#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
case VARYING_SLOT_LAYER:
case VARYING_SLOT_TESS_LEVEL_OUTER:
case VARYING_SLOT_TESS_LEVEL_INNER:
+ case VARYING_SLOT_BOUNDING_BOX0:
+ case VARYING_SLOT_BOUNDING_BOX1:
return GL_FALSE;
default:
return GL_TRUE;
GLboolean _BlendFuncPerBuffer;
/** Are the blend equations currently different for each buffer/target? */
GLboolean _BlendEquationPerBuffer;
+
+ /**
+ * Which advanced blending mode is in use (or BLEND_NONE).
+ *
+ * KHR_blend_equation_advanced only allows advanced blending with a single
+ * draw buffer, and NVX_blend_equation_advanced_multi_draw_buffer still
+ * requires all draw buffers to match, so we only need a single value.
+ */
+ enum gl_advanced_blend_mode _AdvancedBlendMode;
+
+ /** Coherency requested via glEnable(GL_BLEND_ADVANCED_COHERENT_KHR)? */
+ bool BlendCoherent;
/*@}*/
/**
/**
- * 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_vertex_buffer_binding BufferBinding[VERT_ATTRIB_MAX];
/** Mask indicating which vertex arrays have vertex buffer associated. */
GLbitfield64 VertexAttribBufferMask;
*/
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 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 */
- 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 */
+ struct shader_info info;
+
+ GLbitfield64 SecondaryOutputsWritten; /**< Subset of OutputsWritten outputs written with non-zero index. */
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 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.
+ /** Used by ARB assembly-style programs. Can only be true for vertex
+ * programs.
*/
- 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}.
- */
- unsigned LocalSize[3];
-
- /**
- * Size of shared variables accessed by the compute shader.
- */
- unsigned SharedSize;
+ 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;
};
bool EarlyFragmentTests;
/**
- * Compute shader state from ARB_compute_shader layout qualifiers.
+ * A bitmask of gl_advanced_blend_mode values
+ */
+ GLbitfield BlendSupport;
+
+ /**
+ * 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.
*/
* 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 {
* 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: */
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;
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;
bool LowerCsDerivedVariables; /**< Lower gl_GlobalInvocationID and
* gl_LocalInvocationIndex based on
* other builtin variables. */
+
+ /** GL_OES_primitive_bounding_box */
+ bool NoPrimitiveBoundingBoxOutput;
};
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_shader_subroutine;
GLboolean ARB_shader_texture_image_samples;
GLboolean ARB_shader_texture_lod;
+ GLboolean ARB_shader_viewport_layer_array;
GLboolean ARB_shading_language_packing;
GLboolean ARB_shading_language_420pack;
GLboolean ARB_shadow;
GLboolean EXT_vertex_array_bgra;
GLboolean EXT_window_rectangles;
GLboolean OES_copy_image;
+ GLboolean OES_primitive_bounding_box;
GLboolean OES_sample_variables;
- GLboolean OES_shader_io_blocks;
GLboolean OES_standard_derivatives;
GLboolean OES_texture_buffer;
+ GLboolean OES_texture_cube_map_array;
+ GLboolean OES_viewport_array;
/* vendor extensions */
GLboolean AMD_performance_monitor;
GLboolean AMD_pinned_memory;
GLboolean AMD_seamless_cubemap_per_texture;
GLboolean AMD_vertex_shader_layer;
GLboolean AMD_vertex_shader_viewport_index;
+ GLboolean ANDROID_extension_pack_es31a;
GLboolean APPLE_object_purgeable;
GLboolean ATI_meminfo;
GLboolean ATI_texture_compression_3dc;
GLboolean ATI_separate_stencil;
GLboolean GREMEDY_string_marker;
GLboolean INTEL_performance_query;
+ GLboolean KHR_blend_equation_advanced;
+ GLboolean KHR_blend_equation_advanced_coherent;
GLboolean KHR_robustness;
GLboolean KHR_texture_compression_astc_hdr;
GLboolean KHR_texture_compression_astc_ldr;
GLboolean KHR_texture_compression_astc_sliced_3d;
GLboolean MESA_pack_invert;
+ GLboolean MESA_shader_framebuffer_fetch;
+ GLboolean MESA_shader_framebuffer_fetch_non_coherent;
GLboolean MESA_shader_integer_functions;
GLboolean MESA_ycbcr_texture;
GLboolean NV_conditional_render;
* Once this field becomes true, it is never reset to false.
*/
GLboolean ShareGroupReset;
+
+ /**
+ * \name OES_primitive_bounding_box
+ *
+ * Stores the arguments to glPrimitiveBoundingBox
+ */
+ GLfloat PrimitiveBoundingBox[8];
};
/**