st_extensions.c revision 6b1b8e4ca1c911105c42154c9e794262d74652e5
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/extensions.h"
32c6499a741c99394e81d1d86ffd066f3d9749875cBrian#include "main/macros.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;
71e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian
72e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   c->MaxTextureLevels
7354507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
74e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian            MAX_TEXTURE_LEVELS);
75c6499a741c99394e81d1d86ffd066f3d9749875cBrian
76e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   c->Max3DTextureLevels
7754507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS),
78e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian            MAX_3D_TEXTURE_LEVELS);
79c6499a741c99394e81d1d86ffd066f3d9749875cBrian
80e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   c->MaxCubeTextureLevels
8154507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS),
82e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian            MAX_CUBE_TEXTURE_LEVELS);
83c6499a741c99394e81d1d86ffd066f3d9749875cBrian
84e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   c->MaxTextureRectSize
8554507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _min(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE);
86c6499a741c99394e81d1d86ffd066f3d9749875cBrian
87d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul   c->MaxTextureImageUnits
8854507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS),
89e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian            MAX_TEXTURE_IMAGE_UNITS);
90c6499a741c99394e81d1d86ffd066f3d9749875cBrian
911d9360b67829a37b369e32c894183db1cecf827bBrian   c->MaxVertexTextureImageUnits
9215a3fdb63e0511860ee84c168b84dd0bcfca6094Brian Paul      = _min(screen->get_param(screen, PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS),
9315a3fdb63e0511860ee84c168b84dd0bcfca6094Brian Paul             MAX_VERTEX_TEXTURE_IMAGE_UNITS);
941d9360b67829a37b369e32c894183db1cecf827bBrian
956cbaa2226fa1237b9f314828fbbc1c8db6509de8Brian Paul   c->MaxTextureCoordUnits
966cbaa2226fa1237b9f314828fbbc1c8db6509de8Brian Paul      = _min(c->MaxTextureImageUnits, MAX_TEXTURE_COORD_UNITS);
97d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul
986cbaa2226fa1237b9f314828fbbc1c8db6509de8Brian Paul   c->MaxTextureUnits = _min(c->MaxTextureImageUnits, c->MaxTextureCoordUnits);
99d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul
100e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian   c->MaxDrawBuffers
10154507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      = _clamp(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
102e2feb80a90f3e9300c70a4a4eb3e966131f5c313Brian              1, MAX_DRAW_BUFFERS);
10344254b92480115e5c8a2d5cf78f99195c03701ebBrian
10444254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxLineWidth
10518ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonseca      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH));
10644254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxLineWidthAA
10718ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonseca      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH_AA));
10844254b92480115e5c8a2d5cf78f99195c03701ebBrian
10944254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxPointSize
11018ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonseca      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH));
11144254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxPointSizeAA
11218ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonseca      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH_AA));
11344254b92480115e5c8a2d5cf78f99195c03701ebBrian
11444254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxTextureMaxAnisotropy
11518ec140ef27b6488bea9d54e21b08b0a3afbcafeJosé Fonseca      = _maxf(2.0f, screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_ANISOTROPY));
11644254b92480115e5c8a2d5cf78f99195c03701ebBrian
11744254b92480115e5c8a2d5cf78f99195c03701ebBrian   c->MaxTextureLodBias
1188383f798b41df9a305e0a33afe8afa028d5d5dfbBrian      = screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_LOD_BIAS);
1194650b35846e8e87fb0d74573a5f66452bb449b4bBrian
120b54225ccd6d3bc1b678e27c2f00ebddf5bf1046dBrian   c->MaxDrawBuffers
121b54225ccd6d3bc1b678e27c2f00ebddf5bf1046dBrian      = CLAMP(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
122b54225ccd6d3bc1b678e27c2f00ebddf5bf1046dBrian              1, MAX_DRAW_BUFFERS);
123c6499a741c99394e81d1d86ffd066f3d9749875cBrian}
124c6499a741c99394e81d1d86ffd066f3d9749875cBrian
125c6499a741c99394e81d1d86ffd066f3d9749875cBrian
126c6499a741c99394e81d1d86ffd066f3d9749875cBrian/**
1276b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * Use pipe_screen::get_param() to query PIPE_CAP_ values to determine
1286b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * which GL extensions are supported.
1296b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * Quite a few extensions are always supported because they are standard
1306b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * features or can be built on top of other gallium features.
1316b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul * Some fine tuning may still be needed.
132c6499a741c99394e81d1d86ffd066f3d9749875cBrian */
133c6499a741c99394e81d1d86ffd066f3d9749875cBrianvoid st_init_extensions(struct st_context *st)
134c6499a741c99394e81d1d86ffd066f3d9749875cBrian{
1358383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   struct pipe_screen *screen = st->pipe->screen;
136c6499a741c99394e81d1d86ffd066f3d9749875cBrian   GLcontext *ctx = st->ctx;
137c6499a741c99394e81d1d86ffd066f3d9749875cBrian
138c6499a741c99394e81d1d86ffd066f3d9749875cBrian   /*
139c6499a741c99394e81d1d86ffd066f3d9749875cBrian    * Extensions that are supported by all Gallium drivers:
140c6499a741c99394e81d1d86ffd066f3d9749875cBrian    */
1416b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   ctx->Extensions.ARB_multisample = GL_TRUE;
142c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_fragment_program = GL_TRUE;
1436c4447e6a8ecfcfb094ab2ad8b7371dfa2b7d7bbBrian   ctx->Extensions.ARB_texture_border_clamp = GL_TRUE; /* XXX temp */
1446b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   ctx->Extensions.ARB_texture_compression = GL_TRUE;
145c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_texture_cube_map = GL_TRUE;
146c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_texture_env_combine = GL_TRUE;
147c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_texture_env_crossbar = GL_TRUE;
148c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_texture_env_dot3 = GL_TRUE;
149c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_vertex_program = GL_TRUE;
150c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.ARB_vertex_buffer_object = GL_TRUE;
151c6499a741c99394e81d1d86ffd066f3d9749875cBrian
152c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_blend_color = GL_TRUE;
153c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_blend_equation_separate = GL_TRUE;
154c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_blend_func_separate = GL_TRUE;
155c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_blend_logic_op = GL_TRUE;
156c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_blend_minmax = GL_TRUE;
157c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_blend_subtract = GL_TRUE;
1580df877a0ee68359d106ba84e3dd3b7c42ae20d5aBrian   ctx->Extensions.EXT_framebuffer_blit = GL_TRUE;
159c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_framebuffer_object = GL_TRUE;
160c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_fog_coord = GL_TRUE;
161c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_multi_draw_arrays = GL_TRUE;
162c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_pixel_buffer_object = GL_TRUE;
163c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_point_parameters = GL_TRUE;
164c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_secondary_color = GL_TRUE;
165c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_stencil_wrap = GL_TRUE;
166c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_texture_env_add = GL_TRUE;
167c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_texture_env_combine = GL_TRUE;
168c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_texture_env_dot3 = GL_TRUE;
169c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.EXT_texture_lod_bias = GL_TRUE;
170c6499a741c99394e81d1d86ffd066f3d9749875cBrian
171c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.NV_blend_square = GL_TRUE;
172c6499a741c99394e81d1d86ffd066f3d9749875cBrian   ctx->Extensions.NV_texgen_reflection = GL_TRUE;
173c6499a741c99394e81d1d86ffd066f3d9749875cBrian
174e38f677e8f5596d92a6756e13f41f6523de737c2Brian Paul   ctx->Extensions.SGI_color_matrix = GL_TRUE;
1756b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   ctx->Extensions.SGIS_generate_mipmap = GL_TRUE;
176c6499a741c99394e81d1d86ffd066f3d9749875cBrian
177c6499a741c99394e81d1d86ffd066f3d9749875cBrian   /*
178c6499a741c99394e81d1d86ffd066f3d9749875cBrian    * Extensions that depend on the driver/hardware:
179c6499a741c99394e81d1d86ffd066f3d9749875cBrian    */
1808383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS) > 0) {
181c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_draw_buffers = GL_TRUE;
182c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
183c6499a741c99394e81d1d86ffd066f3d9749875cBrian
1848383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_GLSL)) {
185c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_fragment_shader = GL_TRUE;
186c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_vertex_shader = GL_TRUE;
187c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_shader_objects = GL_TRUE;
188c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_shading_language_100 = GL_TRUE;
189c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_shading_language_120 = GL_TRUE;
190c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
191c6499a741c99394e81d1d86ffd066f3d9749875cBrian
192be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   if (screen->get_param(screen, PIPE_CAP_TEXTURE_MIRROR_REPEAT) > 0) {
193be66a8f43172327e3cdde27281e40377cacbb121Brian Paul      ctx->Extensions.ARB_texture_mirrored_repeat = GL_TRUE;
194be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   }
195be66a8f43172327e3cdde27281e40377cacbb121Brian Paul
196be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   if (screen->get_param(screen, PIPE_CAP_TEXTURE_MIRROR_CLAMP) > 0) {
197be66a8f43172327e3cdde27281e40377cacbb121Brian Paul      ctx->Extensions.EXT_texture_mirror_clamp = GL_TRUE;
198be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   }
199be66a8f43172327e3cdde27281e40377cacbb121Brian Paul
2008383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) {
201c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_texture_non_power_of_two = GL_TRUE;
202c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.NV_texture_rectangle = GL_TRUE;
203c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
204c6499a741c99394e81d1d86ffd066f3d9749875cBrian
2058383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS) > 1) {
206c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_multitexture = GL_TRUE;
207c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
208c6499a741c99394e81d1d86ffd066f3d9749875cBrian
2098383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_TWO_SIDED_STENCIL)) {
210c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ATI_separate_stencil = GL_TRUE;
211c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
212c6499a741c99394e81d1d86ffd066f3d9749875cBrian
2138383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_ANISOTROPIC_FILTER)) {
214c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.EXT_texture_filter_anisotropic = GL_TRUE;
215c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
216c6499a741c99394e81d1d86ffd066f3d9749875cBrian
2178383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_POINT_SPRITE)) {
218c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_point_sprite = GL_TRUE;
21903cfeb31af7834c2b2701ad25ec39f8375df6c96Brian      ctx->Extensions.NV_point_sprite = GL_TRUE;
220c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
221c6499a741c99394e81d1d86ffd066f3d9749875cBrian
2228383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY)) {
223c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_occlusion_query = GL_TRUE;
224c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
225c6499a741c99394e81d1d86ffd066f3d9749875cBrian
2268383f798b41df9a305e0a33afe8afa028d5d5dfbBrian   if (screen->get_param(screen, PIPE_CAP_TEXTURE_SHADOW_MAP)) {
227c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_depth_texture = GL_TRUE;
228c6499a741c99394e81d1d86ffd066f3d9749875cBrian      ctx->Extensions.ARB_shadow = GL_TRUE;
2298ce6d6b97e6e90451e7372fe3d94e7e31b0ea569Brian      ctx->Extensions.EXT_shadow_funcs = GL_TRUE;
230c6499a741c99394e81d1d86ffd066f3d9749875cBrian      /*ctx->Extensions.ARB_shadow_ambient = GL_TRUE;*/
231c6499a741c99394e81d1d86ffd066f3d9749875cBrian   }
232c6499a741c99394e81d1d86ffd066f3d9749875cBrian
2336c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul   /* GL_EXT_packed_depth_stencil requires both the ability to render to
2346c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul    * a depth/stencil buffer and texture from depth/stencil source.
2356c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul    */
2366c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul   if (screen->is_format_supported(screen, PIPE_FORMAT_Z24S8_UNORM,
2376c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul                                   PIPE_TEXTURE_2D,
2386c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul                                   PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0) &&
2396c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul       screen->is_format_supported(screen, PIPE_FORMAT_Z24S8_UNORM,
2406c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul                                   PIPE_TEXTURE_2D,
2416c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul                                   PIPE_TEXTURE_USAGE_SAMPLER, 0)) {
2426c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul      ctx->Extensions.EXT_packed_depth_stencil = GL_TRUE;
2436c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul   }
2446c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul   else if (screen->is_format_supported(screen, PIPE_FORMAT_S8Z24_UNORM,
2456c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul                                        PIPE_TEXTURE_2D,
2466c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul                                        PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0) &&
2476c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul            screen->is_format_supported(screen, PIPE_FORMAT_S8Z24_UNORM,
2486c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul                                        PIPE_TEXTURE_2D,
2496c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul                                        PIPE_TEXTURE_USAGE_SAMPLER, 0)) {
2506c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul      ctx->Extensions.EXT_packed_depth_stencil = GL_TRUE;
2516c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul   }
2526c46b49d12b33b04546bee137f75ca7649e9a4efBrian Paul
2536b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   /* sRGB support */
25413540d38d9d4ac4f71533ce239f0d9a2b950e6dbBrian Paul   if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SRGB,
2558aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                                   PIPE_TEXTURE_2D,
256fd2492d24447e461f36982da268caf0317885967Roland Scheidegger                                   PIPE_TEXTURE_USAGE_SAMPLER, 0) ||
257fd2492d24447e461f36982da268caf0317885967Roland Scheidegger      screen->is_format_supported(screen, PIPE_FORMAT_A8R8G8B8_SRGB,
258fd2492d24447e461f36982da268caf0317885967Roland Scheidegger                                   PIPE_TEXTURE_2D,
2598aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                                   PIPE_TEXTURE_USAGE_SAMPLER, 0)) {
26013540d38d9d4ac4f71533ce239f0d9a2b950e6dbBrian Paul      ctx->Extensions.EXT_texture_sRGB = GL_TRUE;
26113540d38d9d4ac4f71533ce239f0d9a2b950e6dbBrian Paul   }
2623600e7402c2a1824c8e5e2cc6ea189bcdeb4db6bBrian Paul
2636b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   /* s3tc support */
2643600e7402c2a1824c8e5e2cc6ea189bcdeb4db6bBrian Paul   if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
2658aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                                   PIPE_TEXTURE_2D,
2668aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                                   PIPE_TEXTURE_USAGE_SAMPLER, 0)) {
2673600e7402c2a1824c8e5e2cc6ea189bcdeb4db6bBrian Paul      ctx->Extensions.EXT_texture_compression_s3tc = GL_TRUE;
2683600e7402c2a1824c8e5e2cc6ea189bcdeb4db6bBrian Paul   }
2696b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul
2706b1b8e4ca1c911105c42154c9e794262d74652e5Brian Paul   /* ycbcr support */
2718aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   if (screen->is_format_supported(screen, PIPE_FORMAT_YCBCR,
2728aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                                   PIPE_TEXTURE_2D,
2738aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                                   PIPE_TEXTURE_USAGE_SAMPLER, 0) ||
2748aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca       screen->is_format_supported(screen, PIPE_FORMAT_YCBCR_REV,
2758aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                                   PIPE_TEXTURE_2D,
2768aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                                   PIPE_TEXTURE_USAGE_SAMPLER, 0)) {
2771307eebfa07e3440554eb2871e5dbd94e98ed7a8Brian      ctx->Extensions.MESA_ycbcr_texture = GL_TRUE;
2781307eebfa07e3440554eb2871e5dbd94e98ed7a8Brian   }
279c6499a741c99394e81d1d86ffd066f3d9749875cBrian}
280