Home | History | Annotate | Download | only in state_tracker
      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 "main/imports.h"
     30 #include "main/context.h"
     31 #include "main/macros.h"
     32 #include "main/version.h"
     33 
     34 #include "pipe/p_context.h"
     35 #include "pipe/p_defines.h"
     36 #include "pipe/p_screen.h"
     37 #include "util/u_math.h"
     38 
     39 #include "st_context.h"
     40 #include "st_debug.h"
     41 #include "st_extensions.h"
     42 #include "st_format.h"
     43 
     44 
     45 /*
     46  * Note: we use these function rather than the MIN2, MAX2, CLAMP macros to
     47  * avoid evaluating arguments (which are often function calls) more than once.
     48  */
     49 
     50 static unsigned _min(unsigned a, unsigned b)
     51 {
     52    return (a < b) ? a : b;
     53 }
     54 
     55 static float _maxf(float a, float b)
     56 {
     57    return (a > b) ? a : b;
     58 }
     59 
     60 static int _clamp(int a, int min, int max)
     61 {
     62    if (a < min)
     63       return min;
     64    else if (a > max)
     65       return max;
     66    else
     67       return a;
     68 }
     69 
     70 
     71 /**
     72  * Query driver to get implementation limits.
     73  * Note that we have to limit/clamp against Mesa's internal limits too.
     74  */
     75 void st_init_limits(struct pipe_screen *screen,
     76                     struct gl_constants *c, struct gl_extensions *extensions)
     77 {
     78    int supported_irs;
     79    unsigned sh;
     80    boolean can_ubo = TRUE;
     81 
     82    c->MaxTextureLevels
     83       = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
     84             MAX_TEXTURE_LEVELS);
     85 
     86    c->Max3DTextureLevels
     87       = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS),
     88             MAX_3D_TEXTURE_LEVELS);
     89 
     90    c->MaxCubeTextureLevels
     91       = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS),
     92             MAX_CUBE_TEXTURE_LEVELS);
     93 
     94    c->MaxTextureRectSize
     95       = _min(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE);
     96 
     97    c->MaxArrayTextureLayers
     98       = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS);
     99 
    100    /* Define max viewport size and max renderbuffer size in terms of
    101     * max texture size (note: max tex RECT size = max tex 2D size).
    102     * If this isn't true for some hardware we'll need new PIPE_CAP_ queries.
    103     */
    104    c->MaxViewportWidth =
    105    c->MaxViewportHeight =
    106    c->MaxRenderbufferSize = c->MaxTextureRectSize;
    107 
    108    c->ViewportSubpixelBits =
    109       screen->get_param(screen, PIPE_CAP_VIEWPORT_SUBPIXEL_BITS);
    110 
    111    c->MaxDrawBuffers = c->MaxColorAttachments =
    112       _clamp(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
    113              1, MAX_DRAW_BUFFERS);
    114 
    115    c->MaxDualSourceDrawBuffers =
    116       _clamp(screen->get_param(screen,
    117                                PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS),
    118              0, MAX_DRAW_BUFFERS);
    119 
    120    c->MaxLineWidth =
    121       _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_LINE_WIDTH));
    122    c->MaxLineWidthAA =
    123       _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_LINE_WIDTH_AA));
    124 
    125    c->MaxPointSize =
    126       _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_POINT_WIDTH));
    127    c->MaxPointSizeAA =
    128       _maxf(1.0f, screen->get_paramf(screen, PIPE_CAPF_MAX_POINT_WIDTH_AA));
    129 
    130    /* these are not queryable. Note that GL basically mandates a 1.0 minimum
    131     * for non-aa sizes, but we can go down to 0.0 for aa points.
    132     */
    133    c->MinPointSize = 1.0f;
    134    c->MinPointSizeAA = 0.0f;
    135 
    136    c->MaxTextureMaxAnisotropy =
    137       _maxf(2.0f,
    138             screen->get_paramf(screen, PIPE_CAPF_MAX_TEXTURE_ANISOTROPY));
    139 
    140    c->MaxTextureLodBias =
    141       screen->get_paramf(screen, PIPE_CAPF_MAX_TEXTURE_LOD_BIAS);
    142 
    143    c->QuadsFollowProvokingVertexConvention =
    144       screen->get_param(screen,
    145                         PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION);
    146 
    147    c->MaxUniformBlockSize =
    148       screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
    149                                PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE);
    150    if (c->MaxUniformBlockSize < 16384) {
    151       can_ubo = FALSE;
    152    }
    153 
    154    for (sh = 0; sh < PIPE_SHADER_TYPES; ++sh) {
    155       struct gl_shader_compiler_options *options;
    156       struct gl_program_constants *pc;
    157 
    158       switch (sh) {
    159       case PIPE_SHADER_FRAGMENT:
    160          pc = &c->Program[MESA_SHADER_FRAGMENT];
    161          options = &c->ShaderCompilerOptions[MESA_SHADER_FRAGMENT];
    162          break;
    163       case PIPE_SHADER_VERTEX:
    164          pc = &c->Program[MESA_SHADER_VERTEX];
    165          options = &c->ShaderCompilerOptions[MESA_SHADER_VERTEX];
    166          break;
    167       case PIPE_SHADER_GEOMETRY:
    168          pc = &c->Program[MESA_SHADER_GEOMETRY];
    169          options = &c->ShaderCompilerOptions[MESA_SHADER_GEOMETRY];
    170          break;
    171       case PIPE_SHADER_TESS_CTRL:
    172          pc = &c->Program[MESA_SHADER_TESS_CTRL];
    173          options = &c->ShaderCompilerOptions[MESA_SHADER_TESS_CTRL];
    174          break;
    175       case PIPE_SHADER_TESS_EVAL:
    176          pc = &c->Program[MESA_SHADER_TESS_EVAL];
    177          options = &c->ShaderCompilerOptions[MESA_SHADER_TESS_EVAL];
    178          break;
    179       case PIPE_SHADER_COMPUTE:
    180          pc = &c->Program[MESA_SHADER_COMPUTE];
    181          options = &c->ShaderCompilerOptions[MESA_SHADER_COMPUTE];
    182 
    183          if (!screen->get_param(screen, PIPE_CAP_COMPUTE))
    184             continue;
    185          supported_irs =
    186             screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUPPORTED_IRS);
    187          if (!(supported_irs & (1 << PIPE_SHADER_IR_TGSI)))
    188             continue;
    189          break;
    190       default:
    191          assert(0);
    192       }
    193 
    194       pc->MaxTextureImageUnits =
    195          _min(screen->get_shader_param(screen, sh,
    196                                        PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS),
    197               MAX_TEXTURE_IMAGE_UNITS);
    198 
    199       pc->MaxInstructions =
    200       pc->MaxNativeInstructions =
    201          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS);
    202       pc->MaxAluInstructions =
    203       pc->MaxNativeAluInstructions =
    204          screen->get_shader_param(screen, sh,
    205                                   PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS);
    206       pc->MaxTexInstructions =
    207       pc->MaxNativeTexInstructions =
    208          screen->get_shader_param(screen, sh,
    209                                   PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS);
    210       pc->MaxTexIndirections =
    211       pc->MaxNativeTexIndirections =
    212          screen->get_shader_param(screen, sh,
    213                                   PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS);
    214       pc->MaxAttribs =
    215       pc->MaxNativeAttribs =
    216          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INPUTS);
    217       pc->MaxTemps =
    218       pc->MaxNativeTemps =
    219          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEMPS);
    220       pc->MaxAddressRegs =
    221       pc->MaxNativeAddressRegs = sh == PIPE_SHADER_VERTEX ? 1 : 0;
    222       pc->MaxParameters =
    223       pc->MaxNativeParameters =
    224          screen->get_shader_param(screen, sh,
    225                    PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE) / sizeof(float[4]);
    226       pc->MaxInputComponents =
    227          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INPUTS) * 4;
    228       pc->MaxOutputComponents =
    229          screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_OUTPUTS) * 4;
    230 
    231       pc->MaxUniformComponents =
    232          4 * MIN2(pc->MaxNativeParameters, MAX_UNIFORMS);
    233 
    234       pc->MaxUniformBlocks =
    235          screen->get_shader_param(screen, sh,
    236                                   PIPE_SHADER_CAP_MAX_CONST_BUFFERS);
    237       if (pc->MaxUniformBlocks)
    238          pc->MaxUniformBlocks -= 1; /* The first one is for ordinary uniforms. */
    239       pc->MaxUniformBlocks = _min(pc->MaxUniformBlocks, MAX_UNIFORM_BUFFERS);
    240 
    241       pc->MaxCombinedUniformComponents = (pc->MaxUniformComponents +
    242                                           c->MaxUniformBlockSize / 4 *
    243                                           pc->MaxUniformBlocks);
    244 
    245       pc->MaxAtomicCounters = MAX_ATOMIC_COUNTERS;
    246       pc->MaxAtomicBuffers = screen->get_shader_param(
    247             screen, sh, PIPE_SHADER_CAP_MAX_SHADER_BUFFERS) / 2;
    248       pc->MaxShaderStorageBlocks = pc->MaxAtomicBuffers;
    249 
    250       pc->MaxImageUniforms = screen->get_shader_param(
    251             screen, sh, PIPE_SHADER_CAP_MAX_SHADER_IMAGES);
    252 
    253       /* Gallium doesn't really care about local vs. env parameters so use the
    254        * same limits.
    255        */
    256       pc->MaxLocalParams = MIN2(pc->MaxParameters, MAX_PROGRAM_LOCAL_PARAMS);
    257       pc->MaxEnvParams = MIN2(pc->MaxParameters, MAX_PROGRAM_ENV_PARAMS);
    258 
    259       if (screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_INTEGERS)) {
    260          pc->LowInt.RangeMin = 31;
    261          pc->LowInt.RangeMax = 30;
    262          pc->LowInt.Precision = 0;
    263          pc->MediumInt = pc->HighInt = pc->LowInt;
    264       }
    265 
    266       /* TODO: make these more fine-grained if anyone needs it */
    267       options->MaxIfDepth =
    268          screen->get_shader_param(screen, sh,
    269                                   PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
    270       options->EmitNoLoops =
    271          !screen->get_shader_param(screen, sh,
    272                                    PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
    273       options->EmitNoFunctions = true;
    274       options->EmitNoMainReturn =
    275          !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES);
    276 
    277       options->EmitNoCont =
    278          !screen->get_shader_param(screen, sh,
    279                                    PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED);
    280 
    281       options->EmitNoIndirectInput =
    282          !screen->get_shader_param(screen, sh,
    283                                    PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR);
    284       options->EmitNoIndirectOutput =
    285          !screen->get_shader_param(screen, sh,
    286                                    PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR);
    287       options->EmitNoIndirectTemp =
    288          !screen->get_shader_param(screen, sh,
    289                                    PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR);
    290       options->EmitNoIndirectUniform =
    291          !screen->get_shader_param(screen, sh,
    292                                    PIPE_SHADER_CAP_INDIRECT_CONST_ADDR);
    293 
    294       if (pc->MaxNativeInstructions &&
    295           (options->EmitNoIndirectUniform || pc->MaxUniformBlocks < 12)) {
    296          can_ubo = FALSE;
    297       }
    298 
    299       if (options->EmitNoLoops)
    300          options->MaxUnrollIterations =
    301             MIN2(screen->get_shader_param(screen, sh,
    302                                           PIPE_SHADER_CAP_MAX_INSTRUCTIONS),
    303                  65536);
    304       else
    305          options->MaxUnrollIterations =
    306             screen->get_shader_param(screen, sh,
    307                                   PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT);
    308 
    309       options->LowerCombinedClipCullDistance = true;
    310       options->LowerBufferInterfaceBlocks = true;
    311    }
    312 
    313    c->GLSLOptimizeConservatively =
    314       screen->get_param(screen, PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY);
    315    c->LowerTessLevel = true;
    316    c->LowerCsDerivedVariables = true;
    317    c->PrimitiveRestartForPatches =
    318       screen->get_param(screen, PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES);
    319 
    320    c->MaxCombinedTextureImageUnits =
    321          _min(c->Program[MESA_SHADER_VERTEX].MaxTextureImageUnits +
    322               c->Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits +
    323               c->Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits +
    324               c->Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits +
    325               c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits +
    326               c->Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits,
    327               MAX_COMBINED_TEXTURE_IMAGE_UNITS);
    328 
    329    /* This depends on program constants. */
    330    c->MaxTextureCoordUnits
    331       = _min(c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
    332              MAX_TEXTURE_COORD_UNITS);
    333 
    334    c->MaxTextureUnits =
    335       _min(c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
    336            c->MaxTextureCoordUnits);
    337 
    338    c->Program[MESA_SHADER_VERTEX].MaxAttribs =
    339       MIN2(c->Program[MESA_SHADER_VERTEX].MaxAttribs, 16);
    340 
    341    /* PIPE_SHADER_CAP_MAX_INPUTS for the FS specifies the maximum number
    342     * of inputs. It's always 2 colors + N generic inputs. */
    343    c->MaxVarying = screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
    344                                             PIPE_SHADER_CAP_MAX_INPUTS);
    345    c->MaxVarying = MIN2(c->MaxVarying, MAX_VARYING);
    346    c->MaxGeometryOutputVertices =
    347       screen->get_param(screen, PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES);
    348    c->MaxGeometryTotalOutputComponents =
    349       screen->get_param(screen, PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS);
    350    c->MaxTessPatchComponents =
    351       MIN2(screen->get_param(screen, PIPE_CAP_MAX_SHADER_PATCH_VARYINGS),
    352            MAX_VARYING) * 4;
    353 
    354    c->MinProgramTexelOffset =
    355       screen->get_param(screen, PIPE_CAP_MIN_TEXEL_OFFSET);
    356    c->MaxProgramTexelOffset =
    357       screen->get_param(screen, PIPE_CAP_MAX_TEXEL_OFFSET);
    358 
    359    c->MaxProgramTextureGatherComponents =
    360       screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS);
    361    c->MinProgramTextureGatherOffset =
    362       screen->get_param(screen, PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET);
    363    c->MaxProgramTextureGatherOffset =
    364       screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET);
    365 
    366    c->MaxTransformFeedbackBuffers =
    367       screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS);
    368    c->MaxTransformFeedbackBuffers = MIN2(c->MaxTransformFeedbackBuffers,
    369                                          MAX_FEEDBACK_BUFFERS);
    370    c->MaxTransformFeedbackSeparateComponents =
    371       screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS);
    372    c->MaxTransformFeedbackInterleavedComponents =
    373       screen->get_param(screen,
    374                         PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS);
    375    c->MaxVertexStreams =
    376       MAX2(1, screen->get_param(screen, PIPE_CAP_MAX_VERTEX_STREAMS));
    377 
    378    /* The vertex stream must fit into pipe_stream_output_info::stream */
    379    assert(c->MaxVertexStreams <= 4);
    380 
    381    c->MaxVertexAttribStride
    382       = screen->get_param(screen, PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE);
    383 
    384    c->StripTextureBorder = GL_TRUE;
    385 
    386    c->GLSLSkipStrictMaxUniformLimitCheck =
    387       screen->get_param(screen, PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS);
    388 
    389    c->UniformBufferOffsetAlignment =
    390       screen->get_param(screen, PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT);
    391 
    392    if (can_ubo) {
    393       extensions->ARB_uniform_buffer_object = GL_TRUE;
    394       c->MaxCombinedUniformBlocks = c->MaxUniformBufferBindings =
    395          c->Program[MESA_SHADER_VERTEX].MaxUniformBlocks +
    396          c->Program[MESA_SHADER_TESS_CTRL].MaxUniformBlocks +
    397          c->Program[MESA_SHADER_TESS_EVAL].MaxUniformBlocks +
    398          c->Program[MESA_SHADER_GEOMETRY].MaxUniformBlocks +
    399          c->Program[MESA_SHADER_FRAGMENT].MaxUniformBlocks +
    400          c->Program[MESA_SHADER_COMPUTE].MaxUniformBlocks;
    401       assert(c->MaxCombinedUniformBlocks <= MAX_COMBINED_UNIFORM_BUFFERS);
    402    }
    403 
    404    c->GLSLFragCoordIsSysVal =
    405       screen->get_param(screen, PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL);
    406    c->GLSLFrontFacingIsSysVal =
    407       screen->get_param(screen, PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL);
    408 
    409    c->MaxAtomicBufferBindings =
    410          c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers;
    411    c->MaxCombinedAtomicBuffers =
    412          c->Program[MESA_SHADER_VERTEX].MaxAtomicBuffers +
    413          c->Program[MESA_SHADER_TESS_CTRL].MaxAtomicBuffers +
    414          c->Program[MESA_SHADER_TESS_EVAL].MaxAtomicBuffers +
    415          c->Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers +
    416          c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers;
    417    assert(c->MaxCombinedAtomicBuffers <= MAX_COMBINED_ATOMIC_BUFFERS);
    418 
    419    if (c->MaxCombinedAtomicBuffers > 0) {
    420       extensions->ARB_shader_atomic_counters = GL_TRUE;
    421       extensions->ARB_shader_atomic_counter_ops = GL_TRUE;
    422    }
    423 
    424    c->MaxCombinedShaderOutputResources = c->MaxDrawBuffers;
    425    c->ShaderStorageBufferOffsetAlignment =
    426       screen->get_param(screen, PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT);
    427    if (c->ShaderStorageBufferOffsetAlignment) {
    428       c->MaxCombinedShaderStorageBlocks = c->MaxShaderStorageBufferBindings =
    429          c->MaxCombinedAtomicBuffers;
    430       c->MaxCombinedShaderOutputResources +=
    431          c->MaxCombinedShaderStorageBlocks;
    432       c->MaxShaderStorageBlockSize = 1 << 27;
    433       extensions->ARB_shader_storage_buffer_object = GL_TRUE;
    434    }
    435 
    436    c->MaxCombinedImageUniforms =
    437          c->Program[MESA_SHADER_VERTEX].MaxImageUniforms +
    438          c->Program[MESA_SHADER_TESS_CTRL].MaxImageUniforms +
    439          c->Program[MESA_SHADER_TESS_EVAL].MaxImageUniforms +
    440          c->Program[MESA_SHADER_GEOMETRY].MaxImageUniforms +
    441          c->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms +
    442          c->Program[MESA_SHADER_COMPUTE].MaxImageUniforms;
    443    c->MaxCombinedShaderOutputResources += c->MaxCombinedImageUniforms;
    444    c->MaxImageUnits = MAX_IMAGE_UNITS;
    445    if (c->MaxCombinedImageUniforms) {
    446       extensions->ARB_shader_image_load_store = GL_TRUE;
    447       extensions->ARB_shader_image_size = GL_TRUE;
    448    }
    449 
    450    /* ARB_framebuffer_no_attachments */
    451    c->MaxFramebufferWidth   = c->MaxViewportWidth;
    452    c->MaxFramebufferHeight  = c->MaxViewportHeight;
    453    /* NOTE: we cheat here a little by assuming that
    454     * PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS has the same
    455     * number of layers as we need, although we technically
    456     * could have more the generality is not really useful
    457     * in practicality.
    458     */
    459    c->MaxFramebufferLayers =
    460       screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS);
    461 
    462    c->MaxWindowRectangles =
    463       screen->get_param(screen, PIPE_CAP_MAX_WINDOW_RECTANGLES);
    464 }
    465 
    466 
    467 /**
    468  * Given a member \c x of struct gl_extensions, return offset of
    469  * \c x in bytes.
    470  */
    471 #define o(x) offsetof(struct gl_extensions, x)
    472 
    473 
    474 struct st_extension_cap_mapping {
    475    int extension_offset;
    476    int cap;
    477 };
    478 
    479 struct st_extension_format_mapping {
    480    int extension_offset[2];
    481    enum pipe_format format[32];
    482 
    483    /* If TRUE, at least one format must be supported for the extensions to be
    484     * advertised. If FALSE, all the formats must be supported. */
    485    GLboolean need_at_least_one;
    486 };
    487 
    488 /**
    489  * Enable extensions if certain pipe formats are supported by the driver.
    490  * What extensions will be enabled and what formats must be supported is
    491  * described by the array of st_extension_format_mapping.
    492  *
    493  * target and bind_flags are passed to is_format_supported.
    494  */
    495 static void
    496 init_format_extensions(struct pipe_screen *screen,
    497                        struct gl_extensions *extensions,
    498                        const struct st_extension_format_mapping *mapping,
    499                        unsigned num_mappings,
    500                        enum pipe_texture_target target,
    501                        unsigned bind_flags)
    502 {
    503    GLboolean *extension_table = (GLboolean *) extensions;
    504    unsigned i;
    505    int j;
    506    int num_formats = ARRAY_SIZE(mapping->format);
    507    int num_ext = ARRAY_SIZE(mapping->extension_offset);
    508 
    509    for (i = 0; i < num_mappings; i++) {
    510       int num_supported = 0;
    511 
    512       /* Examine each format in the list. */
    513       for (j = 0; j < num_formats && mapping[i].format[j]; j++) {
    514          if (screen->is_format_supported(screen, mapping[i].format[j],
    515                                          target, 0, bind_flags)) {
    516             num_supported++;
    517          }
    518       }
    519 
    520       if (!num_supported ||
    521           (!mapping[i].need_at_least_one && num_supported != j)) {
    522          continue;
    523       }
    524 
    525       /* Enable all extensions in the list. */
    526       for (j = 0; j < num_ext && mapping[i].extension_offset[j]; j++)
    527          extension_table[mapping[i].extension_offset[j]] = GL_TRUE;
    528    }
    529 }
    530 
    531 
    532 /**
    533  * Given a list of formats and bind flags, return the maximum number
    534  * of samples supported by any of those formats.
    535  */
    536 static unsigned
    537 get_max_samples_for_formats(struct pipe_screen *screen,
    538                             unsigned num_formats,
    539                             enum pipe_format *formats,
    540                             unsigned max_samples,
    541                             unsigned bind)
    542 {
    543    unsigned i, f;
    544 
    545    for (i = max_samples; i > 0; --i) {
    546       for (f = 0; f < num_formats; f++) {
    547          if (screen->is_format_supported(screen, formats[f],
    548                                          PIPE_TEXTURE_2D, i, bind)) {
    549             return i;
    550          }
    551       }
    552    }
    553    return 0;
    554 }
    555 
    556 
    557 /**
    558  * Use pipe_screen::get_param() to query PIPE_CAP_ values to determine
    559  * which GL extensions are supported.
    560  * Quite a few extensions are always supported because they are standard
    561  * features or can be built on top of other gallium features.
    562  * Some fine tuning may still be needed.
    563  */
    564 void st_init_extensions(struct pipe_screen *screen,
    565                         struct gl_constants *consts,
    566                         struct gl_extensions *extensions,
    567                         struct st_config_options *options,
    568                         boolean has_lib_dxtc)
    569 {
    570    unsigned i;
    571    GLboolean *extension_table = (GLboolean *) extensions;
    572 
    573    static const struct st_extension_cap_mapping cap_mapping[] = {
    574       { o(ARB_base_instance),                PIPE_CAP_START_INSTANCE                   },
    575       { o(ARB_buffer_storage),               PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT   },
    576       { o(ARB_clear_texture),                PIPE_CAP_CLEAR_TEXTURE                    },
    577       { o(ARB_clip_control),                 PIPE_CAP_CLIP_HALFZ                       },
    578       { o(ARB_color_buffer_float),           PIPE_CAP_VERTEX_COLOR_UNCLAMPED           },
    579       { o(ARB_conditional_render_inverted),  PIPE_CAP_CONDITIONAL_RENDER_INVERTED      },
    580       { o(ARB_copy_image),                   PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS },
    581       { o(OES_copy_image),                   PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS },
    582       { o(ARB_cull_distance),                PIPE_CAP_CULL_DISTANCE                    },
    583       { o(ARB_depth_clamp),                  PIPE_CAP_DEPTH_CLIP_DISABLE               },
    584       { o(ARB_depth_texture),                PIPE_CAP_TEXTURE_SHADOW_MAP               },
    585       { o(ARB_derivative_control),           PIPE_CAP_TGSI_FS_FINE_DERIVATIVE          },
    586       { o(ARB_draw_buffers_blend),           PIPE_CAP_INDEP_BLEND_FUNC                 },
    587       { o(ARB_draw_indirect),                PIPE_CAP_DRAW_INDIRECT                    },
    588       { o(ARB_draw_instanced),               PIPE_CAP_TGSI_INSTANCEID                  },
    589       { o(ARB_fragment_program_shadow),      PIPE_CAP_TEXTURE_SHADOW_MAP               },
    590       { o(ARB_framebuffer_object),           PIPE_CAP_MIXED_FRAMEBUFFER_SIZES          },
    591       { o(ARB_indirect_parameters),          PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS       },
    592       { o(ARB_instanced_arrays),             PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR  },
    593       { o(ARB_occlusion_query),              PIPE_CAP_OCCLUSION_QUERY                  },
    594       { o(ARB_occlusion_query2),             PIPE_CAP_OCCLUSION_QUERY                  },
    595       { o(ARB_pipeline_statistics_query),    PIPE_CAP_QUERY_PIPELINE_STATISTICS        },
    596       { o(ARB_point_sprite),                 PIPE_CAP_POINT_SPRITE                     },
    597       { o(ARB_query_buffer_object),          PIPE_CAP_QUERY_BUFFER_OBJECT              },
    598       { o(ARB_robust_buffer_access_behavior), PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR   },
    599       { o(ARB_sample_shading),               PIPE_CAP_SAMPLE_SHADING                   },
    600       { o(ARB_seamless_cube_map),            PIPE_CAP_SEAMLESS_CUBE_MAP                },
    601       { o(ARB_shader_draw_parameters),       PIPE_CAP_DRAW_PARAMETERS                  },
    602       { o(ARB_shader_group_vote),            PIPE_CAP_TGSI_VOTE                        },
    603       { o(ARB_shader_stencil_export),        PIPE_CAP_SHADER_STENCIL_EXPORT            },
    604       { o(ARB_shader_texture_image_samples), PIPE_CAP_TGSI_TXQS                        },
    605       { o(ARB_shader_texture_lod),           PIPE_CAP_SM3                              },
    606       { o(ARB_shadow),                       PIPE_CAP_TEXTURE_SHADOW_MAP               },
    607       { o(ARB_texture_buffer_object),        PIPE_CAP_TEXTURE_BUFFER_OBJECTS           },
    608       { o(ARB_texture_cube_map_array),       PIPE_CAP_CUBE_MAP_ARRAY                   },
    609       { o(ARB_texture_gather),               PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS    },
    610       { o(ARB_texture_mirror_clamp_to_edge), PIPE_CAP_TEXTURE_MIRROR_CLAMP             },
    611       { o(ARB_texture_multisample),          PIPE_CAP_TEXTURE_MULTISAMPLE              },
    612       { o(ARB_texture_non_power_of_two),     PIPE_CAP_NPOT_TEXTURES                    },
    613       { o(ARB_texture_query_lod),            PIPE_CAP_TEXTURE_QUERY_LOD                },
    614       { o(ARB_texture_view),                 PIPE_CAP_SAMPLER_VIEW_TARGET              },
    615       { o(ARB_timer_query),                  PIPE_CAP_QUERY_TIMESTAMP                  },
    616       { o(ARB_transform_feedback2),          PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME       },
    617       { o(ARB_transform_feedback3),          PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS },
    618 
    619       { o(KHR_blend_equation_advanced),      PIPE_CAP_TGSI_FS_FBFETCH                  },
    620 
    621       { o(EXT_blend_equation_separate),      PIPE_CAP_BLEND_EQUATION_SEPARATE          },
    622       { o(EXT_depth_bounds_test),            PIPE_CAP_DEPTH_BOUNDS_TEST                },
    623       { o(EXT_draw_buffers2),                PIPE_CAP_INDEP_BLEND_ENABLE               },
    624       { o(EXT_polygon_offset_clamp),         PIPE_CAP_POLYGON_OFFSET_CLAMP             },
    625       { o(EXT_stencil_two_side),             PIPE_CAP_TWO_SIDED_STENCIL                },
    626       { o(EXT_texture_array),                PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS         },
    627       { o(EXT_texture_filter_anisotropic),   PIPE_CAP_ANISOTROPIC_FILTER               },
    628       { o(EXT_texture_mirror_clamp),         PIPE_CAP_TEXTURE_MIRROR_CLAMP             },
    629       { o(EXT_texture_swizzle),              PIPE_CAP_TEXTURE_SWIZZLE                  },
    630       { o(EXT_transform_feedback),           PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS        },
    631       { o(EXT_window_rectangles),            PIPE_CAP_MAX_WINDOW_RECTANGLES            },
    632 
    633       { o(AMD_pinned_memory),                PIPE_CAP_RESOURCE_FROM_USER_MEMORY        },
    634       { o(ATI_meminfo),                      PIPE_CAP_QUERY_MEMORY_INFO                },
    635       { o(AMD_seamless_cubemap_per_texture), PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE    },
    636       { o(ATI_separate_stencil),             PIPE_CAP_TWO_SIDED_STENCIL                },
    637       { o(ATI_texture_mirror_once),          PIPE_CAP_TEXTURE_MIRROR_CLAMP             },
    638       { o(NV_conditional_render),            PIPE_CAP_CONDITIONAL_RENDER               },
    639       { o(NV_primitive_restart),             PIPE_CAP_PRIMITIVE_RESTART                },
    640       { o(NV_texture_barrier),               PIPE_CAP_TEXTURE_BARRIER                  },
    641       { o(NVX_gpu_memory_info),              PIPE_CAP_QUERY_MEMORY_INFO                },
    642       /* GL_NV_point_sprite is not supported by gallium because we don't
    643        * support the GL_POINT_SPRITE_R_MODE_NV option. */
    644 
    645       { o(OES_standard_derivatives),         PIPE_CAP_SM3                              },
    646       { o(OES_texture_float_linear),         PIPE_CAP_TEXTURE_FLOAT_LINEAR             },
    647       { o(OES_texture_half_float_linear),    PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR        },
    648    };
    649 
    650    /* Required: render target and sampler support */
    651    static const struct st_extension_format_mapping rendertarget_mapping[] = {
    652       { { o(ARB_texture_float) },
    653         { PIPE_FORMAT_R32G32B32A32_FLOAT,
    654           PIPE_FORMAT_R16G16B16A16_FLOAT } },
    655 
    656       { { o(OES_texture_float) },
    657         { PIPE_FORMAT_R32G32B32A32_FLOAT } },
    658 
    659       { { o(OES_texture_half_float) },
    660         { PIPE_FORMAT_R16G16B16A16_FLOAT } },
    661 
    662       { { o(ARB_texture_rgb10_a2ui) },
    663         { PIPE_FORMAT_R10G10B10A2_UINT,
    664           PIPE_FORMAT_B10G10R10A2_UINT },
    665          GL_TRUE }, /* at least one format must be supported */
    666 
    667       { { o(EXT_framebuffer_sRGB) },
    668         { PIPE_FORMAT_A8B8G8R8_SRGB,
    669           PIPE_FORMAT_B8G8R8A8_SRGB },
    670          GL_TRUE }, /* at least one format must be supported */
    671 
    672       { { o(EXT_packed_float) },
    673         { PIPE_FORMAT_R11G11B10_FLOAT } },
    674 
    675       { { o(EXT_texture_integer) },
    676         { PIPE_FORMAT_R32G32B32A32_UINT,
    677           PIPE_FORMAT_R32G32B32A32_SINT } },
    678 
    679       { { o(ARB_texture_rg) },
    680         { PIPE_FORMAT_R8_UNORM,
    681           PIPE_FORMAT_R8G8_UNORM } },
    682    };
    683 
    684    /* Required: depth stencil and sampler support */
    685    static const struct st_extension_format_mapping depthstencil_mapping[] = {
    686       { { o(ARB_depth_buffer_float) },
    687         { PIPE_FORMAT_Z32_FLOAT,
    688           PIPE_FORMAT_Z32_FLOAT_S8X24_UINT } },
    689    };
    690 
    691    /* Required: sampler support */
    692    static const struct st_extension_format_mapping texture_mapping[] = {
    693       { { o(ARB_texture_compression_rgtc) },
    694         { PIPE_FORMAT_RGTC1_UNORM,
    695           PIPE_FORMAT_RGTC1_SNORM,
    696           PIPE_FORMAT_RGTC2_UNORM,
    697           PIPE_FORMAT_RGTC2_SNORM } },
    698 
    699       { { o(EXT_texture_compression_latc) },
    700         { PIPE_FORMAT_LATC1_UNORM,
    701           PIPE_FORMAT_LATC1_SNORM,
    702           PIPE_FORMAT_LATC2_UNORM,
    703           PIPE_FORMAT_LATC2_SNORM } },
    704 
    705       { { o(EXT_texture_compression_s3tc),
    706           o(ANGLE_texture_compression_dxt) },
    707         { PIPE_FORMAT_DXT1_RGB,
    708           PIPE_FORMAT_DXT1_RGBA,
    709           PIPE_FORMAT_DXT3_RGBA,
    710           PIPE_FORMAT_DXT5_RGBA } },
    711 
    712       { { o(ARB_texture_compression_bptc) },
    713         { PIPE_FORMAT_BPTC_RGBA_UNORM,
    714           PIPE_FORMAT_BPTC_SRGBA,
    715           PIPE_FORMAT_BPTC_RGB_FLOAT,
    716           PIPE_FORMAT_BPTC_RGB_UFLOAT } },
    717 
    718       { { o(KHR_texture_compression_astc_ldr) },
    719         { PIPE_FORMAT_ASTC_4x4,
    720           PIPE_FORMAT_ASTC_5x4,
    721           PIPE_FORMAT_ASTC_5x5,
    722           PIPE_FORMAT_ASTC_6x5,
    723           PIPE_FORMAT_ASTC_6x6,
    724           PIPE_FORMAT_ASTC_8x5,
    725           PIPE_FORMAT_ASTC_8x6,
    726           PIPE_FORMAT_ASTC_8x8,
    727           PIPE_FORMAT_ASTC_10x5,
    728           PIPE_FORMAT_ASTC_10x6,
    729           PIPE_FORMAT_ASTC_10x8,
    730           PIPE_FORMAT_ASTC_10x10,
    731           PIPE_FORMAT_ASTC_12x10,
    732           PIPE_FORMAT_ASTC_12x12,
    733           PIPE_FORMAT_ASTC_4x4_SRGB,
    734           PIPE_FORMAT_ASTC_5x4_SRGB,
    735           PIPE_FORMAT_ASTC_5x5_SRGB,
    736           PIPE_FORMAT_ASTC_6x5_SRGB,
    737           PIPE_FORMAT_ASTC_6x6_SRGB,
    738           PIPE_FORMAT_ASTC_8x5_SRGB,
    739           PIPE_FORMAT_ASTC_8x6_SRGB,
    740           PIPE_FORMAT_ASTC_8x8_SRGB,
    741           PIPE_FORMAT_ASTC_10x5_SRGB,
    742           PIPE_FORMAT_ASTC_10x6_SRGB,
    743           PIPE_FORMAT_ASTC_10x8_SRGB,
    744           PIPE_FORMAT_ASTC_10x10_SRGB,
    745           PIPE_FORMAT_ASTC_12x10_SRGB,
    746           PIPE_FORMAT_ASTC_12x12_SRGB } },
    747 
    748       { { o(EXT_texture_shared_exponent) },
    749         { PIPE_FORMAT_R9G9B9E5_FLOAT } },
    750 
    751       { { o(EXT_texture_snorm) },
    752         { PIPE_FORMAT_R8G8B8A8_SNORM } },
    753 
    754       { { o(EXT_texture_sRGB),
    755           o(EXT_texture_sRGB_decode) },
    756         { PIPE_FORMAT_A8B8G8R8_SRGB,
    757           PIPE_FORMAT_B8G8R8A8_SRGB },
    758         GL_TRUE }, /* at least one format must be supported */
    759 
    760       { { o(ATI_texture_compression_3dc) },
    761         { PIPE_FORMAT_LATC2_UNORM } },
    762 
    763       { { o(MESA_ycbcr_texture) },
    764         { PIPE_FORMAT_UYVY,
    765           PIPE_FORMAT_YUYV },
    766         GL_TRUE }, /* at least one format must be supported */
    767 
    768       { { o(OES_compressed_ETC1_RGB8_texture) },
    769         { PIPE_FORMAT_ETC1_RGB8,
    770           PIPE_FORMAT_R8G8B8A8_UNORM },
    771         GL_TRUE }, /* at least one format must be supported */
    772 
    773       { { o(ARB_stencil_texturing),
    774           o(ARB_texture_stencil8) },
    775         { PIPE_FORMAT_X24S8_UINT,
    776           PIPE_FORMAT_S8X24_UINT },
    777         GL_TRUE }, /* at least one format must be supported */
    778    };
    779 
    780    /* Required: vertex fetch support. */
    781    static const struct st_extension_format_mapping vertex_mapping[] = {
    782       { { o(EXT_vertex_array_bgra) },
    783         { PIPE_FORMAT_B8G8R8A8_UNORM } },
    784       { { o(ARB_vertex_type_2_10_10_10_rev) },
    785         { PIPE_FORMAT_R10G10B10A2_UNORM,
    786           PIPE_FORMAT_B10G10R10A2_UNORM,
    787           PIPE_FORMAT_R10G10B10A2_SNORM,
    788           PIPE_FORMAT_B10G10R10A2_SNORM,
    789           PIPE_FORMAT_R10G10B10A2_USCALED,
    790           PIPE_FORMAT_B10G10R10A2_USCALED,
    791           PIPE_FORMAT_R10G10B10A2_SSCALED,
    792           PIPE_FORMAT_B10G10R10A2_SSCALED } },
    793       { { o(ARB_vertex_type_10f_11f_11f_rev) },
    794         { PIPE_FORMAT_R11G11B10_FLOAT } },
    795    };
    796 
    797    static const struct st_extension_format_mapping tbo_rgb32[] = {
    798       { {o(ARB_texture_buffer_object_rgb32) },
    799         { PIPE_FORMAT_R32G32B32_FLOAT,
    800           PIPE_FORMAT_R32G32B32_UINT,
    801           PIPE_FORMAT_R32G32B32_SINT,
    802         } },
    803    };
    804 
    805    /*
    806     * Extensions that are supported by all Gallium drivers:
    807     */
    808    extensions->ARB_ES2_compatibility = GL_TRUE;
    809    extensions->ARB_draw_elements_base_vertex = GL_TRUE;
    810    extensions->ARB_explicit_attrib_location = GL_TRUE;
    811    extensions->ARB_explicit_uniform_location = GL_TRUE;
    812    extensions->ARB_fragment_coord_conventions = GL_TRUE;
    813    extensions->ARB_fragment_program = GL_TRUE;
    814    extensions->ARB_fragment_shader = GL_TRUE;
    815    extensions->ARB_half_float_vertex = GL_TRUE;
    816    extensions->ARB_internalformat_query = GL_TRUE;
    817    extensions->ARB_internalformat_query2 = GL_TRUE;
    818    extensions->ARB_map_buffer_range = GL_TRUE;
    819    extensions->ARB_texture_border_clamp = GL_TRUE; /* XXX temp */
    820    extensions->ARB_texture_cube_map = GL_TRUE;
    821    extensions->ARB_texture_env_combine = GL_TRUE;
    822    extensions->ARB_texture_env_crossbar = GL_TRUE;
    823    extensions->ARB_texture_env_dot3 = GL_TRUE;
    824    extensions->ARB_vertex_program = GL_TRUE;
    825    extensions->ARB_vertex_shader = GL_TRUE;
    826 
    827    extensions->EXT_blend_color = GL_TRUE;
    828    extensions->EXT_blend_func_separate = GL_TRUE;
    829    extensions->EXT_blend_minmax = GL_TRUE;
    830    extensions->EXT_gpu_program_parameters = GL_TRUE;
    831    extensions->EXT_pixel_buffer_object = GL_TRUE;
    832    extensions->EXT_point_parameters = GL_TRUE;
    833    extensions->EXT_provoking_vertex = GL_TRUE;
    834 
    835    extensions->EXT_texture_env_dot3 = GL_TRUE;
    836 
    837    extensions->ATI_fragment_shader = GL_TRUE;
    838    extensions->ATI_texture_env_combine3 = GL_TRUE;
    839 
    840    extensions->MESA_pack_invert = GL_TRUE;
    841 
    842    extensions->NV_fog_distance = GL_TRUE;
    843    extensions->NV_texture_env_combine4 = GL_TRUE;
    844    extensions->NV_texture_rectangle = GL_TRUE;
    845 
    846    extensions->OES_EGL_image = GL_TRUE;
    847    extensions->OES_EGL_image_external = GL_TRUE;
    848    extensions->OES_draw_texture = GL_TRUE;
    849 
    850    /* Expose the extensions which directly correspond to gallium caps. */
    851    for (i = 0; i < ARRAY_SIZE(cap_mapping); i++) {
    852       if (screen->get_param(screen, cap_mapping[i].cap)) {
    853          extension_table[cap_mapping[i].extension_offset] = GL_TRUE;
    854       }
    855    }
    856 
    857    /* Expose the extensions which directly correspond to gallium formats. */
    858    init_format_extensions(screen, extensions, rendertarget_mapping,
    859                           ARRAY_SIZE(rendertarget_mapping), PIPE_TEXTURE_2D,
    860                           PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW);
    861    init_format_extensions(screen, extensions, depthstencil_mapping,
    862                           ARRAY_SIZE(depthstencil_mapping), PIPE_TEXTURE_2D,
    863                           PIPE_BIND_DEPTH_STENCIL | PIPE_BIND_SAMPLER_VIEW);
    864    init_format_extensions(screen, extensions, texture_mapping,
    865                           ARRAY_SIZE(texture_mapping), PIPE_TEXTURE_2D,
    866                           PIPE_BIND_SAMPLER_VIEW);
    867    init_format_extensions(screen, extensions, vertex_mapping,
    868                           ARRAY_SIZE(vertex_mapping), PIPE_BUFFER,
    869                           PIPE_BIND_VERTEX_BUFFER);
    870 
    871    /* Figure out GLSL support and set GLSLVersion to it. */
    872    consts->GLSLVersion = screen->get_param(screen, PIPE_CAP_GLSL_FEATURE_LEVEL);
    873 
    874    _mesa_override_glsl_version(consts);
    875 
    876    if (options->force_glsl_version > 0 &&
    877        options->force_glsl_version <= consts->GLSLVersion) {
    878       consts->ForceGLSLVersion = options->force_glsl_version;
    879    }
    880 
    881    if (consts->GLSLVersion >= 400)
    882       extensions->ARB_gpu_shader5 = GL_TRUE;
    883    if (consts->GLSLVersion >= 410)
    884       extensions->ARB_shader_precision = GL_TRUE;
    885 
    886    /* This extension needs full OpenGL 3.2, but we don't know if that's
    887     * supported at this point. Only check the GLSL version. */
    888    if (consts->GLSLVersion >= 150 &&
    889        screen->get_param(screen, PIPE_CAP_TGSI_VS_LAYER_VIEWPORT)) {
    890       extensions->AMD_vertex_shader_layer = GL_TRUE;
    891    }
    892 
    893    if (consts->GLSLVersion >= 140) {
    894       if (screen->get_param(screen, PIPE_CAP_TGSI_ARRAY_COMPONENTS) &&
    895          screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
    896                                    PIPE_SHADER_CAP_PREFERRED_IR) == PIPE_SHADER_IR_TGSI)
    897          extensions->ARB_enhanced_layouts = GL_TRUE;
    898    }
    899 
    900    if (consts->GLSLVersion >= 130) {
    901       consts->NativeIntegers = GL_TRUE;
    902       consts->MaxClipPlanes = 8;
    903 
    904       if (screen->get_param(screen, PIPE_CAP_VERTEXID_NOBASE)) {
    905          consts->VertexID_is_zero_based = GL_TRUE;
    906       }
    907 
    908       /* Extensions that either depend on GLSL 1.30 or are a subset thereof. */
    909       extensions->ARB_conservative_depth = GL_TRUE;
    910       extensions->ARB_shading_language_packing = GL_TRUE;
    911       extensions->OES_depth_texture_cube_map = GL_TRUE;
    912       extensions->ARB_shading_language_420pack = GL_TRUE;
    913       extensions->ARB_texture_query_levels = GL_TRUE;
    914       extensions->ARB_shader_subroutine = GL_TRUE;
    915 
    916       if (!options->disable_shader_bit_encoding) {
    917          extensions->ARB_shader_bit_encoding = GL_TRUE;
    918       }
    919 
    920       extensions->EXT_shader_integer_mix = GL_TRUE;
    921       extensions->ARB_arrays_of_arrays = GL_TRUE;
    922       extensions->MESA_shader_integer_functions = GL_TRUE;
    923    } else {
    924       /* Optional integer support for GLSL 1.2. */
    925       if (screen->get_shader_param(screen, PIPE_SHADER_VERTEX,
    926                                    PIPE_SHADER_CAP_INTEGERS) &&
    927           screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
    928                                    PIPE_SHADER_CAP_INTEGERS)) {
    929          consts->NativeIntegers = GL_TRUE;
    930 
    931          extensions->EXT_shader_integer_mix = GL_TRUE;
    932       }
    933 
    934       /* Integer textures make no sense before GLSL 1.30 */
    935       extensions->EXT_texture_integer = GL_FALSE;
    936    }
    937 
    938    consts->GLSLZeroInit = options->glsl_zero_init;
    939 
    940    consts->UniformBooleanTrue = consts->NativeIntegers ? ~0U : fui(1.0f);
    941 
    942    /* Below are the cases which cannot be moved into tables easily. */
    943 
    944    if (!has_lib_dxtc && !options->force_s3tc_enable) {
    945       extensions->EXT_texture_compression_s3tc = GL_FALSE;
    946       extensions->ANGLE_texture_compression_dxt = GL_FALSE;
    947    }
    948 
    949    if (screen->get_shader_param(screen, PIPE_SHADER_TESS_CTRL,
    950                                 PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) {
    951       extensions->ARB_tessellation_shader = GL_TRUE;
    952    }
    953 
    954    /* What this is really checking for is the ability to support multiple
    955     * invocations of a geometry shader. There is no separate cap for that, so
    956     * we check the GLSLVersion.
    957     */
    958    if (consts->GLSLVersion >= 400 &&
    959        screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY,
    960                                 PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) {
    961       extensions->OES_geometry_shader = GL_TRUE;
    962    }
    963 
    964    if (screen->fence_finish) {
    965       extensions->ARB_sync = GL_TRUE;
    966    }
    967 
    968    /* Needs PIPE_CAP_SAMPLE_SHADING + all the sample-related bits of
    969     * ARB_gpu_shader5. This enables all the per-sample shading ES extensions.
    970     */
    971    extensions->OES_sample_variables = extensions->ARB_sample_shading &&
    972       extensions->ARB_gpu_shader5;
    973 
    974    /* Maximum sample count. */
    975    {
    976       enum pipe_format color_formats[] = {
    977          PIPE_FORMAT_R8G8B8A8_UNORM,
    978          PIPE_FORMAT_B8G8R8A8_UNORM,
    979          PIPE_FORMAT_A8R8G8B8_UNORM,
    980          PIPE_FORMAT_A8B8G8R8_UNORM,
    981       };
    982       enum pipe_format depth_formats[] = {
    983          PIPE_FORMAT_Z16_UNORM,
    984          PIPE_FORMAT_Z24X8_UNORM,
    985          PIPE_FORMAT_X8Z24_UNORM,
    986          PIPE_FORMAT_Z32_UNORM,
    987          PIPE_FORMAT_Z32_FLOAT
    988       };
    989       enum pipe_format int_formats[] = {
    990          PIPE_FORMAT_R8G8B8A8_SINT
    991       };
    992       enum pipe_format void_formats[] = {
    993          PIPE_FORMAT_NONE
    994       };
    995 
    996       consts->MaxSamples =
    997          get_max_samples_for_formats(screen, ARRAY_SIZE(color_formats),
    998                                      color_formats, 16,
    999                                      PIPE_BIND_RENDER_TARGET);
   1000 
   1001       consts->MaxImageSamples =
   1002          get_max_samples_for_formats(screen, ARRAY_SIZE(color_formats),
   1003                                      color_formats, 16,
   1004                                      PIPE_BIND_SHADER_IMAGE);
   1005 
   1006       consts->MaxColorTextureSamples =
   1007          get_max_samples_for_formats(screen, ARRAY_SIZE(color_formats),
   1008                                      color_formats, consts->MaxSamples,
   1009                                      PIPE_BIND_SAMPLER_VIEW);
   1010 
   1011       consts->MaxDepthTextureSamples =
   1012          get_max_samples_for_formats(screen, ARRAY_SIZE(depth_formats),
   1013                                      depth_formats, consts->MaxSamples,
   1014                                      PIPE_BIND_SAMPLER_VIEW);
   1015 
   1016       consts->MaxIntegerSamples =
   1017          get_max_samples_for_formats(screen, ARRAY_SIZE(int_formats),
   1018                                      int_formats, consts->MaxSamples,
   1019                                      PIPE_BIND_SAMPLER_VIEW);
   1020 
   1021       /* ARB_framebuffer_no_attachments, assume max no. of samples 32 */
   1022       consts->MaxFramebufferSamples =
   1023          get_max_samples_for_formats(screen, ARRAY_SIZE(void_formats),
   1024                                      void_formats, 32,
   1025                                      PIPE_BIND_RENDER_TARGET);
   1026    }
   1027    if (consts->MaxSamples == 1) {
   1028       /* one sample doesn't really make sense */
   1029       consts->MaxSamples = 0;
   1030    }
   1031    else if (consts->MaxSamples >= 2) {
   1032       extensions->EXT_framebuffer_multisample = GL_TRUE;
   1033       extensions->EXT_framebuffer_multisample_blit_scaled = GL_TRUE;
   1034    }
   1035 
   1036    if (consts->MaxSamples == 0 && screen->get_param(screen, PIPE_CAP_FAKE_SW_MSAA)) {
   1037 	consts->FakeSWMSAA = GL_TRUE;
   1038         extensions->EXT_framebuffer_multisample = GL_TRUE;
   1039         extensions->EXT_framebuffer_multisample_blit_scaled = GL_TRUE;
   1040         extensions->ARB_texture_multisample = GL_TRUE;
   1041    }
   1042 
   1043    if (consts->MaxDualSourceDrawBuffers > 0 &&
   1044        !options->disable_blend_func_extended)
   1045       extensions->ARB_blend_func_extended = GL_TRUE;
   1046 
   1047    if (screen->get_param(screen, PIPE_CAP_QUERY_TIME_ELAPSED) ||
   1048        extensions->ARB_timer_query) {
   1049       extensions->EXT_timer_query = GL_TRUE;
   1050    }
   1051 
   1052    if (extensions->ARB_transform_feedback2 &&
   1053        extensions->ARB_draw_instanced) {
   1054       extensions->ARB_transform_feedback_instanced = GL_TRUE;
   1055    }
   1056    if (options->force_glsl_extensions_warn)
   1057       consts->ForceGLSLExtensionsWarn = 1;
   1058 
   1059    if (options->disable_glsl_line_continuations)
   1060       consts->DisableGLSLLineContinuations = 1;
   1061 
   1062    if (options->allow_glsl_extension_directive_midshader)
   1063       consts->AllowGLSLExtensionDirectiveMidShader = GL_TRUE;
   1064 
   1065    consts->MinMapBufferAlignment =
   1066       screen->get_param(screen, PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT);
   1067 
   1068    if (extensions->ARB_texture_buffer_object) {
   1069       consts->MaxTextureBufferSize =
   1070          _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE),
   1071               (1u << 31) - 1);
   1072       consts->TextureBufferOffsetAlignment =
   1073          screen->get_param(screen, PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT);
   1074 
   1075       if (consts->TextureBufferOffsetAlignment)
   1076          extensions->ARB_texture_buffer_range = GL_TRUE;
   1077 
   1078       init_format_extensions(screen, extensions, tbo_rgb32,
   1079                              ARRAY_SIZE(tbo_rgb32), PIPE_BUFFER,
   1080                              PIPE_BIND_SAMPLER_VIEW);
   1081    }
   1082 
   1083    extensions->OES_texture_buffer =
   1084       extensions->ARB_texture_buffer_object &&
   1085       extensions->ARB_texture_buffer_range &&
   1086       extensions->ARB_texture_buffer_object_rgb32 &&
   1087       extensions->ARB_shader_image_load_store;
   1088 
   1089    /* Unpacking a varying in the fragment shader costs 1 texture indirection.
   1090     * If the number of available texture indirections is very limited, then we
   1091     * prefer to disable varying packing rather than run the risk of varying
   1092     * packing preventing a shader from running.
   1093     */
   1094    if (screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
   1095                                 PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS) <= 8) {
   1096       /* We can't disable varying packing if transform feedback is available,
   1097        * because transform feedback code assumes a packed varying layout.
   1098        */
   1099       if (!extensions->EXT_transform_feedback)
   1100          consts->DisableVaryingPacking = GL_TRUE;
   1101    }
   1102 
   1103    consts->MaxViewports = screen->get_param(screen, PIPE_CAP_MAX_VIEWPORTS);
   1104    if (consts->MaxViewports >= 16) {
   1105       if (consts->GLSLVersion >= 400) {
   1106          consts->ViewportBounds.Min = -32768.0;
   1107          consts->ViewportBounds.Max = 32767.0;
   1108       } else {
   1109          consts->ViewportBounds.Min = -16384.0;
   1110          consts->ViewportBounds.Max = 16383.0;
   1111       }
   1112       extensions->ARB_viewport_array = GL_TRUE;
   1113       extensions->ARB_fragment_layer_viewport = GL_TRUE;
   1114       if (extensions->AMD_vertex_shader_layer)
   1115          extensions->AMD_vertex_shader_viewport_index = GL_TRUE;
   1116    }
   1117 
   1118    /* ARB_framebuffer_no_attachments */
   1119    if (screen->get_param(screen, PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT) &&
   1120        ((consts->MaxSamples >= 4 && consts->MaxFramebufferLayers >= 2048) ||
   1121         (consts->MaxFramebufferSamples >= consts->MaxSamples &&
   1122          consts->MaxFramebufferLayers >= consts->MaxArrayTextureLayers)))
   1123       extensions->ARB_framebuffer_no_attachments = GL_TRUE;
   1124 
   1125    /* GL_ARB_ES3_compatibility.
   1126     *
   1127     * Assume that ES3 is supported if GLSL 3.30 is supported.
   1128     * (OpenGL 3.3 is a requirement for that extension.)
   1129     */
   1130    if (consts->GLSLVersion >= 330 &&
   1131        /* Requirements for ETC2 emulation. */
   1132        screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_UNORM,
   1133                                    PIPE_TEXTURE_2D, 0,
   1134                                    PIPE_BIND_SAMPLER_VIEW) &&
   1135        screen->is_format_supported(screen, PIPE_FORMAT_B8G8R8A8_SRGB,
   1136                                    PIPE_TEXTURE_2D, 0,
   1137                                    PIPE_BIND_SAMPLER_VIEW) &&
   1138        screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM,
   1139                                    PIPE_TEXTURE_2D, 0,
   1140                                    PIPE_BIND_SAMPLER_VIEW) &&
   1141        screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM,
   1142                                    PIPE_TEXTURE_2D, 0,
   1143                                    PIPE_BIND_SAMPLER_VIEW) &&
   1144        screen->is_format_supported(screen, PIPE_FORMAT_R16_SNORM,
   1145                                    PIPE_TEXTURE_2D, 0,
   1146                                    PIPE_BIND_SAMPLER_VIEW) &&
   1147        screen->is_format_supported(screen, PIPE_FORMAT_R16G16_SNORM,
   1148                                    PIPE_TEXTURE_2D, 0,
   1149                                    PIPE_BIND_SAMPLER_VIEW)) {
   1150       extensions->ARB_ES3_compatibility = GL_TRUE;
   1151    }
   1152 
   1153 #ifdef HAVE_ST_VDPAU
   1154    if (screen->get_video_param &&
   1155        screen->get_video_param(screen, PIPE_VIDEO_PROFILE_UNKNOWN,
   1156                                PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
   1157                                PIPE_VIDEO_CAP_SUPPORTS_INTERLACED)) {
   1158       extensions->NV_vdpau_interop = GL_TRUE;
   1159    }
   1160 #endif
   1161 
   1162    if (screen->get_shader_param(screen, PIPE_SHADER_VERTEX,
   1163                                 PIPE_SHADER_CAP_DOUBLES) &&
   1164        screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
   1165                                 PIPE_SHADER_CAP_DOUBLES)) {
   1166       extensions->ARB_gpu_shader_fp64 = GL_TRUE;
   1167       extensions->ARB_vertex_attrib_64bit = GL_TRUE;
   1168    }
   1169 
   1170    if ((ST_DEBUG & DEBUG_GREMEDY) &&
   1171        screen->get_param(screen, PIPE_CAP_STRING_MARKER))
   1172       extensions->GREMEDY_string_marker = GL_TRUE;
   1173 
   1174    if (screen->get_param(screen, PIPE_CAP_COMPUTE)) {
   1175       int compute_supported_irs =
   1176          screen->get_shader_param(screen, PIPE_SHADER_COMPUTE,
   1177                                   PIPE_SHADER_CAP_SUPPORTED_IRS);
   1178       if (compute_supported_irs & (1 << PIPE_SHADER_IR_TGSI)) {
   1179          uint64_t grid_size[3], block_size[3];
   1180          uint64_t max_local_size, max_threads_per_block;
   1181 
   1182          screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI,
   1183                                    PIPE_COMPUTE_CAP_MAX_GRID_SIZE, grid_size);
   1184          screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI,
   1185                                    PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE, block_size);
   1186          screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI,
   1187                                    PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK,
   1188                                    &max_threads_per_block);
   1189          screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI,
   1190                                    PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE,
   1191                                    &max_local_size);
   1192 
   1193          consts->MaxComputeWorkGroupInvocations = max_threads_per_block;
   1194          consts->MaxComputeSharedMemorySize = max_local_size;
   1195 
   1196          for (i = 0; i < 3; i++) {
   1197             consts->MaxComputeWorkGroupCount[i] = grid_size[i];
   1198             consts->MaxComputeWorkGroupSize[i] = block_size[i];
   1199          }
   1200 
   1201          extensions->ARB_compute_shader =
   1202                                       extensions->ARB_shader_image_load_store &&
   1203                                       extensions->ARB_shader_atomic_counters;
   1204 
   1205          if (extensions->ARB_compute_shader) {
   1206             uint64_t max_variable_threads_per_block = 0;
   1207 
   1208             screen->get_compute_param(screen, PIPE_SHADER_IR_TGSI,
   1209                                       PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK,
   1210                                       &max_variable_threads_per_block);
   1211 
   1212             for (i = 0; i < 3; i++) {
   1213                /* Clamp the values to avoid having a local work group size
   1214                 * greater than the maximum number of invocations.
   1215                 */
   1216                consts->MaxComputeVariableGroupSize[i] =
   1217                   MIN2(consts->MaxComputeWorkGroupSize[i],
   1218                        max_variable_threads_per_block);
   1219             }
   1220             consts->MaxComputeVariableGroupInvocations =
   1221                max_variable_threads_per_block;
   1222 
   1223             extensions->ARB_compute_variable_group_size =
   1224                max_variable_threads_per_block > 0;
   1225          }
   1226       }
   1227    }
   1228 
   1229    extensions->KHR_robustness = extensions->ARB_robust_buffer_access_behavior;
   1230 
   1231    /* If we support ES 3.1, we support the ES3_1_compatibility ext. However
   1232     * there's no clean way of telling whether we would support ES 3.1 from
   1233     * here, so copy the condition from compute_version_es2 here. A lot of
   1234     * these are redunant, but simpler to just have a (near-)exact copy here.
   1235     */
   1236    extensions->ARB_ES3_1_compatibility =
   1237       extensions->ARB_ES3_compatibility &&
   1238       extensions->ARB_arrays_of_arrays &&
   1239       extensions->ARB_compute_shader &&
   1240       extensions->ARB_draw_indirect &&
   1241       extensions->ARB_explicit_uniform_location &&
   1242       extensions->ARB_framebuffer_no_attachments &&
   1243       extensions->ARB_shader_atomic_counters &&
   1244       extensions->ARB_shader_image_load_store &&
   1245       extensions->ARB_shader_image_size &&
   1246       extensions->ARB_shader_storage_buffer_object &&
   1247       extensions->ARB_shading_language_packing &&
   1248       extensions->ARB_stencil_texturing &&
   1249       extensions->ARB_texture_multisample &&
   1250       extensions->ARB_gpu_shader5 &&
   1251       extensions->EXT_shader_integer_mix;
   1252 
   1253    extensions->OES_texture_cube_map_array =
   1254       extensions->ARB_ES3_1_compatibility &&
   1255       extensions->OES_geometry_shader &&
   1256       extensions->ARB_texture_cube_map_array;
   1257 
   1258    extensions->OES_viewport_array =
   1259       extensions->ARB_ES3_1_compatibility &&
   1260       extensions->OES_geometry_shader &&
   1261       extensions->ARB_viewport_array;
   1262 
   1263    extensions->OES_primitive_bounding_box = extensions->ARB_ES3_1_compatibility;
   1264    consts->NoPrimitiveBoundingBoxOutput = true;
   1265 
   1266    extensions->ANDROID_extension_pack_es31a =
   1267       extensions->KHR_texture_compression_astc_ldr &&
   1268       extensions->KHR_blend_equation_advanced &&
   1269       extensions->OES_sample_variables &&
   1270       extensions->ARB_shader_image_load_store &&
   1271       extensions->ARB_texture_stencil8 &&
   1272       extensions->ARB_texture_multisample &&
   1273       extensions->OES_copy_image &&
   1274       extensions->ARB_draw_buffers_blend &&
   1275       extensions->OES_geometry_shader &&
   1276       extensions->ARB_gpu_shader5 &&
   1277       extensions->OES_primitive_bounding_box &&
   1278       extensions->ARB_tessellation_shader &&
   1279       extensions->ARB_texture_border_clamp &&
   1280       extensions->OES_texture_buffer &&
   1281       extensions->OES_texture_cube_map_array &&
   1282       extensions->EXT_texture_sRGB_decode;
   1283 
   1284    /* Same deal as for ARB_ES3_1_compatibility - this has to be computed
   1285     * before overall versions are selected. Also it's actually a subset of ES
   1286     * 3.2, since it doesn't require ASTC or advanced blending.
   1287     */
   1288    extensions->ARB_ES3_2_compatibility =
   1289       extensions->ARB_ES3_1_compatibility &&
   1290       extensions->KHR_robustness &&
   1291       extensions->ARB_copy_image &&
   1292       extensions->ARB_draw_buffers_blend &&
   1293       extensions->ARB_draw_elements_base_vertex &&
   1294       extensions->OES_geometry_shader &&
   1295       extensions->ARB_gpu_shader5 &&
   1296       extensions->ARB_sample_shading &&
   1297       extensions->ARB_tessellation_shader &&
   1298       extensions->ARB_texture_border_clamp &&
   1299       extensions->OES_texture_buffer &&
   1300       extensions->ARB_texture_cube_map_array &&
   1301       extensions->ARB_texture_stencil8 &&
   1302       extensions->ARB_texture_multisample;
   1303 }
   1304