• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright 2007 VMware, Inc.
4  * Copyright (c) 2008 VMware, Inc.
5  * 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
9  * "Software"), to deal in the Software without restriction, including
10  * without limitation the rights to use, copy, modify, merge, publish,
11  * distribute, sub license, and/or sell copies of the Software, and to
12  * permit persons to whom the Software is furnished to do so, subject to
13  * the following conditions:
14  *
15  * The above copyright notice and this permission notice (including the
16  * next paragraph) shall be included in all copies or substantial portions
17  * of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
23  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26  *
27  **************************************************************************/
28 
29 #include "compiler/nir/nir.h"
30 
31 
32 #include "main/context.h"
33 #include "main/macros.h"
34 #include "main/spirv_extensions.h"
35 #include "main/version.h"
36 #include "nir/nir_to_tgsi.h"
37 
38 #include "pipe/p_context.h"
39 #include "pipe/p_defines.h"
40 #include "pipe/p_screen.h"
41 #include "tgsi/tgsi_from_mesa.h"
42 #include "util/u_math.h"
43 #include "util/u_memory.h"
44 
45 #include "st_context.h"
46 #include "st_debug.h"
47 #include "st_extensions.h"
48 #include "st_format.h"
49 
50 
51 /*
52  * Note: we use these function rather than the MIN2, MAX2, CLAMP macros to
53  * avoid evaluating arguments (which are often function calls) more than once.
54  */
55 
_min(unsigned a,unsigned b)56 static unsigned _min(unsigned a, unsigned b)
57 {
58    return (a < b) ? a : b;
59 }
60 
_maxf(float a,float b)61 static float _maxf(float a, float b)
62 {
63    return (a > b) ? a : b;
64 }
65 
_clamp(int a,int min,int max)66 static int _clamp(int a, int min, int max)
67 {
68    if (a < min)
69       return min;
70    else if (a > max)
71       return max;
72    else
73       return a;
74 }
75 
76 
77 /**
78  * Query driver to get implementation limits.
79  * Note that we have to limit/clamp against Mesa's internal limits too.
80  */
st_init_limits(struct pipe_screen * screen,struct gl_constants * c,struct gl_extensions * extensions,gl_api api)81 void st_init_limits(struct pipe_screen *screen,
82                     struct gl_constants *c, struct gl_extensions *extensions,
83                     gl_api api)
84 {
85    unsigned sh;
86    bool can_ubo = true;
87    int temp;
88 
89    c->MaxTextureSize = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
90    c->MaxTextureSize = MIN2(c->MaxTextureSize, 1 << (MAX_TEXTURE_LEVELS - 1));
91    c->MaxTextureMbytes = MAX2(c->MaxTextureMbytes,
92                               screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_MB));
93 
94    c->Max3DTextureLevels
95       = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS),
96             MAX_TEXTURE_LEVELS);
97    extensions->OES_texture_3D = c->Max3DTextureLevels != 0;
98 
99    c->MaxCubeTextureLevels
100       = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS),
101             MAX_TEXTURE_LEVELS);
102 
103    c->MaxTextureRectSize = _min(c->MaxTextureSize, MAX_TEXTURE_RECT_SIZE);
104 
105    c->MaxArrayTextureLayers
106       = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS);
107 
108    /* Define max viewport size and max renderbuffer size in terms of
109     * max texture size (note: max tex RECT size = max tex 2D size).
110     * If this isn't true for some hardware we'll need new PIPE_CAP_ queries.
111     */
112    c->MaxViewportWidth =
113    c->MaxViewportHeight =
114    c->MaxRenderbufferSize = c->MaxTextureRectSize;
115 
116    c->SubPixelBits =
117       screen->get_param(screen, PIPE_CAP_RASTERIZER_SUBPIXEL_BITS);
118    c->ViewportSubpixelBits =
119       screen->get_param(screen, PIPE_CAP_VIEWPORT_SUBPIXEL_BITS);
120 
121    c->MaxDrawBuffers = c->MaxColorAttachments =
122       _clamp(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
123              1, MAX_DRAW_BUFFERS);
124 
125    c->MaxDualSourceDrawBuffers =
126       _clamp(screen->get_param(screen,
127                                PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS),
128              0, MAX_DRAW_BUFFERS);
129 
130    c->MaxLineWidth =
131       _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_LINE_WIDTH));
132    c->MaxLineWidthAA =
133       _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_LINE_WIDTH_AA));
134 
135    c->MinLineWidth = screen->get_paramf(screen, PIPE_CAPF_MIN_LINE_WIDTH);
136    c->MinLineWidthAA = screen->get_paramf(screen, PIPE_CAPF_MIN_LINE_WIDTH_AA);
137    c->LineWidthGranularity = screen->get_paramf(screen, PIPE_CAPF_LINE_WIDTH_GRANULARITY);
138 
139    c->MaxPointSize =
140       _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_POINT_SIZE));
141    c->MaxPointSizeAA =
142       _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_POINT_SIZE_AA));
143 
144    c->MinPointSize = MAX2(screen->get_paramf(screen, PIPE_CAPF_MIN_POINT_SIZE), 0.01);
145    c->MinPointSizeAA = MAX2(screen->get_paramf(screen, PIPE_CAPF_MIN_POINT_SIZE_AA), 0.01);
146    c->PointSizeGranularity = screen->get_paramf(screen, PIPE_CAPF_POINT_SIZE_GRANULARITY);
147 
148    c->MaxTextureMaxAnisotropy =
149       _maxf(2.0f,
150             screen->get_paramf(screen, PIPE_CAPF_MAX_TEXTURE_ANISOTROPY));
151 
152    c->MaxTextureLodBias =
153       screen->get_paramf(screen, PIPE_CAPF_MAX_TEXTURE_LOD_BIAS);
154 
155    c->QuadsFollowProvokingVertexConvention =
156       screen->get_param(screen,
157                         PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION);
158 
159    c->MaxUniformBlockSize =
160       screen->get_param(screen, PIPE_CAP_MAX_CONSTANT_BUFFER_SIZE_UINT);
161 
162    if (c->MaxUniformBlockSize < 16384) {
163       can_ubo = false;
164    }
165 
166    /* Round down to a multiple of 4 to make piglit happy. Bytes are not
167     * addressible by UBOs anyway.
168     */
169    c->MaxUniformBlockSize &= ~3;
170 
171    c->HasFBFetch = screen->get_param(screen, PIPE_CAP_FBFETCH);
172 
173    c->SupportsReadingOutputs = screen->get_param(screen, PIPE_CAP_SHADER_CAN_READ_OUTPUTS);
174 
175    c->CombinedClipCullDistanceArrays = !screen->get_param(screen, PIPE_CAP_CULL_DISTANCE_NOCOMBINE);
176 
177    c->PointSizeFixed = screen->get_param(screen, PIPE_CAP_POINT_SIZE_FIXED);
178 
179    for (sh = 0; sh < PIPE_SHADER_TYPES; ++sh) {
180       const gl_shader_stage stage = tgsi_processor_to_shader_stage(sh);
181       struct gl_shader_compiler_options *options =
182          &c->ShaderCompilerOptions[stage];
183       struct gl_program_constants *pc = &c->Program[stage];
184 
185       if (screen->get_compiler_options)
186          options->NirOptions = screen->get_compiler_options(screen, PIPE_SHADER_IR_NIR, sh);
187 
188       if (!options->NirOptions) {
189          options->NirOptions =
190             nir_to_tgsi_get_compiler_options(screen, PIPE_SHADER_IR_NIR, sh);
191       }
192 
193       if (sh == PIPE_SHADER_COMPUTE) {
194          if (!screen->get_param(screen, PIPE_CAP_COMPUTE))
195             continue;
196       }
197 
198       pc->MaxTextureImageUnits =
199          _min(screen->get_shader_param(screen, sh,
200                                        PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS),
201               MAX_TEXTURE_IMAGE_UNITS);
202 
203       pc->MaxInstructions =
204       pc->MaxNativeInstructions =
205          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS);
206       pc->MaxAluInstructions =
207       pc->MaxNativeAluInstructions =
208          screen->get_shader_param(screen, sh,
209                                   PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS);
210       pc->MaxTexInstructions =
211       pc->MaxNativeTexInstructions =
212          screen->get_shader_param(screen, sh,
213                                   PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS);
214       pc->MaxTexIndirections =
215       pc->MaxNativeTexIndirections =
216          screen->get_shader_param(screen, sh,
217                                   PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS);
218       pc->MaxAttribs =
219       pc->MaxNativeAttribs =
220          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INPUTS);
221       pc->MaxTemps =
222       pc->MaxNativeTemps =
223          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEMPS);
224       pc->MaxAddressRegs =
225       pc->MaxNativeAddressRegs = sh == PIPE_SHADER_VERTEX ? 1 : 0;
226 
227       pc->MaxUniformComponents =
228          screen->get_shader_param(screen, sh,
229                                   PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE) / 4;
230 
231       /* reserve space in the default-uniform for lowered state */
232       if (sh == PIPE_SHADER_VERTEX ||
233           sh == PIPE_SHADER_TESS_EVAL ||
234           sh == PIPE_SHADER_GEOMETRY) {
235 
236          if (!screen->get_param(screen, PIPE_CAP_CLIP_PLANES))
237             pc->MaxUniformComponents -= 4 * MAX_CLIP_PLANES;
238 
239          if (!screen->get_param(screen, PIPE_CAP_POINT_SIZE_FIXED))
240             pc->MaxUniformComponents -= 4;
241       } else if (sh == PIPE_SHADER_FRAGMENT) {
242          if (!screen->get_param(screen, PIPE_CAP_ALPHA_TEST))
243             pc->MaxUniformComponents -= 4;
244       }
245 
246 
247       pc->MaxUniformComponents = MIN2(pc->MaxUniformComponents,
248                                       MAX_UNIFORMS * 4);
249 
250       /* For ARB programs, prog_src_register::Index is a signed 13-bit number.
251        * This gives us a limit of 4096 values - but we may need to generate
252        * internal values in addition to what the source program uses.  So, we
253        * drop the limit one step lower, to 2048, to be safe.
254        */
255       pc->MaxParameters =
256       pc->MaxNativeParameters = MIN2(pc->MaxUniformComponents / 4, 2048);
257       pc->MaxInputComponents =
258          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INPUTS) * 4;
259       pc->MaxOutputComponents =
260          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_OUTPUTS) * 4;
261 
262 
263       pc->MaxUniformBlocks =
264          screen->get_shader_param(screen, sh,
265                                   PIPE_SHADER_CAP_MAX_CONST_BUFFERS);
266       if (pc->MaxUniformBlocks)
267          pc->MaxUniformBlocks -= 1; /* The first one is for ordinary uniforms. */
268       pc->MaxUniformBlocks = _min(pc->MaxUniformBlocks, MAX_UNIFORM_BUFFERS);
269 
270       pc->MaxCombinedUniformComponents =
271          pc->MaxUniformComponents +
272          (uint64_t)c->MaxUniformBlockSize / 4 * pc->MaxUniformBlocks;
273 
274       pc->MaxShaderStorageBlocks =
275          screen->get_shader_param(screen, sh,
276                                   PIPE_SHADER_CAP_MAX_SHADER_BUFFERS);
277 
278       temp = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS);
279       if (temp) {
280          /*
281           * for separate atomic counters get the actual hw limits
282           * per stage on atomic counters and buffers
283           */
284          pc->MaxAtomicCounters = temp;
285          pc->MaxAtomicBuffers = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS);
286       } else if (pc->MaxShaderStorageBlocks) {
287          pc->MaxAtomicCounters = MAX_ATOMIC_COUNTERS;
288          /*
289           * without separate atomic counters, reserve half of the available
290           * SSBOs for atomic buffers, and the other half for normal SSBOs.
291           */
292          pc->MaxAtomicBuffers = pc->MaxShaderStorageBlocks / 2;
293          pc->MaxShaderStorageBlocks -= pc->MaxAtomicBuffers;
294       }
295       pc->MaxImageUniforms =
296          _min(screen->get_shader_param(screen, sh,
297                                        PIPE_SHADER_CAP_MAX_SHADER_IMAGES),
298               MAX_IMAGE_UNIFORMS);
299 
300       /* Gallium doesn't really care about local vs. env parameters so use the
301        * same limits.
302        */
303       pc->MaxLocalParams = MIN2(pc->MaxParameters, MAX_PROGRAM_LOCAL_PARAMS);
304       pc->MaxEnvParams = MIN2(pc->MaxParameters, MAX_PROGRAM_ENV_PARAMS);
305 
306       if (screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_INTEGERS)) {
307          pc->LowInt.RangeMin = 31;
308          pc->LowInt.RangeMax = 30;
309          pc->LowInt.Precision = 0;
310          pc->MediumInt = pc->HighInt = pc->LowInt;
311 
312          if (screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_INT16)) {
313             pc->LowInt.RangeMin = 15;
314             pc->LowInt.RangeMax = 14;
315             pc->MediumInt = pc->LowInt;
316          }
317       }
318 
319       if (screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_FP16)) {
320          pc->LowFloat.RangeMin = 15;
321          pc->LowFloat.RangeMax = 15;
322          pc->LowFloat.Precision = 10;
323          pc->MediumFloat = pc->LowFloat;
324       }
325 
326       /* TODO: make these more fine-grained if anyone needs it */
327       options->MaxIfDepth =
328          screen->get_shader_param(screen, sh,
329                                   PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
330 
331       options->EmitNoMainReturn =
332          !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES);
333 
334       options->EmitNoCont =
335          !screen->get_shader_param(screen, sh,
336                                    PIPE_SHADER_CAP_CONT_SUPPORTED);
337 
338       options->EmitNoIndirectInput =
339          !screen->get_shader_param(screen, sh,
340                                    PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR);
341       options->EmitNoIndirectOutput =
342          !screen->get_shader_param(screen, sh,
343                                    PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR);
344       options->EmitNoIndirectTemp =
345          !screen->get_shader_param(screen, sh,
346                                    PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR);
347       options->EmitNoIndirectUniform =
348          !screen->get_shader_param(screen, sh,
349                                    PIPE_SHADER_CAP_INDIRECT_CONST_ADDR);
350 
351       if (pc->MaxNativeInstructions &&
352           (options->EmitNoIndirectUniform || pc->MaxUniformBlocks < 12)) {
353          can_ubo = false;
354       }
355 
356       if (!screen->get_param(screen, PIPE_CAP_NIR_COMPACT_ARRAYS))
357          options->LowerCombinedClipCullDistance = true;
358 
359       if (sh == PIPE_SHADER_VERTEX || sh == PIPE_SHADER_GEOMETRY) {
360          if (screen->get_param(screen, PIPE_CAP_VIEWPORT_TRANSFORM_LOWERED))
361             options->LowerBuiltinVariablesXfb |= VARYING_BIT_POS;
362          if (screen->get_param(screen, PIPE_CAP_PSIZ_CLAMPED))
363             options->LowerBuiltinVariablesXfb |= VARYING_BIT_PSIZ;
364       }
365 
366       options->LowerPrecisionFloat16 =
367          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_FP16);
368       options->LowerPrecisionDerivatives =
369          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_FP16_DERIVATIVES);
370       options->LowerPrecisionInt16 =
371          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_INT16);
372       options->LowerPrecisionConstants =
373          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_GLSL_16BIT_CONSTS);
374       options->LowerPrecisionFloat16Uniforms =
375          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_FP16_CONST_BUFFERS);
376    }
377 
378    c->MaxUserAssignableUniformLocations =
379       c->Program[MESA_SHADER_VERTEX].MaxUniformComponents +
380       c->Program[MESA_SHADER_TESS_CTRL].MaxUniformComponents +
381       c->Program[MESA_SHADER_TESS_EVAL].MaxUniformComponents +
382       c->Program[MESA_SHADER_GEOMETRY].MaxUniformComponents +
383       c->Program[MESA_SHADER_FRAGMENT].MaxUniformComponents;
384 
385    c->GLSLLowerConstArrays =
386       screen->get_param(screen, PIPE_CAP_PREFER_IMM_ARRAYS_AS_CONSTBUF);
387    c->GLSLTessLevelsAsInputs =
388       screen->get_param(screen, PIPE_CAP_GLSL_TESS_LEVELS_AS_INPUTS);
389    c->PrimitiveRestartForPatches = false;
390 
391    c->MaxCombinedTextureImageUnits =
392          _min(c->Program[MESA_SHADER_VERTEX].MaxTextureImageUnits +
393               c->Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits +
394               c->Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits +
395               c->Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits +
396               c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits +
397               c->Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits,
398               MAX_COMBINED_TEXTURE_IMAGE_UNITS);
399 
400    /* This depends on program constants. */
401    c->MaxTextureCoordUnits
402       = _min(c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
403              MAX_TEXTURE_COORD_UNITS);
404 
405    c->MaxTextureUnits =
406       _min(c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
407            c->MaxTextureCoordUnits);
408 
409    c->Program[MESA_SHADER_VERTEX].MaxAttribs =
410       MIN2(c->Program[MESA_SHADER_VERTEX].MaxAttribs, 16);
411 
412    c->MaxVarying = screen->get_param(screen, PIPE_CAP_MAX_VARYINGS);
413    c->MaxVarying = MIN2(c->MaxVarying, MAX_VARYING);
414    c->MaxGeometryOutputVertices =
415       screen->get_param(screen, PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES);
416    c->MaxGeometryTotalOutputComponents =
417       screen->get_param(screen, PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS);
418    c->MaxGeometryShaderInvocations =
419       screen->get_param(screen, PIPE_CAP_MAX_GS_INVOCATIONS);
420    c->MaxTessPatchComponents =
421       MIN2(screen->get_param(screen, PIPE_CAP_MAX_SHADER_PATCH_VARYINGS),
422            MAX_VARYING) * 4;
423 
424    c->MinProgramTexelOffset =
425       screen->get_param(screen, PIPE_CAP_MIN_TEXEL_OFFSET);
426    c->MaxProgramTexelOffset =
427       screen->get_param(screen, PIPE_CAP_MAX_TEXEL_OFFSET);
428 
429    c->MaxProgramTextureGatherComponents =
430       screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS);
431    c->MinProgramTextureGatherOffset =
432       screen->get_param(screen, PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET);
433    c->MaxProgramTextureGatherOffset =
434       screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET);
435 
436    c->MaxTransformFeedbackBuffers =
437       screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS);
438    c->MaxTransformFeedbackBuffers = MIN2(c->MaxTransformFeedbackBuffers,
439                                          MAX_FEEDBACK_BUFFERS);
440    c->MaxTransformFeedbackSeparateComponents =
441       screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS);
442    c->MaxTransformFeedbackInterleavedComponents =
443       screen->get_param(screen,
444                         PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS);
445    c->MaxVertexStreams =
446       MAX2(1, screen->get_param(screen, PIPE_CAP_MAX_VERTEX_STREAMS));
447 
448    /* The vertex stream must fit into pipe_stream_output_info::stream */
449    assert(c->MaxVertexStreams <= 4);
450 
451    c->MaxVertexAttribStride
452       = screen->get_param(screen, PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE);
453 
454    /* The value cannot be larger than that since pipe_vertex_buffer::src_offset
455     * is only 16 bits.
456     */
457    temp = screen->get_param(screen, PIPE_CAP_MAX_VERTEX_ELEMENT_SRC_OFFSET);
458    c->MaxVertexAttribRelativeOffset = MIN2(0xffff, temp);
459 
460    c->GLSLSkipStrictMaxUniformLimitCheck =
461       screen->get_param(screen, PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS);
462 
463    c->UniformBufferOffsetAlignment =
464       screen->get_param(screen, PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT);
465 
466    if (can_ubo) {
467       extensions->ARB_uniform_buffer_object = GL_TRUE;
468       c->MaxCombinedUniformBlocks = c->MaxUniformBufferBindings =
469          c->Program[MESA_SHADER_VERTEX].MaxUniformBlocks +
470          c->Program[MESA_SHADER_TESS_CTRL].MaxUniformBlocks +
471          c->Program[MESA_SHADER_TESS_EVAL].MaxUniformBlocks +
472          c->Program[MESA_SHADER_GEOMETRY].MaxUniformBlocks +
473          c->Program[MESA_SHADER_FRAGMENT].MaxUniformBlocks +
474          c->Program[MESA_SHADER_COMPUTE].MaxUniformBlocks;
475       assert(c->MaxCombinedUniformBlocks <= MAX_COMBINED_UNIFORM_BUFFERS);
476    }
477 
478    c->GLSLFragCoordIsSysVal =
479       screen->get_param(screen, PIPE_CAP_FS_POSITION_IS_SYSVAL);
480    c->GLSLPointCoordIsSysVal =
481       screen->get_param(screen, PIPE_CAP_FS_POINT_IS_SYSVAL);
482    c->GLSLFrontFacingIsSysVal =
483       screen->get_param(screen, PIPE_CAP_FS_FACE_IS_INTEGER_SYSVAL);
484 
485    /* GL_ARB_get_program_binary */
486    if (screen->get_disk_shader_cache && screen->get_disk_shader_cache(screen))
487       c->NumProgramBinaryFormats = 1;
488    /* GL_ARB_gl_spirv */
489    if (screen->get_param(screen, PIPE_CAP_GL_SPIRV) &&
490        (api == API_OPENGL_CORE || api == API_OPENGL_COMPAT))
491       c->NumShaderBinaryFormats = 1;
492 
493    c->MaxAtomicBufferBindings =
494       MAX2(c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers,
495            c->Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers);
496    c->MaxAtomicBufferSize = ATOMIC_COUNTER_SIZE *
497       MAX2(c->Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters,
498            c->Program[MESA_SHADER_COMPUTE].MaxAtomicCounters);
499 
500    c->MaxCombinedAtomicBuffers =
501       MIN2(screen->get_param(screen,
502                              PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS),
503            MAX_COMBINED_ATOMIC_BUFFERS);
504    if (!c->MaxCombinedAtomicBuffers) {
505       c->MaxCombinedAtomicBuffers = MAX2(
506          c->Program[MESA_SHADER_VERTEX].MaxAtomicBuffers +
507          c->Program[MESA_SHADER_TESS_CTRL].MaxAtomicBuffers +
508          c->Program[MESA_SHADER_TESS_EVAL].MaxAtomicBuffers +
509          c->Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers +
510          c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers,
511          c->Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers);
512       assert(c->MaxCombinedAtomicBuffers <= MAX_COMBINED_ATOMIC_BUFFERS);
513    }
514 
515    c->MaxCombinedAtomicCounters =
516       screen->get_param(screen, PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS);
517    if (!c->MaxCombinedAtomicCounters)
518       c->MaxCombinedAtomicCounters = MAX_ATOMIC_COUNTERS;
519 
520    if (c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers) {
521       extensions->ARB_shader_atomic_counters = GL_TRUE;
522       extensions->ARB_shader_atomic_counter_ops = GL_TRUE;
523    }
524 
525    c->MaxCombinedShaderOutputResources = c->MaxDrawBuffers;
526    c->ShaderStorageBufferOffsetAlignment =
527       screen->get_param(screen, PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT);
528    if (c->ShaderStorageBufferOffsetAlignment) {
529       c->MaxCombinedShaderStorageBlocks =
530          MIN2(screen->get_param(screen, PIPE_CAP_MAX_COMBINED_SHADER_BUFFERS),
531               MAX_COMBINED_SHADER_STORAGE_BUFFERS);
532       if (!c->MaxCombinedShaderStorageBlocks) {
533          c->MaxCombinedShaderStorageBlocks = MAX2(
534             c->Program[MESA_SHADER_VERTEX].MaxShaderStorageBlocks +
535             c->Program[MESA_SHADER_TESS_CTRL].MaxShaderStorageBlocks +
536             c->Program[MESA_SHADER_TESS_EVAL].MaxShaderStorageBlocks +
537             c->Program[MESA_SHADER_GEOMETRY].MaxShaderStorageBlocks +
538             c->Program[MESA_SHADER_FRAGMENT].MaxShaderStorageBlocks,
539             c->Program[MESA_SHADER_COMPUTE].MaxShaderStorageBlocks);
540          assert(c->MaxCombinedShaderStorageBlocks < MAX_COMBINED_SHADER_STORAGE_BUFFERS);
541       }
542       c->MaxShaderStorageBufferBindings = c->MaxCombinedShaderStorageBlocks;
543 
544       c->MaxCombinedShaderOutputResources +=
545          c->MaxCombinedShaderStorageBlocks;
546       c->MaxShaderStorageBlockSize =
547          screen->get_param(screen, PIPE_CAP_MAX_SHADER_BUFFER_SIZE_UINT);
548       if (c->Program[MESA_SHADER_FRAGMENT].MaxShaderStorageBlocks)
549          extensions->ARB_shader_storage_buffer_object = GL_TRUE;
550    }
551 
552    c->MaxCombinedImageUniforms =
553          c->Program[MESA_SHADER_VERTEX].MaxImageUniforms +
554          c->Program[MESA_SHADER_TESS_CTRL].MaxImageUniforms +
555          c->Program[MESA_SHADER_TESS_EVAL].MaxImageUniforms +
556          c->Program[MESA_SHADER_GEOMETRY].MaxImageUniforms +
557          c->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms +
558          c->Program[MESA_SHADER_COMPUTE].MaxImageUniforms;
559    c->MaxCombinedShaderOutputResources += c->MaxCombinedImageUniforms;
560    c->MaxImageUnits = MAX_IMAGE_UNITS;
561    if (c->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms &&
562        screen->get_param(screen, PIPE_CAP_IMAGE_STORE_FORMATTED)) {
563       extensions->ARB_shader_image_load_store = GL_TRUE;
564       extensions->ARB_shader_image_size = GL_TRUE;
565    }
566 
567    /* ARB_framebuffer_no_attachments */
568    c->MaxFramebufferWidth   = c->MaxViewportWidth;
569    c->MaxFramebufferHeight  = c->MaxViewportHeight;
570    /* NOTE: we cheat here a little by assuming that
571     * PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS has the same
572     * number of layers as we need, although we technically
573     * could have more the generality is not really useful
574     * in practicality.
575     */
576    c->MaxFramebufferLayers =
577       screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS);
578 
579    c->MaxWindowRectangles =
580       screen->get_param(screen, PIPE_CAP_MAX_WINDOW_RECTANGLES);
581 
582    c->SparseBufferPageSize =
583       screen->get_param(screen, PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE);
584 
585    c->AllowMappedBuffersDuringExecution =
586       screen->get_param(screen, PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION);
587 
588    c->UseSTD430AsDefaultPacking =
589       screen->get_param(screen, PIPE_CAP_LOAD_CONSTBUF);
590 
591    c->MaxSubpixelPrecisionBiasBits =
592       screen->get_param(screen, PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS);
593 
594    c->ConservativeRasterDilateRange[0] =
595       screen->get_paramf(screen, PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE);
596    c->ConservativeRasterDilateRange[1] =
597       screen->get_paramf(screen, PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE);
598    c->ConservativeRasterDilateGranularity =
599       screen->get_paramf(screen, PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY);
600 
601    /* limit the max combined shader output resources to a driver limit */
602    temp = screen->get_param(screen, PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES);
603    if (temp > 0 && c->MaxCombinedShaderOutputResources > temp)
604       c->MaxCombinedShaderOutputResources = temp;
605 
606    c->VertexBufferOffsetIsInt32 =
607       screen->get_param(screen, PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET);
608 
609    c->UseVAOFastPath =
610          screen->get_param(screen, PIPE_CAP_ALLOW_DYNAMIC_VAO_FASTPATH);
611 
612    c->glBeginEndBufferSize =
613       screen->get_param(screen, PIPE_CAP_GL_BEGIN_END_BUFFER_SIZE);
614 
615    c->MaxSparseTextureSize =
616       screen->get_param(screen, PIPE_CAP_MAX_SPARSE_TEXTURE_SIZE);
617    c->MaxSparse3DTextureSize =
618       screen->get_param(screen, PIPE_CAP_MAX_SPARSE_3D_TEXTURE_SIZE);
619    c->MaxSparseArrayTextureLayers =
620       screen->get_param(screen, PIPE_CAP_MAX_SPARSE_ARRAY_TEXTURE_LAYERS);
621    c->SparseTextureFullArrayCubeMipmaps =
622       screen->get_param(screen, PIPE_CAP_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS);
623 
624    c->HardwareAcceleratedSelect =
625       screen->get_param(screen, PIPE_CAP_HARDWARE_GL_SELECT);
626 
627    c->AllowGLThreadBufferSubDataOpt =
628       screen->get_param(screen, PIPE_CAP_ALLOW_GLTHREAD_BUFFER_SUBDATA_OPT);
629 
630    c->HasDrawVertexState =
631       screen->get_param(screen, PIPE_CAP_DRAW_VERTEX_STATE);
632 }
633 
634 
635 /**
636  * Given a member \c x of struct gl_extensions, return offset of
637  * \c x in bytes.
638  */
639 #define o(x) offsetof(struct gl_extensions, x)
640 
641 
642 struct st_extension_cap_mapping {
643    int extension_offset;
644    int cap;
645 };
646 
647 struct st_extension_format_mapping {
648    int extension_offset[2];
649    enum pipe_format format[32];
650 
651    /* If TRUE, at least one format must be supported for the extensions to be
652     * advertised. If FALSE, all the formats must be supported. */
653    GLboolean need_at_least_one;
654 };
655 
656 /**
657  * Enable extensions if certain pipe formats are supported by the driver.
658  * What extensions will be enabled and what formats must be supported is
659  * described by the array of st_extension_format_mapping.
660  *
661  * target and bind_flags are passed to is_format_supported.
662  */
663 static void
init_format_extensions(struct pipe_screen * screen,struct gl_extensions * extensions,const struct st_extension_format_mapping * mapping,unsigned num_mappings,enum pipe_texture_target target,unsigned bind_flags)664 init_format_extensions(struct pipe_screen *screen,
665                        struct gl_extensions *extensions,
666                        const struct st_extension_format_mapping *mapping,
667                        unsigned num_mappings,
668                        enum pipe_texture_target target,
669                        unsigned bind_flags)
670 {
671    GLboolean *extension_table = (GLboolean *) extensions;
672    unsigned i;
673    int j;
674    int num_formats = ARRAY_SIZE(mapping->format);
675    int num_ext = ARRAY_SIZE(mapping->extension_offset);
676 
677    for (i = 0; i < num_mappings; i++) {
678       int num_supported = 0;
679 
680       /* Examine each format in the list. */
681       for (j = 0; j < num_formats && mapping[i].format[j]; j++) {
682          if (screen->is_format_supported(screen, mapping[i].format[j],
683                                          target, 0, 0, bind_flags)) {
684             num_supported++;
685          }
686       }
687 
688       if (!num_supported ||
689           (!mapping[i].need_at_least_one && num_supported != j)) {
690          continue;
691       }
692 
693       /* Enable all extensions in the list. */
694       for (j = 0; j < num_ext && mapping[i].extension_offset[j]; j++)
695          extension_table[mapping[i].extension_offset[j]] = GL_TRUE;
696    }
697 }
698 
699 
700 /**
701  * Given a list of formats and bind flags, return the maximum number
702  * of samples supported by any of those formats.
703  */
704 static unsigned
get_max_samples_for_formats(struct pipe_screen * screen,unsigned num_formats,const enum pipe_format * formats,unsigned max_samples,unsigned bind)705 get_max_samples_for_formats(struct pipe_screen *screen,
706                             unsigned num_formats,
707                             const enum pipe_format *formats,
708                             unsigned max_samples,
709                             unsigned bind)
710 {
711    unsigned i, f;
712 
713    for (i = max_samples; i > 0; --i) {
714       for (f = 0; f < num_formats; f++) {
715          if (screen->is_format_supported(screen, formats[f],
716                                          PIPE_TEXTURE_2D, i, i, bind)) {
717             return i;
718          }
719       }
720    }
721    return 0;
722 }
723 
724 static unsigned
get_max_samples_for_formats_advanced(struct pipe_screen * screen,unsigned num_formats,const enum pipe_format * formats,unsigned max_samples,unsigned num_storage_samples,unsigned bind)725 get_max_samples_for_formats_advanced(struct pipe_screen *screen,
726                                      unsigned num_formats,
727                                      const enum pipe_format *formats,
728                                      unsigned max_samples,
729                                      unsigned num_storage_samples,
730                                      unsigned bind)
731 {
732    unsigned i, f;
733 
734    for (i = max_samples; i > 0; --i) {
735       for (f = 0; f < num_formats; f++) {
736          if (screen->is_format_supported(screen, formats[f], PIPE_TEXTURE_2D,
737                                          i, num_storage_samples, bind)) {
738             return i;
739          }
740       }
741    }
742    return 0;
743 }
744 
745 /**
746  * Use pipe_screen::get_param() to query PIPE_CAP_ values to determine
747  * which GL extensions are supported.
748  * Quite a few extensions are always supported because they are standard
749  * features or can be built on top of other gallium features.
750  * Some fine tuning may still be needed.
751  */
st_init_extensions(struct pipe_screen * screen,struct gl_constants * consts,struct gl_extensions * extensions,struct st_config_options * options,gl_api api)752 void st_init_extensions(struct pipe_screen *screen,
753                         struct gl_constants *consts,
754                         struct gl_extensions *extensions,
755                         struct st_config_options *options,
756                         gl_api api)
757 {
758    unsigned i;
759    GLboolean *extension_table = (GLboolean *) extensions;
760 
761    static const struct st_extension_cap_mapping cap_mapping[] = {
762       { o(ARB_base_instance),                PIPE_CAP_START_INSTANCE                   },
763       { o(ARB_bindless_texture),             PIPE_CAP_BINDLESS_TEXTURE                 },
764       { o(ARB_buffer_storage),               PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT   },
765       { o(ARB_clip_control),                 PIPE_CAP_CLIP_HALFZ                       },
766       { o(ARB_color_buffer_float),           PIPE_CAP_VERTEX_COLOR_UNCLAMPED           },
767       { o(ARB_conditional_render_inverted),  PIPE_CAP_CONDITIONAL_RENDER_INVERTED      },
768       { o(ARB_copy_image),                   PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS },
769       { o(OES_copy_image),                   PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS },
770       { o(ARB_cull_distance),                PIPE_CAP_CULL_DISTANCE                    },
771       { o(ARB_depth_clamp),                  PIPE_CAP_DEPTH_CLIP_DISABLE               },
772       { o(ARB_derivative_control),           PIPE_CAP_FS_FINE_DERIVATIVE               },
773       { o(ARB_draw_buffers_blend),           PIPE_CAP_INDEP_BLEND_FUNC                 },
774       { o(ARB_draw_indirect),                PIPE_CAP_DRAW_INDIRECT                    },
775       { o(ARB_draw_instanced),               PIPE_CAP_VS_INSTANCEID                    },
776       { o(ARB_fragment_program_shadow),      PIPE_CAP_TEXTURE_SHADOW_MAP               },
777       { o(ARB_framebuffer_object),           PIPE_CAP_MIXED_FRAMEBUFFER_SIZES          },
778       { o(ARB_gpu_shader_int64),             PIPE_CAP_INT64                            },
779       { o(ARB_gl_spirv),                     PIPE_CAP_GL_SPIRV                         },
780       { o(ARB_indirect_parameters),          PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS       },
781       { o(ARB_instanced_arrays),             PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR  },
782       { o(ARB_occlusion_query2),             PIPE_CAP_OCCLUSION_QUERY                  },
783       { o(ARB_pipeline_statistics_query),    PIPE_CAP_QUERY_PIPELINE_STATISTICS        },
784       { o(ARB_pipeline_statistics_query),    PIPE_CAP_QUERY_PIPELINE_STATISTICS_SINGLE },
785       { o(ARB_polygon_offset_clamp),         PIPE_CAP_POLYGON_OFFSET_CLAMP             },
786       { o(ARB_post_depth_coverage),          PIPE_CAP_POST_DEPTH_COVERAGE              },
787       { o(ARB_query_buffer_object),          PIPE_CAP_QUERY_BUFFER_OBJECT              },
788       { o(ARB_robust_buffer_access_behavior), PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR   },
789       { o(ARB_sample_shading),               PIPE_CAP_SAMPLE_SHADING                   },
790       { o(ARB_sample_locations),             PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS    },
791       { o(ARB_seamless_cube_map),            PIPE_CAP_SEAMLESS_CUBE_MAP                },
792       { o(ARB_shader_ballot),                PIPE_CAP_SHADER_BALLOT                    },
793       { o(ARB_shader_clock),                 PIPE_CAP_SHADER_CLOCK                     },
794       { o(ARB_shader_draw_parameters),       PIPE_CAP_DRAW_PARAMETERS                  },
795       { o(ARB_shader_group_vote),            PIPE_CAP_SHADER_GROUP_VOTE                },
796       { o(EXT_shader_image_load_formatted),  PIPE_CAP_IMAGE_LOAD_FORMATTED             },
797       { o(EXT_shader_image_load_store),      PIPE_CAP_IMAGE_ATOMIC_INC_WRAP            },
798       { o(ARB_shader_stencil_export),        PIPE_CAP_SHADER_STENCIL_EXPORT            },
799       { o(ARB_shader_texture_image_samples), PIPE_CAP_TEXTURE_QUERY_SAMPLES            },
800       { o(ARB_shader_texture_lod),           PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD      },
801       { o(ARB_shadow),                       PIPE_CAP_TEXTURE_SHADOW_MAP               },
802       { o(ARB_sparse_buffer),                PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE          },
803       { o(ARB_sparse_texture),               PIPE_CAP_MAX_SPARSE_TEXTURE_SIZE          },
804       { o(ARB_sparse_texture2),              PIPE_CAP_QUERY_SPARSE_TEXTURE_RESIDENCY   },
805       { o(ARB_sparse_texture_clamp),         PIPE_CAP_CLAMP_SPARSE_TEXTURE_LOD         },
806       { o(ARB_spirv_extensions),             PIPE_CAP_GL_SPIRV                         },
807       { o(ARB_texture_buffer_object),        PIPE_CAP_TEXTURE_BUFFER_OBJECTS           },
808       { o(ARB_texture_cube_map_array),       PIPE_CAP_CUBE_MAP_ARRAY                   },
809       { o(ARB_texture_filter_minmax),        PIPE_CAP_SAMPLER_REDUCTION_MINMAX_ARB     },
810       { o(ARB_texture_gather),               PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS    },
811       { o(ARB_texture_mirror_clamp_to_edge), PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE     },
812       { o(ARB_texture_multisample),          PIPE_CAP_TEXTURE_MULTISAMPLE              },
813       { o(ARB_texture_non_power_of_two),     PIPE_CAP_NPOT_TEXTURES                    },
814       { o(ARB_texture_query_lod),            PIPE_CAP_TEXTURE_QUERY_LOD                },
815       { o(ARB_texture_view),                 PIPE_CAP_SAMPLER_VIEW_TARGET              },
816       { o(ARB_timer_query),                  PIPE_CAP_QUERY_TIMESTAMP                  },
817       { o(ARB_transform_feedback2),          PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME       },
818       { o(ARB_transform_feedback3),          PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS },
819       { o(ARB_transform_feedback_overflow_query), PIPE_CAP_QUERY_SO_OVERFLOW           },
820       { o(ARB_fragment_shader_interlock),    PIPE_CAP_FRAGMENT_SHADER_INTERLOCK        },
821 
822       { o(EXT_blend_equation_separate),      PIPE_CAP_BLEND_EQUATION_SEPARATE          },
823       { o(EXT_demote_to_helper_invocation),  PIPE_CAP_DEMOTE_TO_HELPER_INVOCATION      },
824       { o(EXT_depth_bounds_test),            PIPE_CAP_DEPTH_BOUNDS_TEST                },
825       { o(EXT_disjoint_timer_query),         PIPE_CAP_QUERY_TIMESTAMP                  },
826       { o(EXT_draw_buffers2),                PIPE_CAP_INDEP_BLEND_ENABLE               },
827       { o(EXT_memory_object),                PIPE_CAP_MEMOBJ                           },
828 #ifndef _WIN32
829       { o(EXT_memory_object_fd),             PIPE_CAP_MEMOBJ                           },
830 #else
831       { o(EXT_memory_object_win32),          PIPE_CAP_MEMOBJ                           },
832 #endif
833       { o(EXT_multisampled_render_to_texture), PIPE_CAP_SURFACE_SAMPLE_COUNT           },
834       { o(EXT_semaphore),                    PIPE_CAP_FENCE_SIGNAL                     },
835 #ifndef _WIN32
836       { o(EXT_semaphore_fd),                 PIPE_CAP_FENCE_SIGNAL                     },
837 #else
838       { o(EXT_semaphore_win32),              PIPE_CAP_FENCE_SIGNAL                     },
839 #endif
840       { o(EXT_shader_samples_identical),     PIPE_CAP_SHADER_SAMPLES_IDENTICAL         },
841       { o(EXT_texture_array),                PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS         },
842       { o(EXT_texture_filter_anisotropic),   PIPE_CAP_ANISOTROPIC_FILTER               },
843       { o(EXT_texture_filter_minmax),        PIPE_CAP_SAMPLER_REDUCTION_MINMAX         },
844       { o(EXT_texture_mirror_clamp),         PIPE_CAP_TEXTURE_MIRROR_CLAMP             },
845       { o(EXT_texture_shadow_lod),           PIPE_CAP_TEXTURE_SHADOW_LOD               },
846       { o(EXT_texture_swizzle),              PIPE_CAP_TEXTURE_SWIZZLE                  },
847       { o(EXT_transform_feedback),           PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS        },
848       { o(EXT_window_rectangles),            PIPE_CAP_MAX_WINDOW_RECTANGLES            },
849 
850       { o(AMD_depth_clamp_separate),         PIPE_CAP_DEPTH_CLIP_DISABLE_SEPARATE      },
851       { o(AMD_framebuffer_multisample_advanced), PIPE_CAP_FRAMEBUFFER_MSAA_CONSTRAINTS },
852       { o(AMD_gpu_shader_half_float),        PIPE_CAP_FP16                             },
853       { o(AMD_performance_monitor),          PIPE_CAP_PERFORMANCE_MONITOR              },
854       { o(AMD_pinned_memory),                PIPE_CAP_RESOURCE_FROM_USER_MEMORY        },
855       { o(ATI_meminfo),                      PIPE_CAP_QUERY_MEMORY_INFO                },
856       { o(AMD_seamless_cubemap_per_texture), PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE    },
857       { o(ATI_texture_mirror_once),          PIPE_CAP_TEXTURE_MIRROR_CLAMP             },
858       { o(INTEL_conservative_rasterization), PIPE_CAP_CONSERVATIVE_RASTER_INNER_COVERAGE },
859       { o(INTEL_shader_atomic_float_minmax), PIPE_CAP_ATOMIC_FLOAT_MINMAX              },
860       { o(MESA_tile_raster_order),           PIPE_CAP_TILE_RASTER_ORDER                },
861       { o(NV_alpha_to_coverage_dither_control), PIPE_CAP_ALPHA_TO_COVERAGE_DITHER_CONTROL },
862       { o(NV_compute_shader_derivatives),    PIPE_CAP_COMPUTE_SHADER_DERIVATIVES       },
863       { o(NV_conditional_render),            PIPE_CAP_CONDITIONAL_RENDER               },
864       { o(NV_fill_rectangle),                PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE      },
865       { o(NV_primitive_restart),             PIPE_CAP_PRIMITIVE_RESTART                },
866       { o(NV_shader_atomic_float),           PIPE_CAP_IMAGE_ATOMIC_FLOAT_ADD           },
867       { o(NV_shader_atomic_int64),           PIPE_CAP_SHADER_ATOMIC_INT64              },
868       { o(NV_texture_barrier),               PIPE_CAP_TEXTURE_BARRIER                  },
869       { o(NV_viewport_array2),               PIPE_CAP_VIEWPORT_MASK                    },
870       { o(NV_viewport_swizzle),              PIPE_CAP_VIEWPORT_SWIZZLE                 },
871       { o(NVX_gpu_memory_info),              PIPE_CAP_QUERY_MEMORY_INFO                },
872 
873       { o(OES_standard_derivatives),         PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES      },
874       { o(OES_texture_float_linear),         PIPE_CAP_TEXTURE_FLOAT_LINEAR             },
875       { o(OES_texture_half_float_linear),    PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR        },
876       { o(OES_texture_view),                 PIPE_CAP_SAMPLER_VIEW_TARGET              },
877       { o(INTEL_blackhole_render),           PIPE_CAP_FRONTEND_NOOP                    },
878       { o(ARM_shader_framebuffer_fetch_depth_stencil), PIPE_CAP_FBFETCH_ZS             },
879       { o(MESA_texture_const_bandwidth),     PIPE_CAP_HAS_CONST_BW                     },
880    };
881 
882    /* Required: render target and sampler support */
883    static const struct st_extension_format_mapping rendertarget_mapping[] = {
884       { { o(ARB_texture_rgb10_a2ui) },
885         { PIPE_FORMAT_R10G10B10A2_UINT,
886           PIPE_FORMAT_B10G10R10A2_UINT },
887          GL_TRUE }, /* at least one format must be supported */
888 
889       { { o(EXT_sRGB) },
890         { PIPE_FORMAT_A8B8G8R8_SRGB,
891           PIPE_FORMAT_B8G8R8A8_SRGB,
892           PIPE_FORMAT_R8G8B8A8_SRGB },
893          GL_TRUE }, /* at least one format must be supported */
894 
895       { { o(EXT_packed_float) },
896         { PIPE_FORMAT_R11G11B10_FLOAT } },
897 
898       { { o(EXT_texture_integer) },
899         { PIPE_FORMAT_R32G32B32A32_UINT,
900           PIPE_FORMAT_R32G32B32A32_SINT } },
901 
902       { { o(ARB_texture_rg) },
903         { PIPE_FORMAT_R8_UNORM,
904           PIPE_FORMAT_R8G8_UNORM } },
905 
906       { { o(EXT_texture_norm16) },
907         { PIPE_FORMAT_R16_UNORM,
908           PIPE_FORMAT_R16G16_UNORM,
909           PIPE_FORMAT_R16G16B16A16_UNORM } },
910 
911       { { o(EXT_render_snorm) },
912         { PIPE_FORMAT_R8_SNORM,
913           PIPE_FORMAT_R8G8_SNORM,
914           PIPE_FORMAT_R8G8B8A8_SNORM,
915           PIPE_FORMAT_R16_SNORM,
916           PIPE_FORMAT_R16G16_SNORM,
917           PIPE_FORMAT_R16G16B16A16_SNORM } },
918 
919       { { o(EXT_color_buffer_half_float) },
920         { PIPE_FORMAT_R16_FLOAT,
921           PIPE_FORMAT_R16G16_FLOAT,
922           PIPE_FORMAT_R16G16B16A16_FLOAT } },
923 
924       { { o(EXT_color_buffer_float) },
925         { PIPE_FORMAT_R16_FLOAT,
926           PIPE_FORMAT_R16G16_FLOAT,
927           PIPE_FORMAT_R16G16B16A16_FLOAT,
928           PIPE_FORMAT_R32_FLOAT,
929           PIPE_FORMAT_R32G32_FLOAT,
930           PIPE_FORMAT_R32G32B32A32_FLOAT } },
931    };
932 
933    /* Required: render target, sampler, and blending */
934    static const struct st_extension_format_mapping rt_blendable[] = {
935       { { o(EXT_float_blend) },
936         { PIPE_FORMAT_R32G32B32A32_FLOAT } },
937    };
938 
939    /* Required: depth stencil and sampler support */
940    static const struct st_extension_format_mapping depthstencil_mapping[] = {
941       { { o(ARB_depth_buffer_float) },
942         { PIPE_FORMAT_Z32_FLOAT,
943           PIPE_FORMAT_Z32_FLOAT_S8X24_UINT } },
944    };
945 
946    /* Required: sampler support */
947    static const struct st_extension_format_mapping texture_mapping[] = {
948       { { o(OES_texture_float) },
949         { PIPE_FORMAT_R32G32B32A32_FLOAT } },
950 
951       { { o(OES_texture_half_float) },
952         { PIPE_FORMAT_R16G16B16A16_FLOAT } },
953 
954       { { o(ARB_texture_compression_rgtc) },
955         { PIPE_FORMAT_RGTC1_UNORM,
956           PIPE_FORMAT_RGTC1_SNORM,
957           PIPE_FORMAT_RGTC2_UNORM,
958           PIPE_FORMAT_RGTC2_SNORM } },
959 
960       /* RGTC software fallback support. */
961       { { o(ARB_texture_compression_rgtc) },
962         { PIPE_FORMAT_R8_UNORM,
963           PIPE_FORMAT_R8_SNORM,
964           PIPE_FORMAT_R8G8_UNORM,
965           PIPE_FORMAT_R8G8_SNORM } },
966 
967       { { o(EXT_texture_compression_latc) },
968         { PIPE_FORMAT_LATC1_UNORM,
969           PIPE_FORMAT_LATC1_SNORM,
970           PIPE_FORMAT_LATC2_UNORM,
971           PIPE_FORMAT_LATC2_SNORM } },
972 
973       /* LATC software fallback support. */
974       { { o(EXT_texture_compression_latc) },
975         { PIPE_FORMAT_L8_UNORM,
976           PIPE_FORMAT_L8_SNORM,
977           PIPE_FORMAT_L8A8_UNORM,
978           PIPE_FORMAT_L8A8_SNORM } },
979 
980       { { o(EXT_texture_compression_s3tc),
981           o(ANGLE_texture_compression_dxt) },
982         { PIPE_FORMAT_DXT1_RGB,
983           PIPE_FORMAT_DXT1_RGBA,
984           PIPE_FORMAT_DXT3_RGBA,
985           PIPE_FORMAT_DXT5_RGBA } },
986 
987       /* S3TC software fallback support. */
988       { { o(EXT_texture_compression_s3tc),
989           o(ANGLE_texture_compression_dxt) },
990         { PIPE_FORMAT_R8G8B8A8_UNORM } },
991 
992       { { o(EXT_texture_compression_s3tc_srgb) },
993         { PIPE_FORMAT_DXT1_SRGB,
994           PIPE_FORMAT_DXT1_SRGBA,
995           PIPE_FORMAT_DXT3_SRGBA,
996           PIPE_FORMAT_DXT5_SRGBA } },
997 
998       /* S3TC SRGB software fallback support. */
999       { { o(EXT_texture_compression_s3tc_srgb) },
1000         { PIPE_FORMAT_R8G8B8A8_SRGB } },
1001 
1002       { { o(ARB_texture_compression_bptc) },
1003         { PIPE_FORMAT_BPTC_RGBA_UNORM,
1004           PIPE_FORMAT_BPTC_SRGBA,
1005           PIPE_FORMAT_BPTC_RGB_FLOAT,
1006           PIPE_FORMAT_BPTC_RGB_UFLOAT } },
1007 
1008       /* BPTC software fallback support. */
1009       { { o(ARB_texture_compression_bptc) },
1010         { PIPE_FORMAT_R8G8B8A8_UNORM,
1011           PIPE_FORMAT_R8G8B8A8_SRGB,
1012           PIPE_FORMAT_R16G16B16X16_FLOAT } },
1013 
1014       { { o(TDFX_texture_compression_FXT1) },
1015         { PIPE_FORMAT_FXT1_RGB,
1016           PIPE_FORMAT_FXT1_RGBA } },
1017 
1018       { { o(KHR_texture_compression_astc_ldr),
1019           o(KHR_texture_compression_astc_sliced_3d) },
1020         { PIPE_FORMAT_ASTC_4x4,
1021           PIPE_FORMAT_ASTC_5x4,
1022           PIPE_FORMAT_ASTC_5x5,
1023           PIPE_FORMAT_ASTC_6x5,
1024           PIPE_FORMAT_ASTC_6x6,
1025           PIPE_FORMAT_ASTC_8x5,
1026           PIPE_FORMAT_ASTC_8x6,
1027           PIPE_FORMAT_ASTC_8x8,
1028           PIPE_FORMAT_ASTC_10x5,
1029           PIPE_FORMAT_ASTC_10x6,
1030           PIPE_FORMAT_ASTC_10x8,
1031           PIPE_FORMAT_ASTC_10x10,
1032           PIPE_FORMAT_ASTC_12x10,
1033           PIPE_FORMAT_ASTC_12x12,
1034           PIPE_FORMAT_ASTC_4x4_SRGB,
1035           PIPE_FORMAT_ASTC_5x4_SRGB,
1036           PIPE_FORMAT_ASTC_5x5_SRGB,
1037           PIPE_FORMAT_ASTC_6x5_SRGB,
1038           PIPE_FORMAT_ASTC_6x6_SRGB,
1039           PIPE_FORMAT_ASTC_8x5_SRGB,
1040           PIPE_FORMAT_ASTC_8x6_SRGB,
1041           PIPE_FORMAT_ASTC_8x8_SRGB,
1042           PIPE_FORMAT_ASTC_10x5_SRGB,
1043           PIPE_FORMAT_ASTC_10x6_SRGB,
1044           PIPE_FORMAT_ASTC_10x8_SRGB,
1045           PIPE_FORMAT_ASTC_10x10_SRGB,
1046           PIPE_FORMAT_ASTC_12x10_SRGB,
1047           PIPE_FORMAT_ASTC_12x12_SRGB } },
1048 
1049       /* ASTC software fallback support. */
1050       { { o(KHR_texture_compression_astc_ldr),
1051           o(KHR_texture_compression_astc_sliced_3d) },
1052         { PIPE_FORMAT_R8G8B8A8_UNORM,
1053           PIPE_FORMAT_R8G8B8A8_SRGB } },
1054 
1055       { { o(EXT_texture_shared_exponent) },
1056         { PIPE_FORMAT_R9G9B9E5_FLOAT } },
1057 
1058       { { o(EXT_texture_snorm) },
1059         { PIPE_FORMAT_R8G8B8A8_SNORM } },
1060 
1061       { { o(EXT_texture_sRGB),
1062           o(EXT_texture_sRGB_decode) },
1063         { PIPE_FORMAT_A8B8G8R8_SRGB,
1064 	  PIPE_FORMAT_B8G8R8A8_SRGB,
1065 	  PIPE_FORMAT_A8R8G8B8_SRGB,
1066 	  PIPE_FORMAT_R8G8B8A8_SRGB},
1067         GL_TRUE }, /* at least one format must be supported */
1068 
1069       { { o(EXT_texture_sRGB_R8) },
1070         { PIPE_FORMAT_R8_SRGB }, },
1071 
1072       { { o(EXT_texture_sRGB_RG8) },
1073         { PIPE_FORMAT_R8G8_SRGB }, },
1074 
1075       { { o(EXT_texture_type_2_10_10_10_REV) },
1076         { PIPE_FORMAT_R10G10B10A2_UNORM,
1077           PIPE_FORMAT_B10G10R10A2_UNORM },
1078          GL_TRUE }, /* at least one format must be supported */
1079 
1080       { { o(ATI_texture_compression_3dc) },
1081         { PIPE_FORMAT_LATC2_UNORM } },
1082 
1083       { { o(ATI_texture_compression_3dc) },
1084         { PIPE_FORMAT_L8A8_UNORM } },
1085 
1086       { { o(MESA_ycbcr_texture) },
1087         { PIPE_FORMAT_UYVY,
1088           PIPE_FORMAT_YUYV },
1089         GL_TRUE }, /* at least one format must be supported */
1090 
1091       { { o(OES_compressed_ETC1_RGB8_texture) },
1092         { PIPE_FORMAT_ETC1_RGB8,
1093           PIPE_FORMAT_R8G8B8A8_UNORM },
1094         GL_TRUE }, /* at least one format must be supported */
1095 
1096       { { o(ARB_stencil_texturing),
1097           o(ARB_texture_stencil8) },
1098         { PIPE_FORMAT_X24S8_UINT,
1099           PIPE_FORMAT_S8X24_UINT },
1100         GL_TRUE }, /* at least one format must be supported */
1101 
1102       { { o(AMD_compressed_ATC_texture) },
1103         { PIPE_FORMAT_ATC_RGB,
1104           PIPE_FORMAT_ATC_RGBA_EXPLICIT,
1105           PIPE_FORMAT_ATC_RGBA_INTERPOLATED } },
1106    };
1107 
1108    /* Required: vertex fetch support. */
1109    static const struct st_extension_format_mapping vertex_mapping[] = {
1110       { { o(EXT_vertex_array_bgra) },
1111         { PIPE_FORMAT_B8G8R8A8_UNORM } },
1112       { { o(ARB_vertex_type_2_10_10_10_rev) },
1113         { PIPE_FORMAT_R10G10B10A2_UNORM,
1114           PIPE_FORMAT_B10G10R10A2_UNORM,
1115           PIPE_FORMAT_R10G10B10A2_SNORM,
1116           PIPE_FORMAT_B10G10R10A2_SNORM,
1117           PIPE_FORMAT_R10G10B10A2_USCALED,
1118           PIPE_FORMAT_B10G10R10A2_USCALED,
1119           PIPE_FORMAT_R10G10B10A2_SSCALED,
1120           PIPE_FORMAT_B10G10R10A2_SSCALED } },
1121       { { o(ARB_vertex_type_10f_11f_11f_rev) },
1122         { PIPE_FORMAT_R11G11B10_FLOAT } },
1123    };
1124 
1125    static const struct st_extension_format_mapping tbo_rgb32[] = {
1126       { {o(ARB_texture_buffer_object_rgb32) },
1127         { PIPE_FORMAT_R32G32B32_FLOAT,
1128           PIPE_FORMAT_R32G32B32_UINT,
1129           PIPE_FORMAT_R32G32B32_SINT,
1130         } },
1131    };
1132 
1133    /* Expose the extensions which directly correspond to gallium caps. */
1134    for (i = 0; i < ARRAY_SIZE(cap_mapping); i++) {
1135       if (screen->get_param(screen, cap_mapping[i].cap)) {
1136          extension_table[cap_mapping[i].extension_offset] = GL_TRUE;
1137       }
1138    }
1139 
1140    /* EXT implies ARB here */
1141    if (extensions->EXT_texture_filter_minmax)
1142       extensions->ARB_texture_filter_minmax = GL_TRUE;
1143 
1144    /* Expose the extensions which directly correspond to gallium formats. */
1145    init_format_extensions(screen, extensions, rendertarget_mapping,
1146                           ARRAY_SIZE(rendertarget_mapping), PIPE_TEXTURE_2D,
1147                           PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW);
1148    init_format_extensions(screen, extensions, rt_blendable,
1149                           ARRAY_SIZE(rt_blendable), PIPE_TEXTURE_2D,
1150                           PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW |
1151                           PIPE_BIND_BLENDABLE);
1152    init_format_extensions(screen, extensions, depthstencil_mapping,
1153                           ARRAY_SIZE(depthstencil_mapping), PIPE_TEXTURE_2D,
1154                           PIPE_BIND_DEPTH_STENCIL | PIPE_BIND_SAMPLER_VIEW);
1155    init_format_extensions(screen, extensions, texture_mapping,
1156                           ARRAY_SIZE(texture_mapping), PIPE_TEXTURE_2D,
1157                           PIPE_BIND_SAMPLER_VIEW);
1158    init_format_extensions(screen, extensions, vertex_mapping,
1159                           ARRAY_SIZE(vertex_mapping), PIPE_BUFFER,
1160                           PIPE_BIND_VERTEX_BUFFER);
1161 
1162    /* Figure out GLSL support and set GLSLVersion to it. */
1163    consts->GLSLVersion = screen->get_param(screen, PIPE_CAP_GLSL_FEATURE_LEVEL);
1164    consts->GLSLVersionCompat =
1165       screen->get_param(screen, PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY);
1166 
1167    const unsigned ESSLVersion =
1168       screen->get_param(screen, PIPE_CAP_ESSL_FEATURE_LEVEL);
1169    const unsigned GLSLVersion =
1170       api == API_OPENGL_COMPAT ? consts->GLSLVersionCompat :
1171                                  consts->GLSLVersion;
1172 
1173    _mesa_override_glsl_version(consts);
1174 
1175    if (options->force_glsl_version > 0 &&
1176        options->force_glsl_version <= GLSLVersion) {
1177       consts->ForceGLSLVersion = options->force_glsl_version;
1178    }
1179 
1180    consts->ForceCompatShaders = options->force_compat_shaders;
1181 
1182    consts->AllowExtraPPTokens = options->allow_extra_pp_tokens;
1183 
1184    consts->AllowHigherCompatVersion = options->allow_higher_compat_version;
1185    consts->AllowGLSLCompatShaders = options->allow_glsl_compat_shaders;
1186 
1187    consts->ForceGLSLAbsSqrt = options->force_glsl_abs_sqrt;
1188 
1189    consts->AllowGLSLBuiltinVariableRedeclaration = options->allow_glsl_builtin_variable_redeclaration;
1190 
1191    consts->dri_config_options_sha1 = options->config_options_sha1;
1192 
1193    consts->AllowGLSLCrossStageInterpolationMismatch = options->allow_glsl_cross_stage_interpolation_mismatch;
1194 
1195    consts->DoDCEBeforeClipCullAnalysis = options->do_dce_before_clip_cull_analysis;
1196 
1197    consts->GLSLIgnoreWriteToReadonlyVar = options->glsl_ignore_write_to_readonly_var;
1198 
1199    consts->ForceMapBufferSynchronized = options->force_gl_map_buffer_synchronized;
1200 
1201    consts->PrimitiveRestartFixedIndex =
1202       screen->get_param(screen, PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX);
1203 
1204    /* Technically we are turning on the EXT_gpu_shader5 extension,
1205     * ARB_gpu_shader5 does not exist in GLES, but this flag is what
1206     * switches on EXT_gpu_shader5:
1207     */
1208    if (api == API_OPENGLES2 && ESSLVersion >= 320)
1209       extensions->ARB_gpu_shader5 = GL_TRUE;
1210 
1211    if (GLSLVersion >= 400 && !options->disable_arb_gpu_shader5)
1212       extensions->ARB_gpu_shader5 = GL_TRUE;
1213    if (GLSLVersion >= 410)
1214       extensions->ARB_shader_precision = GL_TRUE;
1215 
1216    /* This extension needs full OpenGL 3.2, but we don't know if that's
1217     * supported at this point. Only check the GLSL version. */
1218    if (GLSLVersion >= 150 &&
1219        screen->get_param(screen, PIPE_CAP_VS_LAYER_VIEWPORT)) {
1220       extensions->AMD_vertex_shader_layer = GL_TRUE;
1221    }
1222 
1223    if (GLSLVersion >= 140) {
1224       /* Since GLSL 1.40 has support for all of the features of gpu_shader4,
1225        * we can always expose it if the driver can do 140. Supporting
1226        * gpu_shader4 on drivers without GLSL 1.40 is left for a future
1227        * pipe cap.
1228        */
1229       extensions->EXT_gpu_shader4 = GL_TRUE;
1230       extensions->EXT_texture_buffer_object = GL_TRUE;
1231 
1232       if (consts->MaxTransformFeedbackBuffers &&
1233           screen->get_param(screen, PIPE_CAP_SHADER_ARRAY_COMPONENTS))
1234          extensions->ARB_enhanced_layouts = GL_TRUE;
1235    }
1236 
1237    if (GLSLVersion >= 130) {
1238       consts->NativeIntegers = GL_TRUE;
1239       consts->MaxClipPlanes = 8;
1240 
1241       uint32_t drv_clip_planes = screen->get_param(screen, PIPE_CAP_CLIP_PLANES);
1242       /* only override for > 1 - 0 if none, 1 is MAX, >2 overrides MAX */
1243       if (drv_clip_planes > 1)
1244          consts->MaxClipPlanes = drv_clip_planes;
1245 
1246       /* Extensions that either depend on GLSL 1.30 or are a subset thereof. */
1247       extensions->ARB_conservative_depth = GL_TRUE;
1248       extensions->ARB_shading_language_packing = GL_TRUE;
1249       extensions->OES_depth_texture_cube_map = GL_TRUE;
1250       extensions->ARB_shading_language_420pack = GL_TRUE;
1251       extensions->ARB_texture_query_levels = GL_TRUE;
1252 
1253       extensions->ARB_shader_bit_encoding = GL_TRUE;
1254 
1255       extensions->EXT_shader_integer_mix = GL_TRUE;
1256       extensions->ARB_arrays_of_arrays = GL_TRUE;
1257       extensions->MESA_shader_integer_functions = GL_TRUE;
1258 
1259       if (screen->get_param(screen, PIPE_CAP_OPENCL_INTEGER_FUNCTIONS) &&
1260           screen->get_param(screen, PIPE_CAP_INTEGER_MULTIPLY_32X16)) {
1261          extensions->INTEL_shader_integer_functions2 = GL_TRUE;
1262       }
1263    } else {
1264       /* Optional integer support for GLSL 1.2. */
1265       if (screen->get_shader_param(screen, PIPE_SHADER_VERTEX,
1266                                    PIPE_SHADER_CAP_INTEGERS) &&
1267           screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
1268                                    PIPE_SHADER_CAP_INTEGERS)) {
1269          consts->NativeIntegers = GL_TRUE;
1270 
1271          extensions->EXT_shader_integer_mix = GL_TRUE;
1272       }
1273 
1274       /* Integer textures make no sense before GLSL 1.30 */
1275       extensions->EXT_texture_integer = GL_FALSE;
1276       extensions->ARB_texture_rgb10_a2ui = GL_FALSE;
1277    }
1278 
1279    if (options->glsl_zero_init) {
1280       consts->GLSLZeroInit = 1;
1281    } else {
1282       consts->GLSLZeroInit = screen->get_param(screen, PIPE_CAP_GLSL_ZERO_INIT);
1283    }
1284 
1285    consts->ForceGLNamesReuse = options->force_gl_names_reuse;
1286 
1287    consts->ForceIntegerTexNearest = options->force_integer_tex_nearest;
1288 
1289    consts->VendorOverride = options->force_gl_vendor;
1290    consts->RendererOverride = options->force_gl_renderer;
1291 
1292    consts->UniformBooleanTrue = consts->NativeIntegers ? ~0U : fui(1.0f);
1293 
1294    /* Below are the cases which cannot be moved into tables easily. */
1295 
1296    /* The compatibility profile also requires GLSLVersionCompat >= 400. */
1297    if (screen->get_shader_param(screen, PIPE_SHADER_TESS_CTRL,
1298                                 PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0 &&
1299        (api != API_OPENGL_COMPAT || consts->GLSLVersionCompat >= 400)) {
1300       extensions->ARB_tessellation_shader = GL_TRUE;
1301    }
1302 
1303    /* OES_geometry_shader requires instancing */
1304    if ((GLSLVersion >= 400 || ESSLVersion >= 310) &&
1305        screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY,
1306                                 PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0 &&
1307        consts->MaxGeometryShaderInvocations >= 32) {
1308       extensions->OES_geometry_shader = GL_TRUE;
1309    }
1310 
1311    /* Some hardware may not support indirect draws, but still wants ES
1312     * 3.1. This allows the extension to be enabled only in ES contexts to
1313     * avoid claiming hw support when there is none, and using a software
1314     * fallback for ES.
1315     */
1316    if (api == API_OPENGLES2 && ESSLVersion >= 310) {
1317       extensions->ARB_draw_indirect = GL_TRUE;
1318    }
1319 
1320    /* Needs PIPE_CAP_SAMPLE_SHADING + all the sample-related bits of
1321     * ARB_gpu_shader5. This enables all the per-sample shading ES extensions.
1322     */
1323    extensions->OES_sample_variables = extensions->ARB_sample_shading &&
1324       extensions->ARB_gpu_shader5;
1325 
1326    /* Maximum sample count. */
1327    {
1328       static const enum pipe_format color_formats[] = {
1329          PIPE_FORMAT_R8G8B8A8_UNORM,
1330          PIPE_FORMAT_B8G8R8A8_UNORM,
1331          PIPE_FORMAT_A8R8G8B8_UNORM,
1332          PIPE_FORMAT_A8B8G8R8_UNORM,
1333       };
1334       static const enum pipe_format depth_formats[] = {
1335          PIPE_FORMAT_Z16_UNORM,
1336          PIPE_FORMAT_Z24X8_UNORM,
1337          PIPE_FORMAT_X8Z24_UNORM,
1338          PIPE_FORMAT_Z32_UNORM,
1339          PIPE_FORMAT_Z32_FLOAT
1340       };
1341       static const enum pipe_format int_formats[] = {
1342          PIPE_FORMAT_R8G8B8A8_SINT
1343       };
1344       static const enum pipe_format void_formats[] = {
1345          PIPE_FORMAT_NONE
1346       };
1347 
1348       consts->MaxSamples =
1349          get_max_samples_for_formats(screen, ARRAY_SIZE(color_formats),
1350                                      color_formats, 16,
1351                                      PIPE_BIND_RENDER_TARGET);
1352 
1353       consts->MaxImageSamples =
1354          get_max_samples_for_formats(screen, ARRAY_SIZE(color_formats),
1355                                      color_formats, 16,
1356                                      PIPE_BIND_SHADER_IMAGE);
1357 
1358       consts->MaxColorTextureSamples =
1359          get_max_samples_for_formats(screen, ARRAY_SIZE(color_formats),
1360                                      color_formats, consts->MaxSamples,
1361                                      PIPE_BIND_SAMPLER_VIEW);
1362 
1363       consts->MaxDepthTextureSamples =
1364          get_max_samples_for_formats(screen, ARRAY_SIZE(depth_formats),
1365                                      depth_formats, consts->MaxSamples,
1366                                      PIPE_BIND_SAMPLER_VIEW);
1367 
1368       consts->MaxIntegerSamples =
1369          get_max_samples_for_formats(screen, ARRAY_SIZE(int_formats),
1370                                      int_formats, consts->MaxSamples,
1371                                      PIPE_BIND_SAMPLER_VIEW);
1372 
1373       /* ARB_framebuffer_no_attachments, assume max no. of samples 32 */
1374       consts->MaxFramebufferSamples =
1375          get_max_samples_for_formats(screen, ARRAY_SIZE(void_formats),
1376                                      void_formats, 32,
1377                                      PIPE_BIND_RENDER_TARGET);
1378 
1379       if (extensions->AMD_framebuffer_multisample_advanced) {
1380          /* AMD_framebuffer_multisample_advanced */
1381          /* This can be greater than storage samples. */
1382          consts->MaxColorFramebufferSamples =
1383             get_max_samples_for_formats_advanced(screen,
1384                                                 ARRAY_SIZE(color_formats),
1385                                                 color_formats, 16,
1386                                                 consts->MaxSamples,
1387                                                 PIPE_BIND_RENDER_TARGET);
1388 
1389          /* If the driver supports N color samples, it means it supports
1390           * N samples and N storage samples. N samples >= N storage
1391           * samples.
1392           */
1393          consts->MaxColorFramebufferStorageSamples = consts->MaxSamples;
1394          consts->MaxDepthStencilFramebufferSamples =
1395             consts->MaxDepthTextureSamples;
1396 
1397          assert(consts->MaxColorFramebufferSamples >=
1398                 consts->MaxDepthStencilFramebufferSamples);
1399          assert(consts->MaxDepthStencilFramebufferSamples >=
1400                 consts->MaxColorFramebufferStorageSamples);
1401 
1402          consts->NumSupportedMultisampleModes = 0;
1403 
1404          unsigned depth_samples_supported = 0;
1405 
1406          for (unsigned samples = 2;
1407               samples <= consts->MaxDepthStencilFramebufferSamples;
1408               samples++) {
1409             if (screen->is_format_supported(screen, PIPE_FORMAT_Z32_FLOAT,
1410                                             PIPE_TEXTURE_2D, samples, samples,
1411                                             PIPE_BIND_DEPTH_STENCIL))
1412                depth_samples_supported |= 1 << samples;
1413          }
1414 
1415          for (unsigned samples = 2;
1416               samples <= consts->MaxColorFramebufferSamples;
1417               samples++) {
1418             for (unsigned depth_samples = 2;
1419                  depth_samples <= samples; depth_samples++) {
1420                if (!(depth_samples_supported & (1 << depth_samples)))
1421                   continue;
1422 
1423                for (unsigned storage_samples = 2;
1424                     storage_samples <= depth_samples; storage_samples++) {
1425                   if (screen->is_format_supported(screen,
1426                                                   PIPE_FORMAT_R8G8B8A8_UNORM,
1427                                                   PIPE_TEXTURE_2D,
1428                                                   samples,
1429                                                   storage_samples,
1430                                                   PIPE_BIND_RENDER_TARGET)) {
1431                      unsigned i = consts->NumSupportedMultisampleModes;
1432 
1433                      assert(i < ARRAY_SIZE(consts->SupportedMultisampleModes));
1434                      consts->SupportedMultisampleModes[i].NumColorSamples =
1435                         samples;
1436                      consts->SupportedMultisampleModes[i].NumColorStorageSamples =
1437                         storage_samples;
1438                      consts->SupportedMultisampleModes[i].NumDepthStencilSamples =
1439                         depth_samples;
1440                      consts->NumSupportedMultisampleModes++;
1441                   }
1442                }
1443             }
1444          }
1445       }
1446    }
1447 
1448    if (consts->MaxSamples >= 2) {
1449       /* Real MSAA support */
1450       extensions->EXT_framebuffer_multisample = GL_TRUE;
1451       extensions->EXT_framebuffer_multisample_blit_scaled = GL_TRUE;
1452    }
1453    else if (consts->MaxSamples > 0 &&
1454             screen->get_param(screen, PIPE_CAP_FAKE_SW_MSAA)) {
1455       /* fake MSAA support */
1456       consts->FakeSWMSAA = GL_TRUE;
1457       extensions->EXT_framebuffer_multisample = GL_TRUE;
1458       extensions->EXT_framebuffer_multisample_blit_scaled = GL_TRUE;
1459       extensions->ARB_texture_multisample = GL_TRUE;
1460    }
1461 
1462    if (consts->MaxDualSourceDrawBuffers > 0 &&
1463        !options->disable_blend_func_extended)
1464       extensions->ARB_blend_func_extended = GL_TRUE;
1465 
1466    if (screen->get_param(screen, PIPE_CAP_QUERY_TIME_ELAPSED) ||
1467        extensions->ARB_timer_query) {
1468       extensions->EXT_timer_query = GL_TRUE;
1469    }
1470 
1471    if (extensions->ARB_transform_feedback2 &&
1472        extensions->ARB_draw_instanced) {
1473       extensions->ARB_transform_feedback_instanced = GL_TRUE;
1474    }
1475    if (options->force_glsl_extensions_warn)
1476       consts->ForceGLSLExtensionsWarn = 1;
1477 
1478    if (options->disable_glsl_line_continuations)
1479       consts->DisableGLSLLineContinuations = 1;
1480 
1481    if (options->disable_uniform_array_resize)
1482       consts->DisableUniformArrayResize = 1;
1483 
1484    consts->AliasShaderExtension = options->alias_shader_extension;
1485 
1486    if (options->allow_vertex_texture_bias)
1487       consts->AllowVertexTextureBias = GL_TRUE;
1488 
1489    if (options->allow_glsl_extension_directive_midshader)
1490       consts->AllowGLSLExtensionDirectiveMidShader = GL_TRUE;
1491 
1492    if (options->allow_glsl_120_subset_in_110)
1493       consts->AllowGLSL120SubsetIn110 = GL_TRUE;
1494 
1495    if (options->allow_glsl_builtin_const_expression)
1496       consts->AllowGLSLBuiltinConstantExpression = GL_TRUE;
1497 
1498    if (options->allow_glsl_relaxed_es)
1499       consts->AllowGLSLRelaxedES = GL_TRUE;
1500 
1501    consts->MinMapBufferAlignment =
1502       screen->get_param(screen, PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT);
1503 
1504    /* The OpenGL Compatibility profile requires arbitrary buffer swizzling. */
1505    if (api == API_OPENGL_COMPAT &&
1506        screen->get_param(screen, PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY))
1507       extensions->ARB_texture_buffer_object = GL_FALSE;
1508 
1509    if (extensions->ARB_texture_buffer_object) {
1510       consts->MaxTextureBufferSize =
1511          screen->get_param(screen, PIPE_CAP_MAX_TEXEL_BUFFER_ELEMENTS_UINT);
1512       consts->TextureBufferOffsetAlignment =
1513          screen->get_param(screen, PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT);
1514 
1515       if (consts->TextureBufferOffsetAlignment)
1516          extensions->ARB_texture_buffer_range = GL_TRUE;
1517 
1518       init_format_extensions(screen, extensions, tbo_rgb32,
1519                              ARRAY_SIZE(tbo_rgb32), PIPE_BUFFER,
1520                              PIPE_BIND_SAMPLER_VIEW);
1521    }
1522 
1523    extensions->OES_texture_buffer =
1524       consts->Program[MESA_SHADER_COMPUTE].MaxImageUniforms &&
1525       extensions->ARB_texture_buffer_object &&
1526       extensions->ARB_texture_buffer_range &&
1527       extensions->ARB_texture_buffer_object_rgb32;
1528 
1529    extensions->EXT_framebuffer_sRGB =
1530          screen->get_param(screen, PIPE_CAP_DEST_SURFACE_SRGB_CONTROL) &&
1531          extensions->EXT_sRGB;
1532 
1533    /* Unpacking a varying in the fragment shader costs 1 texture indirection.
1534     * If the number of available texture indirections is very limited, then we
1535     * prefer to disable varying packing rather than run the risk of varying
1536     * packing preventing a shader from running.
1537     */
1538    if (screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
1539                                 PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS) <= 8) {
1540       /* We can't disable varying packing if transform feedback is available,
1541        * because transform feedback code assumes a packed varying layout.
1542        */
1543       if (!extensions->EXT_transform_feedback)
1544          consts->DisableVaryingPacking = GL_TRUE;
1545    }
1546 
1547    if (!screen->get_param(screen, PIPE_CAP_PACKED_STREAM_OUTPUT))
1548       consts->DisableTransformFeedbackPacking = GL_TRUE;
1549 
1550    if (screen->get_param(screen, PIPE_CAP_PREFER_POT_ALIGNED_VARYINGS))
1551       consts->PreferPOTAlignedVaryings = GL_TRUE;
1552 
1553    unsigned max_fb_fetch_rts = screen->get_param(screen, PIPE_CAP_FBFETCH);
1554    bool coherent_fb_fetch =
1555       screen->get_param(screen, PIPE_CAP_FBFETCH_COHERENT);
1556 
1557    if (screen->get_param(screen, PIPE_CAP_BLEND_EQUATION_ADVANCED))
1558       extensions->KHR_blend_equation_advanced = true;
1559 
1560    if (max_fb_fetch_rts > 0) {
1561       extensions->KHR_blend_equation_advanced = true;
1562       extensions->KHR_blend_equation_advanced_coherent = coherent_fb_fetch;
1563 
1564       if (max_fb_fetch_rts >=
1565           screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS)) {
1566          extensions->EXT_shader_framebuffer_fetch_non_coherent = true;
1567          extensions->EXT_shader_framebuffer_fetch = coherent_fb_fetch;
1568       }
1569    }
1570 
1571    consts->MaxViewports = screen->get_param(screen, PIPE_CAP_MAX_VIEWPORTS);
1572    if (consts->MaxViewports >= 16) {
1573       if (GLSLVersion >= 400) {
1574          consts->ViewportBounds.Min = -32768.0;
1575          consts->ViewportBounds.Max = 32767.0;
1576       } else {
1577          consts->ViewportBounds.Min = -16384.0;
1578          consts->ViewportBounds.Max = 16383.0;
1579       }
1580       extensions->ARB_viewport_array = GL_TRUE;
1581       extensions->ARB_fragment_layer_viewport = GL_TRUE;
1582       if (extensions->AMD_vertex_shader_layer)
1583          extensions->AMD_vertex_shader_viewport_index = GL_TRUE;
1584    }
1585 
1586    if (extensions->AMD_vertex_shader_layer &&
1587        extensions->AMD_vertex_shader_viewport_index &&
1588        screen->get_param(screen, PIPE_CAP_TES_LAYER_VIEWPORT))
1589       extensions->ARB_shader_viewport_layer_array = GL_TRUE;
1590 
1591    /* ARB_framebuffer_no_attachments */
1592    if (screen->get_param(screen, PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT) &&
1593        ((consts->MaxSamples >= 4 && consts->MaxFramebufferLayers >= 2048) ||
1594         (consts->MaxFramebufferSamples >= consts->MaxSamples &&
1595          consts->MaxFramebufferLayers >= consts->MaxArrayTextureLayers)))
1596       extensions->ARB_framebuffer_no_attachments = GL_TRUE;
1597 
1598    /* GL_ARB_ES3_compatibility.
1599     * Check requirements for GLSL ES 3.00.
1600     */
1601    if (GLSLVersion >= 130 &&
1602        extensions->ARB_uniform_buffer_object &&
1603        (extensions->NV_primitive_restart ||
1604         consts->PrimitiveRestartFixedIndex) &&
1605        screen->get_shader_param(screen, PIPE_SHADER_VERTEX,
1606                                 PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS) >= 16 &&
1607        /* Requirements for ETC2 emulation. */
1608        screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_UNORM,
1609                                    PIPE_TEXTURE_2D, 0, 0,
1610                                    PIPE_BIND_SAMPLER_VIEW) &&
1611        screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SRGB,
1612                                    PIPE_TEXTURE_2D, 0, 0,
1613                                    PIPE_BIND_SAMPLER_VIEW) &&
1614        screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM,
1615                                    PIPE_TEXTURE_2D, 0, 0,
1616                                    PIPE_BIND_SAMPLER_VIEW) &&
1617        screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM,
1618                                    PIPE_TEXTURE_2D, 0, 0,
1619                                    PIPE_BIND_SAMPLER_VIEW) &&
1620        screen->is_format_supported(screen, PIPE_FORMAT_R16_SNORM,
1621                                    PIPE_TEXTURE_2D, 0, 0,
1622                                    PIPE_BIND_SAMPLER_VIEW) &&
1623        screen->is_format_supported(screen, PIPE_FORMAT_R16G16_SNORM,
1624                                    PIPE_TEXTURE_2D, 0, 0,
1625                                    PIPE_BIND_SAMPLER_VIEW)) {
1626       extensions->ARB_ES3_compatibility = GL_TRUE;
1627    }
1628 
1629 #ifdef HAVE_ST_VDPAU
1630    if (screen->get_video_param &&
1631        screen->get_video_param(screen, PIPE_VIDEO_PROFILE_UNKNOWN,
1632                                PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
1633                                PIPE_VIDEO_CAP_SUPPORTS_INTERLACED)) {
1634       extensions->NV_vdpau_interop = GL_TRUE;
1635    }
1636 #endif
1637 
1638    if (screen->get_param(screen, PIPE_CAP_DOUBLES)) {
1639       extensions->ARB_gpu_shader_fp64 = GL_TRUE;
1640       extensions->ARB_vertex_attrib_64bit = GL_TRUE;
1641    }
1642 
1643    if ((ST_DEBUG & DEBUG_GREMEDY) &&
1644        screen->get_param(screen, PIPE_CAP_STRING_MARKER))
1645       extensions->GREMEDY_string_marker = GL_TRUE;
1646 
1647    if (screen->get_param(screen, PIPE_CAP_COMPUTE)) {
1648       uint64_t grid_size[3], block_size[3];
1649       uint64_t max_local_size, max_threads_per_block;
1650 
1651       screen->get_compute_param(screen, PIPE_SHADER_IR_NIR,
1652                                  PIPE_COMPUTE_CAP_MAX_GRID_SIZE, grid_size);
1653       screen->get_compute_param(screen, PIPE_SHADER_IR_NIR,
1654                                  PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE, block_size);
1655       screen->get_compute_param(screen, PIPE_SHADER_IR_NIR,
1656                                  PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK,
1657                                  &max_threads_per_block);
1658       screen->get_compute_param(screen, PIPE_SHADER_IR_NIR,
1659                                  PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE,
1660                                  &max_local_size);
1661 
1662       consts->MaxComputeWorkGroupInvocations = max_threads_per_block;
1663       consts->MaxComputeSharedMemorySize = max_local_size;
1664 
1665       for (i = 0; i < 3; i++) {
1666          /* There are tests that fail if we report more that INT_MAX - 1. */
1667          consts->MaxComputeWorkGroupCount[i] = MIN2(grid_size[i], INT_MAX - 1);
1668          consts->MaxComputeWorkGroupSize[i] = block_size[i];
1669       }
1670 
1671       extensions->ARB_compute_shader =
1672          max_threads_per_block >= 1024 &&
1673          extensions->ARB_shader_image_load_store &&
1674          extensions->ARB_shader_atomic_counters;
1675 
1676       if (extensions->ARB_compute_shader) {
1677          uint64_t max_variable_threads_per_block = 0;
1678 
1679          screen->get_compute_param(screen, PIPE_SHADER_IR_NIR,
1680                                     PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK,
1681                                     &max_variable_threads_per_block);
1682 
1683          for (i = 0; i < 3; i++) {
1684             /* Clamp the values to avoid having a local work group size
1685                * greater than the maximum number of invocations.
1686                */
1687             consts->MaxComputeVariableGroupSize[i] =
1688                MIN2(consts->MaxComputeWorkGroupSize[i],
1689                      max_variable_threads_per_block);
1690          }
1691          consts->MaxComputeVariableGroupInvocations =
1692             max_variable_threads_per_block;
1693 
1694          extensions->ARB_compute_variable_group_size =
1695             max_variable_threads_per_block > 0;
1696       }
1697    }
1698 
1699    extensions->ARB_texture_float =
1700       extensions->OES_texture_half_float &&
1701       extensions->OES_texture_float;
1702 
1703    if (extensions->EXT_texture_filter_anisotropic &&
1704        screen->get_paramf(screen, PIPE_CAPF_MAX_TEXTURE_ANISOTROPY) >= 16.0)
1705       extensions->ARB_texture_filter_anisotropic = GL_TRUE;
1706 
1707    extensions->KHR_robustness = extensions->ARB_robust_buffer_access_behavior;
1708 
1709    /* If we support ES 3.1, we support the ES3_1_compatibility ext. However
1710     * there's no clean way of telling whether we would support ES 3.1 from
1711     * here, so copy the condition from compute_version_es2 here. A lot of
1712     * these are redunant, but simpler to just have a (near-)exact copy here.
1713     */
1714    extensions->ARB_ES3_1_compatibility =
1715       consts->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms &&
1716       extensions->ARB_ES3_compatibility &&
1717       extensions->ARB_arrays_of_arrays &&
1718       extensions->ARB_compute_shader &&
1719       extensions->ARB_draw_indirect &&
1720       extensions->ARB_explicit_uniform_location &&
1721       extensions->ARB_framebuffer_no_attachments &&
1722       extensions->ARB_shader_atomic_counters &&
1723       extensions->ARB_shader_image_load_store &&
1724       extensions->ARB_shader_image_size &&
1725       extensions->ARB_shader_storage_buffer_object &&
1726       extensions->ARB_shading_language_packing &&
1727       extensions->ARB_stencil_texturing &&
1728       extensions->ARB_texture_multisample &&
1729       extensions->ARB_gpu_shader5 &&
1730       extensions->EXT_shader_integer_mix;
1731 
1732    extensions->OES_texture_cube_map_array =
1733       (extensions->ARB_ES3_1_compatibility || ESSLVersion >= 310) &&
1734       extensions->OES_geometry_shader &&
1735       extensions->ARB_texture_cube_map_array;
1736 
1737    extensions->OES_viewport_array =
1738       (extensions->ARB_ES3_1_compatibility || ESSLVersion >= 310) &&
1739       extensions->OES_geometry_shader &&
1740       extensions->ARB_viewport_array;
1741 
1742    extensions->OES_primitive_bounding_box =
1743       extensions->ARB_ES3_1_compatibility || ESSLVersion >= 310;
1744 
1745    consts->NoPrimitiveBoundingBoxOutput = true;
1746 
1747    extensions->ANDROID_extension_pack_es31a =
1748       consts->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms &&
1749       extensions->KHR_texture_compression_astc_ldr &&
1750       extensions->KHR_blend_equation_advanced &&
1751       extensions->OES_sample_variables &&
1752       extensions->ARB_texture_stencil8 &&
1753       extensions->ARB_texture_multisample &&
1754       extensions->OES_copy_image &&
1755       extensions->ARB_draw_buffers_blend &&
1756       extensions->OES_geometry_shader &&
1757       extensions->ARB_gpu_shader5 &&
1758       extensions->OES_primitive_bounding_box &&
1759       extensions->ARB_tessellation_shader &&
1760       extensions->OES_texture_buffer &&
1761       extensions->OES_texture_cube_map_array &&
1762       extensions->EXT_texture_sRGB_decode;
1763 
1764    /* Same deal as for ARB_ES3_1_compatibility - this has to be computed
1765     * before overall versions are selected. Also it's actually a subset of ES
1766     * 3.2, since it doesn't require ASTC or advanced blending.
1767     */
1768    extensions->ARB_ES3_2_compatibility =
1769       extensions->ARB_ES3_1_compatibility &&
1770       extensions->KHR_robustness &&
1771       extensions->ARB_copy_image &&
1772       extensions->ARB_draw_buffers_blend &&
1773       extensions->ARB_draw_elements_base_vertex &&
1774       extensions->OES_geometry_shader &&
1775       extensions->ARB_gpu_shader5 &&
1776       extensions->ARB_sample_shading &&
1777       extensions->ARB_tessellation_shader &&
1778       extensions->OES_texture_buffer &&
1779       extensions->ARB_texture_cube_map_array &&
1780       extensions->ARB_texture_stencil8 &&
1781       extensions->ARB_texture_multisample;
1782 
1783    if (screen->get_param(screen, PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES) &&
1784        screen->get_param(screen, PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES) &&
1785        screen->get_param(screen, PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE)) {
1786       float max_dilate;
1787       bool pre_snap_triangles, pre_snap_points_lines;
1788 
1789       max_dilate = screen->get_paramf(screen, PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE);
1790 
1791       pre_snap_triangles =
1792          screen->get_param(screen, PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES);
1793       pre_snap_points_lines =
1794          screen->get_param(screen, PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES);
1795 
1796       extensions->NV_conservative_raster =
1797          screen->get_param(screen, PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS) > 1;
1798 
1799       if (extensions->NV_conservative_raster) {
1800          extensions->NV_conservative_raster_dilate = max_dilate >= 0.75;
1801          extensions->NV_conservative_raster_pre_snap_triangles = pre_snap_triangles;
1802          extensions->NV_conservative_raster_pre_snap =
1803             pre_snap_triangles && pre_snap_points_lines;
1804       }
1805    }
1806 
1807    if (extensions->ARB_gl_spirv) {
1808       struct spirv_supported_capabilities *spirv_caps = &consts->SpirVCapabilities;
1809 
1810       spirv_caps->atomic_storage             = extensions->ARB_shader_atomic_counters;
1811       spirv_caps->demote_to_helper_invocation = extensions->EXT_demote_to_helper_invocation;
1812       spirv_caps->draw_parameters            = extensions->ARB_shader_draw_parameters;
1813       spirv_caps->derivative_group           = extensions->NV_compute_shader_derivatives;
1814       spirv_caps->float64                    = extensions->ARB_gpu_shader_fp64;
1815       spirv_caps->geometry_streams           = extensions->ARB_gpu_shader5;
1816       spirv_caps->image_ms_array             = extensions->ARB_shader_image_load_store &&
1817                                                consts->MaxImageSamples > 1;
1818       spirv_caps->image_read_without_format  = extensions->EXT_shader_image_load_formatted;
1819       spirv_caps->image_write_without_format = extensions->ARB_shader_image_load_store;
1820       spirv_caps->int64                      = extensions->ARB_gpu_shader_int64;
1821       spirv_caps->int64_atomics              = extensions->NV_shader_atomic_int64;
1822       spirv_caps->post_depth_coverage        = extensions->ARB_post_depth_coverage;
1823       spirv_caps->shader_clock               = extensions->ARB_shader_clock;
1824       spirv_caps->shader_viewport_index_layer = extensions->ARB_shader_viewport_layer_array;
1825       spirv_caps->stencil_export             = extensions->ARB_shader_stencil_export;
1826       spirv_caps->storage_image_ms           = extensions->ARB_shader_image_load_store &&
1827                                                consts->MaxImageSamples > 1;
1828       spirv_caps->subgroup_ballot            = extensions->ARB_shader_ballot;
1829       spirv_caps->subgroup_vote              = extensions->ARB_shader_group_vote;
1830       spirv_caps->tessellation               = extensions->ARB_tessellation_shader;
1831       spirv_caps->transform_feedback         = extensions->ARB_transform_feedback3;
1832       spirv_caps->variable_pointers          =
1833          screen->get_param(screen, PIPE_CAP_GL_SPIRV_VARIABLE_POINTERS);
1834       spirv_caps->integer_functions2         = extensions->INTEL_shader_integer_functions2;
1835 
1836       consts->SpirVExtensions = CALLOC_STRUCT(spirv_supported_extensions);
1837       _mesa_fill_supported_spirv_extensions(consts->SpirVExtensions, spirv_caps);
1838    }
1839 
1840    consts->AllowDrawOutOfOrder =
1841       api == API_OPENGL_COMPAT &&
1842       options->allow_draw_out_of_order &&
1843       screen->get_param(screen, PIPE_CAP_ALLOW_DRAW_OUT_OF_ORDER);
1844    consts->GLThreadNopCheckFramebufferStatus = options->glthread_nop_check_framebuffer_status;
1845 
1846    const struct nir_shader_compiler_options *nir_options =
1847       consts->ShaderCompilerOptions[MESA_SHADER_FRAGMENT].NirOptions;
1848 
1849    if (screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, PIPE_SHADER_CAP_INTEGERS) &&
1850        extensions->ARB_stencil_texturing &&
1851        screen->get_param(screen, PIPE_CAP_DOUBLES) &&
1852        !(nir_options->lower_doubles_options & nir_lower_fp64_full_software))
1853       extensions->NV_copy_depth_to_color = true;
1854 }
1855