st_extensions.c revision 5257a6dbc65d742e6d0fcf4278a4157b2f39fdf7
1c6499a741c99394e81d1d86ffd066f3d9749875cBrian/**************************************************************************
2c6499a741c99394e81d1d86ffd066f3d9749875cBrian *
3c6499a741c99394e81d1d86ffd066f3d9749875cBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4fd2492d24447e461f36982da268caf0317885967Roland Scheidegger * Copyright (c) 2008 VMware, Inc.
5c6499a741c99394e81d1d86ffd066f3d9749875cBrian * All Rights Reserved.
6c6499a741c99394e81d1d86ffd066f3d9749875cBrian *
7c6499a741c99394e81d1d86ffd066f3d9749875cBrian * Permission is hereby granted, free of charge, to any person obtaining a
8c6499a741c99394e81d1d86ffd066f3d9749875cBrian * copy of this software and associated documentation files (the
9c6499a741c99394e81d1d86ffd066f3d9749875cBrian * "Software"), to deal in the Software without restriction, including
10c6499a741c99394e81d1d86ffd066f3d9749875cBrian * without limitation the rights to use, copy, modify, merge, publish,
11c6499a741c99394e81d1d86ffd066f3d9749875cBrian * distribute, sub license, and/or sell copies of the Software, and to
12c6499a741c99394e81d1d86ffd066f3d9749875cBrian * permit persons to whom the Software is furnished to do so, subject to
13c6499a741c99394e81d1d86ffd066f3d9749875cBrian * the following conditions:
14c6499a741c99394e81d1d86ffd066f3d9749875cBrian *
15c6499a741c99394e81d1d86ffd066f3d9749875cBrian * The above copyright notice and this permission notice (including the
16c6499a741c99394e81d1d86ffd066f3d9749875cBrian * next paragraph) shall be included in all copies or substantial portions
17c6499a741c99394e81d1d86ffd066f3d9749875cBrian * of the Software.
18c6499a741c99394e81d1d86ffd066f3d9749875cBrian *
19c6499a741c99394e81d1d86ffd066f3d9749875cBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20c6499a741c99394e81d1d86ffd066f3d9749875cBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21c6499a741c99394e81d1d86ffd066f3d9749875cBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22c6499a741c99394e81d1d86ffd066f3d9749875cBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23c6499a741c99394e81d1d86ffd066f3d9749875cBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24c6499a741c99394e81d1d86ffd066f3d9749875cBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25c6499a741c99394e81d1d86ffd066f3d9749875cBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26c6499a741c99394e81d1d86ffd066f3d9749875cBrian *
27c6499a741c99394e81d1d86ffd066f3d9749875cBrian **************************************************************************/
28c6499a741c99394e81d1d86ffd066f3d9749875cBrian
29c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "main/imports.h"
30c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "main/context.h"
31c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "main/macros.h"
32edc09358f72cd48cb2315daf23c82e7646aeaea3Vinson Lee#include "main/mfeatures.h"
33c6499a741c99394e81d1d86ffd066f3d9749875cBrian
34c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "pipe/p_context.h"
35c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "pipe/p_defines.h"
368383f798b41df9a305e0a33afe8afa028d5d5dfbBrian#include "pipe/p_screen.h"
37c6499a741c99394e81d1d86ffd066f3d9749875cBrian
38c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "st_context.h"
39c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "st_extensions.h"
40c6499a741c99394e81d1d86ffd066f3d9749875cBrian
41c6499a741c99394e81d1d86ffd066f3d9749875cBrian
4254507125e735ffa595e252282eaabf38095c21e1Alan Hourihanestatic int _min(int a, int b)
43e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian{
44e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   return (a < b) ? a : b;
45e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian}
46e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian
4718ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonsecastatic float _maxf(float a, float b)
4844254b92480115e5c8a2d5cf78f99195c03701ebBrian{
4944254b92480115e5c8a2d5cf78f99195c03701ebBrian   return (a > b) ? a : b;
5044254b92480115e5c8a2d5cf78f99195c03701ebBrian}
5144254b92480115e5c8a2d5cf78f99195c03701ebBrian
5254507125e735ffa595e252282eaabf38095c21e1Alan Hourihanestatic int _clamp(int a, int min, int max)
53c6499a741c99394e81d1d86ffd066f3d9749875cBrian{
54e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   if (a < min)
55e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian      return min;
56e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   else if (a > max)
57e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian      return max;
58e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   else
59e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian      return a;
60c6499a741c99394e81d1d86ffd066f3d9749875cBrian}
61c6499a741c99394e81d1d86ffd066f3d9749875cBrian
62c6499a741c99394e81d1d86ffd066f3d9749875cBrian
63e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian/**
64e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian * Query driver to get implementation limits.
65e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian * Note that we have to limit/clamp against Mesa's internal limits too.
66e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian */
67c6499a741c99394e81d1d86ffd066f3d9749875cBrianvoid st_init_limits(struct st_context *st)
68c6499a741c99394e81d1d86ffd066f3d9749875cBrian{
698383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   struct pipe_screen *screen = st->pipe->screen;
70e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   struct gl_constants *c = &st->ctx->Const;
71c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul   gl_shader_type sh;
72e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian
73e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   c->MaxTextureLevels
7454507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
75e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian            MAX_TEXTURE_LEVELS);
76c6499a741c99394e81d1d86ffd066f3d9749875cBrian
77e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   c->Max3DTextureLevels
7854507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS),
79e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian            MAX_3D_TEXTURE_LEVELS);
80c6499a741c99394e81d1d86ffd066f3d9749875cBrian
81e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   c->MaxCubeTextureLevels
8254507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS),
83e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian            MAX_CUBE_TEXTURE_LEVELS);
84c6499a741c99394e81d1d86ffd066f3d9749875cBrian
85e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   c->MaxTextureRectSize
8654507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _min(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE);
87c6499a741c99394e81d1d86ffd066f3d9749875cBrian
88d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul   c->MaxTextureImageUnits
8954507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS),
90e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian            MAX_TEXTURE_IMAGE_UNITS);
91c6499a741c99394e81d1d86ffd066f3d9749875cBrian
921d9360b67829a37b369e32c894183db1cecf827bBrian   c->MaxVertexTextureImageUnits
9315a3fdb63e0511860ee84c168b84dd0bcfca6094Brian Paul      = _min(screen->get_param(screen, PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS),
9415a3fdb63e0511860ee84c168b84dd0bcfca6094Brian Paul             MAX_VERTEX_TEXTURE_IMAGE_UNITS);
951d9360b67829a37b369e32c894183db1cecf827bBrian
96853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol   c->MaxCombinedTextureImageUnits
97853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol      = _min(screen->get_param(screen, PIPE_CAP_MAX_COMBINED_SAMPLERS),
98853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol             MAX_COMBINED_TEXTURE_IMAGE_UNITS);
99853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol
1006cbaa2226fa1237b9f314828fbbc1c8db6509de8Brian Paul   c->MaxTextureCoordUnits
1016cbaa2226fa1237b9f314828fbbc1c8db6509de8Brian Paul      = _min(c->MaxTextureImageUnits, MAX_TEXTURE_COORD_UNITS);
102d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul
1036cbaa2226fa1237b9f314828fbbc1c8db6509de8Brian Paul   c->MaxTextureUnits = _min(c->MaxTextureImageUnits, c->MaxTextureCoordUnits);
104d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul
105e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   c->MaxDrawBuffers
10654507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _clamp(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
107e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian              1, MAX_DRAW_BUFFERS);
10844254b92480115e5c8a2d5cf78f99195c03701ebBrian
10944254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxLineWidth
11018ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonseca      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH));
11144254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxLineWidthAA
11218ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonseca      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH_AA));
11344254b92480115e5c8a2d5cf78f99195c03701ebBrian
11444254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxPointSize
11518ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonseca      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH));
11644254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxPointSizeAA
11718ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonseca      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH_AA));
118dd7be07c9685012b3e9fdfbaa13dc638abf6a9d1Roland Scheidegger   /* called after _mesa_create_context/_mesa_init_point, fix default user
119dd7be07c9685012b3e9fdfbaa13dc638abf6a9d1Roland Scheidegger    * settable max point size up
120dd7be07c9685012b3e9fdfbaa13dc638abf6a9d1Roland Scheidegger    */
121dd7be07c9685012b3e9fdfbaa13dc638abf6a9d1Roland Scheidegger   st->ctx->Point.MaxSize = MAX2(c->MaxPointSize, c->MaxPointSizeAA);
1222c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger   /* these are not queryable. Note that GL basically mandates a 1.0 minimum
1232c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger    * for non-aa sizes, but we can go down to 0.0 for aa points.
1242c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger    */
1252c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger   c->MinPointSize = 1.0f;
1262c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger   c->MinPointSizeAA = 0.0f;
12744254b92480115e5c8a2d5cf78f99195c03701ebBrian
12844254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxTextureMaxAnisotropy
12918ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonseca      = _maxf(2.0f, screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_ANISOTROPY));
13044254b92480115e5c8a2d5cf78f99195c03701ebBrian
13144254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxTextureLodBias
1328383f798b41df9a305e0a33afe8afa028d5d5dfbBrian      = screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_LOD_BIAS);
1334650b35846e8e87fb0d74573a5f66452bb449b4bBrian
134b54225ccd6d3bc1b678e27c2f00ebddf5bf1046dBrian   c->MaxDrawBuffers
135b54225ccd6d3bc1b678e27c2f00ebddf5bf1046dBrian      = CLAMP(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
136b54225ccd6d3bc1b678e27c2f00ebddf5bf1046dBrian              1, MAX_DRAW_BUFFERS);
13702edc8da36d6e01635bcfbb5073f0f718de96c37Brian Paul
138dd8f5c33f3a54212a0d7d072cd75b321f5abcda8Corbin Simpson   /* Quads always follow GL provoking rules. */
139dd8f5c33f3a54212a0d7d072cd75b321f5abcda8Corbin Simpson   c->QuadsFollowProvokingVertexConvention = GL_FALSE;
140dad962bafe8ffd7fdb35c28cfb8bbd5a297c8083José Fonseca
141c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul   for (sh = 0; sh < MESA_SHADER_TYPES; ++sh) {
142c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      struct gl_shader_compiler_options *options =
143c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul         &st->ctx->ShaderCompilerOptions[sh];
1449f7f7b3ff87e756a5d42eb4c6a953ec33e128f89Vinson Lee      struct gl_program_constants *pc;
145c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul
146c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      switch (sh) {
147a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_FRAGMENT:
148a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         pc = &c->FragmentProgram;
149a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         break;
150a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_VERTEX:
151a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         pc = &c->VertexProgram;
152a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         break;
153a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_GEOMETRY:
154a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         pc = &c->GeometryProgram;
155a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         break;
1569f7f7b3ff87e756a5d42eb4c6a953ec33e128f89Vinson Lee      default:
1579f7f7b3ff87e756a5d42eb4c6a953ec33e128f89Vinson Lee         assert(0);
1589f7f7b3ff87e756a5d42eb4c6a953ec33e128f89Vinson Lee         continue;
159a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      }
160a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri
161c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      pc->MaxNativeInstructions    = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS);
162c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      pc->MaxNativeAluInstructions = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS);
163c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      pc->MaxNativeTexInstructions = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS);
164c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      pc->MaxNativeTexIndirections = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS);
165c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      pc->MaxNativeAttribs         = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INPUTS);
166c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      pc->MaxNativeTemps           = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEMPS);
167c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      pc->MaxNativeAddressRegs     = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_ADDRS);
168c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      pc->MaxNativeParameters      = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONSTS);
169e7c74a7dfab789496761226fe62a08f2d9fea5c7Marek Olšák      pc->MaxUniformComponents     = 4 * MIN2(pc->MaxNativeParameters, MAX_UNIFORMS);
170a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri
171fbc7c9b7a9d9df979ea82136d2b74121e5d4346eLuca Barbieri      options->EmitNoNoise = TRUE;
172fbc7c9b7a9d9df979ea82136d2b74121e5d4346eLuca Barbieri
173b37459388b22fb6a831d45bc08e51cdb7b9c610cLuca Barbieri      /* TODO: make these more fine-grained if anyone needs it */
174c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      options->EmitNoIfs = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
175c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      options->EmitNoLoops = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
176c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      options->EmitNoFunctions = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES);
177c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      options->EmitNoMainReturn = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES);
178b37459388b22fb6a831d45bc08e51cdb7b9c610cLuca Barbieri
179c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      options->EmitNoCont = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED);
180b37459388b22fb6a831d45bc08e51cdb7b9c610cLuca Barbieri
181c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      options->EmitNoIndirectInput = !screen->get_shader_param(screen, sh,
182cbfdf262ccf8b573f1fa4c0065a8eb1fb87d93daMarek Olšák                                        PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR);
183c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      options->EmitNoIndirectOutput = !screen->get_shader_param(screen, sh,
184cbfdf262ccf8b573f1fa4c0065a8eb1fb87d93daMarek Olšák                                        PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR);
185c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      options->EmitNoIndirectTemp = !screen->get_shader_param(screen, sh,
186cbfdf262ccf8b573f1fa4c0065a8eb1fb87d93daMarek Olšák                                        PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR);
187c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul      options->EmitNoIndirectUniform = !screen->get_shader_param(screen, sh,
188cbfdf262ccf8b573f1fa4c0065a8eb1fb87d93daMarek Olšák                                        PIPE_SHADER_CAP_INDIRECT_CONST_ADDR);
189cbfdf262ccf8b573f1fa4c0065a8eb1fb87d93daMarek Olšák
190b37459388b22fb6a831d45bc08e51cdb7b9c610cLuca Barbieri      if(options->EmitNoLoops)
191c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul         options->MaxUnrollIterations = MIN2(screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS), 65536);
192a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   }
193007bac83312b29061753e625edfd45ccab9ecc9cMarek Olšák
194007bac83312b29061753e625edfd45ccab9ecc9cMarek Olšák   /* PIPE_CAP_MAX_FS_INPUTS specifies the number of COLORn + GENERICn inputs
195007bac83312b29061753e625edfd45ccab9ecc9cMarek Olšák    * and is set in MaxNativeAttribs. It's always 2 colors + N generic
196007bac83312b29061753e625edfd45ccab9ecc9cMarek Olšák    * attributes. The GLSL compiler never uses COLORn for varyings, so we
197007bac83312b29061753e625edfd45ccab9ecc9cMarek Olšák    * subtract the 2 colors to get the maximum number of varyings (generic
198007bac83312b29061753e625edfd45ccab9ecc9cMarek Olšák    * attributes) supported by a driver. */
199a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   c->MaxVarying = screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_INPUTS) - 2;
200e746a6bb9a6c9f797d1b40ed22b2f296f8fa5aacBrian Paul   c->MaxVarying = MIN2(c->MaxVarying, MAX_VARYING);
201e7087175f8a04f777403366fb34b58edd00f4d60Brian Paul
202e7087175f8a04f777403366fb34b58edd00f4d60Brian Paul   /* XXX we'll need a better query here someday */
203e7087175f8a04f777403366fb34b58edd00f4d60Brian Paul   if (screen->get_param(screen, PIPE_CAP_GLSL)) {
204e7087175f8a04f777403366fb34b58edd00f4d60Brian Paul      c->GLSLVersion = 120;
205e7087175f8a04f777403366fb34b58edd00f4d60Brian Paul   }
206c6499a741c99394e81d1d86ffd066f3d9749875cBrian}
207c6499a741c99394e81d1d86ffd066f3d9749875cBrian
208c6499a741c99394e81d1d86ffd066f3d9749875cBrian
209c6499a741c99394e81d1d86ffd066f3d9749875cBrian/**
2106b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * Use pipe_screen::get_param() to query PIPE_CAP_ values to determine
2116b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * which GL extensions are supported.
2126b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * Quite a few extensions are always supported because they are standard
2136b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * features or can be built on top of other gallium features.
2146b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * Some fine tuning may still be needed.
215c6499a741c99394e81d1d86ffd066f3d9749875cBrian */
216c6499a741c99394e81d1d86ffd066f3d9749875cBrianvoid st_init_extensions(struct st_context *st)
217c6499a741c99394e81d1d86ffd066f3d9749875cBrian{
2188383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   struct pipe_screen *screen = st->pipe->screen;
219f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = st->ctx;
220c6499a741c99394e81d1d86ffd066f3d9749875cBrian
221c6499a741c99394e81d1d86ffd066f3d9749875cBrian   /*
222c6499a741c99394e81d1d86ffd066f3d9749875cBrian    * Extensions that are supported by all Gallium drivers:
223c6499a741c99394e81d1d86ffd066f3d9749875cBrian    */
224dd174ea2155ded567494448ffc5de7e022eabc5aBrian Paul   ctx->Extensions.ARB_copy_buffer = GL_TRUE;
2255ed6627ceb82845a7b578419b3cd4168ad0106d3Marek Olšák   ctx->Extensions.ARB_draw_elements_base_vertex = GL_TRUE;
22662c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri   ctx->Extensions.ARB_fragment_coord_conventions = GL_TRUE;
227cb0ea416bda30a7f7bced78e1edde806fbcb7577Brian Paul   ctx->Extensions.ARB_fragment_program = GL_TRUE;
22873e8a2738743035e1347571ba630747d2ec33a2dMarek Olšák   ctx->Extensions.ARB_half_float_pixel = GL_TRUE;
2298d0f72e8f901e12841408b95963d43684fb6ce48Brian Paul   ctx->Extensions.ARB_map_buffer_range = GL_TRUE;
2306b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   ctx->Extensions.ARB_multisample = GL_TRUE;
2316c4447e6a8ecfcfb094ab2ad8b7371dfa2b7d7bbBrian   ctx->Extensions.ARB_texture_border_clamp = GL_TRUE; /* XXX temp */
2326b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   ctx->Extensions.ARB_texture_compression = GL_TRUE;
233c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_texture_cube_map = GL_TRUE;
234c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_texture_env_combine = GL_TRUE;
235c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_texture_env_crossbar = GL_TRUE;
236c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_texture_env_dot3 = GL_TRUE;
23732220c48ad8da199ed6a3d419183fd12bb4fc83eBrian Paul   ctx->Extensions.ARB_vertex_array_object = GL_TRUE;
238c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_vertex_buffer_object = GL_TRUE;
2392a795ad5227f7b311c2b32afb77ba11068733283Brian Paul   ctx->Extensions.ARB_vertex_program = GL_TRUE;
240a0ae2ca033ec2024da1e01d1c11c0437837c031bMarek Olšák   ctx->Extensions.ARB_window_pos = GL_TRUE;
241c6499a741c99394e81d1d86ffd066f3d9749875cBrian
242c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_blend_color = GL_TRUE;
243c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_blend_func_separate = GL_TRUE;
244c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_blend_logic_op = GL_TRUE;
245c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_blend_minmax = GL_TRUE;
246c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_blend_subtract = GL_TRUE;
2470df877a0ee68359d106ba84e3dd3b7c42ae20d5aBrian   ctx->Extensions.EXT_framebuffer_blit = GL_TRUE;
248c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_framebuffer_object = GL_TRUE;
249cd232ae22f9590976d0fabd1eb0e75c4d58d96bfMarek Olšák   ctx->Extensions.EXT_framebuffer_multisample = GL_TRUE;
250c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_fog_coord = GL_TRUE;
25150074ecd3a360d3479d789624a268847a644add8Marek Olšák   ctx->Extensions.EXT_gpu_program_parameters = GL_TRUE;
252c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_multi_draw_arrays = GL_TRUE;
253c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_pixel_buffer_object = GL_TRUE;
254c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_point_parameters = GL_TRUE;
255ded8eb25ef149cf7d2cde4169d36f528cf74d22dBrian Paul   ctx->Extensions.EXT_provoking_vertex = GL_TRUE;
256c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_secondary_color = GL_TRUE;
257c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_stencil_wrap = GL_TRUE;
258c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_texture_env_add = GL_TRUE;
259c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_texture_env_combine = GL_TRUE;
260c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_texture_env_dot3 = GL_TRUE;
261c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_texture_lod_bias = GL_TRUE;
2625b27b4ad37bd992d2d3a6fd9d407277113544f30Brian Paul   ctx->Extensions.EXT_vertex_array_bgra = GL_TRUE;
263b0669837808dee576dd05c8c335ca78264dd8e80Benjamin Franzke   if (ctx->API == API_OPENGLES || ctx->API == API_OPENGLES2)
264b0669837808dee576dd05c8c335ca78264dd8e80Benjamin Franzke	   ctx->Extensions.EXT_texture_format_BGRA8888 = GL_TRUE;
265c6499a741c99394e81d1d86ffd066f3d9749875cBrian
266a892acef982bd17df81ae16131381a558208c112Brian Paul   ctx->Extensions.APPLE_vertex_array_object = GL_TRUE;
267a892acef982bd17df81ae16131381a558208c112Brian Paul
26831a74a6df77daea9084c34b86f217f23a55e6b91Marek Olšák   ctx->Extensions.ATI_texture_env_combine3 = GL_TRUE;
26931a74a6df77daea9084c34b86f217f23a55e6b91Marek Olšák
270a0ae2ca033ec2024da1e01d1c11c0437837c031bMarek Olšák   ctx->Extensions.MESA_pack_invert = GL_TRUE;
271a0ae2ca033ec2024da1e01d1c11c0437837c031bMarek Olšák
272c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.NV_blend_square = GL_TRUE;
273c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.NV_texgen_reflection = GL_TRUE;
274d0b0df380ac6a9b421dc63531a180b3fd3017621Brian Paul   ctx->Extensions.NV_texture_env_combine4 = GL_TRUE;
27540adcd611fe6939895c83e6ae945348437b3e7adMarek Olšák   ctx->Extensions.NV_texture_rectangle = GL_TRUE;
276ed1c69710c5046a80a86a9e8b51a1cb15b1b92ebRoland Scheidegger#if 0
277ed1c69710c5046a80a86a9e8b51a1cb15b1b92ebRoland Scheidegger   /* possibly could support the following two */
278a0ae2ca033ec2024da1e01d1c11c0437837c031bMarek Olšák   ctx->Extensions.NV_vertex_program = GL_TRUE;
279a0ae2ca033ec2024da1e01d1c11c0437837c031bMarek Olšák   ctx->Extensions.NV_vertex_program1_1 = GL_TRUE;
280ed1c69710c5046a80a86a9e8b51a1cb15b1b92ebRoland Scheidegger#endif
281c6499a741c99394e81d1d86ffd066f3d9749875cBrian
2822002e4d06e2627241cd4af88f65b54d2101ef151Chia-I Wu#if FEATURE_OES_EGL_image
2832002e4d06e2627241cd4af88f65b54d2101ef151Chia-I Wu   ctx->Extensions.OES_EGL_image = GL_TRUE;
2842002e4d06e2627241cd4af88f65b54d2101ef151Chia-I Wu#endif
28534064756a5e2c8952c9de26eaebafddabd562540Chia-I Wu#if FEATURE_OES_draw_texture
28634064756a5e2c8952c9de26eaebafddabd562540Chia-I Wu   ctx->Extensions.OES_draw_texture = GL_TRUE;
28734064756a5e2c8952c9de26eaebafddabd562540Chia-I Wu#endif
28834064756a5e2c8952c9de26eaebafddabd562540Chia-I Wu
2896b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   ctx->Extensions.SGIS_generate_mipmap = GL_TRUE;
290c6499a741c99394e81d1d86ffd066f3d9749875cBrian
291c6499a741c99394e81d1d86ffd066f3d9749875cBrian   /*
292c6499a741c99394e81d1d86ffd066f3d9749875cBrian    * Extensions that depend on the driver/hardware:
293c6499a741c99394e81d1d86ffd066f3d9749875cBrian    */
2948383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS) > 0) {
295c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_draw_buffers = GL_TRUE;
296c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
297c6499a741c99394e81d1d86ffd066f3d9749875cBrian
29842ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   if (screen->get_param(screen, PIPE_CAP_TEXTURE_SWIZZLE) > 0) {
29942ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie      ctx->Extensions.EXT_texture_swizzle = GL_TRUE;
30042ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie   }
30142ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie
3028383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_GLSL)) {
303c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_fragment_shader = GL_TRUE;
304c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_vertex_shader = GL_TRUE;
305c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_shader_objects = GL_TRUE;
306c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_shading_language_100 = GL_TRUE;
307e40a58b7f8ef8079d216932aedf321f7afdf3f3fMarek Olšák      ctx->Extensions.ARB_explicit_attrib_location = GL_TRUE;
308e40a58b7f8ef8079d216932aedf321f7afdf3f3fMarek Olšák      ctx->Extensions.EXT_separate_shader_objects = GL_TRUE;
309c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
310c6499a741c99394e81d1d86ffd066f3d9749875cBrian
311be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   if (screen->get_param(screen, PIPE_CAP_TEXTURE_MIRROR_REPEAT) > 0) {
312be66a8f43172327e3cdde27281e40377cacbb121Brian Paul      ctx->Extensions.ARB_texture_mirrored_repeat = GL_TRUE;
313be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   }
314be66a8f43172327e3cdde27281e40377cacbb121Brian Paul
31554cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin   if (screen->get_param(screen, PIPE_CAP_BLEND_EQUATION_SEPARATE)) {
31654cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin      ctx->Extensions.EXT_blend_equation_separate = GL_TRUE;
31754cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin   }
31854cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin
319be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   if (screen->get_param(screen, PIPE_CAP_TEXTURE_MIRROR_CLAMP) > 0) {
320be66a8f43172327e3cdde27281e40377cacbb121Brian Paul      ctx->Extensions.EXT_texture_mirror_clamp = GL_TRUE;
321116c863892bdb55d1f82c4569b27d42bd9826798Marek Olšák      ctx->Extensions.ATI_texture_mirror_once = GL_TRUE;
322be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   }
323be66a8f43172327e3cdde27281e40377cacbb121Brian Paul
3248383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) {
325c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_texture_non_power_of_two = GL_TRUE;
326c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
327c6499a741c99394e81d1d86ffd066f3d9749875cBrian
3288383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS) > 1) {
329c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_multitexture = GL_TRUE;
330c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
331c6499a741c99394e81d1d86ffd066f3d9749875cBrian
3328383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_TWO_SIDED_STENCIL)) {
333c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ATI_separate_stencil = GL_TRUE;
3342b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul      ctx->Extensions.EXT_stencil_two_side = GL_TRUE;
335c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
336c6499a741c99394e81d1d86ffd066f3d9749875cBrian
3378383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_ANISOTROPIC_FILTER)) {
338c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.EXT_texture_filter_anisotropic = GL_TRUE;
339c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
340c6499a741c99394e81d1d86ffd066f3d9749875cBrian
3418383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_POINT_SPRITE)) {
342c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_point_sprite = GL_TRUE;
343ed6125fe9b2a806103cc58a60027aa2aba64dd2fBrian Paul      /* GL_NV_point_sprite is not supported by gallium because we don't
344ed6125fe9b2a806103cc58a60027aa2aba64dd2fBrian Paul       * support the GL_POINT_SPRITE_R_MODE_NV option.
345ed6125fe9b2a806103cc58a60027aa2aba64dd2fBrian Paul       */
346c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
347c6499a741c99394e81d1d86ffd066f3d9749875cBrian
3488383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY)) {
349c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_occlusion_query = GL_TRUE;
350ff7aa554a11863de2c4c0b4b6d1ec7b07c819739Dave Airlie      ctx->Extensions.ARB_occlusion_query2 = GL_TRUE;
351c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
352cdbd5f4203391ee7eb12911bc86fea34dc61c957Mathias Fröhlich   if (screen->get_param(screen, PIPE_CAP_TIMER_QUERY)) {
353cdbd5f4203391ee7eb12911bc86fea34dc61c957Mathias Fröhlich     ctx->Extensions.EXT_timer_query = GL_TRUE;
354cdbd5f4203391ee7eb12911bc86fea34dc61c957Mathias Fröhlich   }
355c6499a741c99394e81d1d86ffd066f3d9749875cBrian
3568383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_TEXTURE_SHADOW_MAP)) {
357c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_depth_texture = GL_TRUE;
358aeffba454f8f5bc63bf97c1a0925cfef51af13c2Marek Olšák      ctx->Extensions.ARB_fragment_program_shadow = GL_TRUE;
359c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_shadow = GL_TRUE;
3608ce6d6b97e6e90451e7372fe3d94e7e31b0ea569Brian      ctx->Extensions.EXT_shadow_funcs = GL_TRUE;
361c6499a741c99394e81d1d86ffd066f3d9749875cBrian      /*ctx->Extensions.ARB_shadow_ambient = GL_TRUE;*/
362c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
363c6499a741c99394e81d1d86ffd066f3d9749875cBrian
3646c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul   /* GL_EXT_packed_depth_stencil requires both the ability to render to
3656c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul    * a depth/stencil buffer and texture from depth/stencil source.
3666c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul    */
3676fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger   if (screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
368127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger                                   PIPE_TEXTURE_2D, 0,
369287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                   PIPE_BIND_DEPTH_STENCIL, 0) &&
3706fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger       screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
371127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger                                   PIPE_TEXTURE_2D, 0,
372287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                   PIPE_BIND_SAMPLER_VIEW, 0)) {
3736c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul      ctx->Extensions.EXT_packed_depth_stencil = GL_TRUE;
3746c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul   }
3756fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger   else if (screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
376127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger                                        PIPE_TEXTURE_2D, 0,
377287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                        PIPE_BIND_DEPTH_STENCIL, 0) &&
3786fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger            screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
379127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger                                        PIPE_TEXTURE_2D, 0,
380287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                        PIPE_BIND_SAMPLER_VIEW, 0)) {
3816c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul      ctx->Extensions.EXT_packed_depth_stencil = GL_TRUE;
3826c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul   }
3836c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul
3846b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   /* sRGB support */
3857d1a79a04eb1266649956f6924f25071d85e20feJosé Fonseca   if (screen->is_format_supported(screen, PIPE_FORMAT_A8B8G8R8_SRGB,
386127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger                                   PIPE_TEXTURE_2D, 0,
387287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                   PIPE_BIND_SAMPLER_VIEW, 0) ||
3887d1a79a04eb1266649956f6924f25071d85e20feJosé Fonseca      screen->is_format_supported(screen, PIPE_FORMAT_B8G8R8A8_SRGB,
389127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger                                   PIPE_TEXTURE_2D, 0,
390287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                   PIPE_BIND_SAMPLER_VIEW, 0)) {
39113540d38d9d4ac4f71533ce239f0d9a2b950e6dbBrian Paul      ctx->Extensions.EXT_texture_sRGB = GL_TRUE;
392527bf67682db70091abf9c5395433bf9b8b98aabDave Airlie      ctx->Extensions.EXT_texture_sRGB_decode = GL_TRUE;
39321b0996dfcbe62c55dd31cc316cd47f2b8531d2eDave Airlie      if (screen->is_format_supported(screen, PIPE_FORMAT_A8B8G8R8_SRGB,
39421b0996dfcbe62c55dd31cc316cd47f2b8531d2eDave Airlie                                   PIPE_TEXTURE_2D, 0,
39521b0996dfcbe62c55dd31cc316cd47f2b8531d2eDave Airlie                                   PIPE_BIND_RENDER_TARGET, 0) ||
39621b0996dfcbe62c55dd31cc316cd47f2b8531d2eDave Airlie          screen->is_format_supported(screen, PIPE_FORMAT_B8G8R8A8_SRGB,
39721b0996dfcbe62c55dd31cc316cd47f2b8531d2eDave Airlie                                   PIPE_TEXTURE_2D, 0,
39821b0996dfcbe62c55dd31cc316cd47f2b8531d2eDave Airlie                                   PIPE_BIND_RENDER_TARGET, 0)) {
39921b0996dfcbe62c55dd31cc316cd47f2b8531d2eDave Airlie         ctx->Extensions.EXT_framebuffer_sRGB = GL_TRUE;
40021b0996dfcbe62c55dd31cc316cd47f2b8531d2eDave Airlie         ctx->Const.sRGBCapable = GL_TRUE;
40121b0996dfcbe62c55dd31cc316cd47f2b8531d2eDave Airlie      }
40213540d38d9d4ac4f71533ce239f0d9a2b950e6dbBrian Paul   }
4033600e7402c2a1824c8e5e2cc6ea189bcdeb4db6bBrian Paul
40471a079fb4ecbd17703ac9b5e6d5ef622fd7bc50fDave Airlie   if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM,
40571a079fb4ecbd17703ac9b5e6d5ef622fd7bc50fDave Airlie                                   PIPE_TEXTURE_2D, 0,
40671a079fb4ecbd17703ac9b5e6d5ef622fd7bc50fDave Airlie                                   PIPE_BIND_SAMPLER_VIEW, 0)) {
40771a079fb4ecbd17703ac9b5e6d5ef622fd7bc50fDave Airlie      ctx->Extensions.ARB_texture_rg = GL_TRUE;
40871a079fb4ecbd17703ac9b5e6d5ef622fd7bc50fDave Airlie   }
40971a079fb4ecbd17703ac9b5e6d5ef622fd7bc50fDave Airlie
4106b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   /* s3tc support */
4113600e7402c2a1824c8e5e2cc6ea189bcdeb4db6bBrian Paul   if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
412127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger                                   PIPE_TEXTURE_2D, 0,
413287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                   PIPE_BIND_SAMPLER_VIEW, 0) &&
4142a2b156ea5ec40110b9e66ba9ccc7d6f3a314723José Fonseca       ctx->Mesa_DXTn) {
4153600e7402c2a1824c8e5e2cc6ea189bcdeb4db6bBrian Paul      ctx->Extensions.EXT_texture_compression_s3tc = GL_TRUE;
416577a598dc905d435a31422bb6135ee9d4352f6b6José Fonseca      ctx->Extensions.S3_s3tc = GL_TRUE;
4173600e7402c2a1824c8e5e2cc6ea189bcdeb4db6bBrian Paul   }
4186b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul
41983ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie   if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_UNORM,
42083ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie                                   PIPE_TEXTURE_2D, 0,
42183ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie                                   PIPE_BIND_SAMPLER_VIEW, 0) &&
42283ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie       screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_SNORM,
42383ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie				   PIPE_TEXTURE_2D, 0,
42483ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie                                   PIPE_BIND_SAMPLER_VIEW, 0) &&
42583ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie       screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_UNORM,
42683ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie                                   PIPE_TEXTURE_2D, 0,
42783ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie                                   PIPE_BIND_SAMPLER_VIEW, 0) &&
42883ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie       screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_SNORM,
42983ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie                                   PIPE_TEXTURE_2D, 0,
43083ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie                                   PIPE_BIND_SAMPLER_VIEW, 0)
43183ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie       ) {
43283ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie     ctx->Extensions.ARB_texture_compression_rgtc = GL_TRUE;
43383ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie   }
43483ebc01c1dd1cd8a960a2a61fc7203f8312644d5Dave Airlie
435384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák   if (screen->is_format_supported(screen, PIPE_FORMAT_LATC1_UNORM,
436384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák                                   PIPE_TEXTURE_2D, 0,
437384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák                                   PIPE_BIND_SAMPLER_VIEW, 0) &&
438384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák       screen->is_format_supported(screen, PIPE_FORMAT_LATC1_SNORM,
439384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák                                   PIPE_TEXTURE_2D, 0,
440384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák                                   PIPE_BIND_SAMPLER_VIEW, 0) &&
441384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák       screen->is_format_supported(screen, PIPE_FORMAT_LATC2_UNORM,
442384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák                                   PIPE_TEXTURE_2D, 0,
443384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák                                   PIPE_BIND_SAMPLER_VIEW, 0) &&
444384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák       screen->is_format_supported(screen, PIPE_FORMAT_LATC2_SNORM,
445384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák                                   PIPE_TEXTURE_2D, 0,
446384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák                                   PIPE_BIND_SAMPLER_VIEW, 0)) {
447384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák      ctx->Extensions.EXT_texture_compression_latc = GL_TRUE;
448384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák   }
449384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák
450384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák   if (screen->is_format_supported(screen, PIPE_FORMAT_LATC2_UNORM,
451384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák                                   PIPE_TEXTURE_2D, 0,
452384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák                                   PIPE_BIND_SAMPLER_VIEW, 0)) {
453384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák      ctx->Extensions.ATI_texture_compression_3dc = GL_TRUE;
454384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák   }
455384845f335d1fbe6766673b988b23a003e104e7bMarek Olšák
4566b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   /* ycbcr support */
4577d1a79a04eb1266649956f6924f25071d85e20feJosé Fonseca   if (screen->is_format_supported(screen, PIPE_FORMAT_UYVY,
458127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger                                   PIPE_TEXTURE_2D, 0,
459287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                   PIPE_BIND_SAMPLER_VIEW, 0) ||
4607d1a79a04eb1266649956f6924f25071d85e20feJosé Fonseca       screen->is_format_supported(screen, PIPE_FORMAT_YUYV,
461127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger                                   PIPE_TEXTURE_2D, 0,
462287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                   PIPE_BIND_SAMPLER_VIEW, 0)) {
4631307eebfa07e3440554eb2871e5dbd94e98ed7a8Brian      ctx->Extensions.MESA_ycbcr_texture = GL_TRUE;
4641307eebfa07e3440554eb2871e5dbd94e98ed7a8Brian   }
4655c06c52116890342c3988325760a73fd84e2be30Brian Paul
4669b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul   /* GL_EXT_texture_array */
4679b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul   if (screen->get_param(screen, PIPE_CAP_ARRAY_TEXTURES)) {
4689b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul      ctx->Extensions.EXT_texture_array = GL_TRUE;
4699b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul      ctx->Extensions.MESA_texture_array = GL_TRUE;
4709b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul   }
4719b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul
4725c06c52116890342c3988325760a73fd84e2be30Brian Paul   /* GL_ARB_framebuffer_object */
4735c06c52116890342c3988325760a73fd84e2be30Brian Paul   if (ctx->Extensions.EXT_packed_depth_stencil) {
4745c06c52116890342c3988325760a73fd84e2be30Brian Paul      /* we support always support GL_EXT_framebuffer_blit */
4755c06c52116890342c3988325760a73fd84e2be30Brian Paul      ctx->Extensions.ARB_framebuffer_object = GL_TRUE;
4765c06c52116890342c3988325760a73fd84e2be30Brian Paul   }
477c9b558351847133dced0c9daaeb84d57d550afc9Brian Paul
478c9b558351847133dced0c9daaeb84d57d550afc9Brian Paul   if (st->pipe->render_condition) {
479c9b558351847133dced0c9daaeb84d57d550afc9Brian Paul      ctx->Extensions.NV_conditional_render = GL_TRUE;
480c9b558351847133dced0c9daaeb84d57d550afc9Brian Paul   }
4815fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger
4825fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger   if (screen->get_param(screen, PIPE_CAP_INDEP_BLEND_ENABLE)) {
4835fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger      ctx->Extensions.EXT_draw_buffers2 = GL_TRUE;
4845fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger   }
4855fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger
486afeebecd95b43860c8320f18b50863958de4f765Brian Paul   if (screen->get_param(screen, PIPE_CAP_INDEP_BLEND_FUNC)) {
487afeebecd95b43860c8320f18b50863958de4f765Brian Paul      ctx->Extensions.ARB_draw_buffers_blend = GL_TRUE;
488afeebecd95b43860c8320f18b50863958de4f765Brian Paul   }
489afeebecd95b43860c8320f18b50863958de4f765Brian Paul
490f2e05acac931889e0820e1cc5d7ea810048a6b5fMarek Olšák   /* GL_ARB_half_float_vertex */
491f2e05acac931889e0820e1cc5d7ea810048a6b5fMarek Olšák   if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_FLOAT,
492f2e05acac931889e0820e1cc5d7ea810048a6b5fMarek Olšák                                   PIPE_BUFFER, 0,
493f2e05acac931889e0820e1cc5d7ea810048a6b5fMarek Olšák                                   PIPE_BIND_VERTEX_BUFFER, 0)) {
494f2e05acac931889e0820e1cc5d7ea810048a6b5fMarek Olšák      ctx->Extensions.ARB_half_float_vertex = GL_TRUE;
495f2e05acac931889e0820e1cc5d7ea810048a6b5fMarek Olšák   }
496f2e05acac931889e0820e1cc5d7ea810048a6b5fMarek Olšák
497a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   if (screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY, PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) {
498bb7c2691d25b6aaea2663f85a5b6723edbf56938Brian Paul#if 0 /* XXX re-enable when GLSL compiler again supports geometry shaders */
499da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      ctx->Extensions.ARB_geometry_shader4 = GL_TRUE;
500bb7c2691d25b6aaea2663f85a5b6723edbf56938Brian Paul#endif
501da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
502c304869ec02793f2d8bf363d1e3b37c3d121cca7Marek Olšák
503053875a8b193481a7b1c209d9adf9d3d85788884Brian Paul   if (screen->get_param(screen, PIPE_CAP_PRIMITIVE_RESTART)) {
504053875a8b193481a7b1c209d9adf9d3d85788884Brian Paul      ctx->Extensions.NV_primitive_restart = GL_TRUE;
505053875a8b193481a7b1c209d9adf9d3d85788884Brian Paul   }
506053875a8b193481a7b1c209d9adf9d3d85788884Brian Paul
507c304869ec02793f2d8bf363d1e3b37c3d121cca7Marek Olšák   if (screen->get_param(screen, PIPE_CAP_DEPTH_CLAMP)) {
508c304869ec02793f2d8bf363d1e3b37c3d121cca7Marek Olšák      ctx->Extensions.ARB_depth_clamp = GL_TRUE;
509c304869ec02793f2d8bf363d1e3b37c3d121cca7Marek Olšák   }
5105f612f5c006ff006ad1d2b90fbfdcdbee271771eDave Airlie
5115f612f5c006ff006ad1d2b90fbfdcdbee271771eDave Airlie   if (screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT)) {
5125f612f5c006ff006ad1d2b90fbfdcdbee271771eDave Airlie      ctx->Extensions.ARB_shader_stencil_export = GL_TRUE;
5135f612f5c006ff006ad1d2b90fbfdcdbee271771eDave Airlie   }
5149cd277684db5a266b451a719a963556664838d6eBrian Paul
51595c7881ac8240fa369e33db411bbd165d0f61948Marek Olšák   if (screen->get_param(screen, PIPE_CAP_TGSI_INSTANCEID)) {
5169cd277684db5a266b451a719a963556664838d6eBrian Paul      ctx->Extensions.ARB_draw_instanced = GL_TRUE;
51795c7881ac8240fa369e33db411bbd165d0f61948Marek Olšák   }
51895c7881ac8240fa369e33db411bbd165d0f61948Marek Olšák   if (screen->get_param(screen, PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR)) {
519a6860f0913d5d4be0c73da963e84e97fc926225fBrian Paul      ctx->Extensions.ARB_instanced_arrays = GL_TRUE;
5209cd277684db5a266b451a719a963556664838d6eBrian Paul   }
5215257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák
5225257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák   if (screen->fence_finish) {
5235257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák      ctx->Extensions.ARB_sync = GL_TRUE;
5245257a6dbc65d742e6d0fcf4278a4157b2f39fdf7Marek Olšák   }
525c6499a741c99394e81d1d86ffd066f3d9749875cBrian}
526