st_extensions.c revision cdc920a0
1/**************************************************************************
2 *
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
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 TUNGSTEN GRAPHICS 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
33#include "pipe/p_context.h"
34#include "pipe/p_defines.h"
35#include "pipe/p_screen.h"
36
37#include "st_context.h"
38#include "st_extensions.h"
39
40
41static int _min(int a, int b)
42{
43   return (a < b) ? a : b;
44}
45
46static float _maxf(float a, float b)
47{
48   return (a > b) ? a : b;
49}
50
51static int _clamp(int a, int min, int max)
52{
53   if (a < min)
54      return min;
55   else if (a > max)
56      return max;
57   else
58      return a;
59}
60
61
62/**
63 * Query driver to get implementation limits.
64 * Note that we have to limit/clamp against Mesa's internal limits too.
65 */
66void st_init_limits(struct st_context *st)
67{
68   struct pipe_screen *screen = st->pipe->screen;
69   struct gl_constants *c = &st->ctx->Const;
70   struct gl_program_constants *pc;
71
72   c->MaxTextureLevels
73      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
74            MAX_TEXTURE_LEVELS);
75
76   c->Max3DTextureLevels
77      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS),
78            MAX_3D_TEXTURE_LEVELS);
79
80   c->MaxCubeTextureLevels
81      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS),
82            MAX_CUBE_TEXTURE_LEVELS);
83
84   c->MaxTextureRectSize
85      = _min(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE);
86
87   c->MaxTextureImageUnits
88      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS),
89            MAX_TEXTURE_IMAGE_UNITS);
90
91   c->MaxVertexTextureImageUnits
92      = _min(screen->get_param(screen, PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS),
93             MAX_VERTEX_TEXTURE_IMAGE_UNITS);
94
95   c->MaxCombinedTextureImageUnits
96      = _min(screen->get_param(screen, PIPE_CAP_MAX_COMBINED_SAMPLERS),
97             MAX_COMBINED_TEXTURE_IMAGE_UNITS);
98
99   c->MaxTextureCoordUnits
100      = _min(c->MaxTextureImageUnits, MAX_TEXTURE_COORD_UNITS);
101
102   c->MaxTextureUnits = _min(c->MaxTextureImageUnits, c->MaxTextureCoordUnits);
103
104   c->MaxDrawBuffers
105      = _clamp(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
106              1, MAX_DRAW_BUFFERS);
107
108   c->MaxLineWidth
109      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH));
110   c->MaxLineWidthAA
111      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH_AA));
112
113   c->MaxPointSize
114      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH));
115   c->MaxPointSizeAA
116      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH_AA));
117   /* called after _mesa_create_context/_mesa_init_point, fix default user
118    * settable max point size up
119    */
120   st->ctx->Point.MaxSize = MAX2(c->MaxPointSize, c->MaxPointSizeAA);
121   /* these are not queryable. Note that GL basically mandates a 1.0 minimum
122    * for non-aa sizes, but we can go down to 0.0 for aa points.
123    */
124   c->MinPointSize = 1.0f;
125   c->MinPointSizeAA = 0.0f;
126
127   c->MaxTextureMaxAnisotropy
128      = _maxf(2.0f, screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_ANISOTROPY));
129
130   c->MaxTextureLodBias
131      = screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_LOD_BIAS);
132
133   c->MaxDrawBuffers
134      = CLAMP(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
135              1, MAX_DRAW_BUFFERS);
136
137   /* Is TGSI_OPCODE_CONT supported? */
138   /* XXX separate query for early function return? */
139   st->ctx->Shader.EmitContReturn =
140      screen->get_param(screen, PIPE_CAP_TGSI_CONT_SUPPORTED);
141
142   if (screen->get_param(screen, PIPE_CAP_GLSL)) {
143      /*
144       * In the lack of more fine grained capabilities, if the pipe driver supports
145       * GLSL then assume native limits match Mesa software limits.
146       */
147
148      pc = &c->FragmentProgram;
149      pc->MaxNativeInstructions      = pc->MaxInstructions;
150      pc->MaxNativeAluInstructions   = pc->MaxAluInstructions;
151      pc->MaxNativeTexInstructions   = pc->MaxTexInstructions;
152      pc->MaxNativeTexIndirections   = pc->MaxTexIndirections;
153      pc->MaxNativeAttribs           = pc->MaxAttribs;
154      pc->MaxNativeTemps             = pc->MaxTemps;
155      pc->MaxNativeAddressRegs       = pc->MaxAddressRegs;
156      pc->MaxNativeParameters        = pc->MaxParameters;
157
158      pc = &c->VertexProgram;
159      pc->MaxNativeInstructions      = pc->MaxInstructions;
160      pc->MaxNativeAluInstructions   = pc->MaxAluInstructions;
161      pc->MaxNativeTexInstructions   = pc->MaxTexInstructions;
162      pc->MaxNativeTexIndirections   = pc->MaxTexIndirections;
163      pc->MaxNativeAttribs           = pc->MaxAttribs;
164      pc->MaxNativeTemps             = pc->MaxTemps;
165      pc->MaxNativeAddressRegs       = pc->MaxAddressRegs;
166      pc->MaxNativeParameters        = pc->MaxParameters;
167   } else if (screen->get_param(screen, PIPE_CAP_SM3)) {
168      /*
169       * Assume the hardware meets the minimum requirements
170       * for Shader Model 3.
171       *
172       * See also:
173       * - http://msdn.microsoft.com/en-us/library/bb172920(VS.85).aspx
174       * - http://msdn.microsoft.com/en-us/library/bb172963(VS.85).aspx
175       */
176
177      pc = &c->FragmentProgram;
178      pc->MaxNativeInstructions      = 512; /* D3DMIN30SHADERINSTRUCTIONS */
179      pc->MaxNativeAluInstructions   = pc->MaxNativeInstructions;
180      pc->MaxNativeTexInstructions   = pc->MaxNativeInstructions;
181      pc->MaxNativeTexIndirections   = pc->MaxNativeTexInstructions;
182      pc->MaxNativeAttribs           = 10;
183      pc->MaxNativeTemps             = 32;
184      pc->MaxNativeAddressRegs       = 1; /* aL */
185      pc->MaxNativeParameters        = 224;
186
187      pc = &c->VertexProgram;
188      pc->MaxNativeInstructions      = 512; /* D3DMIN30SHADERINSTRUCTIONS */
189      pc->MaxNativeAluInstructions   = pc->MaxNativeInstructions;
190      pc->MaxNativeTexInstructions   = pc->MaxNativeInstructions;
191      pc->MaxNativeTexIndirections   = pc->MaxNativeTexInstructions;
192      pc->MaxNativeAttribs           = 16;
193      pc->MaxNativeTemps             = 32;
194      pc->MaxNativeAddressRegs       = 2; /* a0 and aL */
195      pc->MaxNativeParameters        = 256;
196   } else {
197      /*
198       * Assume the hardware meets the minimum requirements
199       * for Shader Model 2.
200       *
201       * See also:
202       * - http://msdn.microsoft.com/en-us/library/bb172918(VS.85).aspx
203       * - http://msdn.microsoft.com/en-us/library/bb172961(VS.85).aspx
204       */
205
206      pc = &c->FragmentProgram;
207      pc->MaxNativeInstructions      = 96; /* D3DPS20_MIN_NUMINSTRUCTIONSLOTS */
208      pc->MaxNativeAluInstructions   = 64;
209      pc->MaxNativeTexInstructions   = 32;
210      pc->MaxNativeTexIndirections   = pc->MaxNativeTexInstructions;
211      pc->MaxNativeAttribs           = 10; /* 2 color + 8 texture coord */
212      pc->MaxNativeTemps             = 12; /* D3DPS20_MIN_NUMTEMPS */
213      pc->MaxNativeAddressRegs       = 0;
214      pc->MaxNativeParameters        = 16;
215
216      pc = &c->VertexProgram;
217      pc->MaxNativeInstructions      = 256;
218      pc->MaxNativeAluInstructions   = 256;
219      pc->MaxNativeTexInstructions   = 0;
220      pc->MaxNativeTexIndirections   = 0;
221      pc->MaxNativeAttribs           = 16;
222      pc->MaxNativeTemps             = 12; /* D3DVS20_MIN_NUMTEMPS */
223      pc->MaxNativeAddressRegs       = 2; /* a0 and aL */
224      pc->MaxNativeParameters        = 256;
225   }
226
227   if (!screen->get_param(screen, PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS)) {
228      c->VertexProgram.MaxNativeTexInstructions = 0;
229      c->VertexProgram.MaxNativeTexIndirections = 0;
230   }
231}
232
233
234/**
235 * Use pipe_screen::get_param() to query PIPE_CAP_ values to determine
236 * which GL extensions are supported.
237 * Quite a few extensions are always supported because they are standard
238 * features or can be built on top of other gallium features.
239 * Some fine tuning may still be needed.
240 */
241void st_init_extensions(struct st_context *st)
242{
243   struct pipe_screen *screen = st->pipe->screen;
244   GLcontext *ctx = st->ctx;
245
246   /*
247    * Extensions that are supported by all Gallium drivers:
248    */
249   ctx->Extensions.ARB_copy_buffer = GL_TRUE;
250   ctx->Extensions.ARB_fragment_coord_conventions = GL_TRUE;
251   ctx->Extensions.ARB_fragment_program = GL_TRUE;
252   ctx->Extensions.ARB_map_buffer_range = GL_TRUE;
253   ctx->Extensions.ARB_multisample = GL_TRUE;
254   ctx->Extensions.ARB_texture_border_clamp = GL_TRUE; /* XXX temp */
255   ctx->Extensions.ARB_texture_compression = GL_TRUE;
256   ctx->Extensions.ARB_texture_cube_map = GL_TRUE;
257   ctx->Extensions.ARB_texture_env_combine = GL_TRUE;
258   ctx->Extensions.ARB_texture_env_crossbar = GL_TRUE;
259   ctx->Extensions.ARB_texture_env_dot3 = GL_TRUE;
260   ctx->Extensions.ARB_vertex_array_object = GL_TRUE;
261   ctx->Extensions.ARB_vertex_buffer_object = GL_TRUE;
262   ctx->Extensions.ARB_vertex_program = GL_TRUE;
263
264   ctx->Extensions.EXT_blend_color = GL_TRUE;
265   ctx->Extensions.EXT_blend_func_separate = GL_TRUE;
266   ctx->Extensions.EXT_blend_logic_op = GL_TRUE;
267   ctx->Extensions.EXT_blend_minmax = GL_TRUE;
268   ctx->Extensions.EXT_blend_subtract = GL_TRUE;
269   ctx->Extensions.EXT_framebuffer_blit = GL_TRUE;
270   ctx->Extensions.EXT_framebuffer_object = GL_TRUE;
271   ctx->Extensions.EXT_framebuffer_multisample = GL_TRUE;
272   ctx->Extensions.EXT_fog_coord = GL_TRUE;
273   ctx->Extensions.EXT_multi_draw_arrays = GL_TRUE;
274   ctx->Extensions.EXT_pixel_buffer_object = GL_TRUE;
275   ctx->Extensions.EXT_point_parameters = GL_TRUE;
276   ctx->Extensions.EXT_provoking_vertex = GL_TRUE;
277   ctx->Extensions.EXT_secondary_color = GL_TRUE;
278   ctx->Extensions.EXT_stencil_wrap = GL_TRUE;
279   ctx->Extensions.EXT_texture_env_add = GL_TRUE;
280   ctx->Extensions.EXT_texture_env_combine = GL_TRUE;
281   ctx->Extensions.EXT_texture_env_dot3 = GL_TRUE;
282   ctx->Extensions.EXT_texture_lod_bias = GL_TRUE;
283   ctx->Extensions.EXT_vertex_array_bgra = GL_TRUE;
284
285   ctx->Extensions.APPLE_vertex_array_object = GL_TRUE;
286
287   ctx->Extensions.NV_blend_square = GL_TRUE;
288   ctx->Extensions.NV_texgen_reflection = GL_TRUE;
289   ctx->Extensions.NV_texture_env_combine4 = GL_TRUE;
290
291#if FEATURE_OES_draw_texture
292   ctx->Extensions.OES_draw_texture = GL_TRUE;
293#endif
294
295   ctx->Extensions.SGI_color_matrix = GL_TRUE;
296   ctx->Extensions.SGIS_generate_mipmap = GL_TRUE;
297
298   /*
299    * Extensions that depend on the driver/hardware:
300    */
301   if (screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS) > 0) {
302      ctx->Extensions.ARB_draw_buffers = GL_TRUE;
303   }
304
305   if (screen->get_param(screen, PIPE_CAP_GLSL)) {
306      ctx->Extensions.ARB_fragment_shader = GL_TRUE;
307      ctx->Extensions.ARB_vertex_shader = GL_TRUE;
308      ctx->Extensions.ARB_shader_objects = GL_TRUE;
309      ctx->Extensions.ARB_shading_language_100 = GL_TRUE;
310      ctx->Extensions.ARB_shading_language_120 = GL_TRUE;
311   }
312
313   if (screen->get_param(screen, PIPE_CAP_TEXTURE_MIRROR_REPEAT) > 0) {
314      ctx->Extensions.ARB_texture_mirrored_repeat = GL_TRUE;
315   }
316
317   if (screen->get_param(screen, PIPE_CAP_BLEND_EQUATION_SEPARATE)) {
318      ctx->Extensions.EXT_blend_equation_separate = GL_TRUE;
319   }
320
321   if (screen->get_param(screen, PIPE_CAP_TEXTURE_MIRROR_CLAMP) > 0) {
322      ctx->Extensions.EXT_texture_mirror_clamp = GL_TRUE;
323   }
324
325   if (screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) {
326      ctx->Extensions.ARB_texture_non_power_of_two = GL_TRUE;
327      ctx->Extensions.NV_texture_rectangle = GL_TRUE;
328   }
329
330   if (screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS) > 1) {
331      ctx->Extensions.ARB_multitexture = GL_TRUE;
332   }
333
334   if (screen->get_param(screen, PIPE_CAP_TWO_SIDED_STENCIL)) {
335      ctx->Extensions.ATI_separate_stencil = GL_TRUE;
336      ctx->Extensions.EXT_stencil_two_side = GL_TRUE;
337   }
338
339   if (screen->get_param(screen, PIPE_CAP_ANISOTROPIC_FILTER)) {
340      ctx->Extensions.EXT_texture_filter_anisotropic = GL_TRUE;
341   }
342
343   if (screen->get_param(screen, PIPE_CAP_POINT_SPRITE)) {
344      ctx->Extensions.ARB_point_sprite = GL_TRUE;
345      /* GL_NV_point_sprite is not supported by gallium because we don't
346       * support the GL_POINT_SPRITE_R_MODE_NV option.
347       */
348   }
349
350   if (screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY)) {
351      ctx->Extensions.ARB_occlusion_query = GL_TRUE;
352   }
353
354   if (screen->get_param(screen, PIPE_CAP_TEXTURE_SHADOW_MAP)) {
355      ctx->Extensions.ARB_depth_texture = GL_TRUE;
356      ctx->Extensions.ARB_shadow = GL_TRUE;
357      ctx->Extensions.EXT_shadow_funcs = GL_TRUE;
358      /*ctx->Extensions.ARB_shadow_ambient = GL_TRUE;*/
359   }
360
361   /* GL_EXT_packed_depth_stencil requires both the ability to render to
362    * a depth/stencil buffer and texture from depth/stencil source.
363    */
364   if (screen->is_format_supported(screen, PIPE_FORMAT_S8Z24_UNORM,
365                                   PIPE_TEXTURE_2D,
366                                   PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0) &&
367       screen->is_format_supported(screen, PIPE_FORMAT_S8Z24_UNORM,
368                                   PIPE_TEXTURE_2D,
369                                   PIPE_TEXTURE_USAGE_SAMPLER, 0)) {
370      ctx->Extensions.EXT_packed_depth_stencil = GL_TRUE;
371   }
372   else if (screen->is_format_supported(screen, PIPE_FORMAT_Z24S8_UNORM,
373                                        PIPE_TEXTURE_2D,
374                                        PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0) &&
375            screen->is_format_supported(screen, PIPE_FORMAT_Z24S8_UNORM,
376                                        PIPE_TEXTURE_2D,
377                                        PIPE_TEXTURE_USAGE_SAMPLER, 0)) {
378      ctx->Extensions.EXT_packed_depth_stencil = GL_TRUE;
379   }
380
381   /* sRGB support */
382   if (screen->is_format_supported(screen, PIPE_FORMAT_A8B8G8R8_SRGB,
383                                   PIPE_TEXTURE_2D,
384                                   PIPE_TEXTURE_USAGE_SAMPLER, 0) ||
385      screen->is_format_supported(screen, PIPE_FORMAT_B8G8R8A8_SRGB,
386                                   PIPE_TEXTURE_2D,
387                                   PIPE_TEXTURE_USAGE_SAMPLER, 0)) {
388      ctx->Extensions.EXT_texture_sRGB = GL_TRUE;
389   }
390
391   /* s3tc support */
392   if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
393                                   PIPE_TEXTURE_2D,
394                                   PIPE_TEXTURE_USAGE_SAMPLER, 0) &&
395       (ctx->Mesa_DXTn ||
396        screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
397                                    PIPE_TEXTURE_2D,
398                                    PIPE_TEXTURE_USAGE_RENDER_TARGET, 0))) {
399      ctx->Extensions.EXT_texture_compression_s3tc = GL_TRUE;
400      ctx->Extensions.S3_s3tc = GL_TRUE;
401   }
402
403   /* ycbcr support */
404   if (screen->is_format_supported(screen, PIPE_FORMAT_UYVY,
405                                   PIPE_TEXTURE_2D,
406                                   PIPE_TEXTURE_USAGE_SAMPLER, 0) ||
407       screen->is_format_supported(screen, PIPE_FORMAT_YUYV,
408                                   PIPE_TEXTURE_2D,
409                                   PIPE_TEXTURE_USAGE_SAMPLER, 0)) {
410      ctx->Extensions.MESA_ycbcr_texture = GL_TRUE;
411   }
412
413   /* GL_ARB_framebuffer_object */
414   if (ctx->Extensions.EXT_packed_depth_stencil) {
415      /* we support always support GL_EXT_framebuffer_blit */
416      ctx->Extensions.ARB_framebuffer_object = GL_TRUE;
417   }
418
419   if (st->pipe->render_condition) {
420      ctx->Extensions.NV_conditional_render = GL_TRUE;
421   }
422
423   if (screen->get_param(screen, PIPE_CAP_INDEP_BLEND_ENABLE)) {
424      ctx->Extensions.EXT_draw_buffers2 = GL_TRUE;
425   }
426
427#if 0 /* not yet */
428   if (screen->get_param(screen, PIPE_CAP_INDEP_BLEND_FUNC)) {
429      ctx->Extensions.ARB_draw_buffers_blend = GL_TRUE;
430   }
431#endif
432}
433