#include "glapi/glapi.h"
#include "math/m_matrix.h" /* GLmatrix */
#include "compiler/shader_enums.h"
+#include "compiler/shader_info.h"
#include "main/formats.h" /* MESA_FORMAT_COUNT */
#include "compiler/glsl/list.h"
+#include "util/bitscan.h"
#ifdef __cplusplus
/**
- * Client vertex array attributes
+ * Vertex array information which is derived from gl_array_attributes
+ * and gl_vertex_buffer_binding information. Used by the VBO module and
+ * device drivers.
*/
-struct gl_client_array
+struct gl_vertex_array
{
GLint Size; /**< components per element (1,2,3,4) */
GLenum Type; /**< datatype: GL_FLOAT, GL_INT, etc */
/**
- * 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 */
};
* This is a legacy data structure created from gl_vertex_attrib_array and
* gl_vertex_buffer_binding, for compatibility with existing driver code.
*/
- struct gl_client_array _VertexAttrib[VERT_ATTRIB_MAX];
+ struct gl_vertex_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_vertex_buffer_binding BufferBinding[VERT_ATTRIB_MAX];
/** Mask indicating which vertex arrays have vertex buffer associated. */
GLbitfield64 VertexAttribBufferMask;
* Vertex arrays as consumed by a driver.
* The array pointer is set up only by the VBO module.
*/
- const struct gl_client_array **_DrawArrays; /**< 0..VERT_ATTRIB_MAX-1 */
+ const struct gl_vertex_array **_DrawArrays; /**< 0..VERT_ATTRIB_MAX-1 */
/** Legal array datatypes and the API for which they have been computed */
GLbitfield LegalTypesMask;
*/
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];
};
unsigned GlesRemainingPrims;
/**
- * The shader program active when BeginTransformFeedback() was called.
+ * The program active when BeginTransformFeedback() was called.
* When active and unpaused, this equals ctx->Shader.CurrentProgram[stage],
* where stage is the pipeline stage that is the source of data for
* transform feedback.
*/
- struct gl_shader_program *shader_program;
+ struct gl_program *program;
/** The feedback buffers */
GLuint BufferNames[MAX_FEEDBACK_BUFFERS];
*/
struct gl_program
{
+ /** FIXME: This must be first until we split shader_info from nir_shader */
+ struct shader_info info;
+
mtx_t Mutex;
GLuint Id;
GLint RefCount;
GLenum Target; /**< GL_VERTEX/FRAGMENT_PROGRAM_ARB, GL_GEOMETRY_PROGRAM_NV */
GLenum Format; /**< String encoding format */
- struct prog_instruction *Instructions;
+ GLboolean _Used; /**< Ever used for drawing? Used for debugging */
struct nir_shader *nir;
- GLbitfield64 InputsRead; /**< Bitmask of which input regs are read */
- GLbitfield64 DoubleInputsRead; /**< Bitmask of which input regs are read and are doubles */
- GLbitfield64 OutputsWritten; /**< Bitmask of which output regs are written */
+ bool is_arb_asm; /** Is this an ARB assembly-style program */
+
GLbitfield64 SecondaryOutputsWritten; /**< Subset of OutputsWritten outputs written with non-zero index. */
- GLbitfield64 OutputsRead; /**< Bitmask of which output regs are read */
- GLbitfield PatchInputsRead; /**< VAR[0..31] usage for patch inputs (user-defined only) */
- GLbitfield PatchOutputsWritten; /**< VAR[0..31] usage for patch outputs (user-defined only) */
- GLbitfield SystemValuesRead; /**< Bitmask of SYSTEM_VALUE_x inputs used */
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? */
-
- /**
- * For vertex and geometry shaders, true if the program uses the
- * gl_ClipDistance output. Ignored for fragment shaders.
- */
+ /* Vertex and geometry shaders fields */
unsigned ClipDistanceArraySize;
unsigned CullDistanceArraySize;
+ /* Fragement shader only fields */
+ GLboolean OriginUpperLeft;
+ GLboolean PixelCenterInteger;
/** Named parameters, constants, etc. from program text */
struct gl_program_parameter_list *Parameters;
- /**
- * Local parameters used by the program.
- *
- * It's dynamically allocated because it is rarely used (just
- * assembly-style programs), and MAX_PROGRAM_LOCAL_PARAMS entries once it's
- * allocated.
- */
- GLfloat (*LocalParams)[4];
-
/** Map from sampler unit to texture unit (set by glUniform1i()) */
GLubyte SamplerUnits[MAX_SAMPLERS];
- /** Bitmask of which register files are read/written with indirect
- * addressing. Mask of (1 << PROGRAM_x) bits.
- */
- GLbitfield IndirectRegisterFiles;
-
- /** Logical counts */
- /*@{*/
- GLuint NumInstructions;
- GLuint NumTemporaries;
- GLuint NumParameters;
- GLuint NumAttributes;
- GLuint NumAddressRegs;
- GLuint NumAluInstructions;
- GLuint NumTexInstructions;
- GLuint NumTexIndirections;
- /*@}*/
- /** Native, actual h/w counts */
- /*@{*/
- GLuint NumNativeInstructions;
- GLuint NumNativeTemporaries;
- GLuint NumNativeParameters;
- GLuint NumNativeAttributes;
- GLuint NumNativeAddressRegs;
- GLuint NumNativeAluInstructions;
- GLuint NumNativeTexInstructions;
- GLuint NumNativeTexIndirections;
- /*@}*/
-};
-
-
-/** Vertex program object */
-struct gl_vertex_program
-{
- struct gl_program Base; /**< base class */
- GLboolean IsPositionInvariant;
-};
-
-
-/** Tessellation control program object */
-struct gl_tess_ctrl_program
-{
- struct gl_program Base; /**< base class */
-
- /* output layout */
- GLint VerticesOut;
-};
-
-
-/** Tessellation evaluation program object */
-struct gl_tess_eval_program
-{
- struct gl_program Base; /**< base class */
-
- /* input layout */
- GLenum PrimitiveMode; /* GL_TRIANGLES, GL_QUADS or GL_ISOLINES */
- GLenum Spacing; /* GL_EQUAL, GL_FRACTIONAL_EVEN, GL_FRACTIONAL_ODD */
- GLenum VertexOrder; /* GL_CW or GL_CCW */
- bool PointMode;
-};
-
-
-/** Geometry program object */
-struct gl_geometry_program
-{
- struct gl_program Base; /**< base class */
-
- GLint VerticesIn;
- GLint VerticesOut;
- GLint Invocations;
- GLenum InputType; /**< GL_POINTS, GL_LINES, GL_LINES_ADJACENCY_ARB,
- GL_TRIANGLES, or GL_TRIANGLES_ADJACENCY_ARB */
- GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */
- bool UsesEndPrimitive;
- bool UsesStreams;
-};
-
-
-/** Fragment program object */
-struct gl_fragment_program
-{
- 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;
-
- /**
- * GLSL interpolation qualifier associated with each fragment shader input.
- * For inputs that do not have an interpolation qualifier specified in
- * GLSL, the value is INTERP_MODE_NONE.
- */
- enum glsl_interp_mode InterpQualifier[VARYING_SLOT_MAX];
-
- /**
- * Bitfield indicating, for each fragment shader input, 1 if that input
- * uses centroid interpolation, 0 otherwise. Unused inputs are 0.
- */
- GLbitfield64 IsCentroid;
-
- /**
- * Bitfield indicating, for each fragment shader input, 1 if that input
- * uses sample interpolation, 0 otherwise. Unused inputs are 0.
- */
- GLbitfield64 IsSample;
-};
-
-
-/** Compute program object */
-struct gl_compute_program
-{
- struct gl_program Base; /**< base class */
-
- /**
- * Size specified using local_size_{x,y,z}.
+ /* FIXME: We should be able to make this struct a union. However some
+ * drivers (i915/fragment_programs, swrast/prog_execute) mix the use of
+ * these fields, we should fix this.
*/
- unsigned LocalSize[3];
-
- /**
- * Size of shared variables accessed by the compute shader.
- */
- unsigned SharedSize;
+ struct {
+ /** Fields used by GLSL programs */
+ struct {
+ /** Data shared by gl_program and gl_shader_program */
+ struct gl_shader_program_data *data;
+
+ struct gl_active_atomic_buffer **AtomicBuffers;
+
+ /** Post-link transform feedback info. */
+ struct gl_transform_feedback_info *LinkedTransformFeedback;
+
+ /**
+ * Number of types for subroutine uniforms.
+ */
+ GLuint NumSubroutineUniformTypes;
+
+ /**
+ * Subroutine uniform remap table
+ * based on the program level uniform remap table.
+ */
+ GLuint NumSubroutineUniforms; /* non-sparse total */
+ GLuint NumSubroutineUniformRemapTable;
+ struct gl_uniform_storage **SubroutineUniformRemapTable;
+
+ /**
+ * Num of subroutine functions for this stage and storage for them.
+ */
+ GLuint NumSubroutineFunctions;
+ GLuint MaxSubroutineFunctionIndex;
+ struct gl_subroutine_function *SubroutineFunctions;
+
+ /**
+ * Map from image uniform index to image unit (set by glUniform1i())
+ *
+ * An image uniform index is associated with each image uniform by
+ * the linker. The image index associated with each uniform is
+ * stored in the \c gl_uniform_storage::image field.
+ */
+ GLubyte ImageUnits[MAX_IMAGE_UNIFORMS];
+
+ /**
+ * Access qualifier specified in the shader for each image uniform
+ * index. Either \c GL_READ_ONLY, \c GL_WRITE_ONLY or \c
+ * GL_READ_WRITE.
+ *
+ * It may be different, though only more strict than the value of
+ * \c gl_image_unit::Access for the corresponding image unit.
+ */
+ GLenum ImageAccess[MAX_IMAGE_UNIFORMS];
+
+ struct gl_uniform_block **UniformBlocks;
+ struct gl_uniform_block **ShaderStorageBlocks;
+
+ /** Which texture target is being sampled
+ * (TEXTURE_1D/2D/3D/etc_INDEX)
+ */
+ gl_texture_index SamplerTargets[MAX_SAMPLERS];
+
+ union {
+ struct {
+ /**
+ * A bitmask of gl_advanced_blend_mode values
+ */
+ GLbitfield BlendSupport;
+ } fs;
+ };
+ } sh;
+
+ /** ARB assembly-style program fields */
+ struct {
+ struct prog_instruction *Instructions;
+
+ /**
+ * Local parameters used by the program.
+ *
+ * It's dynamically allocated because it is rarely used (just
+ * assembly-style programs), and MAX_PROGRAM_LOCAL_PARAMS entries
+ * once it's allocated.
+ */
+ GLfloat (*LocalParams)[4];
+
+ /** Bitmask of which register files are read/written with indirect
+ * addressing. Mask of (1 << PROGRAM_x) bits.
+ */
+ GLbitfield IndirectRegisterFiles;
+
+ /** Logical counts */
+ /*@{*/
+ GLuint NumInstructions;
+ GLuint NumTemporaries;
+ GLuint NumParameters;
+ GLuint NumAttributes;
+ GLuint NumAddressRegs;
+ GLuint NumAluInstructions;
+ GLuint NumTexInstructions;
+ GLuint NumTexIndirections;
+ /*@}*/
+ /** Native, actual h/w counts */
+ /*@{*/
+ GLuint NumNativeInstructions;
+ GLuint NumNativeTemporaries;
+ GLuint NumNativeParameters;
+ GLuint NumNativeAttributes;
+ GLuint NumNativeAddressRegs;
+ GLuint NumNativeAluInstructions;
+ GLuint NumNativeTexInstructions;
+ GLuint NumNativeTexIndirections;
+ /*@}*/
+
+ /** Used by ARB assembly-style programs. Can only be true for vertex
+ * programs.
+ */
+ GLboolean IsPositionInvariant;
+ } arb;
+ };
};
GLboolean TwoSideEnabled; /**< GL_VERTEX_PROGRAM_TWO_SIDE_ARB/NV */
/** Computed two sided lighting for fixed function/programs. */
GLboolean _TwoSideEnabled;
- struct gl_vertex_program *Current; /**< User-bound vertex program */
+ struct gl_program *Current; /**< User-bound vertex program */
/** Currently enabled and valid vertex program (including internal
* programs, user-defined vertex programs and GLSL vertex shaders).
* This is the program we must use when rendering.
*/
- struct gl_vertex_program *_Current;
+ struct gl_program *_Current;
GLfloat Parameters[MAX_PROGRAM_ENV_PARAMS][4]; /**< Env params */
GLboolean _MaintainTnlProgram;
/** Program to emulate fixed-function T&L (see above) */
- struct gl_vertex_program *_TnlProgram;
+ struct gl_program *_TnlProgram;
/** Cache of fixed-function programs */
struct gl_program_cache *Cache;
struct gl_tess_ctrl_program_state
{
/** Currently bound and valid shader. */
- struct gl_tess_ctrl_program *_Current;
+ struct gl_program *_Current;
GLint patch_vertices;
GLfloat patch_default_outer_level[4];
struct gl_tess_eval_program_state
{
/** Currently bound and valid shader. */
- struct gl_tess_eval_program *_Current;
+ struct gl_program *_Current;
};
/**
/** Currently enabled and valid program (including internal programs
* and compiled shader programs).
*/
- struct gl_geometry_program *_Current;
+ struct gl_program *_Current;
};
/**
{
GLboolean Enabled; /**< User-set fragment program enable flag */
GLboolean _Enabled; /**< Enabled and _valid_ user program? */
- struct gl_fragment_program *Current; /**< User-bound fragment program */
+ struct gl_program *Current; /**< User-bound fragment program */
/** Currently enabled and valid fragment program (including internal
* programs, user-defined fragment programs and GLSL fragment shaders).
* This is the program we must use when rendering.
*/
- struct gl_fragment_program *_Current;
+ struct gl_program *_Current;
GLfloat Parameters[MAX_PROGRAM_ENV_PARAMS][4]; /**< Env params */
GLboolean _MaintainTexEnvProgram;
/** Program to emulate fixed-function texture env/combine (see above) */
- struct gl_fragment_program *_TexEnvProgram;
+ struct gl_program *_TexEnvProgram;
/** Cache of fixed-function programs */
struct gl_program_cache *Cache;
/** Currently enabled and valid program (including internal programs
* and compiled shader programs).
*/
- struct gl_compute_program *_Current;
+ struct gl_program *_Current;
};
*/
struct gl_shader_info
{
- bool uses_builtin_functions;
- bool uses_gl_fragcoord;
- bool redeclares_gl_fragcoord;
- bool ARB_fragment_coord_conventions_enable;
-
- /**
- * Fragment shader state from GLSL 1.50 layout qualifiers.
- */
- bool origin_upper_left;
- bool pixel_center_integer;
-
- struct {
- /** Global xfb_stride out qualifier if any */
- GLuint BufferStride[MAX_FEEDBACK_BUFFERS];
- } TransformFeedback;
-
/**
* Tessellation Control shader state from layout qualifiers.
*/
* in this shader.
*/
GLenum PrimitiveMode;
- /**
- * GL_EQUAL, GL_FRACTIONAL_ODD, GL_FRACTIONAL_EVEN, or 0 if it's not set
- * in this shader.
- */
- GLenum Spacing;
+
+ enum gl_tess_spacing Spacing;
+
/**
* GL_CW, GL_CCW, or 0 if it's not set in this shader.
*/
} Geom;
/**
- * Whether early fragment tests are enabled as defined by
- * ARB_shader_image_load_store.
- */
- bool EarlyFragmentTests;
-
- /**
- * A bitmask of gl_advanced_blend_mode values
- */
- 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;
};
{
gl_shader_stage Stage;
+#ifdef DEBUG
+ unsigned SourceChecksum;
+#endif
+
struct gl_program *Program; /**< Post-compile assembly code */
/**
* \note Each of these fields is only set post-linking.
*/
/*@{*/
- unsigned num_samplers; /**< Number of samplers used by this shader. */
- GLbitfield active_samplers; /**< Bitfield of which samplers are used */
GLbitfield shadow_samplers; /**< Samplers used for shadow sampling. */
/*@}*/
- /**
- * Map from sampler unit to texture unit (set by glUniform1i())
- *
- * A sampler unit is associated with each sampler uniform by the linker.
- * The sampler unit associated with each uniform is stored in the
- * \c gl_uniform_storage::sampler field.
- */
- GLubyte SamplerUnits[MAX_SAMPLERS];
- /** Which texture target is being sampled (TEXTURE_1D/2D/3D/etc_INDEX) */
- gl_texture_index SamplerTargets[MAX_SAMPLERS];
-
/**
* Number of default uniform block components used by this shader.
*
*/
unsigned num_combined_uniform_components;
- unsigned NumUniformBlocks;
- struct gl_uniform_block **UniformBlocks;
-
- unsigned NumShaderStorageBlocks;
- struct gl_uniform_block **ShaderStorageBlocks;
-
struct exec_list *ir;
struct exec_list *packed_varyings;
struct exec_list *fragdata_arrays;
struct glsl_symbol_table *symbols;
- /**
- * Map from image uniform index to image unit (set by glUniform1i())
- *
- * An image uniform index is associated with each image uniform by
- * the linker. The image index associated with each uniform is
- * stored in the \c gl_uniform_storage::image field.
- */
- GLubyte ImageUnits[MAX_IMAGE_UNIFORMS];
-
- /**
- * Access qualifier specified in the shader for each image uniform
- * index. Either \c GL_READ_ONLY, \c GL_WRITE_ONLY or \c
- * GL_READ_WRITE.
- *
- * It may be different, though only more strict than the value of
- * \c gl_image_unit::Access for the corresponding image unit.
- */
- GLenum ImageAccess[MAX_IMAGE_UNIFORMS];
-
- /**
- * Number of image uniforms defined in the shader. It specifies
- * the number of valid elements in the \c ImageUnits and \c
- * ImageAccess arrays above.
- */
- GLuint NumImages;
-
- struct gl_active_atomic_buffer **AtomicBuffers;
- unsigned NumAtomicBuffers;
-
- /**
- * Number of types for subroutine uniforms.
- */
- GLuint NumSubroutineUniformTypes;
+ struct gl_shader_info info;
+};
- /**
- * Subroutine uniform remap table
- * based on the program level uniform remap table.
- */
- GLuint NumSubroutineUniforms; /* non-sparse total */
- GLuint NumSubroutineUniformRemapTable;
- struct gl_uniform_storage **SubroutineUniformRemapTable;
+static inline GLbitfield gl_external_samplers(struct gl_program *prog)
+{
+ GLbitfield external_samplers = 0;
+ GLbitfield mask = prog->SamplersUsed;
- /**
- * Num of subroutine functions for this stage
- * and storage for them.
- */
- GLuint NumSubroutineFunctions;
- GLuint MaxSubroutineFunctionIndex;
- struct gl_subroutine_function *SubroutineFunctions;
+ while (mask) {
+ int idx = u_bit_scan(&mask);
+ if (prog->sh.SamplerTargets[idx] == TEXTURE_EXTERNAL_INDEX)
+ external_samplers |= (1 << idx);
+ }
- struct gl_shader_info info;
-};
+ return external_samplers;
+}
/**
* A GLSL shader object.
GLboolean CompileStatus;
bool IsES; /**< True if this shader uses GLSL ES */
- GLuint SourceChecksum; /**< for debug/logging purposes */
+#ifdef DEBUG
+ unsigned SourceChecksum; /**< for debug/logging purposes */
+#endif
const GLchar *Source; /**< Source code string */
GLchar *InfoLog;
struct exec_list *ir;
struct glsl_symbol_table *symbols;
+ /**
+ * A bitmask of gl_advanced_blend_mode values
+ */
+ GLbitfield BlendSupport;
+
+ /**
+ * Whether early fragment tests are enabled as defined by
+ * ARB_shader_image_load_store.
+ */
+ bool EarlyFragmentTests;
+
+ bool ARB_fragment_coord_conventions_enable;
+
+ bool redeclares_gl_fragcoord;
+ bool uses_gl_fragcoord;
+
+ bool PostDepthCoverage;
+ bool InnerCoverage;
+
+ /**
+ * Fragment shader state from GLSL 1.50 layout qualifiers.
+ */
+ bool origin_upper_left;
+ bool pixel_center_integer;
+
+ /** Global xfb_stride out qualifier if any */
+ GLuint TransformFeedbackBufferStride[MAX_FEEDBACK_BUFFERS];
+
struct gl_shader_info info;
};
/** Stages that reference this block */
uint8_t stageref;
+ /**
+ * Linearized array index for uniform block instance arrays
+ *
+ * Given a uniform block instance array declared with size
+ * blk[s_0][s_1]..[s_m], the block referenced by blk[i_0][i_1]..[i_m] will
+ * have the linearized array index
+ *
+ * m-1 m
+ * i_m + ∑ i_j * ∏ s_k
+ * j=0 k=j+1
+ *
+ * For a uniform block instance that is not an array, this is always 0.
+ */
+ uint8_t linearized_array_index;
+
/**
* Layout specified in the shader
*
* cross-validating uniform blocks.
*/
enum gl_uniform_block_packing _Packing;
+ GLboolean _RowMajor;
};
/**
uint8_t StageReferences; /** Bitmask of shader stage references. */
};
+/**
+ * A data structure to be shared by gl_shader_program and gl_program.
+ */
+struct gl_shader_program_data
+{
+ GLint RefCount; /**< Reference count */
+
+ unsigned NumUniformStorage;
+ unsigned NumHiddenUniforms;
+ struct gl_uniform_storage *UniformStorage;
+
+ unsigned NumUniformBlocks;
+ struct gl_uniform_block *UniformBlocks;
+
+ unsigned NumShaderStorageBlocks;
+ struct gl_uniform_block *ShaderStorageBlocks;
+
+ struct gl_active_atomic_buffer *AtomicBuffers;
+ unsigned NumAtomicBuffers;
+
+ /** List of all active resources after linking. */
+ struct gl_program_resource *ProgramResourceList;
+ unsigned NumProgramResourceList;
+
+ GLboolean LinkStatus; /**< GL_LINK_STATUS */
+ GLboolean Validated;
+ GLchar *InfoLog;
+
+ unsigned Version; /**< GLSL version used for linking */
+
+ /* Mask of stages this program was linked against */
+ unsigned linked_stages;
+};
+
/**
* A GLSL program object.
* Basically a linked collection of vertex and fragment shaders.
*/
struct {
GLenum BufferMode;
+ /** Global xfb_stride out qualifier if any */
+ GLuint BufferStride[MAX_FEEDBACK_BUFFERS];
GLuint NumVarying;
GLchar **VaryingNames; /**< Array [NumVarying] of char * */
} TransformFeedback;
- /** Post-link transform feedback info. */
- struct gl_transform_feedback_info LinkedTransformFeedback;
+ struct gl_program *xfb_program;
/** Post-link gl_FragDepth layout for ARB_conservative_depth. */
enum gl_frag_depth_layout FragDepthLayout;
struct {
/**
* True if gl_ClipDistance is written to. Copied into
- * gl_tess_eval_program by _mesa_copy_linked_program_data().
+ * gl_program by _mesa_copy_linked_program_data().
*/
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
0 if not present. */
} TessEval;
/**
- * Geometry shader state - copied into gl_geometry_program by
+ * Geometry shader state - copied into gl_program by
* _mesa_copy_linked_program_data().
*/
struct {
/**
* True if gl_ClipDistance is written to. Copied into
- * gl_geometry_program by _mesa_copy_linked_program_data().
+ * gl_program by _mesa_copy_linked_program_data().
*/
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
0 if not present. */
/** Vertex shader state */
struct {
/**
- * True if gl_ClipDistance is written to. Copied into gl_vertex_program
+ * True if gl_ClipDistance is written to. Copied into gl_program
* by _mesa_copy_linked_program_data().
*/
GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
} Vert;
/**
- * Compute shader state - copied into gl_compute_program by
+ * Compute shader state - copied into gl_program by
* _mesa_copy_linked_program_data().
*/
struct {
* 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: */
- unsigned NumUniformStorage;
- unsigned NumHiddenUniforms;
- struct gl_uniform_storage *UniformStorage;
+ /** Data shared by gl_program and gl_shader_program */
+ struct gl_shader_program_data *data;
/**
* Mapping from GL uniform locations returned by \c glUniformLocation to
unsigned LastClipDistanceArraySize;
unsigned LastCullDistanceArraySize;
- unsigned NumUniformBlocks;
- struct gl_uniform_block *UniformBlocks;
-
- unsigned NumShaderStorageBlocks;
- struct gl_uniform_block *ShaderStorageBlocks;
+ /**
+ * Total number of explicit uniform location including inactive uniforms.
+ */
+ unsigned NumExplicitUniformLocations;
/**
* Map of active uniform names to locations
*/
struct string_to_uint_map *UniformHash;
- struct gl_active_atomic_buffer *AtomicBuffers;
- unsigned NumAtomicBuffers;
-
- GLboolean LinkStatus; /**< GL_LINK_STATUS */
- GLboolean Validated;
- GLboolean _Used; /**< Ever used for drawing? */
GLboolean SamplersValidated; /**< Samplers validated against texture units? */
- GLchar *InfoLog;
- unsigned Version; /**< GLSL version used for linking */
bool IsES; /**< True if this program uses GLSL ES */
/**
*/
struct gl_linked_shader *_LinkedShaders[MESA_SHADER_STAGES];
- /** List of all active resources after linking. */
- struct gl_program_resource *ProgramResourceList;
- unsigned NumProgramResourceList;
-
/* True if any of the fragment shaders attached to this program use:
* #extension ARB_fragment_coord_conventions: enable
*/
*/
struct gl_shader_program *CurrentProgram[MESA_SHADER_STAGES];
- struct gl_shader_program *_CurrentFragmentProgram;
+ struct gl_program *_CurrentFragmentProgram;
/**
* Program used by glUniform calls.
GLboolean EmitNoFunctions;
GLboolean EmitNoCont; /**< Emit CONT opcode? */
GLboolean EmitNoMainReturn; /**< Emit CONT/RET opcodes? */
- GLboolean EmitNoNoise; /**< Emit NOISE opcodes? */
GLboolean EmitNoPow; /**< Emit POW opcodes? */
GLboolean EmitNoSat; /**< Emit SAT opcodes? */
GLboolean LowerCombinedClipCullDistance; /** Lower gl_ClipDistance and
/** Clamp UBO and SSBO block indices so they don't go out-of-bounds. */
GLboolean ClampBlockIndicesToArrayBounds;
- GLboolean LowerShaderSharedVariables; /**< Lower compute shader shared
- * variable access to intrinsics. */
-
const struct nir_shader_compiler_options *NirOptions;
};
*/
/*@{*/
struct _mesa_HashTable *Programs; /**< All vertex/fragment programs */
- struct gl_vertex_program *DefaultVertexProgram;
- struct gl_fragment_program *DefaultFragmentProgram;
+ struct gl_program *DefaultVertexProgram;
+ struct gl_program *DefaultFragmentProgram;
/*@}*/
/* GL_ATI_fragment_shader */
*/
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 */
/* GL_ARB_robustness */
GLenum ResetStrategy;
+ /* GL_KHR_robustness */
+ GLboolean RobustAccess;
+
/* GL_ARB_blend_func_extended */
GLuint MaxDualSourceDrawBuffers;
bool GLSLFragCoordIsSysVal;
bool GLSLFrontFacingIsSysVal;
+ /**
+ * Run the minimum amount of GLSL optimizations to be able to link
+ * shaders optimally (eliminate dead varyings and uniforms) and just do
+ * all the necessary lowering.
+ */
+ bool GLSLOptimizeConservatively;
+
+ /**
+ * True if gl_TessLevelInner/Outer[] in the TES should be inputs
+ * (otherwise, they're system values).
+ */
+ bool GLSLTessLevelsAsInputs;
+
/**
* Always use the GetTransformFeedbackVertexCount() driver hook, rather
* than passing the transform feedback object to the drawing function.
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;
GLboolean ARB_explicit_uniform_location;
GLboolean ARB_gpu_shader5;
GLboolean ARB_gpu_shader_fp64;
+ GLboolean ARB_gpu_shader_int64;
GLboolean ARB_half_float_vertex;
GLboolean ARB_indirect_parameters;
GLboolean ARB_instanced_arrays;
GLboolean ARB_occlusion_query2;
GLboolean ARB_pipeline_statistics_query;
GLboolean ARB_point_sprite;
+ GLboolean ARB_post_depth_coverage;
GLboolean ARB_query_buffer_object;
GLboolean ARB_robust_buffer_access_behavior;
GLboolean ARB_sample_shading;
GLboolean ATI_fragment_shader;
GLboolean ATI_separate_stencil;
GLboolean GREMEDY_string_marker;
+ GLboolean INTEL_conservative_rasterization;
GLboolean INTEL_performance_query;
GLboolean KHR_blend_equation_advanced;
GLboolean KHR_blend_equation_advanced_coherent;
* gl_context::TessCtrlProgram::patch_default_*
*/
uint64_t NewDefaultTessLevels;
+
+ /**
+ * gl_context::IntelConservativeRasterization
+ */
+ uint64_t NewIntelConservativeRasterization;
};
struct gl_uniform_buffer_binding
GLboolean TextureFormatSupported[MESA_FORMAT_COUNT];
GLboolean RasterDiscard; /**< GL_RASTERIZER_DISCARD */
+ GLboolean IntelConservativeRasterization; /**< GL_INTEL_CONSERVATIVE_RASTERIZATION */
/**
* \name Hooks for module contexts.
DEBUG_SILENT = (1 << 0),
DEBUG_ALWAYS_FLUSH = (1 << 1),
DEBUG_INCOMPLETE_TEXTURE = (1 << 2),
- DEBUG_INCOMPLETE_FBO = (1 << 3)
+ DEBUG_INCOMPLETE_FBO = (1 << 3),
+ DEBUG_CONTEXT = (1 << 4)
};
#ifdef __cplusplus