#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"
/**
- * 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 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 */
+ struct shader_info info;
+
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;
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 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.
+ /** Used by ARB assembly-style programs. Can only be true for vertex
+ * programs.
*/
- 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}.
- */
- unsigned LocalSize[3];
-
- /**
- * Size of shared variables accessed by the compute shader.
- */
- unsigned SharedSize;
-
- /**
- * Whether a variable work group size has been specified.
- */
- bool LocalSizeVariable;
+ GLboolean IsPositionInvariant;
};
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;
};
* cross-validating uniform blocks.
*/
enum gl_uniform_block_packing _Packing;
+ GLboolean _RowMajor;
};
/**
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 {
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
*/
/*@{*/
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;