#include "compiler/shader_enums.h"
#include "main/formats.h" /* MESA_FORMAT_COUNT */
#include "compiler/glsl/list.h"
+#include "util/bitscan.h"
#ifdef __cplusplus
/**
- * Vertex attribute array as seen by the client.
+ * Attributes to describe a vertex array.
*
* Contains the size, type, format and normalization flag,
* along with the index of a vertex buffer binding point.
* and VERTEX_BINDING_STRIDE to the same value, while
* glBindVertexBuffer() will only set VERTEX_BINDING_STRIDE.
*/
-struct gl_vertex_attrib_array
+struct gl_array_attributes
{
GLint Size; /**< Components per element (1,2,3,4) */
GLenum Type; /**< Datatype: GL_FLOAT, GL_INT, etc */
GLboolean Integer; /**< Fixed-point values are not converted to floats */
GLboolean Doubles; /**< double precision values are not converted to floats */
GLuint _ElementSize; /**< Size of each element in bytes */
- GLuint VertexBinding; /**< Vertex buffer binding */
+ GLuint BufferBindingIndex; /**< Vertex buffer binding */
};
struct gl_client_array _VertexAttrib[VERT_ATTRIB_MAX];
/** Vertex attribute arrays */
- struct gl_vertex_attrib_array VertexAttrib[VERT_ATTRIB_MAX];
+ struct gl_array_attributes VertexAttrib[VERT_ATTRIB_MAX];
/** Vertex buffer bindings */
struct gl_vertex_buffer_binding VertexBinding[VERT_ATTRIB_MAX];
*/
struct gl_transform_feedback_output
{
- unsigned OutputRegister;
- unsigned OutputBuffer;
- unsigned NumComponents;
- unsigned StreamId;
+ uint32_t OutputRegister;
+ uint32_t OutputBuffer;
+ uint32_t NumComponents;
+ uint32_t StreamId;
/** offset (in DWORDs) of this output within the interleaved structure */
- unsigned DstOffset;
+ uint32_t DstOffset;
/**
* Offset into the output register of the data to output. For example,
* if NumComponents is 2 and ComponentOffset is 1, then the data to
* offset is in the y and z components of the output register.
*/
- unsigned ComponentOffset;
+ uint32_t ComponentOffset;
};
struct gl_transform_feedback_buffer
{
- unsigned Binding;
+ uint32_t Binding;
- unsigned NumVaryings;
+ uint32_t NumVaryings;
/**
* Total number of components stored in each buffer. This may be used by
* hardware back-ends to determine the correct stride when interleaving
* multiple transform feedback outputs in the same buffer.
*/
- unsigned Stride;
+ uint32_t Stride;
/**
* Which transform feedback stream this buffer binding is associated with.
*/
- unsigned Stream;
+ uint32_t Stream;
};
struct gl_transform_feedback_varying_info *Varyings;
GLint NumVarying;
- /** Global xfb_stride out qualifier if any */
- GLuint BufferStride[MAX_FEEDBACK_BUFFERS];
-
struct gl_transform_feedback_buffer Buffers[MAX_FEEDBACK_BUFFERS];
};
GLbitfield TexturesUsed[MAX_COMBINED_TEXTURE_IMAGE_UNITS]; /**< TEXTURE_x_BIT bitmask */
GLbitfield SamplersUsed; /**< Bitfield of which samplers are used */
GLbitfield ShadowSamplers; /**< Texture units used for shadow sampling. */
+ GLbitfield ExternalSamplersUsed; /**< Texture units used for samplerExternalOES */
GLboolean UsesGather; /**< Does this program use gather4 at all? */
{
struct gl_program Base; /**< base class */
GLboolean UsesKill; /**< shader uses KIL instruction */
- GLboolean UsesDFdy; /**< shader uses DDY instruction */
GLboolean OriginUpperLeft;
GLboolean PixelCenterInteger;
enum gl_frag_depth_layout FragDepthLayout;
* Size of shared variables accessed by the compute shader.
*/
unsigned SharedSize;
+
+ /**
+ * Whether a variable work group size has been specified.
+ */
+ bool LocalSizeVariable;
};
GLbitfield BlendSupport;
/**
- * Compute shader state from ARB_compute_shader layout qualifiers.
+ * Compute shader state from ARB_compute_shader and
+ * ARB_compute_variable_group_size layout qualifiers.
*/
struct {
/**
* it's not set in this shader.
*/
unsigned LocalSize[3];
+
+ /**
+ * Whether a variable work group size has been specified as defined by
+ * ARB_compute_variable_group_size.
+ */
+ bool LocalSizeVariable;
} Comp;
};
struct gl_shader_info info;
};
+static inline GLbitfield gl_external_samplers(struct gl_linked_shader *shader)
+{
+ GLbitfield external_samplers = 0;
+ GLbitfield mask = shader->active_samplers;
+
+ while (mask) {
+ int idx = u_bit_scan(&mask);
+ if (shader->SamplerTargets[idx] == TEXTURE_EXTERNAL_INDEX)
+ external_samplers |= (1 << idx);
+ }
+
+ return external_samplers;
+}
+
/**
* A GLSL shader object.
*/
*/
struct {
GLenum BufferMode;
+ /** Global xfb_stride out qualifier if any */
+ GLuint BufferStride[MAX_FEEDBACK_BUFFERS];
GLuint NumVarying;
GLchar **VaryingNames; /**< Array [NumVarying] of char * */
} TransformFeedback;
* Size of shared variables accessed by the compute shader.
*/
unsigned SharedSize;
+
+ /**
+ * Whether a variable work group size has been specified.
+ */
+ bool LocalSizeVariable;
} Comp;
/* post-link info: */
*/
bool _HasAttachments;
- /** Integer color values */
- GLboolean _IntegerColor;
+ GLbitfield _IntegerBuffers; /**< Which color buffers are integer valued */
/* ARB_color_buffer_float */
GLboolean _AllColorBuffersFixedPoint; /* no integer, no float */
GLuint MaxComputeWorkGroupInvocations;
GLuint MaxComputeSharedMemorySize;
+ /** GL_ARB_compute_variable_group_size */
+ GLuint MaxComputeVariableGroupSize[3]; /* Array of x, y, z dimensions */
+ GLuint MaxComputeVariableGroupInvocations;
+
/** GL_ARB_gpu_shader5 */
GLfloat MinFragmentInterpolationOffset;
GLfloat MaxFragmentInterpolationOffset;
GLboolean ARB_clip_control;
GLboolean ARB_color_buffer_float;
GLboolean ARB_compute_shader;
+ GLboolean ARB_compute_variable_group_size;
GLboolean ARB_conditional_render_inverted;
GLboolean ARB_conservative_depth;
GLboolean ARB_copy_image;