r300: enable ARB_occlusion_query
[mesa.git] / src / mesa / drivers / dri / r300 / r300_context.c
1 /*
2 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
3
4 The Weather Channel (TM) funded Tungsten Graphics to develop the
5 initial release of the Radeon 8500 driver under the XFree86 license.
6 This notice must be preserved.
7
8 Permission is hereby granted, free of charge, to any person obtaining
9 a copy of this software and associated documentation files (the
10 "Software"), to deal in the Software without restriction, including
11 without limitation the rights to use, copy, modify, merge, publish,
12 distribute, sublicense, and/or sell copies of the Software, and to
13 permit persons to whom the Software is furnished to do so, subject to
14 the following conditions:
15
16 The above copyright notice and this permission notice (including the
17 next paragraph) shall be included in all copies or substantial
18 portions of the Software.
19
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
24 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 **************************************************************************/
29
30 /**
31 * \file
32 *
33 * \author Keith Whitwell <keith@tungstengraphics.com>
34 *
35 * \author Nicolai Haehnle <prefect_@gmx.net>
36 */
37
38 #include "main/glheader.h"
39 #include "main/api_arrayelt.h"
40 #include "main/context.h"
41 #include "main/simple_list.h"
42 #include "main/imports.h"
43 #include "main/matrix.h"
44 #include "main/extensions.h"
45 #include "main/state.h"
46 #include "main/bufferobj.h"
47 #include "main/texobj.h"
48
49 #include "swrast/swrast.h"
50 #include "swrast_setup/swrast_setup.h"
51 #include "vbo/vbo.h"
52
53 #include "tnl/tnl.h"
54 #include "tnl/t_pipeline.h"
55 #include "tnl/t_vp_build.h"
56
57 #include "drivers/common/driverfuncs.h"
58
59 #include "r300_context.h"
60 #include "radeon_context.h"
61 #include "radeon_span.h"
62 #include "r300_cmdbuf.h"
63 #include "r300_state.h"
64 #include "r300_ioctl.h"
65 #include "r300_tex.h"
66 #include "r300_emit.h"
67 #include "r300_queryobj.h"
68 #include "r300_swtcl.h"
69 #include "radeon_bocs_wrapper.h"
70 #include "radeon_buffer_objects.h"
71
72
73 #include "vblank.h"
74 #include "utils.h"
75 #include "xmlpool.h" /* for symbolic values of enum-type options */
76
77 #define need_GL_VERSION_2_0
78 #define need_GL_ARB_occlusion_query
79 #define need_GL_ARB_point_parameters
80 #define need_GL_ARB_vertex_program
81 #define need_GL_EXT_blend_equation_separate
82 #define need_GL_EXT_blend_func_separate
83 #define need_GL_EXT_blend_minmax
84 #define need_GL_EXT_framebuffer_object
85 #define need_GL_EXT_fog_coord
86 #define need_GL_EXT_gpu_program_parameters
87 #define need_GL_EXT_secondary_color
88 #define need_GL_EXT_stencil_two_side
89 #define need_GL_ATI_separate_stencil
90 #define need_GL_NV_vertex_program
91
92 #include "extension_helper.h"
93
94
95 const struct dri_extension card_extensions[] = {
96 /* *INDENT-OFF* */
97 {"GL_ARB_depth_texture", NULL},
98 {"GL_ARB_fragment_program", NULL},
99 {"GL_ARB_occlusion_query", GL_ARB_occlusion_query_functions},
100 {"GL_ARB_multitexture", NULL},
101 {"GL_ARB_point_parameters", GL_ARB_point_parameters_functions},
102 {"GL_ARB_shadow", NULL},
103 {"GL_ARB_shadow_ambient", NULL},
104 {"GL_ARB_texture_border_clamp", NULL},
105 {"GL_ARB_texture_cube_map", NULL},
106 {"GL_ARB_texture_env_add", NULL},
107 {"GL_ARB_texture_env_combine", NULL},
108 {"GL_ARB_texture_env_crossbar", NULL},
109 {"GL_ARB_texture_env_dot3", NULL},
110 {"GL_ARB_texture_mirrored_repeat", NULL},
111 {"GL_ARB_vertex_program", GL_ARB_vertex_program_functions},
112 {"GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions},
113 {"GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions},
114 {"GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions},
115 {"GL_EXT_blend_subtract", NULL},
116 {"GL_EXT_packed_depth_stencil", NULL},
117 {"GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
118 {"GL_EXT_gpu_program_parameters", GL_EXT_gpu_program_parameters_functions},
119 {"GL_EXT_secondary_color", GL_EXT_secondary_color_functions},
120 {"GL_EXT_shadow_funcs", NULL},
121 {"GL_EXT_stencil_two_side", GL_EXT_stencil_two_side_functions},
122 {"GL_EXT_stencil_wrap", NULL},
123 {"GL_EXT_texture_edge_clamp", NULL},
124 {"GL_EXT_texture_env_combine", NULL},
125 {"GL_EXT_texture_env_dot3", NULL},
126 {"GL_EXT_texture_filter_anisotropic", NULL},
127 {"GL_EXT_texture_lod_bias", NULL},
128 {"GL_EXT_texture_mirror_clamp", NULL},
129 {"GL_EXT_texture_rectangle", NULL},
130 {"GL_EXT_texture_sRGB", NULL},
131 {"GL_EXT_vertex_array_bgra", NULL},
132 {"GL_ATI_separate_stencil", GL_ATI_separate_stencil_functions},
133 {"GL_ATI_texture_env_combine3", NULL},
134 {"GL_ATI_texture_mirror_once", NULL},
135 {"GL_MESA_pack_invert", NULL},
136 {"GL_MESA_ycbcr_texture", NULL},
137 {"GL_MESAX_texture_float", NULL},
138 {"GL_NV_blend_square", NULL},
139 {"GL_NV_vertex_program", GL_NV_vertex_program_functions},
140 {"GL_SGIS_generate_mipmap", NULL},
141 {NULL, NULL}
142 /* *INDENT-ON* */
143 };
144
145
146 const struct dri_extension mm_extensions[] = {
147 { "GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions },
148 { NULL, NULL }
149 };
150
151 /**
152 * The GL 2.0 functions are needed to make display lists work with
153 * functions added by GL_ATI_separate_stencil.
154 */
155 const struct dri_extension gl_20_extension[] = {
156 {"GL_VERSION_2_0", GL_VERSION_2_0_functions },
157 };
158
159 static const struct tnl_pipeline_stage *r300_pipeline[] = {
160 /* Catch any t&l fallbacks
161 */
162 &_tnl_vertex_transform_stage,
163 &_tnl_normal_transform_stage,
164 &_tnl_lighting_stage,
165 &_tnl_fog_coordinate_stage,
166 &_tnl_texgen_stage,
167 &_tnl_texture_transform_stage,
168 &_tnl_point_attenuation_stage,
169 &_tnl_vertex_program_stage,
170 &_tnl_render_stage,
171 0,
172 };
173
174 static void r300_get_lock(radeonContextPtr rmesa)
175 {
176 drm_radeon_sarea_t *sarea = rmesa->sarea;
177
178 if (sarea->ctx_owner != rmesa->dri.hwContext) {
179 sarea->ctx_owner = rmesa->dri.hwContext;
180 if (!rmesa->radeonScreen->kernel_mm)
181 radeon_bo_legacy_texture_age(rmesa->radeonScreen->bom);
182 }
183 }
184
185 static void r300_vtbl_emit_cs_header(struct radeon_cs *cs, radeonContextPtr rmesa)
186 {
187 /* please flush pipe do all pending work */
188 radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
189 R300_SC_SCREENDOOR, 1));
190 radeon_cs_write_dword(cs, 0x0);
191 radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
192 R300_SC_SCREENDOOR, 1));
193 radeon_cs_write_dword(cs, 0x00FFFFFF);
194 radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
195 R300_SC_HYPERZ, 1));
196 radeon_cs_write_dword(cs, 0x0);
197 radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
198 R300_US_CONFIG, 1));
199 radeon_cs_write_dword(cs, 0x0);
200 radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
201 R300_ZB_CNTL, 1));
202 radeon_cs_write_dword(cs, 0x0);
203 radeon_cs_write_dword(cs, cmdwait(rmesa->radeonScreen, R300_WAIT_3D));
204 radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
205 R300_RB3D_DSTCACHE_CTLSTAT, 1));
206 radeon_cs_write_dword(cs, R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
207 radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
208 R300_ZB_ZCACHE_CTLSTAT, 1));
209 radeon_cs_write_dword(cs, R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE);
210 radeon_cs_write_dword(cs, cmdwait(rmesa->radeonScreen,
211 R300_WAIT_3D | R300_WAIT_3D_CLEAN));
212 }
213
214 static void r300_vtbl_pre_emit_atoms(radeonContextPtr radeon)
215 {
216 r300ContextPtr r300 = (r300ContextPtr)radeon;
217 BATCH_LOCALS(radeon);
218
219 r300->vap_flush_needed = GL_TRUE;
220
221 cp_wait(radeon, R300_WAIT_3D | R300_WAIT_3D_CLEAN);
222 BEGIN_BATCH_NO_AUTOSTATE(2);
223 OUT_BATCH_REGVAL(R300_TX_INVALTAGS, R300_TX_FLUSH);
224 END_BATCH();
225 end_3d(radeon);
226 }
227
228 static void r300_fallback(GLcontext *ctx, GLuint bit, GLboolean mode)
229 {
230 r300ContextPtr r300 = R300_CONTEXT(ctx);
231 if (mode)
232 r300->radeon.Fallback |= bit;
233 else
234 r300->radeon.Fallback &= ~bit;
235 }
236
237 static void r300_init_vtbl(radeonContextPtr radeon)
238 {
239 radeon->vtbl.get_lock = r300_get_lock;
240 radeon->vtbl.update_viewport_offset = r300UpdateViewportOffset;
241 radeon->vtbl.emit_cs_header = r300_vtbl_emit_cs_header;
242 radeon->vtbl.swtcl_flush = r300_swtcl_flush;
243 radeon->vtbl.pre_emit_atoms = r300_vtbl_pre_emit_atoms;
244 radeon->vtbl.fallback = r300_fallback;
245 }
246
247 static void r300InitConstValues(GLcontext *ctx, radeonScreenPtr screen)
248 {
249 r300ContextPtr r300 = R300_CONTEXT(ctx);
250
251 ctx->Const.MaxTextureImageUnits =
252 driQueryOptioni(&r300->radeon.optionCache, "texture_image_units");
253 ctx->Const.MaxTextureCoordUnits =
254 driQueryOptioni(&r300->radeon.optionCache, "texture_coord_units");
255 ctx->Const.MaxTextureUnits = MIN2(ctx->Const.MaxTextureImageUnits,
256 ctx->Const.MaxTextureCoordUnits);
257
258 ctx->Const.MaxTextureMaxAnisotropy = 16.0;
259 ctx->Const.MaxTextureLodBias = 16.0;
260
261 if (screen->chip_family >= CHIP_FAMILY_RV515) {
262 ctx->Const.MaxTextureLevels = 13;
263 ctx->Const.MaxCubeTextureLevels = 13;
264 ctx->Const.MaxTextureRectSize = 4096;
265 }
266 else {
267 ctx->Const.MaxTextureLevels = 12;
268 ctx->Const.MaxCubeTextureLevels = 12;
269 ctx->Const.MaxTextureRectSize = 2048;
270 }
271
272 ctx->Const.MinPointSize = 1.0;
273 ctx->Const.MinPointSizeAA = 1.0;
274 ctx->Const.MaxPointSize = R300_POINTSIZE_MAX;
275 ctx->Const.MaxPointSizeAA = R300_POINTSIZE_MAX;
276
277 ctx->Const.MinLineWidth = 1.0;
278 ctx->Const.MinLineWidthAA = 1.0;
279 ctx->Const.MaxLineWidth = R300_LINESIZE_MAX;
280 ctx->Const.MaxLineWidthAA = R300_LINESIZE_MAX;
281
282 ctx->Const.MaxDrawBuffers = 1;
283
284 /* currently bogus data */
285 if (r300->options.hw_tcl_enabled) {
286 ctx->Const.VertexProgram.MaxInstructions = VSF_MAX_FRAGMENT_LENGTH / 4;
287 ctx->Const.VertexProgram.MaxNativeInstructions =
288 VSF_MAX_FRAGMENT_LENGTH / 4;
289 ctx->Const.VertexProgram.MaxNativeAttribs = 16; /* r420 */
290 ctx->Const.VertexProgram.MaxTemps = 32;
291 ctx->Const.VertexProgram.MaxNativeTemps =
292 /*VSF_MAX_FRAGMENT_TEMPS */ 32;
293 ctx->Const.VertexProgram.MaxNativeParameters = 256; /* r420 */
294 ctx->Const.VertexProgram.MaxNativeAddressRegs = 1;
295 }
296
297 if (screen->chip_family >= CHIP_FAMILY_RV515) {
298 ctx->Const.FragmentProgram.MaxNativeTemps = R500_PFS_NUM_TEMP_REGS;
299 ctx->Const.FragmentProgram.MaxNativeAttribs = 11; /* copy i915... */
300 ctx->Const.FragmentProgram.MaxNativeParameters = R500_PFS_NUM_CONST_REGS;
301 ctx->Const.FragmentProgram.MaxNativeAluInstructions = R500_PFS_MAX_INST;
302 ctx->Const.FragmentProgram.MaxNativeTexInstructions = R500_PFS_MAX_INST;
303 ctx->Const.FragmentProgram.MaxNativeInstructions = R500_PFS_MAX_INST;
304 ctx->Const.FragmentProgram.MaxNativeTexIndirections = R500_PFS_MAX_INST;
305 ctx->Const.FragmentProgram.MaxNativeAddressRegs = 0;
306 } else {
307 ctx->Const.FragmentProgram.MaxNativeTemps = R300_PFS_NUM_TEMP_REGS;
308 ctx->Const.FragmentProgram.MaxNativeAttribs = 11; /* copy i915... */
309 ctx->Const.FragmentProgram.MaxNativeParameters = R300_PFS_NUM_CONST_REGS;
310 ctx->Const.FragmentProgram.MaxNativeAluInstructions = R300_PFS_MAX_ALU_INST;
311 ctx->Const.FragmentProgram.MaxNativeTexInstructions = R300_PFS_MAX_TEX_INST;
312 ctx->Const.FragmentProgram.MaxNativeInstructions = R300_PFS_MAX_ALU_INST + R300_PFS_MAX_TEX_INST;
313 ctx->Const.FragmentProgram.MaxNativeTexIndirections = R300_PFS_MAX_TEX_INDIRECT;
314 ctx->Const.FragmentProgram.MaxNativeAddressRegs = 0;
315 }
316
317 if (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV530)
318 r300->num_z_pipes = 2;
319 else
320 r300->num_z_pipes = r300->radeon.radeonScreen->num_gb_pipes;
321 }
322
323 static void r300ParseOptions(r300ContextPtr r300, radeonScreenPtr screen)
324 {
325 struct r300_options options = { 0 };
326
327 driParseConfigFiles(&r300->radeon.optionCache, &screen->optionCache,
328 screen->driScreen->myNum, "r300");
329
330 r300->radeon.initialMaxAnisotropy = driQueryOptionf(&r300->radeon.optionCache, "def_max_anisotropy");
331
332 options.stencil_two_side_disabled = driQueryOptionb(&r300->radeon.optionCache, "disable_stencil_two_side");
333 options.s3tc_force_enabled = driQueryOptionb(&r300->radeon.optionCache, "force_s3tc_enable");
334 options.s3tc_force_disabled = driQueryOptionb(&r300->radeon.optionCache, "disable_s3tc");
335
336 if (!(screen->chip_flags & RADEON_CHIPSET_TCL) || driQueryOptioni(&r300->radeon.optionCache, "tcl_mode") == DRI_CONF_TCL_SW)
337 options.hw_tcl_enabled = 0;
338 else
339 options.hw_tcl_enabled = 1;
340
341 options.conformance_mode = !driQueryOptionb(&r300->radeon.optionCache, "disable_lowimpact_fallback");
342
343 r300->options = options;
344 }
345
346 static void r300InitGLExtensions(GLcontext *ctx)
347 {
348 r300ContextPtr r300 = R300_CONTEXT(ctx);
349
350 driInitExtensions(ctx, card_extensions, GL_TRUE);
351 if (r300->radeon.radeonScreen->kernel_mm)
352 driInitExtensions(ctx, mm_extensions, GL_FALSE);
353
354 if (r300->options.stencil_two_side_disabled)
355 _mesa_disable_extension(ctx, "GL_EXT_stencil_two_side");
356
357 if (ctx->Mesa_DXTn && !r300->options.s3tc_force_enabled) {
358 _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc");
359 _mesa_enable_extension(ctx, "GL_S3_s3tc");
360 } else if (r300->options.s3tc_force_disabled) {
361 _mesa_disable_extension(ctx, "GL_EXT_texture_compression_s3tc");
362 }
363
364 if (!r300->radeon.radeonScreen->drmSupportsOcclusionQueries ||
365 !r300->options.hw_tcl_enabled) {
366 _mesa_disable_extension(ctx, "GL_ARB_occlusion_query");
367 }
368 }
369
370 /* Create the device specific rendering context.
371 */
372 GLboolean r300CreateContext(const __GLcontextModes * glVisual,
373 __DRIcontextPrivate * driContextPriv,
374 void *sharedContextPrivate)
375 {
376 __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
377 radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
378 struct dd_function_table functions;
379 r300ContextPtr r300;
380 GLcontext *ctx;
381
382 assert(glVisual);
383 assert(driContextPriv);
384 assert(screen);
385
386 r300 = (r300ContextPtr) CALLOC(sizeof(*r300));
387 if (!r300)
388 return GL_FALSE;
389
390 r300ParseOptions(r300, screen);
391
392 r300_init_vtbl(&r300->radeon);
393
394 _mesa_init_driver_functions(&functions);
395 r300InitIoctlFuncs(&functions);
396 r300InitStateFuncs(&functions);
397 r300InitTextureFuncs(&functions);
398 r300InitShaderFuncs(&functions);
399 r300InitQueryObjFunctions(&functions);
400 radeonInitBufferObjectFuncs(&functions);
401
402 if (!radeonInitContext(&r300->radeon, &functions,
403 glVisual, driContextPriv,
404 sharedContextPrivate)) {
405 FREE(r300);
406 return GL_FALSE;
407 }
408
409 ctx = r300->radeon.glCtx;
410
411 r300->fallback = 0;
412 if (r300->options.hw_tcl_enabled)
413 ctx->VertexProgram._MaintainTnlProgram = GL_TRUE;
414
415 ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
416
417 r300InitConstValues(ctx, screen);
418
419 _mesa_set_mvp_with_dp4( ctx, GL_TRUE );
420
421 /* Initialize the software rasterizer and helper modules.
422 */
423 _swrast_CreateContext(ctx);
424 _vbo_CreateContext(ctx);
425 _tnl_CreateContext(ctx);
426 _swsetup_CreateContext(ctx);
427 _swsetup_Wakeup(ctx);
428
429 /* Install the customized pipeline:
430 */
431 _tnl_destroy_pipeline(ctx);
432 _tnl_install_pipeline(ctx, r300_pipeline);
433 TNL_CONTEXT(ctx)->Driver.RunPipeline = _tnl_run_pipeline;
434
435 /* Configure swrast and TNL to match hardware characteristics:
436 */
437 _swrast_allow_pixel_fog(ctx, GL_FALSE);
438 _swrast_allow_vertex_fog(ctx, GL_TRUE);
439 _tnl_allow_pixel_fog(ctx, GL_FALSE);
440 _tnl_allow_vertex_fog(ctx, GL_TRUE);
441
442 if (r300->options.hw_tcl_enabled) {
443 r300InitDraw(ctx);
444 } else {
445 r300InitSwtcl(ctx);
446 }
447
448 radeon_fbo_init(&r300->radeon);
449 radeonInitSpanFuncs( ctx );
450 r300InitCmdBuf(r300);
451 r300InitState(r300);
452 r300InitShaderFunctions(r300);
453
454 r300InitGLExtensions(ctx);
455
456 make_empty_list(&r300->query.not_flushed_head);
457
458 return GL_TRUE;
459 }
460