Home | History | Annotate | Line # | Download | only in main
      1 /*
      2  * Mesa 3-D graphics library
      3  *
      4  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
      5  * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included
     15  * in all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
     21  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     22  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     23  * OTHER DEALINGS IN THE SOFTWARE.
     24  */
     25 
     26 /**
     27  * \file mtypes.h
     28  * Main Mesa data structures.
     29  *
     30  * Please try to mark derived values with a leading underscore ('_').
     31  */
     32 
     33 #ifndef MTYPES_H
     34 #define MTYPES_H
     35 
     36 
     37 #include <stdint.h>             /* uint32_t */
     38 #include <stdbool.h>
     39 #include "c11/threads.h"
     40 
     41 #include "main/glheader.h"
     42 #include "main/glthread.h"
     43 #include "main/menums.h"
     44 #include "main/config.h"
     45 #include "glapi/glapi.h"
     46 #include "math/m_matrix.h"	/* GLmatrix */
     47 #include "compiler/shader_enums.h"
     48 #include "compiler/shader_info.h"
     49 #include "main/formats.h"       /* MESA_FORMAT_COUNT */
     50 #include "compiler/glsl/list.h"
     51 #include "util/u_idalloc.h"
     52 #include "util/simple_mtx.h"
     53 #include "util/u_dynarray.h"
     54 #include "vbo/vbo.h"
     55 
     56 
     57 #ifdef __cplusplus
     58 extern "C" {
     59 #endif
     60 
     61 #define GET_COLORMASK_BIT(mask, buf, chan) (((mask) >> (4 * (buf) + (chan))) & 0x1)
     62 #define GET_COLORMASK(mask, buf) (((mask) >> (4 * (buf))) & 0xf)
     63 
     64 
     65 /**
     66  * \name Some forward type declarations
     67  */
     68 /*@{*/
     69 struct _mesa_HashTable;
     70 struct gl_attrib_node;
     71 struct gl_list_extensions;
     72 struct gl_meta_state;
     73 struct gl_program_cache;
     74 struct gl_texture_object;
     75 struct gl_debug_state;
     76 struct gl_context;
     77 struct st_context;
     78 struct gl_uniform_storage;
     79 struct prog_instruction;
     80 struct gl_program_parameter_list;
     81 struct gl_shader_spirv_data;
     82 struct set;
     83 struct shader_includes;
     84 /*@}*/
     85 
     86 
     87 /** Extra draw modes beyond GL_POINTS, GL_TRIANGLE_FAN, etc */
     88 #define PRIM_MAX                 GL_PATCHES
     89 #define PRIM_OUTSIDE_BEGIN_END   (PRIM_MAX + 1)
     90 #define PRIM_UNKNOWN             (PRIM_MAX + 2)
     91 
     92 /**
     93  * Determine if the given gl_varying_slot appears in the fragment shader.
     94  */
     95 static inline GLboolean
     96 _mesa_varying_slot_in_fs(gl_varying_slot slot)
     97 {
     98    switch (slot) {
     99    case VARYING_SLOT_PSIZ:
    100    case VARYING_SLOT_BFC0:
    101    case VARYING_SLOT_BFC1:
    102    case VARYING_SLOT_EDGE:
    103    case VARYING_SLOT_CLIP_VERTEX:
    104    case VARYING_SLOT_LAYER:
    105    case VARYING_SLOT_TESS_LEVEL_OUTER:
    106    case VARYING_SLOT_TESS_LEVEL_INNER:
    107    case VARYING_SLOT_BOUNDING_BOX0:
    108    case VARYING_SLOT_BOUNDING_BOX1:
    109    case VARYING_SLOT_VIEWPORT_MASK:
    110       return GL_FALSE;
    111    default:
    112       return GL_TRUE;
    113    }
    114 }
    115 
    116 /**
    117  * Bit flags for all renderbuffers
    118  */
    119 #define BUFFER_BIT_FRONT_LEFT   (1 << BUFFER_FRONT_LEFT)
    120 #define BUFFER_BIT_BACK_LEFT    (1 << BUFFER_BACK_LEFT)
    121 #define BUFFER_BIT_FRONT_RIGHT  (1 << BUFFER_FRONT_RIGHT)
    122 #define BUFFER_BIT_BACK_RIGHT   (1 << BUFFER_BACK_RIGHT)
    123 #define BUFFER_BIT_DEPTH        (1 << BUFFER_DEPTH)
    124 #define BUFFER_BIT_STENCIL      (1 << BUFFER_STENCIL)
    125 #define BUFFER_BIT_ACCUM        (1 << BUFFER_ACCUM)
    126 #define BUFFER_BIT_COLOR0       (1 << BUFFER_COLOR0)
    127 #define BUFFER_BIT_COLOR1       (1 << BUFFER_COLOR1)
    128 #define BUFFER_BIT_COLOR2       (1 << BUFFER_COLOR2)
    129 #define BUFFER_BIT_COLOR3       (1 << BUFFER_COLOR3)
    130 #define BUFFER_BIT_COLOR4       (1 << BUFFER_COLOR4)
    131 #define BUFFER_BIT_COLOR5       (1 << BUFFER_COLOR5)
    132 #define BUFFER_BIT_COLOR6       (1 << BUFFER_COLOR6)
    133 #define BUFFER_BIT_COLOR7       (1 << BUFFER_COLOR7)
    134 
    135 /**
    136  * Mask of all the color buffer bits (but not accum).
    137  */
    138 #define BUFFER_BITS_COLOR  (BUFFER_BIT_FRONT_LEFT | \
    139                             BUFFER_BIT_BACK_LEFT | \
    140                             BUFFER_BIT_FRONT_RIGHT | \
    141                             BUFFER_BIT_BACK_RIGHT | \
    142                             BUFFER_BIT_COLOR0 | \
    143                             BUFFER_BIT_COLOR1 | \
    144                             BUFFER_BIT_COLOR2 | \
    145                             BUFFER_BIT_COLOR3 | \
    146                             BUFFER_BIT_COLOR4 | \
    147                             BUFFER_BIT_COLOR5 | \
    148                             BUFFER_BIT_COLOR6 | \
    149                             BUFFER_BIT_COLOR7)
    150 
    151 /* Mask of bits for depth+stencil buffers */
    152 #define BUFFER_BITS_DEPTH_STENCIL (BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL)
    153 
    154 /**
    155  * Framebuffer configuration (aka visual / pixelformat)
    156  * Note: some of these fields should be boolean, but it appears that
    157  * code in drivers/dri/common/util.c requires int-sized fields.
    158  */
    159 struct gl_config
    160 {
    161    GLboolean floatMode;
    162    GLuint doubleBufferMode;
    163    GLuint stereoMode;
    164 
    165    GLint redBits, greenBits, blueBits, alphaBits;	/* bits per comp */
    166    GLuint redMask, greenMask, blueMask, alphaMask;
    167    GLint redShift, greenShift, blueShift, alphaShift;
    168    GLint rgbBits;		/* total bits for rgb */
    169 
    170    GLint accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits;
    171    GLint depthBits;
    172    GLint stencilBits;
    173 
    174    /* ARB_multisample / SGIS_multisample */
    175    GLuint samples;
    176 
    177    /* OML_swap_method */
    178    GLint swapMethod;
    179 
    180    /* EXT_framebuffer_sRGB */
    181    GLint sRGBCapable;
    182 };
    183 
    184 
    185 /**
    186  * \name Bit flags used for updating material values.
    187  */
    188 /*@{*/
    189 #define MAT_ATTRIB_FRONT_AMBIENT           0
    190 #define MAT_ATTRIB_BACK_AMBIENT            1
    191 #define MAT_ATTRIB_FRONT_DIFFUSE           2
    192 #define MAT_ATTRIB_BACK_DIFFUSE            3
    193 #define MAT_ATTRIB_FRONT_SPECULAR          4
    194 #define MAT_ATTRIB_BACK_SPECULAR           5
    195 #define MAT_ATTRIB_FRONT_EMISSION          6
    196 #define MAT_ATTRIB_BACK_EMISSION           7
    197 #define MAT_ATTRIB_FRONT_SHININESS         8
    198 #define MAT_ATTRIB_BACK_SHININESS          9
    199 #define MAT_ATTRIB_FRONT_INDEXES           10
    200 #define MAT_ATTRIB_BACK_INDEXES            11
    201 #define MAT_ATTRIB_MAX                     12
    202 
    203 #define MAT_ATTRIB_AMBIENT(f)  (MAT_ATTRIB_FRONT_AMBIENT+(f))
    204 #define MAT_ATTRIB_DIFFUSE(f)  (MAT_ATTRIB_FRONT_DIFFUSE+(f))
    205 #define MAT_ATTRIB_SPECULAR(f) (MAT_ATTRIB_FRONT_SPECULAR+(f))
    206 #define MAT_ATTRIB_EMISSION(f) (MAT_ATTRIB_FRONT_EMISSION+(f))
    207 #define MAT_ATTRIB_SHININESS(f)(MAT_ATTRIB_FRONT_SHININESS+(f))
    208 #define MAT_ATTRIB_INDEXES(f)  (MAT_ATTRIB_FRONT_INDEXES+(f))
    209 
    210 #define MAT_BIT_FRONT_AMBIENT         (1<<MAT_ATTRIB_FRONT_AMBIENT)
    211 #define MAT_BIT_BACK_AMBIENT          (1<<MAT_ATTRIB_BACK_AMBIENT)
    212 #define MAT_BIT_FRONT_DIFFUSE         (1<<MAT_ATTRIB_FRONT_DIFFUSE)
    213 #define MAT_BIT_BACK_DIFFUSE          (1<<MAT_ATTRIB_BACK_DIFFUSE)
    214 #define MAT_BIT_FRONT_SPECULAR        (1<<MAT_ATTRIB_FRONT_SPECULAR)
    215 #define MAT_BIT_BACK_SPECULAR         (1<<MAT_ATTRIB_BACK_SPECULAR)
    216 #define MAT_BIT_FRONT_EMISSION        (1<<MAT_ATTRIB_FRONT_EMISSION)
    217 #define MAT_BIT_BACK_EMISSION         (1<<MAT_ATTRIB_BACK_EMISSION)
    218 #define MAT_BIT_FRONT_SHININESS       (1<<MAT_ATTRIB_FRONT_SHININESS)
    219 #define MAT_BIT_BACK_SHININESS        (1<<MAT_ATTRIB_BACK_SHININESS)
    220 #define MAT_BIT_FRONT_INDEXES         (1<<MAT_ATTRIB_FRONT_INDEXES)
    221 #define MAT_BIT_BACK_INDEXES          (1<<MAT_ATTRIB_BACK_INDEXES)
    222 
    223 
    224 #define FRONT_MATERIAL_BITS   (MAT_BIT_FRONT_EMISSION | \
    225                                MAT_BIT_FRONT_AMBIENT | \
    226                                MAT_BIT_FRONT_DIFFUSE | \
    227                                MAT_BIT_FRONT_SPECULAR | \
    228                                MAT_BIT_FRONT_SHININESS | \
    229                                MAT_BIT_FRONT_INDEXES)
    230 
    231 #define BACK_MATERIAL_BITS    (MAT_BIT_BACK_EMISSION | \
    232                                MAT_BIT_BACK_AMBIENT | \
    233                                MAT_BIT_BACK_DIFFUSE | \
    234                                MAT_BIT_BACK_SPECULAR | \
    235                                MAT_BIT_BACK_SHININESS | \
    236                                MAT_BIT_BACK_INDEXES)
    237 
    238 #define ALL_MATERIAL_BITS     (FRONT_MATERIAL_BITS | BACK_MATERIAL_BITS)
    239 /*@}*/
    240 
    241 
    242 /**
    243  * Material state.
    244  */
    245 struct gl_material
    246 {
    247    GLfloat Attrib[MAT_ATTRIB_MAX][4];
    248 };
    249 
    250 
    251 /**
    252  * Light state flags.
    253  */
    254 /*@{*/
    255 #define LIGHT_SPOT         0x1
    256 #define LIGHT_LOCAL_VIEWER 0x2
    257 #define LIGHT_POSITIONAL   0x4
    258 #define LIGHT_NEED_VERTICES (LIGHT_POSITIONAL|LIGHT_LOCAL_VIEWER)
    259 /*@}*/
    260 
    261 
    262 /**
    263  * Light source state.
    264  */
    265 struct gl_light
    266 {
    267    GLboolean Enabled;		/**< On/off flag */
    268 
    269    /**
    270     * \name Derived fields
    271     */
    272    /*@{*/
    273    GLbitfield _Flags;		/**< Mask of LIGHT_x bits defined above */
    274 
    275    GLfloat _Position[4];	/**< position in eye/obj coordinates */
    276    GLfloat _VP_inf_norm[3];	/**< Norm direction to infinite light */
    277    GLfloat _h_inf_norm[3];	/**< Norm( _VP_inf_norm + <0,0,1> ) */
    278    GLfloat _NormSpotDirection[4]; /**< normalized spotlight direction */
    279    GLfloat _VP_inf_spot_attenuation;
    280 
    281    GLfloat _MatAmbient[2][3];	/**< material ambient * light ambient */
    282    GLfloat _MatDiffuse[2][3];	/**< material diffuse * light diffuse */
    283    GLfloat _MatSpecular[2][3];	/**< material spec * light specular */
    284    /*@}*/
    285 };
    286 
    287 
    288 /**
    289  * Light model state.
    290  */
    291 struct gl_lightmodel
    292 {
    293    GLfloat Ambient[4];		/**< ambient color */
    294    GLboolean LocalViewer;	/**< Local (or infinite) view point? */
    295    GLboolean TwoSide;		/**< Two (or one) sided lighting? */
    296    GLenum16 ColorControl;	/**< either GL_SINGLE_COLOR
    297                                      or GL_SEPARATE_SPECULAR_COLOR */
    298 };
    299 
    300 
    301 /**
    302  * Accumulation buffer attribute group (GL_ACCUM_BUFFER_BIT)
    303  */
    304 struct gl_accum_attrib
    305 {
    306    GLfloat ClearColor[4];	/**< Accumulation buffer clear color */
    307 };
    308 
    309 
    310 /**
    311  * Used for storing clear color, texture border color, etc.
    312  * The float values are typically unclamped.
    313  */
    314 union gl_color_union
    315 {
    316    GLfloat f[4];
    317    GLint i[4];
    318    GLuint ui[4];
    319 };
    320 
    321 
    322 /**
    323  * Color buffer attribute group (GL_COLOR_BUFFER_BIT).
    324  */
    325 struct gl_colorbuffer_attrib
    326 {
    327    GLuint ClearIndex;                      /**< Index for glClear */
    328    union gl_color_union ClearColor;        /**< Color for glClear, unclamped */
    329    GLuint IndexMask;                       /**< Color index write mask */
    330 
    331    /** 4 colormask bits per draw buffer, max 8 draw buffers. 4*8 = 32 bits */
    332    GLbitfield ColorMask;
    333 
    334    GLenum16 DrawBuffer[MAX_DRAW_BUFFERS];  /**< Which buffer to draw into */
    335 
    336    /**
    337     * \name alpha testing
    338     */
    339    /*@{*/
    340    GLboolean AlphaEnabled;		/**< Alpha test enabled flag */
    341    GLenum16 AlphaFunc;			/**< Alpha test function */
    342    GLfloat AlphaRefUnclamped;
    343    GLclampf AlphaRef;			/**< Alpha reference value */
    344    /*@}*/
    345 
    346    /**
    347     * \name Blending
    348     */
    349    /*@{*/
    350    GLbitfield BlendEnabled;		/**< Per-buffer blend enable flags */
    351 
    352    /* NOTE: this does _not_ depend on fragment clamping or any other clamping
    353     * control, only on the fixed-pointness of the render target.
    354     * The query does however depend on fragment color clamping.
    355     */
    356    GLfloat BlendColorUnclamped[4];      /**< Blending color */
    357    GLfloat BlendColor[4];		/**< Blending color */
    358 
    359    struct
    360    {
    361       GLenum16 SrcRGB;             /**< RGB blend source term */
    362       GLenum16 DstRGB;             /**< RGB blend dest term */
    363       GLenum16 SrcA;               /**< Alpha blend source term */
    364       GLenum16 DstA;               /**< Alpha blend dest term */
    365       GLenum16 EquationRGB;        /**< GL_ADD, GL_SUBTRACT, etc. */
    366       GLenum16 EquationA;          /**< GL_ADD, GL_SUBTRACT, etc. */
    367    } Blend[MAX_DRAW_BUFFERS];
    368    /** Bitfield of color buffers with enabled dual source blending. */
    369    GLbitfield _BlendUsesDualSrc;
    370    /** Are the blend func terms currently different for each buffer/target? */
    371    GLboolean _BlendFuncPerBuffer;
    372    /** Are the blend equations currently different for each buffer/target? */
    373    GLboolean _BlendEquationPerBuffer;
    374 
    375    /**
    376     * Which advanced blending mode is in use (or BLEND_NONE).
    377     *
    378     * KHR_blend_equation_advanced only allows advanced blending with a single
    379     * draw buffer, and NVX_blend_equation_advanced_multi_draw_buffer still
    380     * requires all draw buffers to match, so we only need a single value.
    381     */
    382    enum gl_advanced_blend_mode _AdvancedBlendMode;
    383 
    384    /** Coherency requested via glEnable(GL_BLEND_ADVANCED_COHERENT_KHR)? */
    385    bool BlendCoherent;
    386    /*@}*/
    387 
    388    /**
    389     * \name Logic op
    390     */
    391    /*@{*/
    392    GLboolean IndexLogicOpEnabled;	/**< Color index logic op enabled flag */
    393    GLboolean ColorLogicOpEnabled;	/**< RGBA logic op enabled flag */
    394    GLenum16 LogicOp;			/**< Logic operator */
    395    enum gl_logicop_mode _LogicOp;
    396    /*@}*/
    397 
    398    GLboolean DitherFlag;           /**< Dither enable flag */
    399 
    400    GLboolean _ClampFragmentColor;  /** < with GL_FIXED_ONLY_ARB resolved */
    401    GLenum16 ClampFragmentColor; /**< GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */
    402    GLenum16 ClampReadColor;     /**< GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */
    403 
    404    GLboolean sRGBEnabled;  /**< Framebuffer sRGB blending/updating requested */
    405 };
    406 
    407 
    408 /**
    409  * Vertex format to describe a vertex element.
    410  */
    411 struct gl_vertex_format
    412 {
    413    GLenum16 Type;        /**< datatype: GL_FLOAT, GL_INT, etc */
    414    GLenum16 Format;      /**< default: GL_RGBA, but may be GL_BGRA */
    415    enum pipe_format _PipeFormat:16; /**< pipe_format for Gallium */
    416    GLubyte Size:5;       /**< components per element (1,2,3,4) */
    417    GLubyte Normalized:1; /**< GL_ARB_vertex_program */
    418    GLubyte Integer:1;    /**< Integer-valued? */
    419    GLubyte Doubles:1;    /**< double values are not converted to floats */
    420    GLubyte _ElementSize; /**< Size of each element in bytes */
    421 };
    422 
    423 
    424 /**
    425  * Current attribute group (GL_CURRENT_BIT).
    426  */
    427 struct gl_current_attrib
    428 {
    429    /**
    430     * \name Current vertex attributes (color, texcoords, etc).
    431     * \note Values are valid only after FLUSH_VERTICES has been called.
    432     * \note Index and Edgeflag current values are stored as floats in the
    433     * SIX and SEVEN attribute slots.
    434     * \note We need double storage for 64-bit vertex attributes
    435     */
    436    GLfloat Attrib[VERT_ATTRIB_MAX][4*2];
    437 
    438    /**
    439     * \name Current raster position attributes (always up to date after a
    440     * glRasterPos call).
    441     */
    442    GLfloat RasterPos[4];
    443    GLfloat RasterDistance;
    444    GLfloat RasterColor[4];
    445    GLfloat RasterSecondaryColor[4];
    446    GLfloat RasterTexCoords[MAX_TEXTURE_COORD_UNITS][4];
    447    GLboolean RasterPosValid;
    448 };
    449 
    450 
    451 /**
    452  * Depth buffer attribute group (GL_DEPTH_BUFFER_BIT).
    453  */
    454 struct gl_depthbuffer_attrib
    455 {
    456    GLenum16 Func;		/**< Function for depth buffer compare */
    457    GLclampd Clear;		/**< Value to clear depth buffer to */
    458    GLboolean Test;		/**< Depth buffering enabled flag */
    459    GLboolean Mask;		/**< Depth buffer writable? */
    460    GLboolean BoundsTest;        /**< GL_EXT_depth_bounds_test */
    461    GLclampd BoundsMin, BoundsMax;/**< GL_EXT_depth_bounds_test */
    462 };
    463 
    464 
    465 /**
    466  * Evaluator attribute group (GL_EVAL_BIT).
    467  */
    468 struct gl_eval_attrib
    469 {
    470    /**
    471     * \name Enable bits
    472     */
    473    /*@{*/
    474    GLboolean Map1Color4;
    475    GLboolean Map1Index;
    476    GLboolean Map1Normal;
    477    GLboolean Map1TextureCoord1;
    478    GLboolean Map1TextureCoord2;
    479    GLboolean Map1TextureCoord3;
    480    GLboolean Map1TextureCoord4;
    481    GLboolean Map1Vertex3;
    482    GLboolean Map1Vertex4;
    483    GLboolean Map2Color4;
    484    GLboolean Map2Index;
    485    GLboolean Map2Normal;
    486    GLboolean Map2TextureCoord1;
    487    GLboolean Map2TextureCoord2;
    488    GLboolean Map2TextureCoord3;
    489    GLboolean Map2TextureCoord4;
    490    GLboolean Map2Vertex3;
    491    GLboolean Map2Vertex4;
    492    GLboolean AutoNormal;
    493    /*@}*/
    494 
    495    /**
    496     * \name Map Grid endpoints and divisions and calculated du values
    497     */
    498    /*@{*/
    499    GLint MapGrid1un;
    500    GLfloat MapGrid1u1, MapGrid1u2, MapGrid1du;
    501    GLint MapGrid2un, MapGrid2vn;
    502    GLfloat MapGrid2u1, MapGrid2u2, MapGrid2du;
    503    GLfloat MapGrid2v1, MapGrid2v2, MapGrid2dv;
    504    /*@}*/
    505 };
    506 
    507 
    508 /**
    509  * Compressed fog mode.
    510  */
    511 enum gl_fog_mode
    512 {
    513    FOG_NONE,
    514    FOG_LINEAR,
    515    FOG_EXP,
    516    FOG_EXP2,
    517 };
    518 
    519 
    520 /**
    521  * Fog attribute group (GL_FOG_BIT).
    522  */
    523 struct gl_fog_attrib
    524 {
    525    GLboolean Enabled;		/**< Fog enabled flag */
    526    GLboolean ColorSumEnabled;
    527    uint8_t _PackedMode;		/**< Fog mode as 2 bits */
    528    uint8_t _PackedEnabledMode;	/**< Masked CompressedMode */
    529    GLfloat ColorUnclamped[4];            /**< Fog color */
    530    GLfloat Color[4];		/**< Fog color */
    531    GLfloat Density;		/**< Density >= 0.0 */
    532    GLfloat Start;		/**< Start distance in eye coords */
    533    GLfloat End;			/**< End distance in eye coords */
    534    GLfloat Index;		/**< Fog index */
    535    GLenum16 Mode;		/**< Fog mode */
    536    GLenum16 FogCoordinateSource;/**< GL_EXT_fog_coord */
    537    GLenum16 FogDistanceMode;     /**< GL_NV_fog_distance */
    538 };
    539 
    540 
    541 /**
    542  * Hint attribute group (GL_HINT_BIT).
    543  *
    544  * Values are always one of GL_FASTEST, GL_NICEST, or GL_DONT_CARE.
    545  */
    546 struct gl_hint_attrib
    547 {
    548    GLenum16 PerspectiveCorrection;
    549    GLenum16 PointSmooth;
    550    GLenum16 LineSmooth;
    551    GLenum16 PolygonSmooth;
    552    GLenum16 Fog;
    553    GLenum16 TextureCompression;   /**< GL_ARB_texture_compression */
    554    GLenum16 GenerateMipmap;       /**< GL_SGIS_generate_mipmap */
    555    GLenum16 FragmentShaderDerivative; /**< GL_ARB_fragment_shader */
    556    GLuint MaxShaderCompilerThreads; /**< GL_ARB_parallel_shader_compile */
    557 };
    558 
    559 
    560 struct gl_light_uniforms {
    561    /* These must be in the same order as the STATE_* enums,
    562     * which should also match the order of gl_LightSource members.
    563     */
    564    GLfloat Ambient[4];           /**< STATE_AMBIENT */
    565    GLfloat Diffuse[4];           /**< STATE_DIFFUSE */
    566    GLfloat Specular[4];          /**< STATE_SPECULAR */
    567    GLfloat EyePosition[4];       /**< STATE_POSITION in eye coordinates */
    568    GLfloat _HalfVector[4];       /**< STATE_HALF_VECTOR */
    569    GLfloat SpotDirection[3];     /**< STATE_SPOT_DIRECTION in eye coordinates */
    570    GLfloat _CosCutoff;           /**< = MAX(0, cos(SpotCutoff)) */
    571    GLfloat ConstantAttenuation;  /**< STATE_ATTENUATION */
    572    GLfloat LinearAttenuation;
    573    GLfloat QuadraticAttenuation;
    574    GLfloat SpotExponent;
    575    GLfloat SpotCutoff;           /**< STATE_SPOT_CUTOFF in degrees */
    576 };
    577 
    578 
    579 /**
    580  * Lighting attribute group (GL_LIGHT_BIT).
    581  */
    582 struct gl_light_attrib
    583 {
    584    /* gl_LightSource uniforms */
    585    union {
    586       struct gl_light_uniforms LightSource[MAX_LIGHTS];
    587       GLfloat LightSourceData[(sizeof(struct gl_light_uniforms) / 4) * MAX_LIGHTS];
    588    };
    589 
    590    struct gl_light Light[MAX_LIGHTS];	/**< Array of light sources */
    591    struct gl_lightmodel Model;		/**< Lighting model */
    592 
    593    /**
    594     * Front and back material values.
    595     * Note: must call FLUSH_VERTICES() before using.
    596     */
    597    struct gl_material Material;
    598 
    599    GLboolean Enabled;			/**< Lighting enabled flag */
    600    GLboolean ColorMaterialEnabled;
    601 
    602    GLenum16 ShadeModel;			/**< GL_FLAT or GL_SMOOTH */
    603    GLenum16 ProvokingVertex;              /**< GL_EXT_provoking_vertex */
    604    GLenum16 ColorMaterialFace;		/**< GL_FRONT, BACK or FRONT_AND_BACK */
    605    GLenum16 ColorMaterialMode;		/**< GL_AMBIENT, GL_DIFFUSE, etc */
    606    GLbitfield _ColorMaterialBitmask;	/**< bitmask formed from Face and Mode */
    607 
    608 
    609    GLboolean _ClampVertexColor;
    610    GLenum16 ClampVertexColor;             /**< GL_TRUE, GL_FALSE, GL_FIXED_ONLY */
    611 
    612    /**
    613     * Derived state for optimizations:
    614     */
    615    /*@{*/
    616    GLbitfield _EnabledLights;	/**< bitmask containing enabled lights */
    617 
    618    GLboolean _NeedEyeCoords;
    619    GLboolean _NeedVertices;		/**< Use fast shader? */
    620 
    621    GLfloat _BaseColor[2][3];
    622    /*@}*/
    623 };
    624 
    625 
    626 /**
    627  * Line attribute group (GL_LINE_BIT).
    628  */
    629 struct gl_line_attrib
    630 {
    631    GLboolean SmoothFlag;	/**< GL_LINE_SMOOTH enabled? */
    632    GLboolean StippleFlag;	/**< GL_LINE_STIPPLE enabled? */
    633    GLushort StipplePattern;	/**< Stipple pattern */
    634    GLint StippleFactor;		/**< Stipple repeat factor */
    635    GLfloat Width;		/**< Line width */
    636 };
    637 
    638 
    639 /**
    640  * Display list attribute group (GL_LIST_BIT).
    641  */
    642 struct gl_list_attrib
    643 {
    644    GLuint ListBase;
    645 };
    646 
    647 
    648 /**
    649  * Multisample attribute group (GL_MULTISAMPLE_BIT).
    650  */
    651 struct gl_multisample_attrib
    652 {
    653    GLboolean Enabled;
    654    GLboolean SampleAlphaToCoverage;
    655    GLboolean SampleAlphaToOne;
    656    GLboolean SampleCoverage;
    657    GLboolean SampleCoverageInvert;
    658    GLboolean SampleShading;
    659 
    660    /* ARB_texture_multisample / GL3.2 additions */
    661    GLboolean SampleMask;
    662 
    663    GLfloat SampleCoverageValue;  /**< In range [0, 1] */
    664    GLfloat MinSampleShadingValue;  /**< In range [0, 1] */
    665 
    666    /** The GL spec defines this as an array but >32x MSAA is madness */
    667    GLbitfield SampleMaskValue;
    668 
    669    /* NV_alpha_to_coverage_dither_control */
    670    GLenum SampleAlphaToCoverageDitherControl;
    671 };
    672 
    673 
    674 /**
    675  * A pixelmap (see glPixelMap)
    676  */
    677 struct gl_pixelmap
    678 {
    679    GLint Size;
    680    GLfloat Map[MAX_PIXEL_MAP_TABLE];
    681 };
    682 
    683 
    684 /**
    685  * Collection of all pixelmaps
    686  */
    687 struct gl_pixelmaps
    688 {
    689    struct gl_pixelmap RtoR;  /**< i.e. GL_PIXEL_MAP_R_TO_R */
    690    struct gl_pixelmap GtoG;
    691    struct gl_pixelmap BtoB;
    692    struct gl_pixelmap AtoA;
    693    struct gl_pixelmap ItoR;
    694    struct gl_pixelmap ItoG;
    695    struct gl_pixelmap ItoB;
    696    struct gl_pixelmap ItoA;
    697    struct gl_pixelmap ItoI;
    698    struct gl_pixelmap StoS;
    699 };
    700 
    701 
    702 /**
    703  * Pixel attribute group (GL_PIXEL_MODE_BIT).
    704  */
    705 struct gl_pixel_attrib
    706 {
    707    GLenum16 ReadBuffer;		/**< source buffer for glRead/CopyPixels() */
    708 
    709    /*--- Begin Pixel Transfer State ---*/
    710    /* Fields are in the order in which they're applied... */
    711 
    712    /** Scale & Bias (index shift, offset) */
    713    /*@{*/
    714    GLfloat RedBias, RedScale;
    715    GLfloat GreenBias, GreenScale;
    716    GLfloat BlueBias, BlueScale;
    717    GLfloat AlphaBias, AlphaScale;
    718    GLfloat DepthBias, DepthScale;
    719    GLint IndexShift, IndexOffset;
    720    /*@}*/
    721 
    722    /* Pixel Maps */
    723    /* Note: actual pixel maps are not part of this attrib group */
    724    GLboolean MapColorFlag;
    725    GLboolean MapStencilFlag;
    726 
    727    /*--- End Pixel Transfer State ---*/
    728 
    729    /** glPixelZoom */
    730    GLfloat ZoomX, ZoomY;
    731 };
    732 
    733 
    734 /**
    735  * Point attribute group (GL_POINT_BIT).
    736  */
    737 struct gl_point_attrib
    738 {
    739    GLfloat Size;		/**< User-specified point size */
    740    GLfloat Params[3];		/**< GL_EXT_point_parameters */
    741    GLfloat MinSize, MaxSize;	/**< GL_EXT_point_parameters */
    742    GLfloat Threshold;		/**< GL_EXT_point_parameters */
    743    GLboolean SmoothFlag;	/**< True if GL_POINT_SMOOTH is enabled */
    744    GLboolean _Attenuated;	/**< True if Params != [1, 0, 0] */
    745    GLboolean PointSprite;	/**< GL_NV/ARB_point_sprite */
    746    GLbitfield CoordReplace;     /**< GL_ARB_point_sprite*/
    747    GLenum16 SpriteOrigin;	/**< GL_ARB_point_sprite */
    748 };
    749 
    750 
    751 /**
    752  * Polygon attribute group (GL_POLYGON_BIT).
    753  */
    754 struct gl_polygon_attrib
    755 {
    756    GLenum16 FrontFace;		/**< Either GL_CW or GL_CCW */
    757    GLenum FrontMode;		/**< Either GL_POINT, GL_LINE or GL_FILL */
    758    GLenum BackMode;		/**< Either GL_POINT, GL_LINE or GL_FILL */
    759    GLboolean CullFlag;		/**< Culling on/off flag */
    760    GLboolean SmoothFlag;	/**< True if GL_POLYGON_SMOOTH is enabled */
    761    GLboolean StippleFlag;	/**< True if GL_POLYGON_STIPPLE is enabled */
    762    GLenum16 CullFaceMode;	/**< Culling mode GL_FRONT or GL_BACK */
    763    GLfloat OffsetFactor;	/**< Polygon offset factor, from user */
    764    GLfloat OffsetUnits;		/**< Polygon offset units, from user */
    765    GLfloat OffsetClamp;		/**< Polygon offset clamp, from user */
    766    GLboolean OffsetPoint;	/**< Offset in GL_POINT mode */
    767    GLboolean OffsetLine;	/**< Offset in GL_LINE mode */
    768    GLboolean OffsetFill;	/**< Offset in GL_FILL mode */
    769 };
    770 
    771 
    772 /**
    773  * Scissor attributes (GL_SCISSOR_BIT).
    774  */
    775 struct gl_scissor_rect
    776 {
    777    GLint X, Y;			/**< Lower left corner of box */
    778    GLsizei Width, Height;	/**< Size of box */
    779 };
    780 
    781 
    782 struct gl_scissor_attrib
    783 {
    784    GLbitfield EnableFlags;	/**< Scissor test enabled? */
    785    struct gl_scissor_rect ScissorArray[MAX_VIEWPORTS];
    786    GLint NumWindowRects;        /**< Count of enabled window rectangles */
    787    GLenum16 WindowRectMode;     /**< Whether to include or exclude the rects */
    788    struct gl_scissor_rect WindowRects[MAX_WINDOW_RECTANGLES];
    789 };
    790 
    791 
    792 /**
    793  * Stencil attribute group (GL_STENCIL_BUFFER_BIT).
    794  *
    795  * Three sets of stencil data are tracked so that OpenGL 2.0,
    796  * GL_EXT_stencil_two_side, and GL_ATI_separate_stencil can all be supported
    797  * simultaneously.  In each of the stencil state arrays, element 0 corresponds
    798  * to GL_FRONT.  Element 1 corresponds to the OpenGL 2.0 /
    799  * GL_ATI_separate_stencil GL_BACK state.  Element 2 corresponds to the
    800  * GL_EXT_stencil_two_side GL_BACK state.
    801  *
    802  * The derived value \c _BackFace is either 1 or 2 depending on whether or
    803  * not GL_STENCIL_TEST_TWO_SIDE_EXT is enabled.
    804  *
    805  * The derived value \c _TestTwoSide is set when the front-face and back-face
    806  * stencil state are different.
    807  */
    808 struct gl_stencil_attrib
    809 {
    810    GLboolean Enabled;		/**< Enabled flag */
    811    GLboolean TestTwoSide;	/**< GL_EXT_stencil_two_side */
    812    GLubyte ActiveFace;		/**< GL_EXT_stencil_two_side (0 or 2) */
    813    GLubyte _BackFace;           /**< Current back stencil state (1 or 2) */
    814    GLenum16 Function[3];	/**< Stencil function */
    815    GLenum16 FailFunc[3];	/**< Fail function */
    816    GLenum16 ZPassFunc[3];	/**< Depth buffer pass function */
    817    GLenum16 ZFailFunc[3];	/**< Depth buffer fail function */
    818    GLint Ref[3];		/**< Reference value */
    819    GLuint ValueMask[3];		/**< Value mask */
    820    GLuint WriteMask[3];		/**< Write mask */
    821    GLuint Clear;		/**< Clear value */
    822 };
    823 
    824 
    825 /**
    826  * Bit flags for each type of texture object
    827  */
    828 /*@{*/
    829 #define TEXTURE_2D_MULTISAMPLE_BIT (1 << TEXTURE_2D_MULTISAMPLE_INDEX)
    830 #define TEXTURE_2D_MULTISAMPLE_ARRAY_BIT (1 << TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX)
    831 #define TEXTURE_CUBE_ARRAY_BIT (1 << TEXTURE_CUBE_ARRAY_INDEX)
    832 #define TEXTURE_BUFFER_BIT   (1 << TEXTURE_BUFFER_INDEX)
    833 #define TEXTURE_2D_ARRAY_BIT (1 << TEXTURE_2D_ARRAY_INDEX)
    834 #define TEXTURE_1D_ARRAY_BIT (1 << TEXTURE_1D_ARRAY_INDEX)
    835 #define TEXTURE_EXTERNAL_BIT (1 << TEXTURE_EXTERNAL_INDEX)
    836 #define TEXTURE_CUBE_BIT     (1 << TEXTURE_CUBE_INDEX)
    837 #define TEXTURE_3D_BIT       (1 << TEXTURE_3D_INDEX)
    838 #define TEXTURE_RECT_BIT     (1 << TEXTURE_RECT_INDEX)
    839 #define TEXTURE_2D_BIT       (1 << TEXTURE_2D_INDEX)
    840 #define TEXTURE_1D_BIT       (1 << TEXTURE_1D_INDEX)
    841 /*@}*/
    842 
    843 
    844 /**
    845  * Texture image state.  Drivers will typically create a subclass of this
    846  * with extra fields for memory buffers, etc.
    847  */
    848 struct gl_texture_image
    849 {
    850    GLint InternalFormat;	/**< Internal format as given by the user */
    851    GLenum16 _BaseFormat;	/**< Either GL_RGB, GL_RGBA, GL_ALPHA,
    852                                  *   GL_LUMINANCE, GL_LUMINANCE_ALPHA,
    853                                  *   GL_INTENSITY, GL_DEPTH_COMPONENT or
    854                                  *   GL_DEPTH_STENCIL_EXT only. Used for
    855                                  *   choosing TexEnv arithmetic.
    856                                  */
    857    mesa_format TexFormat;         /**< The actual texture memory format */
    858 
    859    GLuint Border;		/**< 0 or 1 */
    860    GLuint Width;		/**< = 2^WidthLog2 + 2*Border */
    861    GLuint Height;		/**< = 2^HeightLog2 + 2*Border */
    862    GLuint Depth;		/**< = 2^DepthLog2 + 2*Border */
    863    GLuint Width2;		/**< = Width - 2*Border */
    864    GLuint Height2;		/**< = Height - 2*Border */
    865    GLuint Depth2;		/**< = Depth - 2*Border */
    866    GLuint WidthLog2;		/**< = log2(Width2) */
    867    GLuint HeightLog2;		/**< = log2(Height2) */
    868    GLuint DepthLog2;		/**< = log2(Depth2) */
    869    GLuint MaxNumLevels;		/**< = maximum possible number of mipmap
    870                                        levels, computed from the dimensions */
    871 
    872    struct gl_texture_object *TexObject;  /**< Pointer back to parent object */
    873    GLuint Level;                /**< Which mipmap level am I? */
    874    /** Cube map face: index into gl_texture_object::Image[] array */
    875    GLuint Face;
    876 
    877    /** GL_ARB_texture_multisample */
    878    GLuint NumSamples;            /**< Sample count, or 0 for non-multisample */
    879    GLboolean FixedSampleLocations; /**< Same sample locations for all pixels? */
    880 };
    881 
    882 
    883 /**
    884  * Indexes for cube map faces.
    885  */
    886 typedef enum
    887 {
    888    FACE_POS_X = 0,
    889    FACE_NEG_X = 1,
    890    FACE_POS_Y = 2,
    891    FACE_NEG_Y = 3,
    892    FACE_POS_Z = 4,
    893    FACE_NEG_Z = 5,
    894    MAX_FACES = 6
    895 } gl_face_index;
    896 
    897 /**
    898  * Sampler state saved and restore by glPush/PopAttrib.
    899  *
    900  * Don't put fields here that glPushAttrib shouldn't save.
    901  * E.g. no GLES fields because GLES doesn't have glPushAttrib.
    902  */
    903 struct gl_sampler_attrib
    904 {
    905    GLenum16 WrapS;		/**< S-axis texture image wrap mode */
    906    GLenum16 WrapT;		/**< T-axis texture image wrap mode */
    907    GLenum16 WrapR;		/**< R-axis texture image wrap mode */
    908    GLenum16 MinFilter;		/**< minification filter */
    909    GLenum16 MagFilter;		/**< magnification filter */
    910    GLenum16 sRGBDecode;         /**< GL_DECODE_EXT or GL_SKIP_DECODE_EXT */
    911    GLfloat MinLod;		/**< min lambda, OpenGL 1.2 */
    912    GLfloat MaxLod;		/**< max lambda, OpenGL 1.2 */
    913    GLfloat LodBias;		/**< OpenGL 1.4 */
    914    GLfloat MaxAnisotropy;	/**< GL_EXT_texture_filter_anisotropic */
    915    GLenum16 CompareMode;	/**< GL_ARB_shadow */
    916    GLenum16 CompareFunc;	/**< GL_ARB_shadow */
    917    GLboolean CubeMapSeamless;   /**< GL_AMD_seamless_cubemap_per_texture */
    918    GLboolean IsBorderColorNonZero; /**< Does the border color have any effect? */
    919    GLenum16 ReductionMode;      /**< GL_EXT_texture_filter_minmax */
    920 
    921    struct pipe_sampler_state state;  /**< Gallium representation */
    922 };
    923 
    924 /**
    925  * Texture state saved and restored by glPush/PopAttrib.
    926  *
    927  * Don't put fields here that glPushAttrib shouldn't save.
    928  * E.g. no GLES fields because GLES doesn't have glPushAttrib.
    929  */
    930 struct gl_texture_object_attrib
    931 {
    932    GLfloat Priority;           /**< in [0,1] */
    933    GLint BaseLevel;            /**< min mipmap level, OpenGL 1.2 */
    934    GLint MaxLevel;             /**< max mipmap level (max=1000), OpenGL 1.2 */
    935    GLenum Swizzle[4];          /**< GL_EXT_texture_swizzle */
    936    GLushort _Swizzle;          /**< same as Swizzle, but SWIZZLE_* format */
    937    GLenum16 DepthMode;         /**< GL_ARB_depth_texture */
    938    GLenum16 ImageFormatCompatibilityType; /**< GL_ARB_shader_image_load_store */
    939    GLushort MinLayer;          /**< GL_ARB_texture_view */
    940    GLushort NumLayers;         /**< GL_ARB_texture_view */
    941    GLboolean GenerateMipmap;   /**< GL_SGIS_generate_mipmap */
    942    GLbyte ImmutableLevels;     /**< ES 3.0 / ARB_texture_view */
    943    GLubyte MinLevel;           /**< GL_ARB_texture_view */
    944    GLubyte NumLevels;          /**< GL_ARB_texture_view */
    945 };
    946 
    947 /**
    948  * Sampler object state.  These objects are new with GL_ARB_sampler_objects
    949  * and OpenGL 3.3.  Legacy texture objects also contain a sampler object.
    950  */
    951 struct gl_sampler_object
    952 {
    953    GLuint Name;
    954    GLchar *Label;               /**< GL_KHR_debug */
    955    GLint RefCount;
    956 
    957    struct gl_sampler_attrib Attrib;  /**< State saved by glPushAttrib */
    958 
    959    /** GL_ARB_bindless_texture */
    960    bool HandleAllocated;
    961    struct util_dynarray Handles;
    962 };
    963 
    964 
    965 /**
    966  * Texture object state.  Contains the array of mipmap images, border color,
    967  * wrap modes, filter modes, and shadow/texcompare state.
    968  */
    969 struct gl_texture_object
    970 {
    971    GLint RefCount;             /**< reference count */
    972    GLuint Name;                /**< the user-visible texture object ID */
    973    GLenum16 Target;            /**< GL_TEXTURE_1D, GL_TEXTURE_2D, etc. */
    974    GLchar *Label;              /**< GL_KHR_debug */
    975 
    976    struct gl_sampler_object Sampler;
    977    struct gl_texture_object_attrib Attrib;  /**< State saved by glPushAttrib */
    978 
    979    gl_texture_index TargetIndex; /**< The gl_texture_unit::CurrentTex index.
    980                                       Only valid when Target is valid. */
    981    GLbyte _MaxLevel;           /**< actual max mipmap level (q in the spec) */
    982    GLfloat _MaxLambda;         /**< = _MaxLevel - BaseLevel (q - p in spec) */
    983    GLint CropRect[4];          /**< GL_OES_draw_texture */
    984    GLboolean _BaseComplete;    /**< Is the base texture level valid? */
    985    GLboolean _MipmapComplete;  /**< Is the whole mipmap valid? */
    986    GLboolean _IsIntegerFormat; /**< Does the texture store integer values? */
    987    GLboolean _RenderToTexture; /**< Any rendering to this texture? */
    988    GLboolean Purgeable;        /**< Is the buffer purgeable under memory
    989                                     pressure? */
    990    GLboolean Immutable;        /**< GL_ARB_texture_storage */
    991    GLboolean _IsFloat;         /**< GL_OES_float_texture */
    992    GLboolean _IsHalfFloat;     /**< GL_OES_half_float_texture */
    993    bool HandleAllocated;       /**< GL_ARB_bindless_texture */
    994 
    995    /* This should not be restored by glPopAttrib: */
    996    bool StencilSampling;       /**< Should we sample stencil instead of depth? */
    997 
    998    /** GL_OES_EGL_image_external */
    999    GLboolean External;
   1000    GLubyte RequiredTextureImageUnits;
   1001 
   1002    /** GL_EXT_memory_object */
   1003    GLenum16 TextureTiling;
   1004 
   1005    /** GL_ARB_texture_buffer_object */
   1006    GLenum16 BufferObjectFormat;
   1007    /** Equivalent Mesa format for BufferObjectFormat. */
   1008    mesa_format _BufferObjectFormat;
   1009    /* TODO: BufferObject->Name should be restored by glPopAttrib(GL_TEXTURE_BIT); */
   1010    struct gl_buffer_object *BufferObject;
   1011 
   1012    /** GL_ARB_texture_buffer_range */
   1013    GLintptr BufferOffset;
   1014    GLsizeiptr BufferSize; /**< if this is -1, use BufferObject->Size instead */
   1015 
   1016    /** Actual texture images, indexed by [cube face] and [mipmap level] */
   1017    struct gl_texture_image *Image[MAX_FACES][MAX_TEXTURE_LEVELS];
   1018 
   1019    /** GL_ARB_bindless_texture */
   1020    struct util_dynarray SamplerHandles;
   1021    struct util_dynarray ImageHandles;
   1022 };
   1023 
   1024 
   1025 /** Up to four combiner sources are possible with GL_NV_texture_env_combine4 */
   1026 #define MAX_COMBINER_TERMS 4
   1027 
   1028 
   1029 /**
   1030  * Texture combine environment state.
   1031  */
   1032 struct gl_tex_env_combine_state
   1033 {
   1034    GLenum16 ModeRGB;       /**< GL_REPLACE, GL_DECAL, GL_ADD, etc. */
   1035    GLenum16 ModeA;         /**< GL_REPLACE, GL_DECAL, GL_ADD, etc. */
   1036    /** Source terms: GL_PRIMARY_COLOR, GL_TEXTURE, etc */
   1037    GLenum16 SourceRGB[MAX_COMBINER_TERMS];
   1038    GLenum16 SourceA[MAX_COMBINER_TERMS];
   1039    /** Source operands: GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, etc */
   1040    GLenum16 OperandRGB[MAX_COMBINER_TERMS];
   1041    GLenum16 OperandA[MAX_COMBINER_TERMS];
   1042    GLubyte ScaleShiftRGB; /**< 0, 1 or 2 */
   1043    GLubyte ScaleShiftA;   /**< 0, 1 or 2 */
   1044    GLubyte _NumArgsRGB;   /**< Number of inputs used for the RGB combiner */
   1045    GLubyte _NumArgsA;     /**< Number of inputs used for the A combiner */
   1046 };
   1047 
   1048 
   1049 /** Compressed TexEnv effective Combine mode */
   1050 enum gl_tex_env_mode
   1051 {
   1052    TEXENV_MODE_REPLACE,                 /* r = a0 */
   1053    TEXENV_MODE_MODULATE,                /* r = a0 * a1 */
   1054    TEXENV_MODE_ADD,                     /* r = a0 + a1 */
   1055    TEXENV_MODE_ADD_SIGNED,              /* r = a0 + a1 - 0.5 */
   1056    TEXENV_MODE_INTERPOLATE,             /* r = a0 * a2 + a1 * (1 - a2) */
   1057    TEXENV_MODE_SUBTRACT,                /* r = a0 - a1 */
   1058    TEXENV_MODE_DOT3_RGB,                /* r = a0 . a1 */
   1059    TEXENV_MODE_DOT3_RGB_EXT,            /* r = a0 . a1 */
   1060    TEXENV_MODE_DOT3_RGBA,               /* r = a0 . a1 */
   1061    TEXENV_MODE_DOT3_RGBA_EXT,           /* r = a0 . a1 */
   1062    TEXENV_MODE_MODULATE_ADD_ATI,        /* r = a0 * a2 + a1 */
   1063    TEXENV_MODE_MODULATE_SIGNED_ADD_ATI, /* r = a0 * a2 + a1 - 0.5 */
   1064    TEXENV_MODE_MODULATE_SUBTRACT_ATI,   /* r = a0 * a2 - a1 */
   1065    TEXENV_MODE_ADD_PRODUCTS_NV,         /* r = a0 * a1 + a2 * a3 */
   1066    TEXENV_MODE_ADD_PRODUCTS_SIGNED_NV,  /* r = a0 * a1 + a2 * a3 - 0.5 */
   1067 };
   1068 
   1069 
   1070 /** Compressed TexEnv Combine source */
   1071 enum gl_tex_env_source
   1072 {
   1073    TEXENV_SRC_TEXTURE0,
   1074    TEXENV_SRC_TEXTURE1,
   1075    TEXENV_SRC_TEXTURE2,
   1076    TEXENV_SRC_TEXTURE3,
   1077    TEXENV_SRC_TEXTURE4,
   1078    TEXENV_SRC_TEXTURE5,
   1079    TEXENV_SRC_TEXTURE6,
   1080    TEXENV_SRC_TEXTURE7,
   1081    TEXENV_SRC_TEXTURE,
   1082    TEXENV_SRC_PREVIOUS,
   1083    TEXENV_SRC_PRIMARY_COLOR,
   1084    TEXENV_SRC_CONSTANT,
   1085    TEXENV_SRC_ZERO,
   1086    TEXENV_SRC_ONE,
   1087 };
   1088 
   1089 
   1090 /** Compressed TexEnv Combine operand */
   1091 enum gl_tex_env_operand
   1092 {
   1093    TEXENV_OPR_COLOR,
   1094    TEXENV_OPR_ONE_MINUS_COLOR,
   1095    TEXENV_OPR_ALPHA,
   1096    TEXENV_OPR_ONE_MINUS_ALPHA,
   1097 };
   1098 
   1099 
   1100 /** Compressed TexEnv Combine argument */
   1101 struct gl_tex_env_argument
   1102 {
   1103 #ifdef __GNUC__
   1104    __extension__ uint8_t Source:4;  /**< TEXENV_SRC_x */
   1105    __extension__ uint8_t Operand:2; /**< TEXENV_OPR_x */
   1106 #else
   1107    uint8_t Source;  /**< SRC_x */
   1108    uint8_t Operand; /**< OPR_x */
   1109 #endif
   1110 };
   1111 
   1112 
   1113 /***
   1114  * Compressed TexEnv Combine state.
   1115  */
   1116 struct gl_tex_env_combine_packed
   1117 {
   1118    uint32_t ModeRGB:4;        /**< Effective mode for RGB as 4 bits */
   1119    uint32_t ModeA:4;          /**< Effective mode for RGB as 4 bits */
   1120    uint32_t ScaleShiftRGB:2;  /**< 0, 1 or 2 */
   1121    uint32_t ScaleShiftA:2;    /**< 0, 1 or 2 */
   1122    uint32_t NumArgsRGB:3;     /**< Number of inputs used for the RGB combiner */
   1123    uint32_t NumArgsA:3;       /**< Number of inputs used for the A combiner */
   1124    /** Source arguments in a packed manner */
   1125    struct gl_tex_env_argument ArgsRGB[MAX_COMBINER_TERMS];
   1126    struct gl_tex_env_argument ArgsA[MAX_COMBINER_TERMS];
   1127 };
   1128 
   1129 
   1130 /**
   1131  * TexGenEnabled flags.
   1132  */
   1133 /*@{*/
   1134 #define S_BIT 1
   1135 #define T_BIT 2
   1136 #define R_BIT 4
   1137 #define Q_BIT 8
   1138 #define STR_BITS (S_BIT | T_BIT | R_BIT)
   1139 /*@}*/
   1140 
   1141 
   1142 /**
   1143  * Bit flag versions of the corresponding GL_ constants.
   1144  */
   1145 /*@{*/
   1146 #define TEXGEN_SPHERE_MAP        0x1
   1147 #define TEXGEN_OBJ_LINEAR        0x2
   1148 #define TEXGEN_EYE_LINEAR        0x4
   1149 #define TEXGEN_REFLECTION_MAP_NV 0x8
   1150 #define TEXGEN_NORMAL_MAP_NV     0x10
   1151 
   1152 #define TEXGEN_NEED_NORMALS   (TEXGEN_SPHERE_MAP        | \
   1153                                TEXGEN_REFLECTION_MAP_NV | \
   1154                                TEXGEN_NORMAL_MAP_NV)
   1155 #define TEXGEN_NEED_EYE_COORD (TEXGEN_SPHERE_MAP        | \
   1156                                TEXGEN_REFLECTION_MAP_NV | \
   1157                                TEXGEN_NORMAL_MAP_NV     | \
   1158                                TEXGEN_EYE_LINEAR)
   1159 /*@}*/
   1160 
   1161 
   1162 
   1163 /** Tex-gen enabled for texture unit? */
   1164 #define ENABLE_TEXGEN(unit) (1 << (unit))
   1165 
   1166 /** Non-identity texture matrix for texture unit? */
   1167 #define ENABLE_TEXMAT(unit) (1 << (unit))
   1168 
   1169 
   1170 /**
   1171  * Texture coord generation state.
   1172  */
   1173 struct gl_texgen
   1174 {
   1175    GLenum16 Mode;       /**< GL_EYE_LINEAR, GL_SPHERE_MAP, etc */
   1176    GLbitfield8 _ModeBit; /**< TEXGEN_x bit corresponding to Mode */
   1177 };
   1178 
   1179 
   1180 /**
   1181  * Sampler-related subset of a texture unit, like current texture objects.
   1182  */
   1183 struct gl_texture_unit
   1184 {
   1185    GLfloat LodBias;		/**< for biasing mipmap levels */
   1186    float LodBiasQuantized;      /**< to reduce pipe_sampler_state variants */
   1187 
   1188    /** Texture targets that have a non-default texture bound */
   1189    GLbitfield _BoundTextures;
   1190 
   1191    /** Current sampler object (GL_ARB_sampler_objects) */
   1192    struct gl_sampler_object *Sampler;
   1193 
   1194    /** Current texture object pointers */
   1195    struct gl_texture_object *CurrentTex[NUM_TEXTURE_TARGETS];
   1196 
   1197    /** Points to highest priority, complete and enabled texture object */
   1198    struct gl_texture_object *_Current;
   1199 };
   1200 
   1201 enum {
   1202    GEN_S,
   1203    GEN_T,
   1204    GEN_R,
   1205    GEN_Q,
   1206    NUM_GEN,
   1207 };
   1208 
   1209 /**
   1210  * Fixed-function-related subset of a texture unit, like enable flags,
   1211  * texture environment/function/combiners, and texgen state.
   1212  */
   1213 struct gl_fixedfunc_texture_unit
   1214 {
   1215    GLbitfield16 Enabled;          /**< bitmask of TEXTURE_*_BIT flags */
   1216 
   1217    GLenum16 EnvMode;            /**< GL_MODULATE, GL_DECAL, GL_BLEND, etc. */
   1218    GLclampf EnvColor[4];
   1219    GLfloat EnvColorUnclamped[4];
   1220 
   1221    struct gl_texgen GenS;
   1222    struct gl_texgen GenT;
   1223    struct gl_texgen GenR;
   1224    struct gl_texgen GenQ;
   1225 
   1226    GLfloat EyePlane[NUM_GEN][4];
   1227    GLfloat ObjectPlane[NUM_GEN][4];
   1228 
   1229    GLbitfield8 TexGenEnabled;	/**< Bitwise-OR of [STRQ]_BIT values */
   1230    GLbitfield8 _GenFlags;	/**< Bitwise-OR of Gen[STRQ]._ModeBit */
   1231 
   1232    /**
   1233     * \name GL_EXT_texture_env_combine
   1234     */
   1235    struct gl_tex_env_combine_state Combine;
   1236 
   1237    /**
   1238     * Derived state based on \c EnvMode and the \c BaseFormat of the
   1239     * currently enabled texture.
   1240     */
   1241    struct gl_tex_env_combine_state _EnvMode;
   1242 
   1243    /** Current compressed TexEnv & Combine state */
   1244    struct gl_tex_env_combine_packed _CurrentCombinePacked;
   1245 
   1246    /**
   1247     * Currently enabled combiner state.  This will point to either
   1248     * \c Combine or \c _EnvMode.
   1249     */
   1250    struct gl_tex_env_combine_state *_CurrentCombine;
   1251 };
   1252 
   1253 
   1254 /**
   1255  * Texture attribute group (GL_TEXTURE_BIT).
   1256  */
   1257 struct gl_texture_attrib
   1258 {
   1259    struct gl_texture_object *ProxyTex[NUM_TEXTURE_TARGETS];
   1260 
   1261    /** GL_ARB_texture_buffer_object */
   1262    struct gl_buffer_object *BufferObject;
   1263 
   1264    GLuint CurrentUnit;   /**< GL_ACTIVE_TEXTURE */
   1265 
   1266    /** Texture coord units/sets used for fragment texturing */
   1267    GLbitfield8 _EnabledCoordUnits;
   1268 
   1269    /** Texture coord units that have texgen enabled */
   1270    GLbitfield8 _TexGenEnabled;
   1271 
   1272    /** Texture coord units that have non-identity matrices */
   1273    GLbitfield8 _TexMatEnabled;
   1274 
   1275    /** Bitwise-OR of all Texture.Unit[i]._GenFlags */
   1276    GLbitfield8 _GenFlags;
   1277 
   1278    /** Largest index of a texture unit with _Current != NULL. */
   1279    GLshort _MaxEnabledTexImageUnit;
   1280 
   1281    /** Largest index + 1 of texture units that have had any CurrentTex set. */
   1282    GLubyte NumCurrentTexUsed;
   1283 
   1284    /** GL_ARB_seamless_cubemap */
   1285    GLboolean CubeMapSeamless;
   1286 
   1287    struct gl_texture_unit Unit[MAX_COMBINED_TEXTURE_IMAGE_UNITS];
   1288    struct gl_fixedfunc_texture_unit FixedFuncUnit[MAX_TEXTURE_COORD_UNITS];
   1289 };
   1290 
   1291 
   1292 /**
   1293  * Data structure representing a single clip plane (e.g. one of the elements
   1294  * of the ctx->Transform.EyeUserPlane or ctx->Transform._ClipUserPlane array).
   1295  */
   1296 typedef GLfloat gl_clip_plane[4];
   1297 
   1298 
   1299 /**
   1300  * Transformation attribute group (GL_TRANSFORM_BIT).
   1301  */
   1302 struct gl_transform_attrib
   1303 {
   1304    GLenum16 MatrixMode;				/**< Matrix mode */
   1305    gl_clip_plane EyeUserPlane[MAX_CLIP_PLANES];	/**< User clip planes */
   1306    gl_clip_plane _ClipUserPlane[MAX_CLIP_PLANES]; /**< derived */
   1307    GLbitfield ClipPlanesEnabled;                /**< on/off bitmask */
   1308    GLboolean Normalize;				/**< Normalize all normals? */
   1309    GLboolean RescaleNormals;			/**< GL_EXT_rescale_normal */
   1310    GLboolean RasterPositionUnclipped;           /**< GL_IBM_rasterpos_clip */
   1311    GLboolean DepthClampNear;			/**< GL_AMD_depth_clamp_separate */
   1312    GLboolean DepthClampFar;			/**< GL_AMD_depth_clamp_separate */
   1313    /** GL_ARB_clip_control */
   1314    GLenum16 ClipOrigin;   /**< GL_LOWER_LEFT or GL_UPPER_LEFT */
   1315    GLenum16 ClipDepthMode;/**< GL_NEGATIVE_ONE_TO_ONE or GL_ZERO_TO_ONE */
   1316 };
   1317 
   1318 
   1319 /**
   1320  * Viewport attribute group (GL_VIEWPORT_BIT).
   1321  */
   1322 struct gl_viewport_attrib
   1323 {
   1324    GLfloat X, Y;		/**< position */
   1325    GLfloat Width, Height;	/**< size */
   1326    GLfloat Near, Far;		/**< Depth buffer range */
   1327 
   1328    /**< GL_NV_viewport_swizzle */
   1329    GLenum16 SwizzleX, SwizzleY, SwizzleZ, SwizzleW;
   1330 };
   1331 
   1332 
   1333 /**
   1334  * Fields describing a mapped buffer range.
   1335  */
   1336 struct gl_buffer_mapping
   1337 {
   1338    GLbitfield AccessFlags; /**< Mask of GL_MAP_x_BIT flags */
   1339    GLvoid *Pointer;        /**< User-space address of mapping */
   1340    GLintptr Offset;        /**< Mapped offset */
   1341    GLsizeiptr Length;      /**< Mapped length */
   1342 };
   1343 
   1344 
   1345 /**
   1346  * Usages we've seen for a buffer object.
   1347  */
   1348 typedef enum
   1349 {
   1350    USAGE_UNIFORM_BUFFER = 0x1,
   1351    USAGE_TEXTURE_BUFFER = 0x2,
   1352    USAGE_ATOMIC_COUNTER_BUFFER = 0x4,
   1353    USAGE_SHADER_STORAGE_BUFFER = 0x8,
   1354    USAGE_TRANSFORM_FEEDBACK_BUFFER = 0x10,
   1355    USAGE_PIXEL_PACK_BUFFER = 0x20,
   1356    USAGE_ARRAY_BUFFER = 0x40,
   1357    USAGE_ELEMENT_ARRAY_BUFFER = 0x80,
   1358    USAGE_DISABLE_MINMAX_CACHE = 0x100,
   1359 } gl_buffer_usage;
   1360 
   1361 
   1362 /**
   1363  * GL_ARB_vertex/pixel_buffer_object buffer object
   1364  */
   1365 struct gl_buffer_object
   1366 {
   1367    GLint RefCount;
   1368    GLuint Name;
   1369    GLchar *Label;       /**< GL_KHR_debug */
   1370 
   1371    /**
   1372     * The context that holds a global buffer reference for the lifetime of
   1373     * the GL buffer ID to skip refcounting for all its private bind points.
   1374     * Other contexts must still do refcounting as usual. Shared binding points
   1375     * like TBO within gl_texture_object are always refcounted.
   1376     *
   1377     * Implementation details:
   1378     * - Only the context that creates the buffer ("creating context") skips
   1379     *   refcounting.
   1380     * - Only buffers represented by an OpenGL buffer ID skip refcounting.
   1381     *   Other internal buffers don't. (glthread requires refcounting for
   1382     *   internal buffers, etc.)
   1383     * - glDeleteBuffers removes the global buffer reference and increments
   1384     *   RefCount for all private bind points where the deleted buffer is bound
   1385     *   (e.g. unbound VAOs that are not changed by glDeleteBuffers),
   1386     *   effectively enabling refcounting for that context. This is the main
   1387     *   point where the global buffer reference is removed.
   1388     * - glDeleteBuffers called from a different context adds the buffer into
   1389     *   the ZombieBufferObjects list, which is a way to notify the creating
   1390     *   context that it should remove its global buffer reference to allow
   1391     *   freeing the buffer. The creating context walks over that list in a few
   1392     *   GL functions.
   1393     * - xxxDestroyContext walks over all buffers and removes its global
   1394     *   reference from those buffers that it created.
   1395     */
   1396    struct gl_context *Ctx;
   1397    GLint CtxRefCount;   /**< Non-atomic references held by Ctx. */
   1398 
   1399    GLenum16 Usage;      /**< GL_STREAM_DRAW_ARB, GL_STREAM_READ_ARB, etc. */
   1400    GLbitfield StorageFlags; /**< GL_MAP_PERSISTENT_BIT, etc. */
   1401    GLsizeiptrARB Size;  /**< Size of buffer storage in bytes */
   1402    GLubyte *Data;       /**< Location of storage either in RAM or VRAM. */
   1403    GLboolean DeletePending;   /**< true if buffer object is removed from the hash */
   1404    GLboolean Written;   /**< Ever written to? (for debugging) */
   1405    GLboolean Purgeable; /**< Is the buffer purgeable under memory pressure? */
   1406    GLboolean Immutable; /**< GL_ARB_buffer_storage */
   1407    gl_buffer_usage UsageHistory; /**< How has this buffer been used so far? */
   1408 
   1409    /** Counters used for buffer usage warnings */
   1410    GLuint NumSubDataCalls;
   1411    GLuint NumMapBufferWriteCalls;
   1412 
   1413    struct gl_buffer_mapping Mappings[MAP_COUNT];
   1414 
   1415    /** Memoization of min/max index computations for static index buffers */
   1416    simple_mtx_t MinMaxCacheMutex;
   1417    struct hash_table *MinMaxCache;
   1418    unsigned MinMaxCacheHitIndices;
   1419    unsigned MinMaxCacheMissIndices;
   1420    bool MinMaxCacheDirty;
   1421 
   1422    bool HandleAllocated; /**< GL_ARB_bindless_texture */
   1423 };
   1424 
   1425 
   1426 /**
   1427  * Client pixel packing/unpacking attributes
   1428  */
   1429 struct gl_pixelstore_attrib
   1430 {
   1431    GLint Alignment;
   1432    GLint RowLength;
   1433    GLint SkipPixels;
   1434    GLint SkipRows;
   1435    GLint ImageHeight;
   1436    GLint SkipImages;
   1437    GLboolean SwapBytes;
   1438    GLboolean LsbFirst;
   1439    GLboolean Invert;        /**< GL_MESA_pack_invert */
   1440    GLint CompressedBlockWidth;   /**< GL_ARB_compressed_texture_pixel_storage */
   1441    GLint CompressedBlockHeight;
   1442    GLint CompressedBlockDepth;
   1443    GLint CompressedBlockSize;
   1444    struct gl_buffer_object *BufferObj; /**< GL_ARB_pixel_buffer_object */
   1445 };
   1446 
   1447 
   1448 /**
   1449  * Enum for defining the mapping for the position/generic0 attribute.
   1450  *
   1451  * Do not change the order of the values as these are used as
   1452  * array indices.
   1453  */
   1454 typedef enum
   1455 {
   1456    ATTRIBUTE_MAP_MODE_IDENTITY, /**< 1:1 mapping */
   1457    ATTRIBUTE_MAP_MODE_POSITION, /**< get position and generic0 from position */
   1458    ATTRIBUTE_MAP_MODE_GENERIC0, /**< get position and generic0 from generic0 */
   1459    ATTRIBUTE_MAP_MODE_MAX       /**< for sizing arrays */
   1460 } gl_attribute_map_mode;
   1461 
   1462 
   1463 /**
   1464  * Attributes to describe a vertex array.
   1465  *
   1466  * Contains the size, type, format and normalization flag,
   1467  * along with the index of a vertex buffer binding point.
   1468  *
   1469  * Note that the Stride field corresponds to VERTEX_ATTRIB_ARRAY_STRIDE
   1470  * and is only present for backwards compatibility reasons.
   1471  * Rendering always uses VERTEX_BINDING_STRIDE.
   1472  * The gl*Pointer() functions will set VERTEX_ATTRIB_ARRAY_STRIDE
   1473  * and VERTEX_BINDING_STRIDE to the same value, while
   1474  * glBindVertexBuffer() will only set VERTEX_BINDING_STRIDE.
   1475  */
   1476 struct gl_array_attributes
   1477 {
   1478    /** Points to client array data. Not used when a VBO is bound */
   1479    const GLubyte *Ptr;
   1480    /** Offset of the first element relative to the binding offset */
   1481    GLuint RelativeOffset;
   1482    /** Vertex format */
   1483    struct gl_vertex_format Format;
   1484    /** Stride as specified with gl*Pointer() */
   1485    GLshort Stride;
   1486    /** Index into gl_vertex_array_object::BufferBinding[] array */
   1487    GLubyte BufferBindingIndex;
   1488 
   1489    /**
   1490     * Derived effective buffer binding index
   1491     *
   1492     * Index into the gl_vertex_buffer_binding array of the vao.
   1493     * Similar to BufferBindingIndex, but with the mapping of the
   1494     * position/generic0 attributes applied and with identical
   1495     * gl_vertex_buffer_binding entries collapsed to a single
   1496     * entry within the vao.
   1497     *
   1498     * The value is valid past calling _mesa_update_vao_derived_arrays.
   1499     * Note that _mesa_update_vao_derived_arrays is called when binding
   1500     * the VAO to Array._DrawVAO.
   1501     */
   1502    GLubyte _EffBufferBindingIndex;
   1503    /**
   1504     * Derived effective relative offset.
   1505     *
   1506     * Relative offset to the effective buffers offset in
   1507     * gl_vertex_buffer_binding::_EffOffset.
   1508     *
   1509     * The value is valid past calling _mesa_update_vao_derived_arrays.
   1510     * Note that _mesa_update_vao_derived_arrays is called when binding
   1511     * the VAO to Array._DrawVAO.
   1512     */
   1513    GLushort _EffRelativeOffset;
   1514 };
   1515 
   1516 
   1517 /**
   1518  * This describes the buffer object used for a vertex array (or
   1519  * multiple vertex arrays).  If BufferObj points to the default/null
   1520  * buffer object, then the vertex array lives in user memory and not a VBO.
   1521  */
   1522 struct gl_vertex_buffer_binding
   1523 {
   1524    GLintptr Offset;                    /**< User-specified offset */
   1525    GLsizei Stride;                     /**< User-specified stride */
   1526    GLuint InstanceDivisor;             /**< GL_ARB_instanced_arrays */
   1527    struct gl_buffer_object *BufferObj; /**< GL_ARB_vertex_buffer_object */
   1528    GLbitfield _BoundArrays;            /**< Arrays bound to this binding point */
   1529 
   1530    /**
   1531     * Derived effective bound arrays.
   1532     *
   1533     * The effective binding handles enabled arrays past the
   1534     * position/generic0 attribute mapping and reduces the refered
   1535     * gl_vertex_buffer_binding entries to a unique subset.
   1536     *
   1537     * The value is valid past calling _mesa_update_vao_derived_arrays.
   1538     * Note that _mesa_update_vao_derived_arrays is called when binding
   1539     * the VAO to Array._DrawVAO.
   1540     */
   1541    GLbitfield _EffBoundArrays;
   1542    /**
   1543     * Derived offset.
   1544     *
   1545     * The absolute offset to that we can collapse some attributes
   1546     * to this unique effective binding.
   1547     * For user space array bindings this contains the smallest pointer value
   1548     * in the bound and interleaved arrays.
   1549     * For VBO bindings this contains an offset that lets the attributes
   1550     * _EffRelativeOffset stay positive and in bounds with
   1551     * Const.MaxVertexAttribRelativeOffset
   1552     *
   1553     * The value is valid past calling _mesa_update_vao_derived_arrays.
   1554     * Note that _mesa_update_vao_derived_arrays is called when binding
   1555     * the VAO to Array._DrawVAO.
   1556     */
   1557    GLintptr _EffOffset;
   1558 };
   1559 
   1560 
   1561 /**
   1562  * A representation of "Vertex Array Objects" (VAOs) from OpenGL 3.1+ /
   1563  * the GL_ARB_vertex_array_object extension.
   1564  */
   1565 struct gl_vertex_array_object
   1566 {
   1567    /** Name of the VAO as received from glGenVertexArray. */
   1568    GLuint Name;
   1569 
   1570    GLint RefCount;
   1571 
   1572    GLchar *Label;       /**< GL_KHR_debug */
   1573 
   1574    /**
   1575     * Has this array object been bound?
   1576     */
   1577    GLboolean EverBound;
   1578 
   1579    /**
   1580     * Whether the VAO is changed by the application so often that some of
   1581     * the derived fields are not updated at all to decrease overhead.
   1582     * Also, interleaved arrays are not detected, because it's too expensive
   1583     * to do that before every draw call.
   1584     */
   1585    bool IsDynamic;
   1586 
   1587    /**
   1588     * Marked to true if the object is shared between contexts and immutable.
   1589     * Then reference counting is done using atomics and thread safe.
   1590     * Is used for dlist VAOs.
   1591     */
   1592    bool SharedAndImmutable;
   1593 
   1594    /**
   1595     * Number of updates that were done by the application. This is used to
   1596     * decide whether the VAO is static or dynamic.
   1597     */
   1598    unsigned NumUpdates;
   1599 
   1600    /** Vertex attribute arrays */
   1601    struct gl_array_attributes VertexAttrib[VERT_ATTRIB_MAX];
   1602 
   1603    /** Vertex buffer bindings */
   1604    struct gl_vertex_buffer_binding BufferBinding[VERT_ATTRIB_MAX];
   1605 
   1606    /** Mask indicating which vertex arrays have vertex buffer associated. */
   1607    GLbitfield VertexAttribBufferMask;
   1608 
   1609    /** Mask indicating which vertex arrays have a non-zero instance divisor. */
   1610    GLbitfield NonZeroDivisorMask;
   1611 
   1612    /** Mask of VERT_BIT_* values indicating which arrays are enabled */
   1613    GLbitfield Enabled;
   1614 
   1615    /**
   1616     * Mask indicating which VertexAttrib and BufferBinding structures have
   1617     * been changed since the VAO creation. No bit is ever cleared to 0 by
   1618     * state updates. Setting to the default state doesn't update this.
   1619     * (e.g. unbinding) Setting the derived state (_* fields) doesn't update
   1620     * this either.
   1621     */
   1622    GLbitfield NonDefaultStateMask;
   1623 
   1624    /**
   1625     * Mask of VERT_BIT_* enabled arrays past position/generic0 mapping
   1626     *
   1627     * The value is valid past calling _mesa_update_vao_derived_arrays.
   1628     * Note that _mesa_update_vao_derived_arrays is called when binding
   1629     * the VAO to Array._DrawVAO.
   1630     */
   1631    GLbitfield _EffEnabledVBO;
   1632 
   1633    /** Same as _EffEnabledVBO, but for instance divisors. */
   1634    GLbitfield _EffEnabledNonZeroDivisor;
   1635 
   1636    /** Denotes the way the position/generic0 attribute is mapped */
   1637    gl_attribute_map_mode _AttributeMapMode;
   1638 
   1639    /** "Enabled" with the position/generic0 attribute aliasing resolved */
   1640    GLbitfield _EnabledWithMapMode;
   1641 
   1642    /** Mask of VERT_BIT_* values indicating changed/dirty arrays */
   1643    GLbitfield NewArrays;
   1644 
   1645    /** The index buffer (also known as the element array buffer in OpenGL). */
   1646    struct gl_buffer_object *IndexBufferObj;
   1647 };
   1648 
   1649 
   1650 /**
   1651  * Vertex array state
   1652  */
   1653 struct gl_array_attrib
   1654 {
   1655    /** Currently bound array object. */
   1656    struct gl_vertex_array_object *VAO;
   1657 
   1658    /** The default vertex array object */
   1659    struct gl_vertex_array_object *DefaultVAO;
   1660 
   1661    /** The last VAO accessed by a DSA function */
   1662    struct gl_vertex_array_object *LastLookedUpVAO;
   1663 
   1664    /** These contents are copied to newly created VAOs. */
   1665    struct gl_vertex_array_object DefaultVAOState;
   1666 
   1667    /** Array objects (GL_ARB_vertex_array_object) */
   1668    struct _mesa_HashTable *Objects;
   1669 
   1670    GLint ActiveTexture;		/**< Client Active Texture */
   1671    GLuint LockFirst;            /**< GL_EXT_compiled_vertex_array */
   1672    GLuint LockCount;            /**< GL_EXT_compiled_vertex_array */
   1673 
   1674    /**
   1675     * \name Primitive restart controls
   1676     *
   1677     * Primitive restart is enabled if either \c PrimitiveRestart or
   1678     * \c PrimitiveRestartFixedIndex is set.
   1679     */
   1680    /*@{*/
   1681    GLboolean PrimitiveRestart;
   1682    GLboolean PrimitiveRestartFixedIndex;
   1683    GLboolean _PrimitiveRestart[3]; /**< Enable indexed by index_size_shift. */
   1684    GLuint RestartIndex;
   1685    GLuint _RestartIndex[3]; /**< Restart indices indexed by index_size_shift. */
   1686    /*@}*/
   1687 
   1688    /* GL_ARB_vertex_buffer_object */
   1689    struct gl_buffer_object *ArrayBufferObj;
   1690 
   1691    /**
   1692     * Vertex array object that is used with the currently active draw command.
   1693     * The _DrawVAO is either set to the currently bound VAO for array type
   1694     * draws or to internal VAO's set up by the vbo module to execute immediate
   1695     * mode or display list draws.
   1696     */
   1697    struct gl_vertex_array_object *_DrawVAO;
   1698    /**
   1699     * The VERT_BIT_* bits effectively enabled from the current _DrawVAO.
   1700     * This is always a subset of _mesa_get_vao_vp_inputs(_DrawVAO)
   1701     * but may omit those arrays that shall not be referenced by the current
   1702     * gl_vertex_program_state::_VPMode. For example the generic attributes are
   1703     * maked out form the _DrawVAO's enabled arrays when a fixed function
   1704     * array draw is executed.
   1705     */
   1706    GLbitfield _DrawVAOEnabledAttribs;
   1707    /**
   1708     * Initially or if the VAO referenced by _DrawVAO is deleted the _DrawVAO
   1709     * pointer is set to the _EmptyVAO which is just an empty VAO all the time.
   1710     */
   1711    struct gl_vertex_array_object *_EmptyVAO;
   1712 
   1713    /** Legal array datatypes and the API for which they have been computed */
   1714    GLbitfield LegalTypesMask;
   1715    gl_api LegalTypesMaskAPI;
   1716 };
   1717 
   1718 
   1719 /**
   1720  * Feedback buffer state
   1721  */
   1722 struct gl_feedback
   1723 {
   1724    GLenum16 Type;
   1725    GLbitfield _Mask;    /**< FB_* bits */
   1726    GLfloat *Buffer;
   1727    GLuint BufferSize;
   1728    GLuint Count;
   1729 };
   1730 
   1731 
   1732 /**
   1733  * Selection buffer state
   1734  */
   1735 struct gl_selection
   1736 {
   1737    GLuint *Buffer;	/**< selection buffer */
   1738    GLuint BufferSize;	/**< size of the selection buffer */
   1739    GLuint BufferCount;	/**< number of values in the selection buffer */
   1740    GLuint Hits;		/**< number of records in the selection buffer */
   1741    GLuint NameStackDepth; /**< name stack depth */
   1742    GLuint NameStack[MAX_NAME_STACK_DEPTH]; /**< name stack */
   1743    GLboolean HitFlag;	/**< hit flag */
   1744    GLfloat HitMinZ;	/**< minimum hit depth */
   1745    GLfloat HitMaxZ;	/**< maximum hit depth */
   1746 };
   1747 
   1748 
   1749 /**
   1750  * 1-D Evaluator control points
   1751  */
   1752 struct gl_1d_map
   1753 {
   1754    GLuint Order;	/**< Number of control points */
   1755    GLfloat u1, u2, du;	/**< u1, u2, 1.0/(u2-u1) */
   1756    GLfloat *Points;	/**< Points to contiguous control points */
   1757 };
   1758 
   1759 
   1760 /**
   1761  * 2-D Evaluator control points
   1762  */
   1763 struct gl_2d_map
   1764 {
   1765    GLuint Uorder;		/**< Number of control points in U dimension */
   1766    GLuint Vorder;		/**< Number of control points in V dimension */
   1767    GLfloat u1, u2, du;
   1768    GLfloat v1, v2, dv;
   1769    GLfloat *Points;		/**< Points to contiguous control points */
   1770 };
   1771 
   1772 
   1773 /**
   1774  * All evaluator control point state
   1775  */
   1776 struct gl_evaluators
   1777 {
   1778    /**
   1779     * \name 1-D maps
   1780     */
   1781    /*@{*/
   1782    struct gl_1d_map Map1Vertex3;
   1783    struct gl_1d_map Map1Vertex4;
   1784    struct gl_1d_map Map1Index;
   1785    struct gl_1d_map Map1Color4;
   1786    struct gl_1d_map Map1Normal;
   1787    struct gl_1d_map Map1Texture1;
   1788    struct gl_1d_map Map1Texture2;
   1789    struct gl_1d_map Map1Texture3;
   1790    struct gl_1d_map Map1Texture4;
   1791    /*@}*/
   1792 
   1793    /**
   1794     * \name 2-D maps
   1795     */
   1796    /*@{*/
   1797    struct gl_2d_map Map2Vertex3;
   1798    struct gl_2d_map Map2Vertex4;
   1799    struct gl_2d_map Map2Index;
   1800    struct gl_2d_map Map2Color4;
   1801    struct gl_2d_map Map2Normal;
   1802    struct gl_2d_map Map2Texture1;
   1803    struct gl_2d_map Map2Texture2;
   1804    struct gl_2d_map Map2Texture3;
   1805    struct gl_2d_map Map2Texture4;
   1806    /*@}*/
   1807 };
   1808 
   1809 
   1810 struct gl_transform_feedback_varying_info
   1811 {
   1812    char *Name;
   1813    GLenum16 Type;
   1814    GLint BufferIndex;
   1815    GLint Size;
   1816    GLint Offset;
   1817 };
   1818 
   1819 
   1820 /**
   1821  * Per-output info vertex shaders for transform feedback.
   1822  */
   1823 struct gl_transform_feedback_output
   1824 {
   1825    uint32_t OutputRegister;
   1826    uint32_t OutputBuffer;
   1827    uint32_t NumComponents;
   1828    uint32_t StreamId;
   1829 
   1830    /** offset (in DWORDs) of this output within the interleaved structure */
   1831    uint32_t DstOffset;
   1832 
   1833    /**
   1834     * Offset into the output register of the data to output.  For example,
   1835     * if NumComponents is 2 and ComponentOffset is 1, then the data to
   1836     * offset is in the y and z components of the output register.
   1837     */
   1838    uint32_t ComponentOffset;
   1839 };
   1840 
   1841 
   1842 struct gl_transform_feedback_buffer
   1843 {
   1844    uint32_t Binding;
   1845 
   1846    uint32_t NumVaryings;
   1847 
   1848    /**
   1849     * Total number of components stored in each buffer.  This may be used by
   1850     * hardware back-ends to determine the correct stride when interleaving
   1851     * multiple transform feedback outputs in the same buffer.
   1852     */
   1853    uint32_t Stride;
   1854 
   1855    /**
   1856     * Which transform feedback stream this buffer binding is associated with.
   1857     */
   1858    uint32_t Stream;
   1859 };
   1860 
   1861 
   1862 /** Post-link transform feedback info. */
   1863 struct gl_transform_feedback_info
   1864 {
   1865    unsigned NumOutputs;
   1866 
   1867    /* Bitmask of active buffer indices. */
   1868    unsigned ActiveBuffers;
   1869 
   1870    struct gl_transform_feedback_output *Outputs;
   1871 
   1872    /** Transform feedback varyings used for the linking of this shader program.
   1873     *
   1874     * Use for glGetTransformFeedbackVarying().
   1875     */
   1876    struct gl_transform_feedback_varying_info *Varyings;
   1877    GLint NumVarying;
   1878 
   1879    struct gl_transform_feedback_buffer Buffers[MAX_FEEDBACK_BUFFERS];
   1880 };
   1881 
   1882 
   1883 /**
   1884  * Transform feedback object state
   1885  */
   1886 struct gl_transform_feedback_object
   1887 {
   1888    GLuint Name;  /**< AKA the object ID */
   1889    GLint RefCount;
   1890    GLchar *Label;     /**< GL_KHR_debug */
   1891    GLboolean Active;  /**< Is transform feedback enabled? */
   1892    GLboolean Paused;  /**< Is transform feedback paused? */
   1893    GLboolean EndedAnytime; /**< Has EndTransformFeedback been called
   1894                                 at least once? */
   1895    GLboolean EverBound; /**< Has this object been bound? */
   1896 
   1897    /**
   1898     * GLES: if Active is true, remaining number of primitives which can be
   1899     * rendered without overflow.  This is necessary to track because GLES
   1900     * requires us to generate INVALID_OPERATION if a call to glDrawArrays or
   1901     * glDrawArraysInstanced would overflow transform feedback buffers.
   1902     * Undefined if Active is false.
   1903     *
   1904     * Not tracked for desktop GL since it's unnecessary.
   1905     */
   1906    unsigned GlesRemainingPrims;
   1907 
   1908    /**
   1909     * The program active when BeginTransformFeedback() was called.
   1910     * When active and unpaused, this equals ctx->Shader.CurrentProgram[stage],
   1911     * where stage is the pipeline stage that is the source of data for
   1912     * transform feedback.
   1913     */
   1914    struct gl_program *program;
   1915 
   1916    /** The feedback buffers */
   1917    GLuint BufferNames[MAX_FEEDBACK_BUFFERS];
   1918    struct gl_buffer_object *Buffers[MAX_FEEDBACK_BUFFERS];
   1919 
   1920    /** Start of feedback data in dest buffer */
   1921    GLintptr Offset[MAX_FEEDBACK_BUFFERS];
   1922 
   1923    /**
   1924     * Max data to put into dest buffer (in bytes).  Computed based on
   1925     * RequestedSize and the actual size of the buffer.
   1926     */
   1927    GLsizeiptr Size[MAX_FEEDBACK_BUFFERS];
   1928 
   1929    /**
   1930     * Size that was specified when the buffer was bound.  If the buffer was
   1931     * bound with glBindBufferBase() or glBindBufferOffsetEXT(), this value is
   1932     * zero.
   1933     */
   1934    GLsizeiptr RequestedSize[MAX_FEEDBACK_BUFFERS];
   1935 };
   1936 
   1937 
   1938 /**
   1939  * Context state for transform feedback.
   1940  */
   1941 struct gl_transform_feedback_state
   1942 {
   1943    GLenum16 Mode;     /**< GL_POINTS, GL_LINES or GL_TRIANGLES */
   1944 
   1945    /** The general binding point (GL_TRANSFORM_FEEDBACK_BUFFER) */
   1946    struct gl_buffer_object *CurrentBuffer;
   1947 
   1948    /** The table of all transform feedback objects */
   1949    struct _mesa_HashTable *Objects;
   1950 
   1951    /** The current xform-fb object (GL_TRANSFORM_FEEDBACK_BINDING) */
   1952    struct gl_transform_feedback_object *CurrentObject;
   1953 
   1954    /** The default xform-fb object (Name==0) */
   1955    struct gl_transform_feedback_object *DefaultObject;
   1956 };
   1957 
   1958 
   1959 /**
   1960  * A "performance monitor" as described in AMD_performance_monitor.
   1961  */
   1962 struct gl_perf_monitor_object
   1963 {
   1964    GLuint Name;
   1965 
   1966    /** True if the monitor is currently active (Begin called but not End). */
   1967    GLboolean Active;
   1968 
   1969    /**
   1970     * True if the monitor has ended.
   1971     *
   1972     * This is distinct from !Active because it may never have began.
   1973     */
   1974    GLboolean Ended;
   1975 
   1976    /**
   1977     * A list of groups with currently active counters.
   1978     *
   1979     * ActiveGroups[g] == n if there are n counters active from group 'g'.
   1980     */
   1981    unsigned *ActiveGroups;
   1982 
   1983    /**
   1984     * An array of bitsets, subscripted by group ID, then indexed by counter ID.
   1985     *
   1986     * Checking whether counter 'c' in group 'g' is active can be done via:
   1987     *
   1988     *    BITSET_TEST(ActiveCounters[g], c)
   1989     */
   1990    GLuint **ActiveCounters;
   1991 };
   1992 
   1993 
   1994 union gl_perf_monitor_counter_value
   1995 {
   1996    float f;
   1997    uint64_t u64;
   1998    uint32_t u32;
   1999 };
   2000 
   2001 
   2002 struct gl_perf_monitor_counter
   2003 {
   2004    /** Human readable name for the counter. */
   2005    const char *Name;
   2006 
   2007    /**
   2008     * Data type of the counter.  Valid values are FLOAT, UNSIGNED_INT,
   2009     * UNSIGNED_INT64_AMD, and PERCENTAGE_AMD.
   2010     */
   2011    GLenum16 Type;
   2012 
   2013    /** Minimum counter value. */
   2014    union gl_perf_monitor_counter_value Minimum;
   2015 
   2016    /** Maximum counter value. */
   2017    union gl_perf_monitor_counter_value Maximum;
   2018 };
   2019 
   2020 
   2021 struct gl_perf_monitor_group
   2022 {
   2023    /** Human readable name for the group. */
   2024    const char *Name;
   2025 
   2026    /**
   2027     * Maximum number of counters in this group which can be active at the
   2028     * same time.
   2029     */
   2030    GLuint MaxActiveCounters;
   2031 
   2032    /** Array of counters within this group. */
   2033    const struct gl_perf_monitor_counter *Counters;
   2034    GLuint NumCounters;
   2035 };
   2036 
   2037 
   2038 /**
   2039  * A query object instance as described in INTEL_performance_query.
   2040  *
   2041  * NB: We want to keep this and the corresponding backend structure
   2042  * relatively lean considering that applications may expect to
   2043  * allocate enough objects to be able to query around all draw calls
   2044  * in a frame.
   2045  */
   2046 struct gl_perf_query_object
   2047 {
   2048    GLuint Id;          /**< hash table ID/name */
   2049    unsigned Used:1;    /**< has been used for 1 or more queries */
   2050    unsigned Active:1;  /**< inside Begin/EndPerfQuery */
   2051    unsigned Ready:1;   /**< result is ready? */
   2052 };
   2053 
   2054 
   2055 /**
   2056  * Context state for AMD_performance_monitor.
   2057  */
   2058 struct gl_perf_monitor_state
   2059 {
   2060    /** Array of performance monitor groups (indexed by group ID) */
   2061    const struct gl_perf_monitor_group *Groups;
   2062    GLuint NumGroups;
   2063 
   2064    /** The table of all performance monitors. */
   2065    struct _mesa_HashTable *Monitors;
   2066 };
   2067 
   2068 
   2069 /**
   2070  * Context state for INTEL_performance_query.
   2071  */
   2072 struct gl_perf_query_state
   2073 {
   2074    struct _mesa_HashTable *Objects; /**< The table of all performance query objects */
   2075 };
   2076 
   2077 
   2078 /**
   2079  * A bindless sampler object.
   2080  */
   2081 struct gl_bindless_sampler
   2082 {
   2083    /** Texture unit (set by glUniform1()). */
   2084    GLubyte unit;
   2085 
   2086    /** Whether this bindless sampler is bound to a unit. */
   2087    GLboolean bound;
   2088 
   2089    /** Texture Target (TEXTURE_1D/2D/3D/etc_INDEX). */
   2090    gl_texture_index target;
   2091 
   2092    /** Pointer to the base of the data. */
   2093    GLvoid *data;
   2094 };
   2095 
   2096 
   2097 /**
   2098  * A bindless image object.
   2099  */
   2100 struct gl_bindless_image
   2101 {
   2102    /** Image unit (set by glUniform1()). */
   2103    GLubyte unit;
   2104 
   2105    /** Whether this bindless image is bound to a unit. */
   2106    GLboolean bound;
   2107 
   2108    /** Access qualifier (GL_READ_WRITE, GL_READ_ONLY, GL_WRITE_ONLY, or
   2109     * GL_NONE to indicate both read-only and write-only)
   2110     */
   2111    GLenum16 access;
   2112 
   2113    /** Pointer to the base of the data. */
   2114    GLvoid *data;
   2115 };
   2116 
   2117 
   2118 /**
   2119  * Base class for any kind of program object
   2120  */
   2121 struct gl_program
   2122 {
   2123    /** FIXME: This must be first until we split shader_info from nir_shader */
   2124    struct shader_info info;
   2125 
   2126    GLuint Id;
   2127    GLint RefCount;
   2128    GLubyte *String;  /**< Null-terminated program text */
   2129 
   2130    /** GL_VERTEX/FRAGMENT_PROGRAM_ARB, GL_GEOMETRY_PROGRAM_NV */
   2131    GLenum16 Target;
   2132    GLenum16 Format;    /**< String encoding format */
   2133 
   2134    GLboolean _Used;        /**< Ever used for drawing? Used for debugging */
   2135 
   2136    struct nir_shader *nir;
   2137 
   2138    /* Saved and restored with metadata. Freed with ralloc. */
   2139    void *driver_cache_blob;
   2140    size_t driver_cache_blob_size;
   2141 
   2142    /** Is this program written to on disk shader cache */
   2143    bool program_written_to_cache;
   2144 
   2145    /** A bitfield indicating which vertex shader inputs consume two slots
   2146     *
   2147     * This is used for mapping from single-slot input locations in the GL API
   2148     * to dual-slot double input locations in the shader.  This field is set
   2149     * once as part of linking and never updated again to ensure the mapping
   2150     * remains consistent.
   2151     *
   2152     * Note: There may be dual-slot variables in the original shader source
   2153     * which do not appear in this bitfield due to having been eliminated by
   2154     * the compiler prior to DualSlotInputs being calculated.  There may also
   2155     * be bits set in this bitfield which are set but which the shader never
   2156     * reads due to compiler optimizations eliminating such variables after
   2157     * DualSlotInputs is calculated.
   2158     */
   2159    GLbitfield64 DualSlotInputs;
   2160    /** Subset of OutputsWritten outputs written with non-zero index. */
   2161    GLbitfield64 SecondaryOutputsWritten;
   2162    /** TEXTURE_x_BIT bitmask */
   2163    GLbitfield16 TexturesUsed[MAX_COMBINED_TEXTURE_IMAGE_UNITS];
   2164    /** Bitfield of which samplers are used */
   2165    GLbitfield SamplersUsed;
   2166    /** Texture units used for shadow sampling. */
   2167    GLbitfield ShadowSamplers;
   2168    /** Texture units used for samplerExternalOES */
   2169    GLbitfield ExternalSamplersUsed;
   2170 
   2171    /** Named parameters, constants, etc. from program text */
   2172    struct gl_program_parameter_list *Parameters;
   2173 
   2174    /** Map from sampler unit to texture unit (set by glUniform1i()) */
   2175    GLubyte SamplerUnits[MAX_SAMPLERS];
   2176 
   2177    /* FIXME: We should be able to make this struct a union. However some
   2178     * drivers (i915/fragment_programs, swrast/prog_execute) mix the use of
   2179     * these fields, we should fix this.
   2180     */
   2181    struct {
   2182       /** Fields used by GLSL programs */
   2183       struct {
   2184          /** Data shared by gl_program and gl_shader_program */
   2185          struct gl_shader_program_data *data;
   2186 
   2187          struct gl_active_atomic_buffer **AtomicBuffers;
   2188 
   2189          /** Post-link transform feedback info. */
   2190          struct gl_transform_feedback_info *LinkedTransformFeedback;
   2191 
   2192          /**
   2193           * Number of types for subroutine uniforms.
   2194           */
   2195          GLuint NumSubroutineUniformTypes;
   2196 
   2197          /**
   2198           * Subroutine uniform remap table
   2199           * based on the program level uniform remap table.
   2200           */
   2201          GLuint NumSubroutineUniforms; /* non-sparse total */
   2202          GLuint NumSubroutineUniformRemapTable;
   2203          struct gl_uniform_storage **SubroutineUniformRemapTable;
   2204 
   2205          /**
   2206           * Num of subroutine functions for this stage and storage for them.
   2207           */
   2208          GLuint NumSubroutineFunctions;
   2209          GLuint MaxSubroutineFunctionIndex;
   2210          struct gl_subroutine_function *SubroutineFunctions;
   2211 
   2212          /**
   2213           * Map from image uniform index to image unit (set by glUniform1i())
   2214           *
   2215           * An image uniform index is associated with each image uniform by
   2216           * the linker.  The image index associated with each uniform is
   2217           * stored in the \c gl_uniform_storage::image field.
   2218           */
   2219          GLubyte ImageUnits[MAX_IMAGE_UNIFORMS];
   2220 
   2221          /**
   2222           * Access qualifier specified in the shader for each image uniform
   2223           * index.  Either \c GL_READ_ONLY, \c GL_WRITE_ONLY, \c
   2224           * GL_READ_WRITE, or \c GL_NONE to indicate both read-only and
   2225           * write-only.
   2226           *
   2227           * It may be different, though only more strict than the value of
   2228           * \c gl_image_unit::Access for the corresponding image unit.
   2229           */
   2230          GLenum16 ImageAccess[MAX_IMAGE_UNIFORMS];
   2231 
   2232          GLuint NumUniformBlocks;
   2233          struct gl_uniform_block **UniformBlocks;
   2234          struct gl_uniform_block **ShaderStorageBlocks;
   2235 
   2236          /**
   2237           * Bitmask of shader storage blocks not declared as read-only.
   2238           */
   2239          unsigned ShaderStorageBlocksWriteAccess;
   2240 
   2241          /** Which texture target is being sampled
   2242           * (TEXTURE_1D/2D/3D/etc_INDEX)
   2243           */
   2244          GLubyte SamplerTargets[MAX_SAMPLERS];
   2245 
   2246          /**
   2247           * Number of samplers declared with the bindless_sampler layout
   2248           * qualifier as specified by ARB_bindless_texture.
   2249           */
   2250          GLuint NumBindlessSamplers;
   2251          GLboolean HasBoundBindlessSampler;
   2252          struct gl_bindless_sampler *BindlessSamplers;
   2253 
   2254          /**
   2255           * Number of images declared with the bindless_image layout qualifier
   2256           * as specified by ARB_bindless_texture.
   2257           */
   2258          GLuint NumBindlessImages;
   2259          GLboolean HasBoundBindlessImage;
   2260          struct gl_bindless_image *BindlessImages;
   2261       } sh;
   2262 
   2263       /** ARB assembly-style program fields */
   2264       struct {
   2265          struct prog_instruction *Instructions;
   2266 
   2267          /**
   2268           * Local parameters used by the program.
   2269           *
   2270           * It's dynamically allocated because it is rarely used (just
   2271           * assembly-style programs), and MAX_PROGRAM_LOCAL_PARAMS entries
   2272           * once it's allocated.
   2273           */
   2274          GLfloat (*LocalParams)[4];
   2275          unsigned MaxLocalParams;
   2276 
   2277          /** Bitmask of which register files are read/written with indirect
   2278           * addressing.  Mask of (1 << PROGRAM_x) bits.
   2279           */
   2280          GLbitfield IndirectRegisterFiles;
   2281 
   2282          /** Logical counts */
   2283          /*@{*/
   2284          GLuint NumInstructions;
   2285          GLuint NumTemporaries;
   2286          GLuint NumParameters;
   2287          GLuint NumAttributes;
   2288          GLuint NumAddressRegs;
   2289          GLuint NumAluInstructions;
   2290          GLuint NumTexInstructions;
   2291          GLuint NumTexIndirections;
   2292          /*@}*/
   2293          /** Native, actual h/w counts */
   2294          /*@{*/
   2295          GLuint NumNativeInstructions;
   2296          GLuint NumNativeTemporaries;
   2297          GLuint NumNativeParameters;
   2298          GLuint NumNativeAttributes;
   2299          GLuint NumNativeAddressRegs;
   2300          GLuint NumNativeAluInstructions;
   2301          GLuint NumNativeTexInstructions;
   2302          GLuint NumNativeTexIndirections;
   2303          /*@}*/
   2304 
   2305          /** Used by ARB assembly-style programs. Can only be true for vertex
   2306           * programs.
   2307           */
   2308          GLboolean IsPositionInvariant;
   2309       } arb;
   2310    };
   2311 };
   2312 
   2313 
   2314 /**
   2315  * State common to vertex and fragment programs.
   2316  */
   2317 struct gl_program_state
   2318 {
   2319    GLint ErrorPos;                       /* GL_PROGRAM_ERROR_POSITION_ARB/NV */
   2320    const char *ErrorString;              /* GL_PROGRAM_ERROR_STRING_ARB/NV */
   2321 };
   2322 
   2323 
   2324 /**
   2325  * Context state for vertex programs.
   2326  */
   2327 struct gl_vertex_program_state
   2328 {
   2329    GLboolean Enabled;            /**< User-set GL_VERTEX_PROGRAM_ARB/NV flag */
   2330    GLboolean PointSizeEnabled;   /**< GL_VERTEX_PROGRAM_POINT_SIZE_ARB/NV */
   2331    GLboolean TwoSideEnabled;     /**< GL_VERTEX_PROGRAM_TWO_SIDE_ARB/NV */
   2332    /** Should fixed-function T&L be implemented with a vertex prog? */
   2333    GLboolean _MaintainTnlProgram;
   2334    /** Whether the fixed-func program is being used right now. */
   2335    GLboolean _UsesTnlProgram;
   2336 
   2337    struct gl_program *Current;  /**< User-bound vertex program */
   2338 
   2339    /** Currently enabled and valid vertex program (including internal
   2340     * programs, user-defined vertex programs and GLSL vertex shaders).
   2341     * This is the program we must use when rendering.
   2342     */
   2343    struct gl_program *_Current;
   2344 
   2345    GLfloat Parameters[MAX_PROGRAM_ENV_PARAMS][4]; /**< Env params */
   2346 
   2347    /** Program to emulate fixed-function T&L (see above) */
   2348    struct gl_program *_TnlProgram;
   2349 
   2350    /** Cache of fixed-function programs */
   2351    struct gl_program_cache *Cache;
   2352 
   2353    GLboolean _Overriden;
   2354 
   2355    bool _VPModeOptimizesConstantAttribs;
   2356 
   2357    /**
   2358     * If we have a vertex program, a TNL program or no program at all.
   2359     * Note that this value should be kept up to date all the time,
   2360     * nevertheless its correctness is asserted in _mesa_update_state.
   2361     * The reason is to avoid calling _mesa_update_state twice we need
   2362     * this value on draw *before* actually calling _mesa_update_state.
   2363     * Also it should need to get recomputed only on changes to the
   2364     * vertex program which are heavyweight already.
   2365     */
   2366    gl_vertex_processing_mode _VPMode;
   2367 
   2368    GLbitfield _VaryingInputs;  /**< mask of VERT_BIT_* flags */
   2369    GLbitfield _VPModeInputFilter;
   2370 };
   2371 
   2372 /**
   2373  * Context state for tessellation control programs.
   2374  */
   2375 struct gl_tess_ctrl_program_state
   2376 {
   2377    /** Currently bound and valid shader. */
   2378    struct gl_program *_Current;
   2379 
   2380    GLint patch_vertices;
   2381    GLfloat patch_default_outer_level[4];
   2382    GLfloat patch_default_inner_level[2];
   2383 };
   2384 
   2385 /**
   2386  * Context state for tessellation evaluation programs.
   2387  */
   2388 struct gl_tess_eval_program_state
   2389 {
   2390    /** Currently bound and valid shader. */
   2391    struct gl_program *_Current;
   2392 };
   2393 
   2394 /**
   2395  * Context state for geometry programs.
   2396  */
   2397 struct gl_geometry_program_state
   2398 {
   2399    /**
   2400     * Currently enabled and valid program (including internal programs
   2401     * and compiled shader programs).
   2402     */
   2403    struct gl_program *_Current;
   2404 };
   2405 
   2406 /**
   2407  * Context state for fragment programs.
   2408  */
   2409 struct gl_fragment_program_state
   2410 {
   2411    GLboolean Enabled;     /**< User-set fragment program enable flag */
   2412    /** Should fixed-function texturing be implemented with a fragment prog? */
   2413    GLboolean _MaintainTexEnvProgram;
   2414    /** Whether the fixed-func program is being used right now. */
   2415    GLboolean _UsesTexEnvProgram;
   2416 
   2417    struct gl_program *Current;  /**< User-bound fragment program */
   2418 
   2419    /**
   2420     * Currently enabled and valid fragment program (including internal
   2421     * programs, user-defined fragment programs and GLSL fragment shaders).
   2422     * This is the program we must use when rendering.
   2423     */
   2424    struct gl_program *_Current;
   2425 
   2426    GLfloat Parameters[MAX_PROGRAM_ENV_PARAMS][4]; /**< Env params */
   2427 
   2428    /** Program to emulate fixed-function texture env/combine (see above) */
   2429    struct gl_program *_TexEnvProgram;
   2430 
   2431    /** Cache of fixed-function programs */
   2432    struct gl_program_cache *Cache;
   2433 };
   2434 
   2435 
   2436 /**
   2437  * Context state for compute programs.
   2438  */
   2439 struct gl_compute_program_state
   2440 {
   2441    /** Currently enabled and valid program (including internal programs
   2442     * and compiled shader programs).
   2443     */
   2444    struct gl_program *_Current;
   2445 };
   2446 
   2447 
   2448 /**
   2449  * ATI_fragment_shader runtime state
   2450  */
   2451 
   2452 struct atifs_instruction;
   2453 struct atifs_setupinst;
   2454 
   2455 /**
   2456  * ATI fragment shader
   2457  */
   2458 struct ati_fragment_shader
   2459 {
   2460    GLuint Id;
   2461    GLint RefCount;
   2462    struct atifs_instruction *Instructions[2];
   2463    struct atifs_setupinst *SetupInst[2];
   2464    GLfloat Constants[8][4];
   2465    GLbitfield LocalConstDef;  /**< Indicates which constants have been set */
   2466    GLubyte numArithInstr[2];
   2467    GLubyte regsAssigned[2];
   2468    GLubyte NumPasses;         /**< 1 or 2 */
   2469    /**
   2470     * Current compile stage: 0 setup pass1, 1 arith pass1,
   2471     * 2 setup pass2, 3 arith pass2.
   2472     */
   2473    GLubyte cur_pass;
   2474    GLubyte last_optype;
   2475    GLboolean interpinp1;
   2476    GLboolean isValid;
   2477    /**
   2478     * Array of 2 bit values for each tex unit to remember whether
   2479     * STR or STQ swizzle was used
   2480     */
   2481    GLuint swizzlerq;
   2482    struct gl_program *Program;
   2483 };
   2484 
   2485 /**
   2486  * Context state for GL_ATI_fragment_shader
   2487  */
   2488 struct gl_ati_fragment_shader_state
   2489 {
   2490    GLboolean Enabled;
   2491    GLboolean Compiling;
   2492    GLfloat GlobalConstants[8][4];
   2493    struct ati_fragment_shader *Current;
   2494 };
   2495 
   2496 /**
   2497  *  Shader subroutine function definition
   2498  */
   2499 struct gl_subroutine_function
   2500 {
   2501    char *name;
   2502    int index;
   2503    int num_compat_types;
   2504    const struct glsl_type **types;
   2505 };
   2506 
   2507 /**
   2508  * Shader information needed by both gl_shader and gl_linked shader.
   2509  */
   2510 struct gl_shader_info
   2511 {
   2512    /**
   2513     * Tessellation Control shader state from layout qualifiers.
   2514     */
   2515    struct {
   2516       /**
   2517        * 0 - vertices not declared in shader, or
   2518        * 1 .. GL_MAX_PATCH_VERTICES
   2519        */
   2520       GLint VerticesOut;
   2521    } TessCtrl;
   2522 
   2523    /**
   2524     * Tessellation Evaluation shader state from layout qualifiers.
   2525     */
   2526    struct {
   2527       /**
   2528        * GL_TRIANGLES, GL_QUADS, GL_ISOLINES or PRIM_UNKNOWN if it's not set
   2529        * in this shader.
   2530        */
   2531       GLenum16 PrimitiveMode;
   2532 
   2533       enum gl_tess_spacing Spacing;
   2534 
   2535       /**
   2536        * GL_CW, GL_CCW, or 0 if it's not set in this shader.
   2537        */
   2538       GLenum16 VertexOrder;
   2539       /**
   2540        * 1, 0, or -1 if it's not set in this shader.
   2541        */
   2542       int PointMode;
   2543    } TessEval;
   2544 
   2545    /**
   2546     * Geometry shader state from GLSL 1.50 layout qualifiers.
   2547     */
   2548    struct {
   2549       GLint VerticesOut;
   2550       /**
   2551        * 0 - Invocations count not declared in shader, or
   2552        * 1 .. Const.MaxGeometryShaderInvocations
   2553        */
   2554       GLint Invocations;
   2555       /**
   2556        * GL_POINTS, GL_LINES, GL_LINES_ADJACENCY, GL_TRIANGLES, or
   2557        * GL_TRIANGLES_ADJACENCY, or PRIM_UNKNOWN if it's not set in this
   2558        * shader.
   2559        */
   2560       GLenum16 InputType;
   2561        /**
   2562         * GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP, or PRIM_UNKNOWN if
   2563         * it's not set in this shader.
   2564         */
   2565       GLenum16 OutputType;
   2566    } Geom;
   2567 
   2568    /**
   2569     * Compute shader state from ARB_compute_shader and
   2570     * ARB_compute_variable_group_size layout qualifiers.
   2571     */
   2572    struct {
   2573       /**
   2574        * Size specified using local_size_{x,y,z}, or all 0's to indicate that
   2575        * it's not set in this shader.
   2576        */
   2577       unsigned LocalSize[3];
   2578 
   2579       /**
   2580        * Whether a variable work group size has been specified as defined by
   2581        * ARB_compute_variable_group_size.
   2582        */
   2583       bool LocalSizeVariable;
   2584 
   2585       /*
   2586        * Arrangement of invocations used to calculate derivatives in a compute
   2587        * shader.  From NV_compute_shader_derivatives.
   2588        */
   2589       enum gl_derivative_group DerivativeGroup;
   2590    } Comp;
   2591 };
   2592 
   2593 /**
   2594  * A linked GLSL shader object.
   2595  */
   2596 struct gl_linked_shader
   2597 {
   2598    gl_shader_stage Stage;
   2599 
   2600 #ifdef DEBUG
   2601    unsigned SourceChecksum;
   2602 #endif
   2603 
   2604    struct gl_program *Program;  /**< Post-compile assembly code */
   2605 
   2606    /**
   2607     * \name Sampler tracking
   2608     *
   2609     * \note Each of these fields is only set post-linking.
   2610     */
   2611    /*@{*/
   2612    GLbitfield shadow_samplers;	/**< Samplers used for shadow sampling. */
   2613    /*@}*/
   2614 
   2615    /**
   2616     * Number of default uniform block components used by this shader.
   2617     *
   2618     * This field is only set post-linking.
   2619     */
   2620    unsigned num_uniform_components;
   2621 
   2622    /**
   2623     * Number of combined uniform components used by this shader.
   2624     *
   2625     * This field is only set post-linking.  It is the sum of the uniform block
   2626     * sizes divided by sizeof(float), and num_uniform_compoennts.
   2627     */
   2628    unsigned num_combined_uniform_components;
   2629 
   2630    struct exec_list *ir;
   2631    struct exec_list *packed_varyings;
   2632    struct exec_list *fragdata_arrays;
   2633    struct glsl_symbol_table *symbols;
   2634 
   2635    /**
   2636     * ARB_gl_spirv related data.
   2637     *
   2638     * This is actually a reference to the gl_shader::spirv_data, which
   2639     * stores information that is also needed during linking.
   2640     */
   2641    struct gl_shader_spirv_data *spirv_data;
   2642 };
   2643 
   2644 
   2645 /**
   2646  * Compile status enum. COMPILE_SKIPPED is used to indicate the compile
   2647  * was skipped due to the shader matching one that's been seen before by
   2648  * the on-disk cache.
   2649  */
   2650 enum gl_compile_status
   2651 {
   2652    COMPILE_FAILURE = 0,
   2653    COMPILE_SUCCESS,
   2654    COMPILE_SKIPPED
   2655 };
   2656 
   2657 /**
   2658  * A GLSL shader object.
   2659  */
   2660 struct gl_shader
   2661 {
   2662    /** GL_FRAGMENT_SHADER || GL_VERTEX_SHADER || GL_GEOMETRY_SHADER_ARB ||
   2663     *  GL_TESS_CONTROL_SHADER || GL_TESS_EVALUATION_SHADER.
   2664     * Must be the first field.
   2665     */
   2666    GLenum16 Type;
   2667    gl_shader_stage Stage;
   2668    GLuint Name;  /**< AKA the handle */
   2669    GLint RefCount;  /**< Reference count */
   2670    GLchar *Label;   /**< GL_KHR_debug */
   2671    unsigned char sha1[20]; /**< SHA1 hash of pre-processed source */
   2672    GLboolean DeletePending;
   2673    bool IsES;              /**< True if this shader uses GLSL ES */
   2674 
   2675    enum gl_compile_status CompileStatus;
   2676 
   2677 #ifdef DEBUG
   2678    unsigned SourceChecksum;       /**< for debug/logging purposes */
   2679 #endif
   2680    const GLchar *Source;  /**< Source code string */
   2681 
   2682    const GLchar *FallbackSource;  /**< Fallback string used by on-disk cache*/
   2683 
   2684    GLchar *InfoLog;
   2685 
   2686    unsigned Version;       /**< GLSL version used for linking */
   2687 
   2688    /**
   2689     * A bitmask of gl_advanced_blend_mode values
   2690     */
   2691    GLbitfield BlendSupport;
   2692 
   2693    struct exec_list *ir;
   2694    struct glsl_symbol_table *symbols;
   2695 
   2696    /**
   2697     * Whether early fragment tests are enabled as defined by
   2698     * ARB_shader_image_load_store.
   2699     */
   2700    bool EarlyFragmentTests;
   2701 
   2702    bool ARB_fragment_coord_conventions_enable;
   2703 
   2704    bool redeclares_gl_fragcoord;
   2705    bool uses_gl_fragcoord;
   2706 
   2707    bool PostDepthCoverage;
   2708    bool PixelInterlockOrdered;
   2709    bool PixelInterlockUnordered;
   2710    bool SampleInterlockOrdered;
   2711    bool SampleInterlockUnordered;
   2712    bool InnerCoverage;
   2713 
   2714    /**
   2715     * Fragment shader state from GLSL 1.50 layout qualifiers.
   2716     */
   2717    bool origin_upper_left;
   2718    bool pixel_center_integer;
   2719 
   2720    /**
   2721     * Whether bindless_sampler/bindless_image, and respectively
   2722     * bound_sampler/bound_image are declared at global scope as defined by
   2723     * ARB_bindless_texture.
   2724     */
   2725    bool bindless_sampler;
   2726    bool bindless_image;
   2727    bool bound_sampler;
   2728    bool bound_image;
   2729 
   2730    /**
   2731     * Whether layer output is viewport-relative.
   2732     */
   2733    bool redeclares_gl_layer;
   2734    bool layer_viewport_relative;
   2735 
   2736    /** Global xfb_stride out qualifier if any */
   2737    GLuint TransformFeedbackBufferStride[MAX_FEEDBACK_BUFFERS];
   2738 
   2739    struct gl_shader_info info;
   2740 
   2741    /* ARB_gl_spirv related data */
   2742    struct gl_shader_spirv_data *spirv_data;
   2743 };
   2744 
   2745 
   2746 struct gl_uniform_buffer_variable
   2747 {
   2748    char *Name;
   2749 
   2750    /**
   2751     * Name of the uniform as seen by glGetUniformIndices.
   2752     *
   2753     * glGetUniformIndices requires that the block instance index \b not be
   2754     * present in the name of queried uniforms.
   2755     *
   2756     * \note
   2757     * \c gl_uniform_buffer_variable::IndexName and
   2758     * \c gl_uniform_buffer_variable::Name may point to identical storage.
   2759     */
   2760    char *IndexName;
   2761 
   2762    const struct glsl_type *Type;
   2763    unsigned int Offset;
   2764    GLboolean RowMajor;
   2765 };
   2766 
   2767 
   2768 struct gl_uniform_block
   2769 {
   2770    /** Declared name of the uniform block */
   2771    char *Name;
   2772 
   2773    /** Array of supplemental information about UBO ir_variables. */
   2774    struct gl_uniform_buffer_variable *Uniforms;
   2775    GLuint NumUniforms;
   2776 
   2777    /**
   2778     * Index (GL_UNIFORM_BLOCK_BINDING) into ctx->UniformBufferBindings[] to use
   2779     * with glBindBufferBase to bind a buffer object to this uniform block.
   2780     */
   2781    GLuint Binding;
   2782 
   2783    /**
   2784     * Minimum size (in bytes) of a buffer object to back this uniform buffer
   2785     * (GL_UNIFORM_BLOCK_DATA_SIZE).
   2786     */
   2787    GLuint UniformBufferSize;
   2788 
   2789    /** Stages that reference this block */
   2790    uint8_t stageref;
   2791 
   2792    /**
   2793     * Linearized array index for uniform block instance arrays
   2794     *
   2795     * Given a uniform block instance array declared with size
   2796     * blk[s_0][s_1]..[s_m], the block referenced by blk[i_0][i_1]..[i_m] will
   2797     * have the linearized array index
   2798     *
   2799     *           m-1       m
   2800     *     i_m +    i_j *      s_k
   2801     *           j=0       k=j+1
   2802     *
   2803     * For a uniform block instance that is not an array, this is always 0.
   2804     */
   2805    uint8_t linearized_array_index;
   2806 
   2807    /**
   2808     * Layout specified in the shader
   2809     *
   2810     * This isn't accessible through the API, but it is used while
   2811     * cross-validating uniform blocks.
   2812     */
   2813    enum glsl_interface_packing _Packing;
   2814    GLboolean _RowMajor;
   2815 };
   2816 
   2817 /**
   2818  * Structure that represents a reference to an atomic buffer from some
   2819  * shader program.
   2820  */
   2821 struct gl_active_atomic_buffer
   2822 {
   2823    /** Uniform indices of the atomic counters declared within it. */
   2824    GLuint *Uniforms;
   2825    GLuint NumUniforms;
   2826 
   2827    /** Binding point index associated with it. */
   2828    GLuint Binding;
   2829 
   2830    /** Minimum reasonable size it is expected to have. */
   2831    GLuint MinimumSize;
   2832 
   2833    /** Shader stages making use of it. */
   2834    GLboolean StageReferences[MESA_SHADER_STAGES];
   2835 };
   2836 
   2837 /**
   2838  * Data container for shader queries. This holds only the minimal
   2839  * amount of required information for resource queries to work.
   2840  */
   2841 struct gl_shader_variable
   2842 {
   2843    /**
   2844     * Declared type of the variable
   2845     */
   2846    const struct glsl_type *type;
   2847 
   2848    /**
   2849     * If the variable is in an interface block, this is the type of the block.
   2850     */
   2851    const struct glsl_type *interface_type;
   2852 
   2853    /**
   2854     * For variables inside structs (possibly recursively), this is the
   2855     * outermost struct type.
   2856     */
   2857    const struct glsl_type *outermost_struct_type;
   2858 
   2859    /**
   2860     * Declared name of the variable
   2861     */
   2862    char *name;
   2863 
   2864    /**
   2865     * Storage location of the base of this variable
   2866     *
   2867     * The precise meaning of this field depends on the nature of the variable.
   2868     *
   2869     *   - Vertex shader input: one of the values from \c gl_vert_attrib.
   2870     *   - Vertex shader output: one of the values from \c gl_varying_slot.
   2871     *   - Geometry shader input: one of the values from \c gl_varying_slot.
   2872     *   - Geometry shader output: one of the values from \c gl_varying_slot.
   2873     *   - Fragment shader input: one of the values from \c gl_varying_slot.
   2874     *   - Fragment shader output: one of the values from \c gl_frag_result.
   2875     *   - Uniforms: Per-stage uniform slot number for default uniform block.
   2876     *   - Uniforms: Index within the uniform block definition for UBO members.
   2877     *   - Non-UBO Uniforms: explicit location until linking then reused to
   2878     *     store uniform slot number.
   2879     *   - Other: This field is not currently used.
   2880     *
   2881     * If the variable is a uniform, shader input, or shader output, and the
   2882     * slot has not been assigned, the value will be -1.
   2883     */
   2884    int location;
   2885 
   2886    /**
   2887     * Specifies the first component the variable is stored in as per
   2888     * ARB_enhanced_layouts.
   2889     */
   2890    unsigned component:2;
   2891 
   2892    /**
   2893     * Output index for dual source blending.
   2894     *
   2895     * \note
   2896     * The GLSL spec only allows the values 0 or 1 for the index in \b dual
   2897     * source blending.
   2898     */
   2899    unsigned index:1;
   2900 
   2901    /**
   2902     * Specifies whether a shader input/output is per-patch in tessellation
   2903     * shader stages.
   2904     */
   2905    unsigned patch:1;
   2906 
   2907    /**
   2908     * Storage class of the variable.
   2909     *
   2910     * \sa (n)ir_variable_mode
   2911     */
   2912    unsigned mode:4;
   2913 
   2914    /**
   2915     * Interpolation mode for shader inputs / outputs
   2916     *
   2917     * \sa glsl_interp_mode
   2918     */
   2919    unsigned interpolation:2;
   2920 
   2921    /**
   2922     * Was the location explicitly set in the shader?
   2923     *
   2924     * If the location is explicitly set in the shader, it \b cannot be changed
   2925     * by the linker or by the API (e.g., calls to \c glBindAttribLocation have
   2926     * no effect).
   2927     */
   2928    unsigned explicit_location:1;
   2929 
   2930    /**
   2931     * Precision qualifier.
   2932     */
   2933    unsigned precision:2;
   2934 };
   2935 
   2936 /**
   2937  * Active resource in a gl_shader_program
   2938  */
   2939 struct gl_program_resource
   2940 {
   2941    GLenum16 Type; /** Program interface type. */
   2942    const void *Data; /** Pointer to resource associated data structure. */
   2943    uint8_t StageReferences; /** Bitmask of shader stage references. */
   2944 };
   2945 
   2946 /**
   2947  * Link status enum. LINKING_SKIPPED is used to indicate linking
   2948  * was skipped due to the shader being loaded from the on-disk cache.
   2949  */
   2950 enum gl_link_status
   2951 {
   2952    LINKING_FAILURE = 0,
   2953    LINKING_SUCCESS,
   2954    LINKING_SKIPPED
   2955 };
   2956 
   2957 /**
   2958  * A data structure to be shared by gl_shader_program and gl_program.
   2959  */
   2960 struct gl_shader_program_data
   2961 {
   2962    GLint RefCount;  /**< Reference count */
   2963 
   2964    /** SHA1 hash of linked shader program */
   2965    unsigned char sha1[20];
   2966 
   2967    unsigned NumUniformStorage;
   2968    unsigned NumHiddenUniforms;
   2969    struct gl_uniform_storage *UniformStorage;
   2970 
   2971    unsigned NumUniformBlocks;
   2972    unsigned NumShaderStorageBlocks;
   2973 
   2974    struct gl_uniform_block *UniformBlocks;
   2975    struct gl_uniform_block *ShaderStorageBlocks;
   2976 
   2977    struct gl_active_atomic_buffer *AtomicBuffers;
   2978    unsigned NumAtomicBuffers;
   2979 
   2980    /* Shader cache variables used during restore */
   2981    unsigned NumUniformDataSlots;
   2982    union gl_constant_value *UniformDataSlots;
   2983 
   2984    /* Used to hold initial uniform values for program binary restores.
   2985     *
   2986     * From the ARB_get_program_binary spec:
   2987     *
   2988     *    "A successful call to ProgramBinary will reset all uniform
   2989     *    variables to their initial values. The initial value is either
   2990     *    the value of the variable's initializer as specified in the
   2991     *    original shader source, or 0 if no initializer was present.
   2992     */
   2993    union gl_constant_value *UniformDataDefaults;
   2994 
   2995    /** Hash for quick search by name. */
   2996    struct hash_table_u64 *ProgramResourceHash;
   2997 
   2998    GLboolean Validated;
   2999 
   3000    /** List of all active resources after linking. */
   3001    struct gl_program_resource *ProgramResourceList;
   3002    unsigned NumProgramResourceList;
   3003 
   3004    enum gl_link_status LinkStatus;   /**< GL_LINK_STATUS */
   3005    GLchar *InfoLog;
   3006 
   3007    unsigned Version;       /**< GLSL version used for linking */
   3008 
   3009    /* Mask of stages this program was linked against */
   3010    unsigned linked_stages;
   3011 
   3012    /* Whether the shaders of this program are loaded from SPIR-V binaries
   3013     * (all have the SPIR_V_BINARY_ARB state). This was introduced by the
   3014     * ARB_gl_spirv extension.
   3015     */
   3016    bool spirv;
   3017 };
   3018 
   3019 /**
   3020  * A GLSL program object.
   3021  * Basically a linked collection of vertex and fragment shaders.
   3022  */
   3023 struct gl_shader_program
   3024 {
   3025    GLenum16 Type;   /**< Always GL_SHADER_PROGRAM (internal token) */
   3026    GLuint Name;  /**< aka handle or ID */
   3027    GLchar *Label;   /**< GL_KHR_debug */
   3028    GLint RefCount;  /**< Reference count */
   3029    GLboolean DeletePending;
   3030 
   3031    /**
   3032     * Is the application intending to glGetProgramBinary this program?
   3033     *
   3034     * BinaryRetrievableHint is the currently active hint that gets set
   3035     * during initialization and after linking and BinaryRetrievableHintPending
   3036     * is the hint set by the user to be active when program is linked next time.
   3037     */
   3038    GLboolean BinaryRetrievableHint;
   3039    GLboolean BinaryRetrievableHintPending;
   3040 
   3041    /**
   3042     * Indicates whether program can be bound for individual pipeline stages
   3043     * using UseProgramStages after it is next linked.
   3044     */
   3045    GLboolean SeparateShader;
   3046 
   3047    GLuint NumShaders;          /**< number of attached shaders */
   3048    struct gl_shader **Shaders; /**< List of attached the shaders */
   3049 
   3050    /**
   3051     * User-defined attribute bindings
   3052     *
   3053     * These are set via \c glBindAttribLocation and are used to direct the
   3054     * GLSL linker.  These are \b not the values used in the compiled shader,
   3055     * and they are \b not the values returned by \c glGetAttribLocation.
   3056     */
   3057    struct string_to_uint_map *AttributeBindings;
   3058 
   3059    /**
   3060     * User-defined fragment data bindings
   3061     *
   3062     * These are set via \c glBindFragDataLocation and are used to direct the
   3063     * GLSL linker.  These are \b not the values used in the compiled shader,
   3064     * and they are \b not the values returned by \c glGetFragDataLocation.
   3065     */
   3066    struct string_to_uint_map *FragDataBindings;
   3067    struct string_to_uint_map *FragDataIndexBindings;
   3068 
   3069    /**
   3070     * Transform feedback varyings last specified by
   3071     * glTransformFeedbackVaryings().
   3072     *
   3073     * For the current set of transform feedback varyings used for transform
   3074     * feedback output, see LinkedTransformFeedback.
   3075     */
   3076    struct {
   3077       GLenum16 BufferMode;
   3078       /** Global xfb_stride out qualifier if any */
   3079       GLuint BufferStride[MAX_FEEDBACK_BUFFERS];
   3080       GLuint NumVarying;
   3081       GLchar **VaryingNames;  /**< Array [NumVarying] of char * */
   3082    } TransformFeedback;
   3083 
   3084    struct gl_program *last_vert_prog;
   3085 
   3086    /** Post-link gl_FragDepth layout for ARB_conservative_depth. */
   3087    enum gl_frag_depth_layout FragDepthLayout;
   3088 
   3089    /**
   3090     * Geometry shader state - copied into gl_program by
   3091     * _mesa_copy_linked_program_data().
   3092     */
   3093    struct {
   3094       GLint VerticesIn;
   3095 
   3096       bool UsesEndPrimitive;
   3097       unsigned ActiveStreamMask;
   3098    } Geom;
   3099 
   3100    /**
   3101     * Compute shader state - copied into gl_program by
   3102     * _mesa_copy_linked_program_data().
   3103     */
   3104    struct {
   3105       /**
   3106        * Size of shared variables accessed by the compute shader.
   3107        */
   3108       unsigned SharedSize;
   3109    } Comp;
   3110 
   3111    /** Data shared by gl_program and gl_shader_program */
   3112    struct gl_shader_program_data *data;
   3113 
   3114    /**
   3115     * Mapping from GL uniform locations returned by \c glUniformLocation to
   3116     * UniformStorage entries. Arrays will have multiple contiguous slots
   3117     * in the UniformRemapTable, all pointing to the same UniformStorage entry.
   3118     */
   3119    unsigned NumUniformRemapTable;
   3120    struct gl_uniform_storage **UniformRemapTable;
   3121 
   3122    /**
   3123     * Sometimes there are empty slots left over in UniformRemapTable after we
   3124     * allocate slots to explicit locations. This list stores the blocks of
   3125     * continuous empty slots inside UniformRemapTable.
   3126     */
   3127    struct exec_list EmptyUniformLocations;
   3128 
   3129    /**
   3130     * Total number of explicit uniform location including inactive uniforms.
   3131     */
   3132    unsigned NumExplicitUniformLocations;
   3133 
   3134    /**
   3135     * Map of active uniform names to locations
   3136     *
   3137     * Maps any active uniform that is not an array element to a location.
   3138     * Each active uniform, including individual structure members will appear
   3139     * in this map.  This roughly corresponds to the set of names that would be
   3140     * enumerated by \c glGetActiveUniform.
   3141     */
   3142    struct string_to_uint_map *UniformHash;
   3143 
   3144    GLboolean SamplersValidated; /**< Samplers validated against texture units? */
   3145 
   3146    bool IsES;              /**< True if this program uses GLSL ES */
   3147 
   3148    /**
   3149     * Per-stage shaders resulting from the first stage of linking.
   3150     *
   3151     * Set of linked shaders for this program.  The array is accessed using the
   3152     * \c MESA_SHADER_* defines.  Entries for non-existent stages will be
   3153     * \c NULL.
   3154     */
   3155    struct gl_linked_shader *_LinkedShaders[MESA_SHADER_STAGES];
   3156 
   3157    /**
   3158     * True if any of the fragment shaders attached to this program use:
   3159     * #extension ARB_fragment_coord_conventions: enable
   3160     */
   3161    GLboolean ARB_fragment_coord_conventions_enable;
   3162 };
   3163 
   3164 
   3165 #define GLSL_DUMP      0x1  /**< Dump shaders to stdout */
   3166 #define GLSL_LOG       0x2  /**< Write shaders to files */
   3167 #define GLSL_UNIFORMS  0x4  /**< Print glUniform calls */
   3168 #define GLSL_NOP_VERT  0x8  /**< Force no-op vertex shaders */
   3169 #define GLSL_NOP_FRAG 0x10  /**< Force no-op fragment shaders */
   3170 #define GLSL_USE_PROG 0x20  /**< Log glUseProgram calls */
   3171 #define GLSL_REPORT_ERRORS 0x40  /**< Print compilation errors */
   3172 #define GLSL_DUMP_ON_ERROR 0x80 /**< Dump shaders to stderr on compile error */
   3173 #define GLSL_CACHE_INFO 0x100 /**< Print debug information about shader cache */
   3174 #define GLSL_CACHE_FALLBACK 0x200 /**< Force shader cache fallback paths */
   3175 
   3176 
   3177 /**
   3178  * Context state for GLSL vertex/fragment shaders.
   3179  * Extended to support pipeline object
   3180  */
   3181 struct gl_pipeline_object
   3182 {
   3183    /** Name of the pipeline object as received from glGenProgramPipelines.
   3184     * It would be 0 for shaders without separate shader objects.
   3185     */
   3186    GLuint Name;
   3187 
   3188    GLint RefCount;
   3189 
   3190    GLchar *Label;   /**< GL_KHR_debug */
   3191 
   3192    /**
   3193     * Programs used for rendering
   3194     *
   3195     * There is a separate program set for each shader stage.
   3196     */
   3197    struct gl_program *CurrentProgram[MESA_SHADER_STAGES];
   3198 
   3199    struct gl_shader_program *ReferencedPrograms[MESA_SHADER_STAGES];
   3200 
   3201    /**
   3202     * Program used by glUniform calls.
   3203     *
   3204     * Explicitly set by \c glUseProgram and \c glActiveProgramEXT.
   3205     */
   3206    struct gl_shader_program *ActiveProgram;
   3207 
   3208    GLbitfield Flags;         /**< Mask of GLSL_x flags */
   3209    GLboolean EverBound;      /**< Has the pipeline object been created */
   3210    GLboolean Validated;      /**< Pipeline Validation status */
   3211    GLboolean UserValidated;  /**< Validation status initiated by the user */
   3212 
   3213    GLchar *InfoLog;
   3214 };
   3215 
   3216 /**
   3217  * Context state for GLSL pipeline shaders.
   3218  */
   3219 struct gl_pipeline_shader_state
   3220 {
   3221    /** Currently bound pipeline object. See _mesa_BindProgramPipeline() */
   3222    struct gl_pipeline_object *Current;
   3223 
   3224    /** Default Object to ensure that _Shader is never NULL */
   3225    struct gl_pipeline_object *Default;
   3226 
   3227    /** Pipeline objects */
   3228    struct _mesa_HashTable *Objects;
   3229 };
   3230 
   3231 /**
   3232  * Compiler options for a single GLSL shaders type
   3233  */
   3234 struct gl_shader_compiler_options
   3235 {
   3236    /** Driver-selectable options: */
   3237    GLboolean EmitNoLoops;
   3238    GLboolean EmitNoCont;                  /**< Emit CONT opcode? */
   3239    GLboolean EmitNoMainReturn;            /**< Emit CONT/RET opcodes? */
   3240    GLboolean EmitNoPow;                   /**< Emit POW opcodes? */
   3241    GLboolean EmitNoSat;                   /**< Emit SAT opcodes? */
   3242    GLboolean LowerCombinedClipCullDistance; /** Lower gl_ClipDistance and
   3243                                               * gl_CullDistance together from
   3244                                               * float[8] to vec4[2]
   3245                                               **/
   3246    GLbitfield LowerBuiltinVariablesXfb;   /**< Which builtin variables should
   3247                                            * be lowered for transform feedback
   3248                                            **/
   3249 
   3250    /**
   3251     * If we can lower the precision of variables based on precision
   3252     * qualifiers
   3253     */
   3254    GLboolean LowerPrecisionFloat16;
   3255    GLboolean LowerPrecisionInt16;
   3256    GLboolean LowerPrecisionDerivatives;
   3257    GLboolean LowerPrecisionFloat16Uniforms;
   3258 
   3259    /**
   3260     * This enables lowering of 16b constants.  Some drivers may not
   3261     * to lower constants to 16b (ie. if the hw can do automatic
   3262     * narrowing on constant load)
   3263     */
   3264    GLboolean LowerPrecisionConstants;
   3265 
   3266    /**
   3267     * \name Forms of indirect addressing the driver cannot do.
   3268     */
   3269    /*@{*/
   3270    GLboolean EmitNoIndirectInput;   /**< No indirect addressing of inputs */
   3271    GLboolean EmitNoIndirectOutput;  /**< No indirect addressing of outputs */
   3272    GLboolean EmitNoIndirectTemp;    /**< No indirect addressing of temps */
   3273    GLboolean EmitNoIndirectUniform; /**< No indirect addressing of constants */
   3274    GLboolean EmitNoIndirectSampler; /**< No indirect addressing of samplers */
   3275    /*@}*/
   3276 
   3277    GLuint MaxIfDepth;               /**< Maximum nested IF blocks */
   3278    GLuint MaxUnrollIterations;
   3279 
   3280    /**
   3281     * Optimize code for array of structures backends.
   3282     *
   3283     * This is a proxy for:
   3284     *   - preferring DP4 instructions (rather than MUL/MAD) for
   3285     *     matrix * vector operations, such as position transformation.
   3286     */
   3287    GLboolean OptimizeForAOS;
   3288 
   3289    /** Lower UBO and SSBO access to intrinsics. */
   3290    GLboolean LowerBufferInterfaceBlocks;
   3291 
   3292    /** Clamp UBO and SSBO block indices so they don't go out-of-bounds. */
   3293    GLboolean ClampBlockIndicesToArrayBounds;
   3294 
   3295    /** (driconf) Force gl_Position to be considered invariant */
   3296    GLboolean PositionAlwaysInvariant;
   3297 
   3298    /** (driconf) Force gl_Position to be considered precise */
   3299    GLboolean PositionAlwaysPrecise;
   3300 
   3301    const struct nir_shader_compiler_options *NirOptions;
   3302 };
   3303 
   3304 
   3305 /**
   3306  * Occlusion/timer query object.
   3307  */
   3308 struct gl_query_object
   3309 {
   3310    GLenum16 Target;    /**< The query target, when active */
   3311    GLuint Id;          /**< hash table ID/name */
   3312    GLchar *Label;      /**< GL_KHR_debug */
   3313    GLuint64EXT Result; /**< the counter */
   3314    GLboolean Active;   /**< inside Begin/EndQuery */
   3315    GLboolean Ready;    /**< result is ready? */
   3316    GLboolean EverBound;/**< has query object ever been bound */
   3317    GLuint Stream;      /**< The stream */
   3318 };
   3319 
   3320 
   3321 /**
   3322  * Context state for query objects.
   3323  */
   3324 struct gl_query_state
   3325 {
   3326    struct _mesa_HashTable *QueryObjects;
   3327    struct gl_query_object *CurrentOcclusionObject; /* GL_ARB_occlusion_query */
   3328    struct gl_query_object *CurrentTimerObject;     /* GL_EXT_timer_query */
   3329 
   3330    /** GL_NV_conditional_render */
   3331    struct gl_query_object *CondRenderQuery;
   3332 
   3333    /** GL_EXT_transform_feedback */
   3334    struct gl_query_object *PrimitivesGenerated[MAX_VERTEX_STREAMS];
   3335    struct gl_query_object *PrimitivesWritten[MAX_VERTEX_STREAMS];
   3336 
   3337    /** GL_ARB_transform_feedback_overflow_query */
   3338    struct gl_query_object *TransformFeedbackOverflow[MAX_VERTEX_STREAMS];
   3339    struct gl_query_object *TransformFeedbackOverflowAny;
   3340 
   3341    /** GL_ARB_timer_query */
   3342    struct gl_query_object *TimeElapsed;
   3343 
   3344    /** GL_ARB_pipeline_statistics_query */
   3345    struct gl_query_object *pipeline_stats[MAX_PIPELINE_STATISTICS];
   3346 
   3347    GLenum16 CondRenderMode;
   3348 };
   3349 
   3350 
   3351 /** Sync object state */
   3352 struct gl_sync_object
   3353 {
   3354    GLuint Name;               /**< Fence name */
   3355    GLint RefCount;            /**< Reference count */
   3356    GLchar *Label;             /**< GL_KHR_debug */
   3357    GLboolean DeletePending;   /**< Object was deleted while there were still
   3358                                * live references (e.g., sync not yet finished)
   3359                                */
   3360    GLenum16 SyncCondition;
   3361    GLbitfield Flags;          /**< Flags passed to glFenceSync */
   3362    GLuint StatusFlag:1;       /**< Has the sync object been signaled? */
   3363 };
   3364 
   3365 
   3366 /**
   3367  * State which can be shared by multiple contexts:
   3368  */
   3369 struct gl_shared_state
   3370 {
   3371    simple_mtx_t Mutex;		   /**< for thread safety */
   3372    GLint RefCount;			   /**< Reference count */
   3373    struct _mesa_HashTable *DisplayList;	   /**< Display lists hash table */
   3374    struct _mesa_HashTable *BitmapAtlas;    /**< For optimized glBitmap text */
   3375    struct _mesa_HashTable *TexObjects;	   /**< Texture objects hash table */
   3376 
   3377    /** Default texture objects (shared by all texture units) */
   3378    struct gl_texture_object *DefaultTex[NUM_TEXTURE_TARGETS];
   3379 
   3380    /** Fallback texture used when a bound texture is incomplete */
   3381    struct gl_texture_object *FallbackTex[NUM_TEXTURE_TARGETS];
   3382 
   3383    /**
   3384     * \name Thread safety and statechange notification for texture
   3385     * objects.
   3386     *
   3387     * \todo Improve the granularity of locking.
   3388     */
   3389    /*@{*/
   3390    mtx_t TexMutex;		/**< texobj thread safety */
   3391    GLuint TextureStateStamp;	        /**< state notification for shared tex */
   3392    /*@}*/
   3393 
   3394    /**
   3395     * \name Vertex/geometry/fragment programs
   3396     */
   3397    /*@{*/
   3398    struct _mesa_HashTable *Programs; /**< All vertex/fragment programs */
   3399    struct gl_program *DefaultVertexProgram;
   3400    struct gl_program *DefaultFragmentProgram;
   3401    /*@}*/
   3402 
   3403    /* GL_ATI_fragment_shader */
   3404    struct _mesa_HashTable *ATIShaders;
   3405    struct ati_fragment_shader *DefaultFragmentShader;
   3406 
   3407    struct _mesa_HashTable *BufferObjects;
   3408 
   3409    /* Buffer objects released by a different context than the one that
   3410     * created them. Since the creating context holds one global buffer
   3411     * reference for each buffer it created and skips reference counting,
   3412     * deleting a buffer by another context can't touch the buffer reference
   3413     * held by the context that created it. Only the creating context can
   3414     * remove its global buffer reference.
   3415     *
   3416     * This list contains all buffers that were deleted by a different context
   3417     * than the one that created them. This list should be probed by all
   3418     * contexts regularly and remove references of those buffers that they own.
   3419     */
   3420    struct set *ZombieBufferObjects;
   3421 
   3422    /** Table of both gl_shader and gl_shader_program objects */
   3423    struct _mesa_HashTable *ShaderObjects;
   3424 
   3425    /* GL_EXT_framebuffer_object */
   3426    struct _mesa_HashTable *RenderBuffers;
   3427    struct _mesa_HashTable *FrameBuffers;
   3428 
   3429    /* GL_ARB_sync */
   3430    struct set *SyncObjects;
   3431 
   3432    /** GL_ARB_sampler_objects */
   3433    struct _mesa_HashTable *SamplerObjects;
   3434 
   3435    /* GL_ARB_bindless_texture */
   3436    struct hash_table_u64 *TextureHandles;
   3437    struct hash_table_u64 *ImageHandles;
   3438    mtx_t HandlesMutex; /**< For texture/image handles safety */
   3439 
   3440    /* GL_ARB_shading_language_include */
   3441    struct shader_includes *ShaderIncludes;
   3442    /* glCompileShaderInclude expects ShaderIncludes not to change while it is
   3443     * in progress.
   3444     */
   3445    simple_mtx_t ShaderIncludeMutex;
   3446 
   3447    /**
   3448     * Some context in this share group was affected by a GPU reset
   3449     *
   3450     * On the next call to \c glGetGraphicsResetStatus, contexts that have not
   3451     * been affected by a GPU reset must also return
   3452     * \c GL_INNOCENT_CONTEXT_RESET_ARB.
   3453     *
   3454     * Once this field becomes true, it is never reset to false.
   3455     */
   3456    bool ShareGroupReset;
   3457 
   3458    /** EXT_external_objects */
   3459    struct _mesa_HashTable *MemoryObjects;
   3460 
   3461    /** EXT_semaphore */
   3462    struct _mesa_HashTable *SemaphoreObjects;
   3463 
   3464    /**
   3465     * Some context in this share group was affected by a disjoint
   3466     * operation. This operation can be anything that has effects on
   3467     * values of timer queries in such manner that they become invalid for
   3468     * performance metrics. As example gpu reset, counter overflow or gpu
   3469     * frequency changes.
   3470     */
   3471    bool DisjointOperation;
   3472 
   3473    /**
   3474     * Whether at least one image has been imported or exported, excluding
   3475     * the default framebuffer. If this is false, glFlush can be executed
   3476     * asynchronously because there is no invisible dependency on external
   3477     * users.
   3478     */
   3479    bool HasExternallySharedImages;
   3480 
   3481    /* Small display list storage */
   3482    struct {
   3483       union gl_dlist_node *ptr;
   3484       struct util_idalloc free_idx;
   3485       unsigned size;
   3486    } small_dlist_store;
   3487 };
   3488 
   3489 
   3490 
   3491 /**
   3492  * Renderbuffers represent drawing surfaces such as color, depth and/or
   3493  * stencil.  A framebuffer object has a set of renderbuffers.
   3494  * Drivers will typically derive subclasses of this type.
   3495  */
   3496 struct gl_renderbuffer
   3497 {
   3498    GLuint ClassID;        /**< Useful for drivers */
   3499    GLuint Name;
   3500    GLchar *Label;         /**< GL_KHR_debug */
   3501    GLint RefCount;
   3502    GLuint Width, Height;
   3503    GLuint Depth;
   3504    GLboolean Purgeable;  /**< Is the buffer purgeable under memory pressure? */
   3505    GLboolean AttachedAnytime; /**< TRUE if it was attached to a framebuffer */
   3506    /**
   3507     * True for renderbuffers that wrap textures, giving the driver a chance to
   3508     * flush render caches through the FinishRenderTexture hook.
   3509     *
   3510     * Drivers may also set this on renderbuffers other than those generated by
   3511     * glFramebufferTexture(), though it means FinishRenderTexture() would be
   3512     * called without a rb->TexImage.
   3513     */
   3514    GLboolean NeedsFinishRenderTexture;
   3515    GLubyte NumSamples;    /**< zero means not multisampled */
   3516    GLubyte NumStorageSamples; /**< for AMD_framebuffer_multisample_advanced */
   3517    GLenum16 InternalFormat; /**< The user-specified format */
   3518    GLenum16 _BaseFormat;    /**< Either GL_RGB, GL_RGBA, GL_DEPTH_COMPONENT or
   3519                                GL_STENCIL_INDEX. */
   3520    mesa_format Format;      /**< The actual renderbuffer memory format */
   3521    /**
   3522     * Pointer to the texture image if this renderbuffer wraps a texture,
   3523     * otherwise NULL.
   3524     *
   3525     * Note that the reference on the gl_texture_object containing this
   3526     * TexImage is held by the gl_renderbuffer_attachment.
   3527     */
   3528    struct gl_texture_image *TexImage;
   3529 
   3530    /** Delete this renderbuffer */
   3531    void (*Delete)(struct gl_context *ctx, struct gl_renderbuffer *rb);
   3532 
   3533    /** Allocate new storage for this renderbuffer */
   3534    GLboolean (*AllocStorage)(struct gl_context *ctx,
   3535                              struct gl_renderbuffer *rb,
   3536                              GLenum internalFormat,
   3537                              GLuint width, GLuint height);
   3538 };
   3539 
   3540 
   3541 /**
   3542  * A renderbuffer attachment points to either a texture object (and specifies
   3543  * a mipmap level, cube face or 3D texture slice) or points to a renderbuffer.
   3544  */
   3545 struct gl_renderbuffer_attachment
   3546 {
   3547    GLenum16 Type; /**< \c GL_NONE or \c GL_TEXTURE or \c GL_RENDERBUFFER_EXT */
   3548    GLboolean Complete;
   3549 
   3550    /**
   3551     * If \c Type is \c GL_RENDERBUFFER_EXT, this stores a pointer to the
   3552     * application supplied renderbuffer object.
   3553     */
   3554    struct gl_renderbuffer *Renderbuffer;
   3555 
   3556    /**
   3557     * If \c Type is \c GL_TEXTURE, this stores a pointer to the application
   3558     * supplied texture object.
   3559     */
   3560    struct gl_texture_object *Texture;
   3561    GLuint TextureLevel; /**< Attached mipmap level. */
   3562    GLsizei NumSamples;  /**< from FramebufferTexture2DMultisampleEXT */
   3563    GLuint CubeMapFace;  /**< 0 .. 5, for cube map textures. */
   3564    GLuint Zoffset;      /**< Slice for 3D textures,  or layer for both 1D
   3565                          * and 2D array textures */
   3566    GLboolean Layered;
   3567 };
   3568 
   3569 
   3570 /**
   3571  * A framebuffer is a collection of renderbuffers (color, depth, stencil, etc).
   3572  * In C++ terms, think of this as a base class from which device drivers
   3573  * will make derived classes.
   3574  */
   3575 struct gl_framebuffer
   3576 {
   3577    simple_mtx_t Mutex;  /**< for thread safety */
   3578    /**
   3579     * If zero, this is a window system framebuffer.  If non-zero, this
   3580     * is a FBO framebuffer; note that for some devices (i.e. those with
   3581     * a natural pixel coordinate system for FBOs that differs from the
   3582     * OpenGL/Mesa coordinate system), this means that the viewport,
   3583     * polygon face orientation, and polygon stipple will have to be inverted.
   3584     */
   3585    GLuint Name;
   3586    GLint RefCount;
   3587 
   3588    GLchar *Label;       /**< GL_KHR_debug */
   3589 
   3590    GLboolean DeletePending;
   3591 
   3592    /**
   3593     * The framebuffer's visual. Immutable if this is a window system buffer.
   3594     * Computed from attachments if user-made FBO.
   3595     */
   3596    struct gl_config Visual;
   3597 
   3598    /**
   3599     * Size of frame buffer in pixels. If there are no attachments, then both
   3600     * of these are 0.
   3601     */
   3602    GLuint Width, Height;
   3603 
   3604    /**
   3605     * In the case that the framebuffer has no attachment (i.e.
   3606     * GL_ARB_framebuffer_no_attachments) then the geometry of
   3607     * the framebuffer is specified by the default values.
   3608     */
   3609    struct {
   3610      GLuint Width, Height, Layers, NumSamples;
   3611      GLboolean FixedSampleLocations;
   3612      /* Derived from NumSamples by the driver so that it can choose a valid
   3613       * value for the hardware.
   3614       */
   3615      GLuint _NumSamples;
   3616    } DefaultGeometry;
   3617 
   3618    /** \name  Drawing bounds (Intersection of buffer size and scissor box)
   3619     * The drawing region is given by [_Xmin, _Xmax) x [_Ymin, _Ymax),
   3620     * (inclusive for _Xmin and _Ymin while exclusive for _Xmax and _Ymax)
   3621     */
   3622    /*@{*/
   3623    GLint _Xmin, _Xmax;
   3624    GLint _Ymin, _Ymax;
   3625    /*@}*/
   3626 
   3627    /** \name  Derived Z buffer stuff */
   3628    /*@{*/
   3629    GLuint _DepthMax;	/**< Max depth buffer value */
   3630    GLfloat _DepthMaxF;	/**< Float max depth buffer value */
   3631    GLfloat _MRD;	/**< minimum resolvable difference in Z values */
   3632    /*@}*/
   3633 
   3634    /** One of the GL_FRAMEBUFFER_(IN)COMPLETE_* tokens */
   3635    GLenum16 _Status;
   3636 
   3637    /** Whether one of Attachment has Type != GL_NONE
   3638     * NOTE: the values for Width and Height are set to 0 in case of having
   3639     * no attachments, a backend driver supporting the extension
   3640     * GL_ARB_framebuffer_no_attachments must check for the flag _HasAttachments
   3641     * and if GL_FALSE, must then use the values in DefaultGeometry to initialize
   3642     * its viewport, scissor and so on (in particular _Xmin, _Xmax, _Ymin and
   3643     * _Ymax do NOT take into account _HasAttachments being false). To get the
   3644     * geometry of the framebuffer, the  helper functions
   3645     *   _mesa_geometric_width(),
   3646     *   _mesa_geometric_height(),
   3647     *   _mesa_geometric_samples() and
   3648     *   _mesa_geometric_layers()
   3649     * are available that check _HasAttachments.
   3650     */
   3651    bool _HasAttachments;
   3652 
   3653    GLbitfield _IntegerBuffers;  /**< Which color buffers are integer valued */
   3654    GLbitfield _RGBBuffers;  /**< Which color buffers have baseformat == RGB */
   3655    GLbitfield _FP32Buffers; /**< Which color buffers are FP32 */
   3656 
   3657    /* ARB_color_buffer_float */
   3658    GLboolean _AllColorBuffersFixedPoint; /* no integer, no float */
   3659    GLboolean _HasSNormOrFloatColorBuffer;
   3660 
   3661    /**
   3662     * The maximum number of layers in the framebuffer, or 0 if the framebuffer
   3663     * is not layered.  For cube maps and cube map arrays, each cube face
   3664     * counts as a layer. As the case for Width, Height a backend driver
   3665     * supporting GL_ARB_framebuffer_no_attachments must use DefaultGeometry
   3666     * in the case that _HasAttachments is false
   3667     */
   3668    GLuint MaxNumLayers;
   3669 
   3670    /** Array of all renderbuffer attachments, indexed by BUFFER_* tokens. */
   3671    struct gl_renderbuffer_attachment Attachment[BUFFER_COUNT];
   3672 
   3673    /* In unextended OpenGL these vars are part of the GL_COLOR_BUFFER
   3674     * attribute group and GL_PIXEL attribute group, respectively.
   3675     */
   3676    GLenum16 ColorDrawBuffer[MAX_DRAW_BUFFERS];
   3677    GLenum16 ColorReadBuffer;
   3678 
   3679    /* GL_ARB_sample_locations */
   3680    GLfloat *SampleLocationTable; /**< If NULL, no table has been specified */
   3681    GLboolean ProgrammableSampleLocations;
   3682    GLboolean SampleLocationPixelGrid;
   3683 
   3684    /** Computed from ColorDraw/ReadBuffer above */
   3685    GLuint _NumColorDrawBuffers;
   3686    gl_buffer_index _ColorDrawBufferIndexes[MAX_DRAW_BUFFERS];
   3687    gl_buffer_index _ColorReadBufferIndex;
   3688    struct gl_renderbuffer *_ColorDrawBuffers[MAX_DRAW_BUFFERS];
   3689    struct gl_renderbuffer *_ColorReadBuffer;
   3690 
   3691    /* GL_MESA_framebuffer_flip_y */
   3692    bool FlipY;
   3693 
   3694    /** Delete this framebuffer */
   3695    void (*Delete)(struct gl_framebuffer *fb);
   3696 };
   3697 
   3698 
   3699 /**
   3700  * Precision info for shader datatypes.  See glGetShaderPrecisionFormat().
   3701  */
   3702 struct gl_precision
   3703 {
   3704    GLushort RangeMin;   /**< min value exponent */
   3705    GLushort RangeMax;   /**< max value exponent */
   3706    GLushort Precision;  /**< number of mantissa bits */
   3707 };
   3708 
   3709 
   3710 /**
   3711  * Limits for vertex, geometry and fragment programs/shaders.
   3712  */
   3713 struct gl_program_constants
   3714 {
   3715    /* logical limits */
   3716    GLuint MaxInstructions;
   3717    GLuint MaxAluInstructions;
   3718    GLuint MaxTexInstructions;
   3719    GLuint MaxTexIndirections;
   3720    GLuint MaxAttribs;
   3721    GLuint MaxTemps;
   3722    GLuint MaxAddressRegs;
   3723    GLuint MaxAddressOffset;  /**< [-MaxAddressOffset, MaxAddressOffset-1] */
   3724    GLuint MaxParameters;
   3725    GLuint MaxLocalParams;
   3726    GLuint MaxEnvParams;
   3727    /* native/hardware limits */
   3728    GLuint MaxNativeInstructions;
   3729    GLuint MaxNativeAluInstructions;
   3730    GLuint MaxNativeTexInstructions;
   3731    GLuint MaxNativeTexIndirections;
   3732    GLuint MaxNativeAttribs;
   3733    GLuint MaxNativeTemps;
   3734    GLuint MaxNativeAddressRegs;
   3735    GLuint MaxNativeParameters;
   3736    /* For shaders */
   3737    GLuint MaxUniformComponents;  /**< Usually == MaxParameters * 4 */
   3738 
   3739    /**
   3740     * \name Per-stage input / output limits
   3741     *
   3742     * Previous to OpenGL 3.2, the intrastage data limits were advertised with
   3743     * a single value: GL_MAX_VARYING_COMPONENTS (GL_MAX_VARYING_VECTORS in
   3744     * ES).  This is stored as \c gl_constants::MaxVarying.
   3745     *
   3746     * Starting with OpenGL 3.2, the limits are advertised with per-stage
   3747     * variables.  Each stage as a certain number of outputs that it can feed
   3748     * to the next stage and a certain number inputs that it can consume from
   3749     * the previous stage.
   3750     *
   3751     * Vertex shader inputs do not participate this in this accounting.
   3752     * These are tracked exclusively by \c gl_program_constants::MaxAttribs.
   3753     *
   3754     * Fragment shader outputs do not participate this in this accounting.
   3755     * These are tracked exclusively by \c gl_constants::MaxDrawBuffers.
   3756     */
   3757    /*@{*/
   3758    GLuint MaxInputComponents;
   3759    GLuint MaxOutputComponents;
   3760    /*@}*/
   3761 
   3762    /* ES 2.0 and GL_ARB_ES2_compatibility */
   3763    struct gl_precision LowFloat, MediumFloat, HighFloat;
   3764    struct gl_precision LowInt, MediumInt, HighInt;
   3765    /* GL_ARB_uniform_buffer_object */
   3766    GLuint MaxUniformBlocks;
   3767    uint64_t MaxCombinedUniformComponents;
   3768    GLuint MaxTextureImageUnits;
   3769 
   3770    /* GL_ARB_shader_atomic_counters */
   3771    GLuint MaxAtomicBuffers;
   3772    GLuint MaxAtomicCounters;
   3773 
   3774    /* GL_ARB_shader_image_load_store */
   3775    GLuint MaxImageUniforms;
   3776 
   3777    /* GL_ARB_shader_storage_buffer_object */
   3778    GLuint MaxShaderStorageBlocks;
   3779 };
   3780 
   3781 /**
   3782  * Constants which may be overridden by device driver during context creation
   3783  * but are never changed after that.
   3784  */
   3785 struct gl_constants
   3786 {
   3787    GLuint MaxTextureMbytes;      /**< Max memory per image, in MB */
   3788    GLuint MaxTextureSize;        /**< Max 1D/2D texture size, in pixels*/
   3789    GLuint Max3DTextureLevels;    /**< Max mipmap levels for 3D textures */
   3790    GLuint MaxCubeTextureLevels;  /**< Max mipmap levels for cube textures */
   3791    GLuint MaxArrayTextureLayers; /**< Max layers in array textures */
   3792    GLuint MaxTextureRectSize;    /**< Max rectangle texture size, in pixes */
   3793    GLuint MaxTextureCoordUnits;
   3794    GLuint MaxCombinedTextureImageUnits;
   3795    GLuint MaxTextureUnits; /**< = MIN(CoordUnits, FragmentProgram.ImageUnits) */
   3796    GLfloat MaxTextureMaxAnisotropy;  /**< GL_EXT_texture_filter_anisotropic */
   3797    GLfloat MaxTextureLodBias;        /**< GL_EXT_texture_lod_bias */
   3798    GLuint MaxTextureBufferSize;      /**< GL_ARB_texture_buffer_object */
   3799 
   3800    GLuint TextureBufferOffsetAlignment; /**< GL_ARB_texture_buffer_range */
   3801 
   3802    GLuint MaxArrayLockSize;
   3803 
   3804    GLint SubPixelBits;
   3805 
   3806    GLfloat MinPointSize, MaxPointSize;	     /**< aliased */
   3807    GLfloat MinPointSizeAA, MaxPointSizeAA;   /**< antialiased */
   3808    GLfloat PointSizeGranularity;
   3809    GLfloat MinLineWidth, MaxLineWidth;       /**< aliased */
   3810    GLfloat MinLineWidthAA, MaxLineWidthAA;   /**< antialiased */
   3811    GLfloat LineWidthGranularity;
   3812 
   3813    GLuint MaxClipPlanes;
   3814    GLuint MaxLights;
   3815    GLfloat MaxShininess;                     /**< GL_NV_light_max_exponent */
   3816    GLfloat MaxSpotExponent;                  /**< GL_NV_light_max_exponent */
   3817 
   3818    GLuint MaxViewportWidth, MaxViewportHeight;
   3819    GLuint MaxViewports;                      /**< GL_ARB_viewport_array */
   3820    GLuint ViewportSubpixelBits;              /**< GL_ARB_viewport_array */
   3821    struct {
   3822       GLfloat Min;
   3823       GLfloat Max;
   3824    } ViewportBounds;                         /**< GL_ARB_viewport_array */
   3825    GLuint MaxWindowRectangles;               /**< GL_EXT_window_rectangles */
   3826 
   3827    struct gl_program_constants Program[MESA_SHADER_STAGES];
   3828    GLuint MaxProgramMatrices;
   3829    GLuint MaxProgramMatrixStackDepth;
   3830 
   3831    struct {
   3832       GLuint SamplesPassed;
   3833       GLuint TimeElapsed;
   3834       GLuint Timestamp;
   3835       GLuint PrimitivesGenerated;
   3836       GLuint PrimitivesWritten;
   3837       GLuint VerticesSubmitted;
   3838       GLuint PrimitivesSubmitted;
   3839       GLuint VsInvocations;
   3840       GLuint TessPatches;
   3841       GLuint TessInvocations;
   3842       GLuint GsInvocations;
   3843       GLuint GsPrimitives;
   3844       GLuint FsInvocations;
   3845       GLuint ComputeInvocations;
   3846       GLuint ClInPrimitives;
   3847       GLuint ClOutPrimitives;
   3848    } QueryCounterBits;
   3849 
   3850    GLuint MaxDrawBuffers;    /**< GL_ARB_draw_buffers */
   3851 
   3852    GLuint MaxColorAttachments;   /**< GL_EXT_framebuffer_object */
   3853    GLuint MaxRenderbufferSize;   /**< GL_EXT_framebuffer_object */
   3854    GLuint MaxSamples;            /**< GL_ARB_framebuffer_object */
   3855 
   3856    /**
   3857     * GL_ARB_framebuffer_no_attachments
   3858     */
   3859    GLuint MaxFramebufferWidth;
   3860    GLuint MaxFramebufferHeight;
   3861    GLuint MaxFramebufferLayers;
   3862    GLuint MaxFramebufferSamples;
   3863 
   3864    /** Number of varying vectors between any two shader stages. */
   3865    GLuint MaxVarying;
   3866 
   3867    /** @{
   3868     * GL_ARB_uniform_buffer_object
   3869     */
   3870    GLuint MaxCombinedUniformBlocks;
   3871    GLuint MaxUniformBufferBindings;
   3872    GLuint MaxUniformBlockSize;
   3873    GLuint UniformBufferOffsetAlignment;
   3874    /** @} */
   3875 
   3876    /** @{
   3877     * GL_ARB_shader_storage_buffer_object
   3878     */
   3879    GLuint MaxCombinedShaderStorageBlocks;
   3880    GLuint MaxShaderStorageBufferBindings;
   3881    GLuint MaxShaderStorageBlockSize;
   3882    GLuint ShaderStorageBufferOffsetAlignment;
   3883    /** @} */
   3884 
   3885    /**
   3886     * GL_ARB_explicit_uniform_location
   3887     */
   3888    GLuint MaxUserAssignableUniformLocations;
   3889 
   3890    /** geometry shader */
   3891    GLuint MaxGeometryOutputVertices;
   3892    GLuint MaxGeometryTotalOutputComponents;
   3893    GLuint MaxGeometryShaderInvocations;
   3894 
   3895    GLuint GLSLVersion;  /**< Desktop GLSL version supported (ex: 120 = 1.20) */
   3896    GLuint GLSLVersionCompat;  /**< Desktop compat GLSL version supported  */
   3897 
   3898    /**
   3899     * Changes default GLSL extension behavior from "error" to "warn".  It's out
   3900     * of spec, but it can make some apps work that otherwise wouldn't.
   3901     */
   3902    GLboolean ForceGLSLExtensionsWarn;
   3903 
   3904    /**
   3905     * If non-zero, forces GLSL shaders to behave as if they began
   3906     * with "#version ForceGLSLVersion".
   3907     */
   3908    GLuint ForceGLSLVersion;
   3909 
   3910    /**
   3911     * Allow GLSL #extension directives in the middle of shaders.
   3912     */
   3913    GLboolean AllowGLSLExtensionDirectiveMidShader;
   3914 
   3915    /**
   3916     * Allow a subset of GLSL 1.20 in GLSL 1.10 as needed by SPECviewperf13.
   3917     */
   3918    GLboolean AllowGLSL120SubsetIn110;
   3919 
   3920    /**
   3921     * Allow builtins as part of constant expressions. This was not allowed
   3922     * until GLSL 1.20 this allows it everywhere.
   3923     */
   3924    GLboolean AllowGLSLBuiltinConstantExpression;
   3925 
   3926    /**
   3927     * Allow some relaxation of GLSL ES shader restrictions. This encompasses
   3928     * a number of relaxations to the ES shader rules.
   3929     */
   3930    GLboolean AllowGLSLRelaxedES;
   3931 
   3932    /**
   3933     * Allow GLSL built-in variables to be redeclared verbatim
   3934     */
   3935    GLboolean AllowGLSLBuiltinVariableRedeclaration;
   3936 
   3937    /**
   3938     * Allow GLSL interpolation qualifier mismatch across shader stages.
   3939     */
   3940    GLboolean AllowGLSLCrossStageInterpolationMismatch;
   3941 
   3942    /**
   3943     * Allow creating a higher compat profile (version 3.1+) for apps that
   3944     * request it. Be careful when adding that driconf option because some
   3945     * features are unimplemented and might not work correctly.
   3946     */
   3947    GLboolean AllowHigherCompatVersion;
   3948 
   3949    /**
   3950     * Allow extra tokens at end of preprocessor directives. The CTS now tests
   3951     * to make sure these are not allowed. However, previously drivers would
   3952     * allow them to exist and just issue a warning so some old applications
   3953     * depend on this.
   3954     */
   3955    GLboolean AllowExtraPPTokens;
   3956 
   3957    /**
   3958     * Force computing the absolute value for sqrt() and inversesqrt() to follow
   3959     * D3D9 when apps rely on this behaviour.
   3960     */
   3961    GLboolean ForceGLSLAbsSqrt;
   3962 
   3963    /**
   3964     * Forces the GLSL compiler to ignore writes to readonly vars rather than
   3965     * throwing an error.
   3966     */
   3967    GLboolean GLSLIgnoreWriteToReadonlyVar;
   3968 
   3969    /**
   3970     * Types of variable to default initialized to zero. Supported values are:
   3971     *   - 0: no zero initialization
   3972     *   - 1: all shader variables and gl_FragColor are initialiazed to 0
   3973     *   - 2: same as 1, but shader out variables are *not* initialized, while
   3974     *        function out variables are now initialized.
   3975     */
   3976    GLchar GLSLZeroInit;
   3977 
   3978    /**
   3979     * Force GL names reuse. Needed by SPECviewperf13.
   3980     */
   3981    GLboolean ForceGLNamesReuse;
   3982 
   3983    /**
   3984     * Treat integer textures using GL_LINEAR filters as GL_NEAREST.
   3985     */
   3986    GLboolean ForceIntegerTexNearest;
   3987 
   3988    /**
   3989     * Does the driver support real 32-bit integers?  (Otherwise, integers are
   3990     * simulated via floats.)
   3991     */
   3992    GLboolean NativeIntegers;
   3993 
   3994    /**
   3995     * Does VertexID count from zero or from base vertex?
   3996     *
   3997     * \note
   3998     * If desktop GLSL 1.30 or GLSL ES 3.00 are not supported, this field is
   3999     * ignored and need not be set.
   4000     */
   4001    bool VertexID_is_zero_based;
   4002 
   4003    /**
   4004     * If the driver supports real 32-bit integers, what integer value should be
   4005     * used for boolean true in uniform uploads?  (Usually 1 or ~0.)
   4006     */
   4007    GLuint UniformBooleanTrue;
   4008 
   4009    /**
   4010     * Maximum amount of time, measured in nanseconds, that the server can wait.
   4011     */
   4012    GLuint64 MaxServerWaitTimeout;
   4013 
   4014    /** GL_EXT_provoking_vertex */
   4015    GLboolean QuadsFollowProvokingVertexConvention;
   4016 
   4017    /** GL_ARB_viewport_array */
   4018    GLenum16 LayerAndVPIndexProvokingVertex;
   4019 
   4020    /** OpenGL version 3.0 */
   4021    GLbitfield ContextFlags;  /**< Ex: GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT */
   4022 
   4023    /** OpenGL version 3.2 */
   4024    GLbitfield ProfileMask;   /**< Mask of CONTEXT_x_PROFILE_BIT */
   4025 
   4026    /** OpenGL version 4.4 */
   4027    GLuint MaxVertexAttribStride;
   4028 
   4029    /** GL_EXT_transform_feedback */
   4030    GLuint MaxTransformFeedbackBuffers;
   4031    GLuint MaxTransformFeedbackSeparateComponents;
   4032    GLuint MaxTransformFeedbackInterleavedComponents;
   4033    GLuint MaxVertexStreams;
   4034 
   4035    /** GL_EXT_gpu_shader4 */
   4036    GLint MinProgramTexelOffset, MaxProgramTexelOffset;
   4037 
   4038    /** GL_ARB_texture_gather */
   4039    GLuint MinProgramTextureGatherOffset;
   4040    GLuint MaxProgramTextureGatherOffset;
   4041    GLuint MaxProgramTextureGatherComponents;
   4042 
   4043    /* GL_ARB_robustness */
   4044    GLenum16 ResetStrategy;
   4045 
   4046    /* GL_KHR_robustness */
   4047    GLboolean RobustAccess;
   4048 
   4049    /* GL_ARB_blend_func_extended */
   4050    GLuint MaxDualSourceDrawBuffers;
   4051 
   4052    /**
   4053     * Whether the implementation strips out and ignores texture borders.
   4054     *
   4055     * Many GPU hardware implementations don't support rendering with texture
   4056     * borders and mipmapped textures.  (Note: not static border color, but the
   4057     * old 1-pixel border around each edge).  Implementations then have to do
   4058     * slow fallbacks to be correct, or just ignore the border and be fast but
   4059     * wrong.  Setting the flag strips the border off of TexImage calls,
   4060     * providing "fast but wrong" at significantly reduced driver complexity.
   4061     *
   4062     * Texture borders are deprecated in GL 3.0.
   4063     **/
   4064    GLboolean StripTextureBorder;
   4065 
   4066    /**
   4067     * For drivers which can do a better job at eliminating unused uniforms
   4068     * than the GLSL compiler.
   4069     *
   4070     * XXX Remove these as soon as a better solution is available.
   4071     */
   4072    GLboolean GLSLSkipStrictMaxUniformLimitCheck;
   4073 
   4074    /**
   4075     * Whether gl_FragCoord, gl_PointCoord and gl_FrontFacing
   4076     * are system values.
   4077     **/
   4078    bool GLSLFragCoordIsSysVal;
   4079    bool GLSLPointCoordIsSysVal;
   4080    bool GLSLFrontFacingIsSysVal;
   4081 
   4082    /**
   4083     * Run the minimum amount of GLSL optimizations to be able to link
   4084     * shaders optimally (eliminate dead varyings and uniforms) and just do
   4085     * all the necessary lowering.
   4086     */
   4087    bool GLSLOptimizeConservatively;
   4088 
   4089    /**
   4090     * Whether to call lower_const_arrays_to_uniforms() during linking.
   4091     */
   4092    bool GLSLLowerConstArrays;
   4093 
   4094    /**
   4095     * True if gl_TessLevelInner/Outer[] in the TES should be inputs
   4096     * (otherwise, they're system values).
   4097     */
   4098    bool GLSLTessLevelsAsInputs;
   4099 
   4100    /**
   4101     * Always use the GetTransformFeedbackVertexCount() driver hook, rather
   4102     * than passing the transform feedback object to the drawing function.
   4103     */
   4104    GLboolean AlwaysUseGetTransformFeedbackVertexCount;
   4105 
   4106    /** GL_ARB_map_buffer_alignment */
   4107    GLuint MinMapBufferAlignment;
   4108 
   4109    /**
   4110     * Disable varying packing.  This is out of spec, but potentially useful
   4111     * for older platforms that supports a limited number of texture
   4112     * indirections--on these platforms, unpacking the varyings in the fragment
   4113     * shader increases the number of texture indirections by 1, which might
   4114     * make some shaders not executable at all.
   4115     *
   4116     * Drivers that support transform feedback must set this value to GL_FALSE.
   4117     */
   4118    GLboolean DisableVaryingPacking;
   4119 
   4120    /**
   4121     * Disable varying packing if used for transform feedback.  This is needed
   4122     * for some drivers (e.g. Panfrost) where transform feedback requires
   4123     * unpacked varyings.
   4124     *
   4125     * This variable is mutually exlusive with DisableVaryingPacking.
   4126     */
   4127    GLboolean DisableTransformFeedbackPacking;
   4128 
   4129    /**
   4130     * UBOs and SSBOs can be packed tightly by the OpenGL implementation when
   4131     * layout is set as shared (the default) or packed. However most Mesa drivers
   4132     * just use STD140 for these layouts. This flag allows drivers to use STD430
   4133     * for packed and shared layouts which allows arrays to be packed more
   4134     * tightly.
   4135     */
   4136    bool UseSTD430AsDefaultPacking;
   4137 
   4138    /**
   4139     * Should meaningful names be generated for compiler temporary variables?
   4140     *
   4141     * Generally, it is not useful to have the compiler generate "meaningful"
   4142     * names for temporary variables that it creates.  This can, however, be a
   4143     * useful debugging aid.  In Mesa debug builds or release builds when
   4144     * MESA_GLSL is set at run-time, meaningful names will be generated.
   4145     * Drivers can also force names to be generated by setting this field.
   4146     * For example, the i965 driver may set it when INTEL_DEBUG=vs (to dump
   4147     * vertex shader assembly) is set at run-time.
   4148     */
   4149    bool GenerateTemporaryNames;
   4150 
   4151    /*
   4152     * Maximum value supported for an index in DrawElements and friends.
   4153     *
   4154     * This must be at least (1ull<<24)-1.  The default value is
   4155     * (1ull<<32)-1.
   4156     *
   4157     * \since ES 3.0 or GL_ARB_ES3_compatibility
   4158     * \sa _mesa_init_constants
   4159     */
   4160    GLuint64 MaxElementIndex;
   4161 
   4162    /**
   4163     * Disable interpretation of line continuations (lines ending with a
   4164     * backslash character ('\') in GLSL source.
   4165     */
   4166    GLboolean DisableGLSLLineContinuations;
   4167 
   4168    /** GL_ARB_texture_multisample */
   4169    GLint MaxColorTextureSamples;
   4170    GLint MaxDepthTextureSamples;
   4171    GLint MaxIntegerSamples;
   4172 
   4173    /** GL_AMD_framebuffer_multisample_advanced */
   4174    GLint MaxColorFramebufferSamples;
   4175    GLint MaxColorFramebufferStorageSamples;
   4176    GLint MaxDepthStencilFramebufferSamples;
   4177 
   4178    /* An array of supported MSAA modes allowing different sample
   4179     * counts per attachment type.
   4180     */
   4181    struct {
   4182       GLint NumColorSamples;
   4183       GLint NumColorStorageSamples;
   4184       GLint NumDepthStencilSamples;
   4185    } SupportedMultisampleModes[40];
   4186    GLint NumSupportedMultisampleModes;
   4187 
   4188    /** GL_ARB_shader_atomic_counters */
   4189    GLuint MaxAtomicBufferBindings;
   4190    GLuint MaxAtomicBufferSize;
   4191    GLuint MaxCombinedAtomicBuffers;
   4192    GLuint MaxCombinedAtomicCounters;
   4193 
   4194    /** GL_ARB_vertex_attrib_binding */
   4195    GLint MaxVertexAttribRelativeOffset;
   4196    GLint MaxVertexAttribBindings;
   4197 
   4198    /* GL_ARB_shader_image_load_store */
   4199    GLuint MaxImageUnits;
   4200    GLuint MaxCombinedShaderOutputResources;
   4201    GLuint MaxImageSamples;
   4202    GLuint MaxCombinedImageUniforms;
   4203 
   4204    /** GL_ARB_compute_shader */
   4205    GLuint MaxComputeWorkGroupCount[3]; /* Array of x, y, z dimensions */
   4206    GLuint MaxComputeWorkGroupSize[3]; /* Array of x, y, z dimensions */
   4207    GLuint MaxComputeWorkGroupInvocations;
   4208    GLuint MaxComputeSharedMemorySize;
   4209 
   4210    /** GL_ARB_compute_variable_group_size */
   4211    GLuint MaxComputeVariableGroupSize[3]; /* Array of x, y, z dimensions */
   4212    GLuint MaxComputeVariableGroupInvocations;
   4213 
   4214    /** GL_ARB_gpu_shader5 */
   4215    GLfloat MinFragmentInterpolationOffset;
   4216    GLfloat MaxFragmentInterpolationOffset;
   4217 
   4218    GLboolean FakeSWMSAA;
   4219 
   4220    /** GL_KHR_context_flush_control */
   4221    GLenum16 ContextReleaseBehavior;
   4222 
   4223    struct gl_shader_compiler_options ShaderCompilerOptions[MESA_SHADER_STAGES];
   4224 
   4225    /** GL_ARB_tessellation_shader */
   4226    GLuint MaxPatchVertices;
   4227    GLuint MaxTessGenLevel;
   4228    GLuint MaxTessPatchComponents;
   4229    GLuint MaxTessControlTotalOutputComponents;
   4230    bool LowerTessLevel; /**< Lower gl_TessLevel* from float[n] to vecn? */
   4231    bool PrimitiveRestartForPatches;
   4232    bool LowerCsDerivedVariables;    /**< Lower gl_GlobalInvocationID and
   4233                                      *   gl_LocalInvocationIndex based on
   4234                                      *   other builtin variables. */
   4235 
   4236    /** GL_OES_primitive_bounding_box */
   4237    bool NoPrimitiveBoundingBoxOutput;
   4238 
   4239    /** GL_ARB_sparse_buffer */
   4240    GLuint SparseBufferPageSize;
   4241 
   4242    /** Used as an input for sha1 generation in the on-disk shader cache */
   4243    unsigned char *dri_config_options_sha1;
   4244 
   4245    /** When drivers are OK with mapped buffers during draw and other calls. */
   4246    bool AllowMappedBuffersDuringExecution;
   4247 
   4248    /**
   4249     * Whether buffer creation, unsynchronized mapping, unmapping, and
   4250     * deletion is thread-safe.
   4251     */
   4252    bool BufferCreateMapUnsynchronizedThreadSafe;
   4253 
   4254    /** GL_ARB_get_program_binary */
   4255    GLuint NumProgramBinaryFormats;
   4256 
   4257    /** GL_NV_conservative_raster */
   4258    GLuint MaxSubpixelPrecisionBiasBits;
   4259 
   4260    /** GL_NV_conservative_raster_dilate */
   4261    GLfloat ConservativeRasterDilateRange[2];
   4262    GLfloat ConservativeRasterDilateGranularity;
   4263 
   4264    /** Is the drivers uniform storage packed or padded to 16 bytes. */
   4265    bool PackedDriverUniformStorage;
   4266 
   4267    /** Does the driver make use of the NIR based GLSL linker */
   4268    bool UseNIRGLSLLinker;
   4269 
   4270    /** Wether or not glBitmap uses red textures rather than alpha */
   4271    bool BitmapUsesRed;
   4272 
   4273    /** Whether the vertex buffer offset is a signed 32-bit integer. */
   4274    bool VertexBufferOffsetIsInt32;
   4275 
   4276    /** Whether the driver can handle MultiDrawElements with non-VBO indices. */
   4277    bool MultiDrawWithUserIndices;
   4278 
   4279    /** Whether out-of-order draw (Begin/End) optimizations are allowed. */
   4280    bool AllowDrawOutOfOrder;
   4281 
   4282    /** Whether to allow the fast path for frequently updated VAOs. */
   4283    bool AllowDynamicVAOFastPath;
   4284 
   4285    /** Whether the driver can support primitive restart with a fixed index.
   4286     * This is essentially a subset of NV_primitive_restart with enough support
   4287     * to be able to enable GLES 3.1. Some hardware can support this but not the
   4288     * full NV extension with arbitrary restart indices.
   4289     */
   4290    bool PrimitiveRestartFixedIndex;
   4291 
   4292    /** GL_ARB_gl_spirv */
   4293    struct spirv_supported_capabilities SpirVCapabilities;
   4294 
   4295    /** GL_ARB_spirv_extensions */
   4296    struct spirv_supported_extensions *SpirVExtensions;
   4297 
   4298    char *VendorOverride;
   4299    char *RendererOverride;
   4300 
   4301    /** Buffer size used to upload vertices from glBegin/glEnd. */
   4302    unsigned glBeginEndBufferSize;
   4303 
   4304    /** Whether the driver doesn't want x/y/width/height clipped based on src size
   4305     *  when doing a copy texture operation (eg: may want out-of-bounds reads that
   4306     *  produce 0 instead of leaving the texture content undefined).
   4307     */
   4308    bool NoClippingOnCopyTex;
   4309 };
   4310 
   4311 
   4312 /**
   4313  * Enable flag for each OpenGL extension.  Different device drivers will
   4314  * enable different extensions at runtime.
   4315  */
   4316 struct gl_extensions
   4317 {
   4318    GLboolean dummy;  /* don't remove this! */
   4319    GLboolean dummy_true;  /* Set true by _mesa_init_extensions(). */
   4320    GLboolean ANGLE_texture_compression_dxt;
   4321    GLboolean ARB_ES2_compatibility;
   4322    GLboolean ARB_ES3_compatibility;
   4323    GLboolean ARB_ES3_1_compatibility;
   4324    GLboolean ARB_ES3_2_compatibility;
   4325    GLboolean ARB_arrays_of_arrays;
   4326    GLboolean ARB_base_instance;
   4327    GLboolean ARB_bindless_texture;
   4328    GLboolean ARB_blend_func_extended;
   4329    GLboolean ARB_buffer_storage;
   4330    GLboolean ARB_clear_texture;
   4331    GLboolean ARB_clip_control;
   4332    GLboolean ARB_color_buffer_float;
   4333    GLboolean ARB_compatibility;
   4334    GLboolean ARB_compute_shader;
   4335    GLboolean ARB_compute_variable_group_size;
   4336    GLboolean ARB_conditional_render_inverted;
   4337    GLboolean ARB_conservative_depth;
   4338    GLboolean ARB_copy_image;
   4339    GLboolean ARB_cull_distance;
   4340    GLboolean EXT_color_buffer_half_float;
   4341    GLboolean ARB_depth_buffer_float;
   4342    GLboolean ARB_depth_clamp;
   4343    GLboolean ARB_depth_texture;
   4344    GLboolean ARB_derivative_control;
   4345    GLboolean ARB_draw_buffers_blend;
   4346    GLboolean ARB_draw_elements_base_vertex;
   4347    GLboolean ARB_draw_indirect;
   4348    GLboolean ARB_draw_instanced;
   4349    GLboolean ARB_fragment_coord_conventions;
   4350    GLboolean ARB_fragment_layer_viewport;
   4351    GLboolean ARB_fragment_program;
   4352    GLboolean ARB_fragment_program_shadow;
   4353    GLboolean ARB_fragment_shader;
   4354    GLboolean ARB_framebuffer_no_attachments;
   4355    GLboolean ARB_framebuffer_object;
   4356    GLboolean ARB_fragment_shader_interlock;
   4357    GLboolean ARB_enhanced_layouts;
   4358    GLboolean ARB_explicit_attrib_location;
   4359    GLboolean ARB_explicit_uniform_location;
   4360    GLboolean ARB_gl_spirv;
   4361    GLboolean ARB_gpu_shader5;
   4362    GLboolean ARB_gpu_shader_fp64;
   4363    GLboolean ARB_gpu_shader_int64;
   4364    GLboolean ARB_half_float_vertex;
   4365    GLboolean ARB_indirect_parameters;
   4366    GLboolean ARB_instanced_arrays;
   4367    GLboolean ARB_internalformat_query;
   4368    GLboolean ARB_internalformat_query2;
   4369    GLboolean ARB_map_buffer_range;
   4370    GLboolean ARB_occlusion_query;
   4371    GLboolean ARB_occlusion_query2;
   4372    GLboolean ARB_pipeline_statistics_query;
   4373    GLboolean ARB_point_sprite;
   4374    GLboolean ARB_polygon_offset_clamp;
   4375    GLboolean ARB_post_depth_coverage;
   4376    GLboolean ARB_query_buffer_object;
   4377    GLboolean ARB_robust_buffer_access_behavior;
   4378    GLboolean ARB_sample_locations;
   4379    GLboolean ARB_sample_shading;
   4380    GLboolean ARB_seamless_cube_map;
   4381    GLboolean ARB_shader_atomic_counter_ops;
   4382    GLboolean ARB_shader_atomic_counters;
   4383    GLboolean ARB_shader_ballot;
   4384    GLboolean ARB_shader_bit_encoding;
   4385    GLboolean ARB_shader_clock;
   4386    GLboolean ARB_shader_draw_parameters;
   4387    GLboolean ARB_shader_group_vote;
   4388    GLboolean ARB_shader_image_load_store;
   4389    GLboolean ARB_shader_image_size;
   4390    GLboolean ARB_shader_precision;
   4391    GLboolean ARB_shader_stencil_export;
   4392    GLboolean ARB_shader_storage_buffer_object;
   4393    GLboolean ARB_shader_texture_image_samples;
   4394    GLboolean ARB_shader_texture_lod;
   4395    GLboolean ARB_shader_viewport_layer_array;
   4396    GLboolean ARB_shading_language_packing;
   4397    GLboolean ARB_shading_language_420pack;
   4398    GLboolean ARB_shadow;
   4399    GLboolean ARB_sparse_buffer;
   4400    GLboolean ARB_stencil_texturing;
   4401    GLboolean ARB_spirv_extensions;
   4402    GLboolean ARB_sync;
   4403    GLboolean ARB_tessellation_shader;
   4404    GLboolean ARB_texture_border_clamp;
   4405    GLboolean ARB_texture_buffer_object;
   4406    GLboolean ARB_texture_buffer_object_rgb32;
   4407    GLboolean ARB_texture_buffer_range;
   4408    GLboolean ARB_texture_compression_bptc;
   4409    GLboolean ARB_texture_compression_rgtc;
   4410    GLboolean ARB_texture_cube_map;
   4411    GLboolean ARB_texture_cube_map_array;
   4412    GLboolean ARB_texture_env_combine;
   4413    GLboolean ARB_texture_env_crossbar;
   4414    GLboolean ARB_texture_env_dot3;
   4415    GLboolean ARB_texture_filter_anisotropic;
   4416    GLboolean ARB_texture_filter_minmax;
   4417    GLboolean ARB_texture_float;
   4418    GLboolean ARB_texture_gather;
   4419    GLboolean ARB_texture_mirror_clamp_to_edge;
   4420    GLboolean ARB_texture_multisample;
   4421    GLboolean ARB_texture_non_power_of_two;
   4422    GLboolean ARB_texture_stencil8;
   4423    GLboolean ARB_texture_query_levels;
   4424    GLboolean ARB_texture_query_lod;
   4425    GLboolean ARB_texture_rg;
   4426    GLboolean ARB_texture_rgb10_a2ui;
   4427    GLboolean ARB_texture_view;
   4428    GLboolean ARB_timer_query;
   4429    GLboolean ARB_transform_feedback2;
   4430    GLboolean ARB_transform_feedback3;
   4431    GLboolean ARB_transform_feedback_instanced;
   4432    GLboolean ARB_transform_feedback_overflow_query;
   4433    GLboolean ARB_uniform_buffer_object;
   4434    GLboolean ARB_vertex_attrib_64bit;
   4435    GLboolean ARB_vertex_program;
   4436    GLboolean ARB_vertex_shader;
   4437    GLboolean ARB_vertex_type_10f_11f_11f_rev;
   4438    GLboolean ARB_vertex_type_2_10_10_10_rev;
   4439    GLboolean ARB_viewport_array;
   4440    GLboolean EXT_blend_color;
   4441    GLboolean EXT_blend_equation_separate;
   4442    GLboolean EXT_blend_func_separate;
   4443    GLboolean EXT_blend_minmax;
   4444    GLboolean EXT_demote_to_helper_invocation;
   4445    GLboolean EXT_depth_bounds_test;
   4446    GLboolean EXT_disjoint_timer_query;
   4447    GLboolean EXT_draw_buffers2;
   4448    GLboolean EXT_EGL_image_storage;
   4449    GLboolean EXT_float_blend;
   4450    GLboolean EXT_framebuffer_multisample;
   4451    GLboolean EXT_framebuffer_multisample_blit_scaled;
   4452    GLboolean EXT_framebuffer_sRGB;
   4453    GLboolean EXT_gpu_program_parameters;
   4454    GLboolean EXT_gpu_shader4;
   4455    GLboolean EXT_memory_object;
   4456    GLboolean EXT_memory_object_fd;
   4457    GLboolean EXT_multisampled_render_to_texture;
   4458    GLboolean EXT_packed_float;
   4459    GLboolean EXT_pixel_buffer_object;
   4460    GLboolean EXT_point_parameters;
   4461    GLboolean EXT_provoking_vertex;
   4462    GLboolean EXT_render_snorm;
   4463    GLboolean EXT_semaphore;
   4464    GLboolean EXT_semaphore_fd;
   4465    GLboolean EXT_shader_image_load_formatted;
   4466    GLboolean EXT_shader_image_load_store;
   4467    GLboolean EXT_shader_integer_mix;
   4468    GLboolean EXT_shader_samples_identical;
   4469    GLboolean EXT_sRGB;
   4470    GLboolean EXT_stencil_two_side;
   4471    GLboolean EXT_texture_array;
   4472    GLboolean EXT_texture_buffer_object;
   4473    GLboolean EXT_texture_compression_latc;
   4474    GLboolean EXT_texture_compression_s3tc;
   4475    GLboolean EXT_texture_compression_s3tc_srgb;
   4476    GLboolean EXT_texture_env_dot3;
   4477    GLboolean EXT_texture_filter_anisotropic;
   4478    GLboolean EXT_texture_filter_minmax;
   4479    GLboolean EXT_texture_integer;
   4480    GLboolean EXT_texture_mirror_clamp;
   4481    GLboolean EXT_texture_norm16;
   4482    GLboolean EXT_texture_shadow_lod;
   4483    GLboolean EXT_texture_shared_exponent;
   4484    GLboolean EXT_texture_snorm;
   4485    GLboolean EXT_texture_sRGB;
   4486    GLboolean EXT_texture_sRGB_R8;
   4487    GLboolean EXT_texture_sRGB_RG8;
   4488    GLboolean EXT_texture_sRGB_decode;
   4489    GLboolean EXT_texture_swizzle;
   4490    GLboolean EXT_texture_type_2_10_10_10_REV;
   4491    GLboolean EXT_transform_feedback;
   4492    GLboolean EXT_timer_query;
   4493    GLboolean EXT_vertex_array_bgra;
   4494    GLboolean EXT_window_rectangles;
   4495    GLboolean OES_copy_image;
   4496    GLboolean OES_primitive_bounding_box;
   4497    GLboolean OES_sample_variables;
   4498    GLboolean OES_standard_derivatives;
   4499    GLboolean OES_texture_buffer;
   4500    GLboolean OES_texture_cube_map_array;
   4501    GLboolean OES_texture_view;
   4502    GLboolean OES_viewport_array;
   4503    /* vendor extensions */
   4504    GLboolean AMD_compressed_ATC_texture;
   4505    GLboolean AMD_framebuffer_multisample_advanced;
   4506    GLboolean AMD_depth_clamp_separate;
   4507    GLboolean AMD_performance_monitor;
   4508    GLboolean AMD_pinned_memory;
   4509    GLboolean AMD_seamless_cubemap_per_texture;
   4510    GLboolean AMD_vertex_shader_layer;
   4511    GLboolean AMD_vertex_shader_viewport_index;
   4512    GLboolean ANDROID_extension_pack_es31a;
   4513    GLboolean APPLE_object_purgeable;
   4514    GLboolean ATI_meminfo;
   4515    GLboolean ATI_texture_compression_3dc;
   4516    GLboolean ATI_texture_mirror_once;
   4517    GLboolean ATI_texture_env_combine3;
   4518    GLboolean ATI_fragment_shader;
   4519    GLboolean GREMEDY_string_marker;
   4520    GLboolean INTEL_blackhole_render;
   4521    GLboolean INTEL_conservative_rasterization;
   4522    GLboolean INTEL_performance_query;
   4523    GLboolean INTEL_shader_atomic_float_minmax;
   4524    GLboolean INTEL_shader_integer_functions2;
   4525    GLboolean KHR_blend_equation_advanced;
   4526    GLboolean KHR_blend_equation_advanced_coherent;
   4527    GLboolean KHR_robustness;
   4528    GLboolean KHR_texture_compression_astc_hdr;
   4529    GLboolean KHR_texture_compression_astc_ldr;
   4530    GLboolean KHR_texture_compression_astc_sliced_3d;
   4531    GLboolean MESA_framebuffer_flip_y;
   4532    GLboolean MESA_tile_raster_order;
   4533    GLboolean EXT_shader_framebuffer_fetch;
   4534    GLboolean EXT_shader_framebuffer_fetch_non_coherent;
   4535    GLboolean MESA_shader_integer_functions;
   4536    GLboolean MESA_ycbcr_texture;
   4537    GLboolean NV_alpha_to_coverage_dither_control;
   4538    GLboolean NV_compute_shader_derivatives;
   4539    GLboolean NV_conditional_render;
   4540    GLboolean NV_copy_depth_to_color;
   4541    GLboolean NV_copy_image;
   4542    GLboolean NV_fill_rectangle;
   4543    GLboolean NV_fog_distance;
   4544    GLboolean NV_primitive_restart;
   4545    GLboolean NV_shader_atomic_float;
   4546    GLboolean NV_shader_atomic_int64;
   4547    GLboolean NV_texture_barrier;
   4548    GLboolean NV_texture_env_combine4;
   4549    GLboolean NV_texture_rectangle;
   4550    GLboolean NV_vdpau_interop;
   4551    GLboolean NV_conservative_raster;
   4552    GLboolean NV_conservative_raster_dilate;
   4553    GLboolean NV_conservative_raster_pre_snap_triangles;
   4554    GLboolean NV_conservative_raster_pre_snap;
   4555    GLboolean NV_viewport_array2;
   4556    GLboolean NV_viewport_swizzle;
   4557    GLboolean NVX_gpu_memory_info;
   4558    GLboolean TDFX_texture_compression_FXT1;
   4559    GLboolean OES_EGL_image;
   4560    GLboolean OES_draw_texture;
   4561    GLboolean OES_depth_texture_cube_map;
   4562    GLboolean OES_EGL_image_external;
   4563    GLboolean OES_texture_float;
   4564    GLboolean OES_texture_float_linear;
   4565    GLboolean OES_texture_half_float;
   4566    GLboolean OES_texture_half_float_linear;
   4567    GLboolean OES_compressed_ETC1_RGB8_texture;
   4568    GLboolean OES_geometry_shader;
   4569    GLboolean OES_texture_compression_astc;
   4570    GLboolean extension_sentinel;
   4571    /** The extension string */
   4572    const GLubyte *String;
   4573    /** Number of supported extensions */
   4574    GLuint Count;
   4575    /**
   4576     * The context version which extension helper functions compare against.
   4577     * By default, the value is equal to ctx->Version. This changes to ~0
   4578     * while meta is in progress.
   4579     */
   4580    GLubyte Version;
   4581 };
   4582 
   4583 
   4584 /**
   4585  * A stack of matrices (projection, modelview, color, texture, etc).
   4586  */
   4587 struct gl_matrix_stack
   4588 {
   4589    GLmatrix *Top;      /**< points into Stack */
   4590    GLmatrix *Stack;    /**< array [MaxDepth] of GLmatrix */
   4591    unsigned StackSize; /**< Number of elements in Stack */
   4592    GLuint Depth;       /**< 0 <= Depth < MaxDepth */
   4593    GLuint MaxDepth;    /**< size of Stack[] array */
   4594    GLuint DirtyFlag;   /**< _NEW_MODELVIEW or _NEW_PROJECTION, for example */
   4595 };
   4596 
   4597 
   4598 /**
   4599  * \name Bits for image transfer operations
   4600  * \sa __struct gl_contextRec::ImageTransferState.
   4601  */
   4602 /*@{*/
   4603 #define IMAGE_SCALE_BIAS_BIT                      0x1
   4604 #define IMAGE_SHIFT_OFFSET_BIT                    0x2
   4605 #define IMAGE_MAP_COLOR_BIT                       0x4
   4606 #define IMAGE_CLAMP_BIT                           0x800
   4607 
   4608 
   4609 /** Pixel Transfer ops */
   4610 #define IMAGE_BITS (IMAGE_SCALE_BIAS_BIT | \
   4611                     IMAGE_SHIFT_OFFSET_BIT | \
   4612                     IMAGE_MAP_COLOR_BIT)
   4613 
   4614 
   4615 /**
   4616  * \name Bits to indicate what state has changed.
   4617  */
   4618 /*@{*/
   4619 #define _NEW_MODELVIEW         (1u << 0)   /**< gl_context::ModelView */
   4620 #define _NEW_PROJECTION        (1u << 1)   /**< gl_context::Projection */
   4621 #define _NEW_TEXTURE_MATRIX    (1u << 2)   /**< gl_context::TextureMatrix */
   4622 #define _NEW_COLOR             (1u << 3)   /**< gl_context::Color */
   4623 #define _NEW_DEPTH             (1u << 4)   /**< gl_context::Depth */
   4624 #define _NEW_TNL_SPACES        (1u << 5)  /**< _mesa_update_tnl_spaces */
   4625 #define _NEW_FOG               (1u << 6)   /**< gl_context::Fog */
   4626 #define _NEW_HINT              (1u << 7)   /**< gl_context::Hint */
   4627 #define _NEW_LIGHT_CONSTANTS   (1u << 8)   /**< gl_context::Light */
   4628 #define _NEW_LINE              (1u << 9)   /**< gl_context::Line */
   4629 #define _NEW_PIXEL             (1u << 10)  /**< gl_context::Pixel */
   4630 #define _NEW_POINT             (1u << 11)  /**< gl_context::Point */
   4631 #define _NEW_POLYGON           (1u << 12)  /**< gl_context::Polygon */
   4632 #define _NEW_POLYGONSTIPPLE    (1u << 13)  /**< gl_context::PolygonStipple */
   4633 #define _NEW_SCISSOR           (1u << 14)  /**< gl_context::Scissor */
   4634 #define _NEW_STENCIL           (1u << 15)  /**< gl_context::Stencil */
   4635 #define _NEW_TEXTURE_OBJECT    (1u << 16)  /**< gl_context::Texture (bindings only) */
   4636 #define _NEW_TRANSFORM         (1u << 17)  /**< gl_context::Transform */
   4637 #define _NEW_VIEWPORT          (1u << 18)  /**< gl_context::Viewport */
   4638 #define _NEW_TEXTURE_STATE     (1u << 19)  /**< gl_context::Texture (states only) */
   4639 #define _NEW_LIGHT_STATE       (1u << 20)  /**< gl_context::Light */
   4640 #define _NEW_RENDERMODE        (1u << 21)  /**< gl_context::RenderMode, etc */
   4641 #define _NEW_BUFFERS           (1u << 22)  /**< gl_context::Visual, DrawBuffer, */
   4642 #define _NEW_CURRENT_ATTRIB    (1u << 23)  /**< gl_context::Current */
   4643 #define _NEW_MULTISAMPLE       (1u << 24)  /**< gl_context::Multisample */
   4644 #define _NEW_TRACK_MATRIX      (1u << 25)  /**< gl_context::VertexProgram */
   4645 #define _NEW_PROGRAM           (1u << 26)  /**< New program/shader state */
   4646 #define _NEW_PROGRAM_CONSTANTS (1u << 27)
   4647 #define _NEW_FF_VERT_PROGRAM   (1u << 28)
   4648 #define _NEW_FRAG_CLAMP        (1u << 29)
   4649 #define _NEW_MATERIAL          (1u << 30)  /**< gl_context::Light.Material */
   4650 #define _NEW_FF_FRAG_PROGRAM   (1u << 31)
   4651 #define _NEW_ALL ~0
   4652 /*@}*/
   4653 
   4654 
   4655 /**
   4656  * Composite state flags, deprecated and inefficient, do not use.
   4657  */
   4658 /*@{*/
   4659 #define _NEW_LIGHT     (_NEW_LIGHT_CONSTANTS |  /* state parameters */ \
   4660                         _NEW_LIGHT_STATE |      /* rasterizer state */ \
   4661                         _NEW_MATERIAL |         /* light materials */ \
   4662                         _NEW_FF_VERT_PROGRAM | \
   4663                         _NEW_FF_FRAG_PROGRAM)
   4664 
   4665 #define _NEW_TEXTURE   (_NEW_TEXTURE_OBJECT | _NEW_TEXTURE_STATE | \
   4666                         _NEW_FF_VERT_PROGRAM | _NEW_FF_FRAG_PROGRAM)
   4667 
   4668 #define _MESA_NEW_NEED_EYE_COORDS         (_NEW_FF_VERT_PROGRAM | \
   4669                                            _NEW_FF_FRAG_PROGRAM | \
   4670                                            _NEW_LIGHT_CONSTANTS | \
   4671                                            _NEW_TEXTURE_STATE |	\
   4672                                            _NEW_POINT |		\
   4673                                            _NEW_PROGRAM |	\
   4674                                            _NEW_MODELVIEW)
   4675 
   4676 #define _MESA_NEW_SEPARATE_SPECULAR        (_NEW_LIGHT | \
   4677                                             _NEW_FOG | \
   4678                                             _NEW_PROGRAM)
   4679 
   4680 
   4681 /*@}*/
   4682 
   4683 
   4684 
   4685 
   4686 /* This has to be included here. */
   4687 #include "dd.h"
   4688 
   4689 
   4690 /** Opaque declaration of display list payload data type */
   4691 union gl_dlist_node;
   4692 
   4693 
   4694 /**
   4695  * Per-display list information.
   4696  */
   4697 struct gl_display_list
   4698 {
   4699    GLuint Name;
   4700    bool small_list;
   4701    /* If small_list and begins_with_a_nop are true, this means
   4702     * the 'start' has been incremented to skip a NOP at the
   4703     * beginning.
   4704     */
   4705    bool begins_with_a_nop;
   4706    GLchar *Label;     /**< GL_KHR_debug */
   4707    /** The dlist commands are in a linked list of nodes */
   4708    union {
   4709       /* Big lists allocate their own storage */
   4710       union gl_dlist_node *Head;
   4711       /* Small lists use ctx->Shared->small_dlist_store */
   4712       struct {
   4713          unsigned start;
   4714          unsigned count;
   4715       };
   4716    };
   4717 };
   4718 
   4719 
   4720 /**
   4721  * State used during display list compilation and execution.
   4722  */
   4723 struct gl_dlist_state
   4724 {
   4725    struct gl_display_list *CurrentList; /**< List currently being compiled */
   4726    union gl_dlist_node *CurrentBlock; /**< Pointer to current block of nodes */
   4727    GLuint CurrentPos;		/**< Index into current block of nodes */
   4728    GLuint CallDepth;		/**< Current recursion calling depth */
   4729 
   4730    GLvertexformat ListVtxfmt;
   4731 
   4732    GLubyte ActiveAttribSize[VERT_ATTRIB_MAX];
   4733    uint32_t CurrentAttrib[VERT_ATTRIB_MAX][8];
   4734 
   4735    GLubyte ActiveMaterialSize[MAT_ATTRIB_MAX];
   4736    GLfloat CurrentMaterial[MAT_ATTRIB_MAX][4];
   4737 
   4738    struct {
   4739       /* State known to have been set by the currently-compiling display
   4740        * list.  Used to eliminate some redundant state changes.
   4741        */
   4742       GLenum16 ShadeModel;
   4743       bool UseLoopback;
   4744    } Current;
   4745 };
   4746 
   4747 /**
   4748  * Driver-specific state flags.
   4749  *
   4750  * These are or'd with gl_context::NewDriverState to notify a driver about
   4751  * a state change. The driver sets the flags at context creation and
   4752  * the meaning of the bits set is opaque to core Mesa.
   4753  */
   4754 struct gl_driver_flags
   4755 {
   4756    /** gl_context::Array::_DrawArrays (vertex array state) */
   4757    uint64_t NewArray;
   4758 
   4759    /** gl_context::TransformFeedback::CurrentObject */
   4760    uint64_t NewTransformFeedback;
   4761 
   4762    /** gl_context::TransformFeedback::CurrentObject::shader_program */
   4763    uint64_t NewTransformFeedbackProg;
   4764 
   4765    /** gl_context::RasterDiscard */
   4766    uint64_t NewRasterizerDiscard;
   4767 
   4768    /** gl_context::TileRasterOrder* */
   4769    uint64_t NewTileRasterOrder;
   4770 
   4771    /**
   4772     * gl_context::UniformBufferBindings
   4773     * gl_shader_program::UniformBlocks
   4774     */
   4775    uint64_t NewUniformBuffer;
   4776 
   4777    /**
   4778     * gl_context::ShaderStorageBufferBindings
   4779     * gl_shader_program::ShaderStorageBlocks
   4780     */
   4781    uint64_t NewShaderStorageBuffer;
   4782 
   4783    uint64_t NewTextureBuffer;
   4784 
   4785    /**
   4786     * gl_context::AtomicBufferBindings
   4787     */
   4788    uint64_t NewAtomicBuffer;
   4789 
   4790    /**
   4791     * gl_context::ImageUnits
   4792     */
   4793    uint64_t NewImageUnits;
   4794 
   4795    /**
   4796     * gl_context::TessCtrlProgram::patch_default_*
   4797     * gl_context::TessCtrlProgram::patch_vertices
   4798     */
   4799    uint64_t NewTessState;
   4800 
   4801    /**
   4802     * gl_context::IntelConservativeRasterization
   4803     */
   4804    uint64_t NewIntelConservativeRasterization;
   4805 
   4806    /**
   4807     * gl_context::NvConservativeRasterization
   4808     */
   4809    uint64_t NewNvConservativeRasterization;
   4810 
   4811    /**
   4812     * gl_context::ConservativeRasterMode/ConservativeRasterDilate
   4813     * gl_context::SubpixelPrecisionBias
   4814     */
   4815    uint64_t NewNvConservativeRasterizationParams;
   4816 
   4817    /**
   4818     * gl_context::Scissor::WindowRects
   4819     */
   4820    uint64_t NewWindowRectangles;
   4821 
   4822    /** gl_context::Color::sRGBEnabled */
   4823    uint64_t NewFramebufferSRGB;
   4824 
   4825    /** gl_context::Scissor::EnableFlags */
   4826    uint64_t NewScissorTest;
   4827 
   4828    /** gl_context::Scissor::ScissorArray */
   4829    uint64_t NewScissorRect;
   4830 
   4831    /** gl_context::Color::Alpha* */
   4832    uint64_t NewAlphaTest;
   4833 
   4834    /** gl_context::Color::Blend/Dither */
   4835    uint64_t NewBlend;
   4836 
   4837    /** gl_context::Color::BlendColor */
   4838    uint64_t NewBlendColor;
   4839 
   4840    /** gl_context::Color::Color/Index */
   4841    uint64_t NewColorMask;
   4842 
   4843    /** gl_context::Depth */
   4844    uint64_t NewDepth;
   4845 
   4846    /** gl_context::Color::LogicOp/ColorLogicOp/IndexLogicOp */
   4847    uint64_t NewLogicOp;
   4848 
   4849    /** gl_context::Multisample::Enabled */
   4850    uint64_t NewMultisampleEnable;
   4851 
   4852    /** gl_context::Multisample::SampleAlphaTo* */
   4853    uint64_t NewSampleAlphaToXEnable;
   4854 
   4855    /** gl_context::Multisample::SampleCoverage/SampleMaskValue */
   4856    uint64_t NewSampleMask;
   4857 
   4858    /** gl_context::Multisample::(Min)SampleShading */
   4859    uint64_t NewSampleShading;
   4860 
   4861    /** gl_context::Stencil */
   4862    uint64_t NewStencil;
   4863 
   4864    /** gl_context::Transform::ClipOrigin/ClipDepthMode */
   4865    uint64_t NewClipControl;
   4866 
   4867    /** gl_context::Transform::EyeUserPlane */
   4868    uint64_t NewClipPlane;
   4869 
   4870    /** gl_context::Transform::ClipPlanesEnabled */
   4871    uint64_t NewClipPlaneEnable;
   4872 
   4873    /** gl_context::Color::ClampFragmentColor */
   4874    uint64_t NewFragClamp;
   4875 
   4876    /** gl_context::Transform::DepthClamp */
   4877    uint64_t NewDepthClamp;
   4878 
   4879    /** gl_context::Line */
   4880    uint64_t NewLineState;
   4881 
   4882    /** gl_context::Polygon */
   4883    uint64_t NewPolygonState;
   4884 
   4885    /** gl_context::PolygonStipple */
   4886    uint64_t NewPolygonStipple;
   4887 
   4888    /** gl_context::ViewportArray */
   4889    uint64_t NewViewport;
   4890 
   4891    /** Shader constants (uniforms, program parameters, state constants) */
   4892    uint64_t NewShaderConstants[MESA_SHADER_STAGES];
   4893 
   4894    /** Programmable sample location state for gl_context::DrawBuffer */
   4895    uint64_t NewSampleLocations;
   4896 
   4897    /** For GL_CLAMP emulation */
   4898    uint64_t NewSamplersWithClamp;
   4899 };
   4900 
   4901 struct gl_buffer_binding
   4902 {
   4903    struct gl_buffer_object *BufferObject;
   4904    /** Start of uniform block data in the buffer */
   4905    GLintptr Offset;
   4906    /** Size of data allowed to be referenced from the buffer (in bytes) */
   4907    GLsizeiptr Size;
   4908    /**
   4909     * glBindBufferBase() indicates that the Size should be ignored and only
   4910     * limited by the current size of the BufferObject.
   4911     */
   4912    GLboolean AutomaticSize;
   4913 };
   4914 
   4915 /**
   4916  * ARB_shader_image_load_store image unit.
   4917  */
   4918 struct gl_image_unit
   4919 {
   4920    /**
   4921     * Texture object bound to this unit.
   4922     */
   4923    struct gl_texture_object *TexObj;
   4924 
   4925    /**
   4926     * Level of the texture object bound to this unit.
   4927     */
   4928    GLubyte Level;
   4929 
   4930    /**
   4931     * \c GL_TRUE if the whole level is bound as an array of layers, \c
   4932     * GL_FALSE if only some specific layer of the texture is bound.
   4933     * \sa Layer
   4934     */
   4935    GLboolean Layered;
   4936 
   4937    /**
   4938     * Layer of the texture object bound to this unit as specified by the
   4939     * application.
   4940     */
   4941    GLushort Layer;
   4942 
   4943    /**
   4944     * Layer of the texture object bound to this unit, or zero if
   4945     * Layered == false.
   4946     */
   4947    GLushort _Layer;
   4948 
   4949    /**
   4950     * Access allowed to this texture image.  Either \c GL_READ_ONLY,
   4951     * \c GL_WRITE_ONLY or \c GL_READ_WRITE.
   4952     */
   4953    GLenum16 Access;
   4954 
   4955    /**
   4956     * GL internal format that determines the interpretation of the
   4957     * image memory when shader image operations are performed through
   4958     * this unit.
   4959     */
   4960    GLenum16 Format;
   4961 
   4962    /**
   4963     * Mesa format corresponding to \c Format.
   4964     */
   4965    mesa_format _ActualFormat:16;
   4966 };
   4967 
   4968 /**
   4969  * Shader subroutines storage
   4970  */
   4971 struct gl_subroutine_index_binding
   4972 {
   4973    GLuint NumIndex;
   4974    GLuint *IndexPtr;
   4975 };
   4976 
   4977 struct gl_texture_handle_object
   4978 {
   4979    struct gl_texture_object *texObj;
   4980    struct gl_sampler_object *sampObj;
   4981    GLuint64 handle;
   4982 };
   4983 
   4984 struct gl_image_handle_object
   4985 {
   4986    struct gl_image_unit imgObj;
   4987    GLuint64 handle;
   4988 };
   4989 
   4990 struct gl_memory_object
   4991 {
   4992    GLuint Name;            /**< hash table ID/name */
   4993    GLboolean Immutable;    /**< denotes mutability state of parameters */
   4994    GLboolean Dedicated;    /**< import memory from a dedicated allocation */
   4995 };
   4996 
   4997 struct gl_semaphore_object
   4998 {
   4999    GLuint Name;            /**< hash table ID/name */
   5000 };
   5001 
   5002 /**
   5003  * One element of the client attrib stack.
   5004  */
   5005 struct gl_client_attrib_node
   5006 {
   5007    GLbitfield Mask;
   5008    struct gl_array_attrib Array;
   5009    struct gl_vertex_array_object VAO;
   5010    struct gl_pixelstore_attrib Pack;
   5011    struct gl_pixelstore_attrib Unpack;
   5012 };
   5013 
   5014 /**
   5015  * The VBO module implemented in src/vbo.
   5016  */
   5017 struct vbo_context {
   5018    struct gl_vertex_buffer_binding binding;
   5019    struct gl_array_attributes current[VBO_ATTRIB_MAX];
   5020 
   5021    struct gl_vertex_array_object *VAO;
   5022 
   5023    struct vbo_exec_context exec;
   5024    struct vbo_save_context save;
   5025 };
   5026 
   5027 /**
   5028  * glEnable node for the attribute stack. (glPushAttrib/glPopAttrib)
   5029  */
   5030 struct gl_enable_attrib_node
   5031 {
   5032    GLboolean AlphaTest;
   5033    GLboolean AutoNormal;
   5034    GLboolean Blend;
   5035    GLbitfield ClipPlanes;
   5036    GLboolean ColorMaterial;
   5037    GLboolean CullFace;
   5038    GLboolean DepthClampNear;
   5039    GLboolean DepthClampFar;
   5040    GLboolean DepthTest;
   5041    GLboolean Dither;
   5042    GLboolean Fog;
   5043    GLboolean Light[MAX_LIGHTS];
   5044    GLboolean Lighting;
   5045    GLboolean LineSmooth;
   5046    GLboolean LineStipple;
   5047    GLboolean IndexLogicOp;
   5048    GLboolean ColorLogicOp;
   5049 
   5050    GLboolean Map1Color4;
   5051    GLboolean Map1Index;
   5052    GLboolean Map1Normal;
   5053    GLboolean Map1TextureCoord1;
   5054    GLboolean Map1TextureCoord2;
   5055    GLboolean Map1TextureCoord3;
   5056    GLboolean Map1TextureCoord4;
   5057    GLboolean Map1Vertex3;
   5058    GLboolean Map1Vertex4;
   5059    GLboolean Map2Color4;
   5060    GLboolean Map2Index;
   5061    GLboolean Map2Normal;
   5062    GLboolean Map2TextureCoord1;
   5063    GLboolean Map2TextureCoord2;
   5064    GLboolean Map2TextureCoord3;
   5065    GLboolean Map2TextureCoord4;
   5066    GLboolean Map2Vertex3;
   5067    GLboolean Map2Vertex4;
   5068 
   5069    GLboolean Normalize;
   5070    GLboolean PixelTexture;
   5071    GLboolean PointSmooth;
   5072    GLboolean PolygonOffsetPoint;
   5073    GLboolean PolygonOffsetLine;
   5074    GLboolean PolygonOffsetFill;
   5075    GLboolean PolygonSmooth;
   5076    GLboolean PolygonStipple;
   5077    GLboolean RescaleNormals;
   5078    GLbitfield Scissor;
   5079    GLboolean Stencil;
   5080    GLboolean StencilTwoSide;          /* GL_EXT_stencil_two_side */
   5081    GLboolean MultisampleEnabled;      /* GL_ARB_multisample */
   5082    GLboolean SampleAlphaToCoverage;   /* GL_ARB_multisample */
   5083    GLboolean SampleAlphaToOne;        /* GL_ARB_multisample */
   5084    GLboolean SampleCoverage;          /* GL_ARB_multisample */
   5085    GLboolean RasterPositionUnclipped; /* GL_IBM_rasterpos_clip */
   5086 
   5087    GLbitfield Texture[MAX_TEXTURE_UNITS];
   5088    GLbitfield TexGen[MAX_TEXTURE_UNITS];
   5089 
   5090    /* GL_ARB_vertex_program */
   5091    GLboolean VertexProgram;
   5092    GLboolean VertexProgramPointSize;
   5093    GLboolean VertexProgramTwoSide;
   5094 
   5095    /* GL_ARB_fragment_program */
   5096    GLboolean FragmentProgram;
   5097 
   5098    /* GL_ARB_point_sprite */
   5099    GLboolean PointSprite;
   5100    GLboolean FragmentShaderATI;
   5101 
   5102    /* GL_ARB_framebuffer_sRGB / GL_EXT_framebuffer_sRGB */
   5103    GLboolean sRGBEnabled;
   5104 
   5105    /* GL_NV_conservative_raster */
   5106    GLboolean ConservativeRasterization;
   5107 };
   5108 
   5109 /**
   5110  * Texture node for the attribute stack. (glPushAttrib/glPopAttrib)
   5111  */
   5112 struct gl_texture_attrib_node
   5113 {
   5114    GLuint CurrentUnit;   /**< GL_ACTIVE_TEXTURE */
   5115    GLuint NumTexSaved;
   5116    struct gl_fixedfunc_texture_unit FixedFuncUnit[MAX_TEXTURE_COORD_UNITS];
   5117    GLfloat LodBias[MAX_TEXTURE_UNITS];
   5118    float LodBiasQuantized[MAX_TEXTURE_UNITS];
   5119 
   5120    /** Saved default texture object state. */
   5121    struct gl_texture_object SavedDefaultObj[NUM_TEXTURE_TARGETS];
   5122 
   5123    /* For saving per texture object state (wrap modes, filters, etc),
   5124     * SavedObj[][].Target is unused, so the value is invalid.
   5125     */
   5126    struct gl_texture_object SavedObj[MAX_COMBINED_TEXTURE_IMAGE_UNITS][NUM_TEXTURE_TARGETS];
   5127 };
   5128 
   5129 
   5130 /**
   5131  * Node for the attribute stack. (glPushAttrib/glPopAttrib)
   5132  */
   5133 struct gl_attrib_node
   5134 {
   5135    GLbitfield Mask;
   5136    GLbitfield OldPopAttribStateMask;
   5137    struct gl_accum_attrib Accum;
   5138    struct gl_colorbuffer_attrib Color;
   5139    struct gl_current_attrib Current;
   5140    struct gl_depthbuffer_attrib Depth;
   5141    struct gl_enable_attrib_node Enable;
   5142    struct gl_eval_attrib Eval;
   5143    struct gl_fog_attrib Fog;
   5144    struct gl_hint_attrib Hint;
   5145    struct gl_light_attrib Light;
   5146    struct gl_line_attrib Line;
   5147    struct gl_list_attrib List;
   5148    struct gl_pixel_attrib Pixel;
   5149    struct gl_point_attrib Point;
   5150    struct gl_polygon_attrib Polygon;
   5151    GLuint PolygonStipple[32];
   5152    struct gl_scissor_attrib Scissor;
   5153    struct gl_stencil_attrib Stencil;
   5154    struct gl_transform_attrib Transform;
   5155    struct gl_multisample_attrib Multisample;
   5156    struct gl_texture_attrib_node Texture;
   5157 
   5158    struct viewport_state
   5159    {
   5160       struct gl_viewport_attrib ViewportArray[MAX_VIEWPORTS];
   5161       GLuint SubpixelPrecisionBias[2];
   5162    } Viewport;
   5163 };
   5164 
   5165 /**
   5166  * Mesa rendering context.
   5167  *
   5168  * This is the central context data structure for Mesa.  Almost all
   5169  * OpenGL state is contained in this structure.
   5170  * Think of this as a base class from which device drivers will derive
   5171  * sub classes.
   5172  */
   5173 struct gl_context
   5174 {
   5175    /** State possibly shared with other contexts in the address space */
   5176    struct gl_shared_state *Shared;
   5177 
   5178    /** Whether Shared->BufferObjects has already been locked for this context. */
   5179    bool BufferObjectsLocked;
   5180    /** Whether Shared->TexMutex has already been locked for this context. */
   5181    bool TexturesLocked;
   5182 
   5183    /** \name API function pointer tables */
   5184    /*@{*/
   5185    gl_api API;
   5186 
   5187    /**
   5188     * The current dispatch table for non-displaylist-saving execution, either
   5189     * BeginEnd or OutsideBeginEnd
   5190     */
   5191    struct _glapi_table *Exec;
   5192    /**
   5193     * The normal dispatch table for non-displaylist-saving, non-begin/end
   5194     */
   5195    struct _glapi_table *OutsideBeginEnd;
   5196    /** The dispatch table used between glNewList() and glEndList() */
   5197    struct _glapi_table *Save;
   5198    /**
   5199     * The dispatch table used between glBegin() and glEnd() (outside of a
   5200     * display list).  Only valid functions between those two are set, which is
   5201     * mostly just the set in a GLvertexformat struct.
   5202     */
   5203    struct _glapi_table *BeginEnd;
   5204    /**
   5205     * Dispatch table for when a graphics reset has happened.
   5206     */
   5207    struct _glapi_table *ContextLost;
   5208    /**
   5209     * Dispatch table used to marshal API calls from the client program to a
   5210     * separate server thread.  NULL if API calls are not being marshalled to
   5211     * another thread.
   5212     */
   5213    struct _glapi_table *MarshalExec;
   5214    /**
   5215     * Dispatch table currently in use for fielding API calls from the client
   5216     * program.  If API calls are being marshalled to another thread, this ==
   5217     * MarshalExec.  Otherwise it == CurrentServerDispatch.
   5218     */
   5219    struct _glapi_table *CurrentClientDispatch;
   5220 
   5221    /**
   5222     * Dispatch table currently in use for performing API calls.  == Save or
   5223     * Exec.
   5224     */
   5225    struct _glapi_table *CurrentServerDispatch;
   5226 
   5227    /*@}*/
   5228 
   5229    struct glthread_state GLThread;
   5230 
   5231    struct gl_config Visual;
   5232    struct gl_framebuffer *DrawBuffer;	/**< buffer for writing */
   5233    struct gl_framebuffer *ReadBuffer;	/**< buffer for reading */
   5234    struct gl_framebuffer *WinSysDrawBuffer;  /**< set with MakeCurrent */
   5235    struct gl_framebuffer *WinSysReadBuffer;  /**< set with MakeCurrent */
   5236 
   5237    /**
   5238     * Device driver function pointer table
   5239     */
   5240    struct dd_function_table Driver;
   5241 
   5242    /** Core/Driver constants */
   5243    struct gl_constants Const;
   5244 
   5245    /**
   5246     * Bitmask of valid primitive types supported by this context type,
   5247     * GL version, and extensions, not taking current states into account.
   5248     * Current states can further reduce the final bitmask at draw time.
   5249     */
   5250    GLbitfield SupportedPrimMask;
   5251 
   5252    /**
   5253     * Bitmask of valid primitive types depending on current states (such as
   5254     * shaders). This is 0 if the current states should result in
   5255     * GL_INVALID_OPERATION in draw calls.
   5256     */
   5257    GLbitfield ValidPrimMask;
   5258 
   5259    GLenum16 DrawGLError; /**< GL error to return from draw calls */
   5260 
   5261    /**
   5262     * Same as ValidPrimMask, but should be applied to glDrawElements*.
   5263     */
   5264    GLbitfield ValidPrimMaskIndexed;
   5265 
   5266    /**
   5267     * Whether DrawPixels/CopyPixels/Bitmap are valid to render.
   5268     */
   5269    bool DrawPixValid;
   5270 
   5271    /** \name The various 4x4 matrix stacks */
   5272    /*@{*/
   5273    struct gl_matrix_stack ModelviewMatrixStack;
   5274    struct gl_matrix_stack ProjectionMatrixStack;
   5275    struct gl_matrix_stack TextureMatrixStack[MAX_TEXTURE_UNITS];
   5276    struct gl_matrix_stack ProgramMatrixStack[MAX_PROGRAM_MATRICES];
   5277    struct gl_matrix_stack *CurrentStack; /**< Points to one of the above stacks */
   5278    /*@}*/
   5279 
   5280    /** Combined modelview and projection matrix */
   5281    GLmatrix _ModelProjectMatrix;
   5282 
   5283    /** \name Display lists */
   5284    struct gl_dlist_state ListState;
   5285 
   5286    GLboolean ExecuteFlag;	/**< Execute GL commands? */
   5287    GLboolean CompileFlag;	/**< Compile GL commands into display list? */
   5288 
   5289    /** Extension information */
   5290    struct gl_extensions Extensions;
   5291 
   5292    /** GL version integer, for example 31 for GL 3.1, or 20 for GLES 2.0. */
   5293    GLuint Version;
   5294    char *VersionString;
   5295 
   5296    /** \name State attribute stack (for glPush/PopAttrib) */
   5297    /*@{*/
   5298    GLuint AttribStackDepth;
   5299    struct gl_attrib_node *AttribStack[MAX_ATTRIB_STACK_DEPTH];
   5300    /*@}*/
   5301 
   5302    /** \name Renderer attribute groups
   5303     *
   5304     * We define a struct for each attribute group to make pushing and popping
   5305     * attributes easy.  Also it's a good organization.
   5306     */
   5307    /*@{*/
   5308    struct gl_accum_attrib	Accum;		/**< Accum buffer attributes */
   5309    struct gl_colorbuffer_attrib	Color;		/**< Color buffer attributes */
   5310    struct gl_current_attrib	Current;	/**< Current attributes */
   5311    struct gl_depthbuffer_attrib	Depth;		/**< Depth buffer attributes */
   5312    struct gl_eval_attrib	Eval;		/**< Eval attributes */
   5313    struct gl_fog_attrib		Fog;		/**< Fog attributes */
   5314    struct gl_hint_attrib	Hint;		/**< Hint attributes */
   5315    struct gl_light_attrib	Light;		/**< Light attributes */
   5316    struct gl_line_attrib	Line;		/**< Line attributes */
   5317    struct gl_list_attrib	List;		/**< List attributes */
   5318    struct gl_multisample_attrib Multisample;
   5319    struct gl_pixel_attrib	Pixel;		/**< Pixel attributes */
   5320    struct gl_point_attrib	Point;		/**< Point attributes */
   5321    struct gl_polygon_attrib	Polygon;	/**< Polygon attributes */
   5322    GLuint PolygonStipple[32];			/**< Polygon stipple */
   5323    struct gl_scissor_attrib	Scissor;	/**< Scissor attributes */
   5324    struct gl_stencil_attrib	Stencil;	/**< Stencil buffer attributes */
   5325    struct gl_texture_attrib	Texture;	/**< Texture attributes */
   5326    struct gl_transform_attrib	Transform;	/**< Transformation attributes */
   5327    struct gl_viewport_attrib	ViewportArray[MAX_VIEWPORTS];	/**< Viewport attributes */
   5328    GLuint SubpixelPrecisionBias[2];	/**< Viewport attributes */
   5329    /*@}*/
   5330 
   5331    /** \name Client attribute stack */
   5332    /*@{*/
   5333    GLuint ClientAttribStackDepth;
   5334    struct gl_client_attrib_node ClientAttribStack[MAX_CLIENT_ATTRIB_STACK_DEPTH];
   5335    /*@}*/
   5336 
   5337    /** \name Client attribute groups */
   5338    /*@{*/
   5339    struct gl_array_attrib	Array;	/**< Vertex arrays */
   5340    struct gl_pixelstore_attrib	Pack;	/**< Pixel packing */
   5341    struct gl_pixelstore_attrib	Unpack;	/**< Pixel unpacking */
   5342    struct gl_pixelstore_attrib	DefaultPacking;	/**< Default params */
   5343    /*@}*/
   5344 
   5345    /** \name Other assorted state (not pushed/popped on attribute stack) */
   5346    /*@{*/
   5347    struct gl_pixelmaps          PixelMaps;
   5348 
   5349    struct gl_evaluators EvalMap;   /**< All evaluators */
   5350    struct gl_feedback   Feedback;  /**< Feedback */
   5351    struct gl_selection  Select;    /**< Selection */
   5352 
   5353    struct gl_program_state Program;  /**< general program state */
   5354    struct gl_vertex_program_state VertexProgram;
   5355    struct gl_fragment_program_state FragmentProgram;
   5356    struct gl_geometry_program_state GeometryProgram;
   5357    struct gl_compute_program_state ComputeProgram;
   5358    struct gl_tess_ctrl_program_state TessCtrlProgram;
   5359    struct gl_tess_eval_program_state TessEvalProgram;
   5360    struct gl_ati_fragment_shader_state ATIFragmentShader;
   5361 
   5362    struct gl_pipeline_shader_state Pipeline; /**< GLSL pipeline shader object state */
   5363    struct gl_pipeline_object Shader; /**< GLSL shader object state */
   5364 
   5365    /**
   5366     * Current active shader pipeline state
   5367     *
   5368     * Almost all internal users want ::_Shader instead of ::Shader.  The
   5369     * exceptions are bits of legacy GLSL API that do not know about separate
   5370     * shader objects.
   5371     *
   5372     * If a program is active via \c glUseProgram, this will point to
   5373     * \c ::Shader.
   5374     *
   5375     * If a program pipeline is active via \c glBindProgramPipeline, this will
   5376     * point to \c ::Pipeline.Current.
   5377     *
   5378     * If neither a program nor a program pipeline is active, this will point to
   5379     * \c ::Pipeline.Default.  This ensures that \c ::_Shader will never be
   5380     * \c NULL.
   5381     */
   5382    struct gl_pipeline_object *_Shader;
   5383 
   5384    /**
   5385     * NIR containing the functions that implement software fp64 support.
   5386     */
   5387    struct nir_shader *SoftFP64;
   5388 
   5389    struct gl_query_state Query;  /**< occlusion, timer queries */
   5390 
   5391    struct gl_transform_feedback_state TransformFeedback;
   5392 
   5393    struct gl_perf_monitor_state PerfMonitor;
   5394    struct gl_perf_query_state PerfQuery;
   5395 
   5396    struct gl_buffer_object *DrawIndirectBuffer; /** < GL_ARB_draw_indirect */
   5397    struct gl_buffer_object *ParameterBuffer; /** < GL_ARB_indirect_parameters */
   5398    struct gl_buffer_object *DispatchIndirectBuffer; /** < GL_ARB_compute_shader */
   5399 
   5400    struct gl_buffer_object *CopyReadBuffer; /**< GL_ARB_copy_buffer */
   5401    struct gl_buffer_object *CopyWriteBuffer; /**< GL_ARB_copy_buffer */
   5402 
   5403    struct gl_buffer_object *QueryBuffer; /**< GL_ARB_query_buffer_object */
   5404 
   5405    /**
   5406     * Current GL_ARB_uniform_buffer_object binding referenced by
   5407     * GL_UNIFORM_BUFFER target for glBufferData, glMapBuffer, etc.
   5408     */
   5409    struct gl_buffer_object *UniformBuffer;
   5410 
   5411    /**
   5412     * Current GL_ARB_shader_storage_buffer_object binding referenced by
   5413     * GL_SHADER_STORAGE_BUFFER target for glBufferData, glMapBuffer, etc.
   5414     */
   5415    struct gl_buffer_object *ShaderStorageBuffer;
   5416 
   5417    /**
   5418     * Array of uniform buffers for GL_ARB_uniform_buffer_object and GL 3.1.
   5419     * This is set up using glBindBufferRange() or glBindBufferBase().  They are
   5420     * associated with uniform blocks by glUniformBlockBinding()'s state in the
   5421     * shader program.
   5422     */
   5423    struct gl_buffer_binding
   5424       UniformBufferBindings[MAX_COMBINED_UNIFORM_BUFFERS];
   5425 
   5426    /**
   5427     * Array of shader storage buffers for ARB_shader_storage_buffer_object
   5428     * and GL 4.3. This is set up using glBindBufferRange() or
   5429     * glBindBufferBase().  They are associated with shader storage blocks by
   5430     * glShaderStorageBlockBinding()'s state in the shader program.
   5431     */
   5432    struct gl_buffer_binding
   5433       ShaderStorageBufferBindings[MAX_COMBINED_SHADER_STORAGE_BUFFERS];
   5434 
   5435    /**
   5436     * Object currently associated with the GL_ATOMIC_COUNTER_BUFFER
   5437     * target.
   5438     */
   5439    struct gl_buffer_object *AtomicBuffer;
   5440 
   5441    /**
   5442     * Object currently associated w/ the GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD
   5443     * target.
   5444     */
   5445    struct gl_buffer_object *ExternalVirtualMemoryBuffer;
   5446 
   5447    /**
   5448     * Array of atomic counter buffer binding points.
   5449     */
   5450    struct gl_buffer_binding
   5451       AtomicBufferBindings[MAX_COMBINED_ATOMIC_BUFFERS];
   5452 
   5453    /**
   5454     * Array of image units for ARB_shader_image_load_store.
   5455     */
   5456    struct gl_image_unit ImageUnits[MAX_IMAGE_UNITS];
   5457 
   5458    struct gl_subroutine_index_binding SubroutineIndex[MESA_SHADER_STAGES];
   5459    /*@}*/
   5460 
   5461    struct gl_meta_state *Meta;  /**< for "meta" operations */
   5462 
   5463    /* GL_EXT_framebuffer_object */
   5464    struct gl_renderbuffer *CurrentRenderbuffer;
   5465 
   5466    GLenum16 ErrorValue;      /**< Last error code */
   5467 
   5468    /**
   5469     * Recognize and silence repeated error debug messages in buggy apps.
   5470     */
   5471    const char *ErrorDebugFmtString;
   5472    GLuint ErrorDebugCount;
   5473 
   5474    /* GL_ARB_debug_output/GL_KHR_debug */
   5475    simple_mtx_t DebugMutex;
   5476    struct gl_debug_state *Debug;
   5477 
   5478    GLenum16 RenderMode;      /**< either GL_RENDER, GL_SELECT, GL_FEEDBACK */
   5479    GLbitfield NewState;      /**< bitwise-or of _NEW_* flags */
   5480    GLbitfield PopAttribState; /**< Updated state since glPushAttrib */
   5481    uint64_t NewDriverState;  /**< bitwise-or of flags from DriverFlags */
   5482 
   5483    struct gl_driver_flags DriverFlags;
   5484 
   5485    GLboolean ViewportInitialized;  /**< has viewport size been initialized? */
   5486    GLboolean _AllowDrawOutOfOrder;
   5487 
   5488    /** \name Derived state */
   5489    GLbitfield _ImageTransferState;/**< bitwise-or of IMAGE_*_BIT flags */
   5490    GLfloat _EyeZDir[3];
   5491    GLfloat _ModelViewInvScale; /* may be for model- or eyespace lighting */
   5492    GLfloat _ModelViewInvScaleEyespace; /* always factor defined in spec */
   5493    GLboolean _NeedEyeCoords;
   5494    GLboolean _ForceEyeCoords;
   5495 
   5496    GLuint TextureStateTimestamp; /**< detect changes to shared state */
   5497 
   5498    /** \name For debugging/development only */
   5499    /*@{*/
   5500    GLboolean FirstTimeCurrent;
   5501    /*@}*/
   5502 
   5503    /**
   5504     * False if this context was created without a config. This is needed
   5505     * because the initial state of glDrawBuffers depends on this
   5506     */
   5507    GLboolean HasConfig;
   5508 
   5509    GLboolean TextureFormatSupported[MESA_FORMAT_COUNT];
   5510 
   5511    GLboolean RasterDiscard;  /**< GL_RASTERIZER_DISCARD */
   5512    GLboolean IntelConservativeRasterization; /**< GL_CONSERVATIVE_RASTERIZATION_INTEL */
   5513    GLboolean ConservativeRasterization; /**< GL_CONSERVATIVE_RASTERIZATION_NV */
   5514    GLfloat ConservativeRasterDilate;
   5515    GLenum16 ConservativeRasterMode;
   5516 
   5517    GLboolean IntelBlackholeRender; /**< GL_INTEL_blackhole_render */
   5518 
   5519    /** Does glVertexAttrib(0) alias glVertex()? */
   5520    bool _AttribZeroAliasesVertex;
   5521 
   5522    /**
   5523     * When set, TileRasterOrderIncreasingX/Y control the order that a tiled
   5524     * renderer's tiles should be excecuted, to meet the requirements of
   5525     * GL_MESA_tile_raster_order.
   5526     */
   5527    GLboolean TileRasterOrderFixed;
   5528    GLboolean TileRasterOrderIncreasingX;
   5529    GLboolean TileRasterOrderIncreasingY;
   5530 
   5531    /**
   5532     * \name Hooks for module contexts.
   5533     *
   5534     * These will eventually live in the driver or elsewhere.
   5535     */
   5536    /*@{*/
   5537    void *swrast_context;
   5538    void *swsetup_context;
   5539    void *swtnl_context;
   5540    struct vbo_context vbo_context;
   5541    struct st_context *st;
   5542    /*@}*/
   5543 
   5544    /**
   5545     * \name NV_vdpau_interop
   5546     */
   5547    /*@{*/
   5548    const void *vdpDevice;
   5549    const void *vdpGetProcAddress;
   5550    struct set *vdpSurfaces;
   5551    /*@}*/
   5552 
   5553    /**
   5554     * Has this context observed a GPU reset in any context in the share group?
   5555     *
   5556     * Once this field becomes true, it is never reset to false.
   5557     */
   5558    GLboolean ShareGroupReset;
   5559 
   5560    /**
   5561     * \name OES_primitive_bounding_box
   5562     *
   5563     * Stores the arguments to glPrimitiveBoundingBox
   5564     */
   5565    GLfloat PrimitiveBoundingBox[8];
   5566 
   5567    struct disk_cache *Cache;
   5568 
   5569    /**
   5570     * \name GL_ARB_bindless_texture
   5571     */
   5572    /*@{*/
   5573    struct hash_table_u64 *ResidentTextureHandles;
   5574    struct hash_table_u64 *ResidentImageHandles;
   5575    /*@}*/
   5576 
   5577    bool shader_builtin_ref;
   5578 };
   5579 
   5580 /**
   5581  * Information about memory usage. All sizes are in kilobytes.
   5582  */
   5583 struct gl_memory_info
   5584 {
   5585    unsigned total_device_memory; /**< size of device memory, e.g. VRAM */
   5586    unsigned avail_device_memory; /**< free device memory at the moment */
   5587    unsigned total_staging_memory; /**< size of staging memory, e.g. GART */
   5588    unsigned avail_staging_memory; /**< free staging memory at the moment */
   5589    unsigned device_memory_evicted; /**< size of memory evicted (monotonic counter) */
   5590    unsigned nr_device_memory_evictions; /**< # of evictions (monotonic counter) */
   5591 };
   5592 
   5593 #ifndef NDEBUG
   5594 extern int MESA_VERBOSE;
   5595 extern int MESA_DEBUG_FLAGS;
   5596 #else
   5597 # define MESA_VERBOSE 0
   5598 # define MESA_DEBUG_FLAGS 0
   5599 #endif
   5600 
   5601 
   5602 /** The MESA_VERBOSE var is a bitmask of these flags */
   5603 enum _verbose
   5604 {
   5605    VERBOSE_VARRAY		= 0x0001,
   5606    VERBOSE_TEXTURE		= 0x0002,
   5607    VERBOSE_MATERIAL		= 0x0004,
   5608    VERBOSE_PIPELINE		= 0x0008,
   5609    VERBOSE_DRIVER		= 0x0010,
   5610    VERBOSE_STATE		= 0x0020,
   5611    VERBOSE_API			= 0x0040,
   5612    VERBOSE_DISPLAY_LIST		= 0x0100,
   5613    VERBOSE_LIGHTING		= 0x0200,
   5614    VERBOSE_PRIMS		= 0x0400,
   5615    VERBOSE_VERTS		= 0x0800,
   5616    VERBOSE_DISASSEM		= 0x1000,
   5617    VERBOSE_SWAPBUFFERS          = 0x4000
   5618 };
   5619 
   5620 
   5621 /** The MESA_DEBUG_FLAGS var is a bitmask of these flags */
   5622 enum _debug
   5623 {
   5624    DEBUG_SILENT                 = (1 << 0),
   5625    DEBUG_ALWAYS_FLUSH		= (1 << 1),
   5626    DEBUG_INCOMPLETE_TEXTURE     = (1 << 2),
   5627    DEBUG_INCOMPLETE_FBO         = (1 << 3),
   5628    DEBUG_CONTEXT                = (1 << 4)
   5629 };
   5630 
   5631 #ifdef __cplusplus
   5632 }
   5633 #endif
   5634 
   5635 #endif /* MTYPES_H */
   5636