1 /**************************************************************************
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
28 #include "main/imports.h"
29 #include "main/context.h"
30 #include "main/extensions.h"
31 #include "main/macros.h"
33 #include "pipe/p_context.h"
34 #include "pipe/p_defines.h"
36 #include "st_context.h"
37 #include "st_extensions.h"
40 static int min(int a
, int b
)
42 return (a
< b
) ? a
: b
;
45 static int max(int a
, int b
)
47 return (a
> b
) ? a
: b
;
50 static int clamp(int a
, int min
, int max
)
62 * Query driver to get implementation limits.
63 * Note that we have to limit/clamp against Mesa's internal limits too.
65 void st_init_limits(struct st_context
*st
)
67 struct pipe_context
*pipe
= st
->pipe
;
68 struct gl_constants
*c
= &st
->ctx
->Const
;
71 = min(pipe
->get_param(pipe
, PIPE_CAP_MAX_TEXTURE_2D_LEVELS
),
75 = min(pipe
->get_param(pipe
, PIPE_CAP_MAX_TEXTURE_3D_LEVELS
),
76 MAX_3D_TEXTURE_LEVELS
);
78 c
->MaxCubeTextureLevels
79 = min(pipe
->get_param(pipe
, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS
),
80 MAX_CUBE_TEXTURE_LEVELS
);
83 = min(1 << (c
->MaxTextureLevels
- 1), MAX_TEXTURE_RECT_SIZE
);
85 c
->MaxTextureImageUnits
86 = c
->MaxTextureCoordUnits
87 = min(pipe
->get_param(pipe
, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS
),
88 MAX_TEXTURE_IMAGE_UNITS
);
91 = clamp(pipe
->get_param(pipe
, PIPE_CAP_MAX_RENDER_TARGETS
),
95 = max(1.0, pipe
->get_paramf(pipe
, PIPE_CAP_MAX_LINE_WIDTH
));
97 = max(1.0, pipe
->get_paramf(pipe
, PIPE_CAP_MAX_LINE_WIDTH_AA
));
100 = max(1.0, pipe
->get_paramf(pipe
, PIPE_CAP_MAX_POINT_WIDTH
));
102 = max(1.0, pipe
->get_paramf(pipe
, PIPE_CAP_MAX_POINT_WIDTH_AA
));
104 c
->MaxTextureMaxAnisotropy
105 = max(2.0, pipe
->get_paramf(pipe
, PIPE_CAP_MAX_TEXTURE_ANISOTROPY
));
108 = pipe
->get_paramf(pipe
, PIPE_CAP_MAX_TEXTURE_LOD_BIAS
);
113 * XXX this needs careful review
115 void st_init_extensions(struct st_context
*st
)
117 struct pipe_context
*pipe
= st
->pipe
;
118 GLcontext
*ctx
= st
->ctx
;
121 * Extensions that are supported by all Gallium drivers:
123 ctx
->Extensions
.ARB_multisample
= GL_TRUE
; /* API support */
124 ctx
->Extensions
.ARB_fragment_program
= GL_TRUE
;
125 ctx
->Extensions
.ARB_texture_border_clamp
= GL_TRUE
; /* XXX temp */
126 ctx
->Extensions
.ARB_texture_compression
= GL_TRUE
; /* API support only */
127 ctx
->Extensions
.ARB_texture_cube_map
= GL_TRUE
;
128 ctx
->Extensions
.ARB_texture_env_combine
= GL_TRUE
;
129 ctx
->Extensions
.ARB_texture_env_crossbar
= GL_TRUE
;
130 ctx
->Extensions
.ARB_texture_env_dot3
= GL_TRUE
;
131 ctx
->Extensions
.ARB_texture_mirrored_repeat
= GL_TRUE
; /* XXX temp */
133 ctx
->Extensions
.ARB_vertex_program
= GL_TRUE
;
134 ctx
->Extensions
.ARB_vertex_buffer_object
= GL_TRUE
;
136 ctx
->Extensions
.EXT_blend_color
= GL_TRUE
;
137 ctx
->Extensions
.EXT_blend_equation_separate
= GL_TRUE
;
138 ctx
->Extensions
.EXT_blend_func_separate
= GL_TRUE
;
139 ctx
->Extensions
.EXT_blend_logic_op
= GL_TRUE
;
140 ctx
->Extensions
.EXT_blend_minmax
= GL_TRUE
;
141 ctx
->Extensions
.EXT_blend_subtract
= GL_TRUE
;
142 ctx
->Extensions
.EXT_framebuffer_object
= GL_TRUE
;
143 ctx
->Extensions
.EXT_fog_coord
= GL_TRUE
;
144 ctx
->Extensions
.EXT_multi_draw_arrays
= GL_TRUE
;
145 ctx
->Extensions
.EXT_pixel_buffer_object
= GL_TRUE
;
146 ctx
->Extensions
.EXT_point_parameters
= GL_TRUE
;
147 ctx
->Extensions
.EXT_secondary_color
= GL_TRUE
;
148 ctx
->Extensions
.EXT_stencil_wrap
= GL_TRUE
;
149 ctx
->Extensions
.EXT_texture_env_add
= GL_TRUE
;
150 ctx
->Extensions
.EXT_texture_env_combine
= GL_TRUE
;
151 ctx
->Extensions
.EXT_texture_env_dot3
= GL_TRUE
;
152 ctx
->Extensions
.EXT_texture_lod_bias
= GL_TRUE
;
153 ctx
->Extensions
.EXT_texture_sRGB
= GL_TRUE
; /* XXX temp */
155 ctx
->Extensions
.NV_blend_square
= GL_TRUE
;
156 ctx
->Extensions
.NV_texgen_reflection
= GL_TRUE
;
158 ctx
->Extensions
.SGIS_generate_mipmap
= GL_TRUE
; /* XXX temp */
161 * Extensions that depend on the driver/hardware:
163 if (pipe
->get_param(pipe
, PIPE_CAP_MAX_RENDER_TARGETS
) > 0) {
164 ctx
->Extensions
.ARB_draw_buffers
= GL_TRUE
;
167 if (pipe
->get_param(pipe
, PIPE_CAP_GLSL
)) {
168 ctx
->Extensions
.ARB_fragment_shader
= GL_TRUE
;
169 ctx
->Extensions
.ARB_vertex_shader
= GL_TRUE
;
170 ctx
->Extensions
.ARB_shader_objects
= GL_TRUE
;
171 ctx
->Extensions
.ARB_shading_language_100
= GL_TRUE
;
172 ctx
->Extensions
.ARB_shading_language_120
= GL_TRUE
;
175 if (pipe
->get_param(pipe
, PIPE_CAP_NPOT_TEXTURES
)) {
176 ctx
->Extensions
.ARB_texture_non_power_of_two
= GL_TRUE
;
177 ctx
->Extensions
.NV_texture_rectangle
= GL_TRUE
;
180 if (pipe
->get_param(pipe
, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS
) > 1) {
181 ctx
->Extensions
.ARB_multitexture
= GL_TRUE
;
184 if (pipe
->get_param(pipe
, PIPE_CAP_TWO_SIDED_STENCIL
)) {
185 ctx
->Extensions
.ATI_separate_stencil
= GL_TRUE
;
188 if (pipe
->get_param(pipe
, PIPE_CAP_S3TC
)) {
189 ctx
->Extensions
.EXT_texture_compression_s3tc
= GL_TRUE
;
192 if (pipe
->get_param(pipe
, PIPE_CAP_ANISOTROPIC_FILTER
)) {
193 ctx
->Extensions
.EXT_texture_filter_anisotropic
= GL_TRUE
;
196 if (pipe
->get_param(pipe
, PIPE_CAP_POINT_SPRITE
)) {
197 ctx
->Extensions
.ARB_point_sprite
= GL_TRUE
;
198 ctx
->Extensions
.NV_point_sprite
= GL_TRUE
;
201 if (pipe
->get_param(pipe
, PIPE_CAP_OCCLUSION_QUERY
)) {
202 ctx
->Extensions
.ARB_occlusion_query
= GL_TRUE
;
205 if (pipe
->get_param(pipe
, PIPE_CAP_TEXTURE_SHADOW_MAP
)) {
206 ctx
->Extensions
.ARB_depth_texture
= GL_TRUE
;
207 ctx
->Extensions
.ARB_shadow
= GL_TRUE
;
208 ctx
->Extensions
.EXT_shadow_funcs
= GL_TRUE
;
209 /*ctx->Extensions.ARB_shadow_ambient = GL_TRUE;*/