2 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
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.
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:
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.
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.
28 **************************************************************************/
33 * \author Keith Whitwell <keith@tungstengraphics.com>
35 * \author Nicolai Haehnle <prefect_@gmx.net>
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"
49 #include "swrast/swrast.h"
50 #include "swrast_setup/swrast_setup.h"
54 #include "tnl/t_pipeline.h"
55 #include "tnl/t_vp_build.h"
57 #include "drivers/common/driverfuncs.h"
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"
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"
75 #include "xmlpool.h" /* for symbolic values of enum-type options */
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
92 #include "extension_helper.h"
95 const struct dri_extension card_extensions
[] = {
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
},
146 const struct dri_extension mm_extensions
[] = {
147 { "GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions
},
152 * The GL 2.0 functions are needed to make display lists work with
153 * functions added by GL_ATI_separate_stencil.
155 const struct dri_extension gl_20_extension
[] = {
156 {"GL_VERSION_2_0", GL_VERSION_2_0_functions
},
159 static const struct tnl_pipeline_stage
*r300_pipeline
[] = {
160 /* Catch any t&l fallbacks
162 &_tnl_vertex_transform_stage
,
163 &_tnl_normal_transform_stage
,
164 &_tnl_lighting_stage
,
165 &_tnl_fog_coordinate_stage
,
167 &_tnl_texture_transform_stage
,
168 &_tnl_point_attenuation_stage
,
169 &_tnl_vertex_program_stage
,
174 static void r300_get_lock(radeonContextPtr rmesa
)
176 drm_radeon_sarea_t
*sarea
= rmesa
->sarea
;
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
);
185 static void r300_vtbl_emit_cs_header(struct radeon_cs
*cs
, radeonContextPtr rmesa
)
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
,
196 radeon_cs_write_dword(cs
, 0x0);
197 radeon_cs_write_dword(cs
, cmdpacket0(rmesa
->radeonScreen
,
199 radeon_cs_write_dword(cs
, 0x0);
200 radeon_cs_write_dword(cs
, cmdpacket0(rmesa
->radeonScreen
,
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
));
214 static void r300_vtbl_pre_emit_atoms(radeonContextPtr radeon
)
216 r300ContextPtr r300
= (r300ContextPtr
)radeon
;
217 BATCH_LOCALS(radeon
);
219 r300
->vap_flush_needed
= GL_TRUE
;
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
);
228 static void r300_fallback(GLcontext
*ctx
, GLuint bit
, GLboolean mode
)
230 r300ContextPtr r300
= R300_CONTEXT(ctx
);
232 r300
->radeon
.Fallback
|= bit
;
234 r300
->radeon
.Fallback
&= ~bit
;
237 static void r300_init_vtbl(radeonContextPtr radeon
)
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
;
247 static void r300InitConstValues(GLcontext
*ctx
, radeonScreenPtr screen
)
249 r300ContextPtr r300
= R300_CONTEXT(ctx
);
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
);
258 ctx
->Const
.MaxTextureMaxAnisotropy
= 16.0;
259 ctx
->Const
.MaxTextureLodBias
= 16.0;
261 if (screen
->chip_family
>= CHIP_FAMILY_RV515
) {
262 ctx
->Const
.MaxTextureLevels
= 13;
263 ctx
->Const
.MaxCubeTextureLevels
= 13;
264 ctx
->Const
.MaxTextureRectSize
= 4096;
267 ctx
->Const
.MaxTextureLevels
= 12;
268 ctx
->Const
.MaxCubeTextureLevels
= 12;
269 ctx
->Const
.MaxTextureRectSize
= 2048;
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
;
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
;
282 ctx
->Const
.MaxDrawBuffers
= 1;
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;
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;
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;
317 if (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV530
)
318 r300
->num_z_pipes
= 2;
320 r300
->num_z_pipes
= r300
->radeon
.radeonScreen
->num_gb_pipes
;
323 static void r300ParseOptions(r300ContextPtr r300
, radeonScreenPtr screen
)
325 struct r300_options options
= { 0 };
327 driParseConfigFiles(&r300
->radeon
.optionCache
, &screen
->optionCache
,
328 screen
->driScreen
->myNum
, "r300");
330 r300
->radeon
.initialMaxAnisotropy
= driQueryOptionf(&r300
->radeon
.optionCache
, "def_max_anisotropy");
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");
336 if (!(screen
->chip_flags
& RADEON_CHIPSET_TCL
) || driQueryOptioni(&r300
->radeon
.optionCache
, "tcl_mode") == DRI_CONF_TCL_SW
)
337 options
.hw_tcl_enabled
= 0;
339 options
.hw_tcl_enabled
= 1;
341 options
.conformance_mode
= !driQueryOptionb(&r300
->radeon
.optionCache
, "disable_lowimpact_fallback");
343 r300
->options
= options
;
346 static void r300InitGLExtensions(GLcontext
*ctx
)
348 r300ContextPtr r300
= R300_CONTEXT(ctx
);
350 driInitExtensions(ctx
, card_extensions
, GL_TRUE
);
351 if (r300
->radeon
.radeonScreen
->kernel_mm
)
352 driInitExtensions(ctx
, mm_extensions
, GL_FALSE
);
354 if (r300
->options
.stencil_two_side_disabled
)
355 _mesa_disable_extension(ctx
, "GL_EXT_stencil_two_side");
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");
364 if (!r300
->radeon
.radeonScreen
->drmSupportsOcclusionQueries
||
365 !r300
->options
.hw_tcl_enabled
) {
366 _mesa_disable_extension(ctx
, "GL_ARB_occlusion_query");
370 /* Create the device specific rendering context.
372 GLboolean
r300CreateContext(const __GLcontextModes
* glVisual
,
373 __DRIcontextPrivate
* driContextPriv
,
374 void *sharedContextPrivate
)
376 __DRIscreenPrivate
*sPriv
= driContextPriv
->driScreenPriv
;
377 radeonScreenPtr screen
= (radeonScreenPtr
) (sPriv
->private);
378 struct dd_function_table functions
;
383 assert(driContextPriv
);
386 r300
= (r300ContextPtr
) CALLOC(sizeof(*r300
));
390 r300ParseOptions(r300
, screen
);
392 r300_init_vtbl(&r300
->radeon
);
394 _mesa_init_driver_functions(&functions
);
395 r300InitIoctlFuncs(&functions
);
396 r300InitStateFuncs(&functions
);
397 r300InitTextureFuncs(&functions
);
398 r300InitShaderFuncs(&functions
);
399 r300InitQueryObjFunctions(&functions
);
400 radeonInitBufferObjectFuncs(&functions
);
402 if (!radeonInitContext(&r300
->radeon
, &functions
,
403 glVisual
, driContextPriv
,
404 sharedContextPrivate
)) {
409 ctx
= r300
->radeon
.glCtx
;
412 if (r300
->options
.hw_tcl_enabled
)
413 ctx
->VertexProgram
._MaintainTnlProgram
= GL_TRUE
;
415 ctx
->FragmentProgram
._MaintainTexEnvProgram
= GL_TRUE
;
417 r300InitConstValues(ctx
, screen
);
419 _mesa_set_mvp_with_dp4( ctx
, GL_TRUE
);
421 /* Initialize the software rasterizer and helper modules.
423 _swrast_CreateContext(ctx
);
424 _vbo_CreateContext(ctx
);
425 _tnl_CreateContext(ctx
);
426 _swsetup_CreateContext(ctx
);
427 _swsetup_Wakeup(ctx
);
429 /* Install the customized pipeline:
431 _tnl_destroy_pipeline(ctx
);
432 _tnl_install_pipeline(ctx
, r300_pipeline
);
433 TNL_CONTEXT(ctx
)->Driver
.RunPipeline
= _tnl_run_pipeline
;
435 /* Configure swrast and TNL to match hardware characteristics:
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
);
442 if (r300
->options
.hw_tcl_enabled
) {
448 radeon_fbo_init(&r300
->radeon
);
449 radeonInitSpanFuncs( ctx
);
450 r300InitCmdBuf(r300
);
452 r300InitShaderFunctions(r300
);
454 r300InitGLExtensions(ctx
);
456 make_empty_list(&r300
->query
.not_flushed_head
);