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>
39 #include "main/glheader.h"
40 #include "main/api_arrayelt.h"
41 #include "main/context.h"
42 #include "main/simple_list.h"
43 #include "main/imports.h"
44 #include "main/extensions.h"
45 #include "main/bufferobj.h"
46 #include "main/texobj.h"
47 #include "main/mfeatures.h"
49 #include "swrast/swrast.h"
50 #include "swrast_setup/swrast_setup.h"
54 #include "tnl/t_pipeline.h"
56 #include "drivers/common/driverfuncs.h"
57 #include "drivers/common/meta.h"
59 #include "r300_context.h"
60 #include "radeon_span.h"
61 #include "r300_blit.h"
62 #include "r300_cmdbuf.h"
63 #include "r300_state.h"
65 #include "r300_emit.h"
66 #include "r300_render.h"
67 #include "r300_swtcl.h"
68 #include "radeon_bocs_wrapper.h"
69 #include "radeon_buffer_objects.h"
70 #include "radeon_queryobj.h"
73 #include "xmlpool.h" /* for symbolic values of enum-type options */
76 static const struct tnl_pipeline_stage
*r300_pipeline
[] = {
77 /* Catch any t&l fallbacks
79 &_tnl_vertex_transform_stage
,
80 &_tnl_normal_transform_stage
,
82 &_tnl_fog_coordinate_stage
,
84 &_tnl_texture_transform_stage
,
85 &_tnl_point_attenuation_stage
,
86 &_tnl_vertex_program_stage
,
91 static void r300_get_lock(radeonContextPtr rmesa
)
93 drm_radeon_sarea_t
*sarea
= rmesa
->sarea
;
95 if (sarea
->ctx_owner
!= rmesa
->dri
.hwContext
) {
96 sarea
->ctx_owner
= rmesa
->dri
.hwContext
;
97 if (!rmesa
->radeonScreen
->kernel_mm
)
98 radeon_bo_legacy_texture_age(rmesa
->radeonScreen
->bom
);
102 static void r300_vtbl_emit_cs_header(struct radeon_cs
*cs
, radeonContextPtr rmesa
)
104 /* please flush pipe do all pending work */
105 radeon_cs_write_dword(cs
, cmdpacket0(rmesa
->radeonScreen
,
106 R300_SC_SCREENDOOR
, 1));
107 radeon_cs_write_dword(cs
, 0x0);
108 radeon_cs_write_dword(cs
, cmdpacket0(rmesa
->radeonScreen
,
109 R300_SC_SCREENDOOR
, 1));
110 radeon_cs_write_dword(cs
, 0x00FFFFFF);
111 radeon_cs_write_dword(cs
, cmdpacket0(rmesa
->radeonScreen
,
113 radeon_cs_write_dword(cs
, 0x0);
114 radeon_cs_write_dword(cs
, cmdpacket0(rmesa
->radeonScreen
,
116 radeon_cs_write_dword(cs
, 0x0);
117 radeon_cs_write_dword(cs
, cmdpacket0(rmesa
->radeonScreen
,
119 radeon_cs_write_dword(cs
, 0x0);
120 radeon_cs_write_dword(cs
, cmdwait(rmesa
->radeonScreen
, R300_WAIT_3D
));
121 radeon_cs_write_dword(cs
, cmdpacket0(rmesa
->radeonScreen
,
122 R300_RB3D_DSTCACHE_CTLSTAT
, 1));
123 radeon_cs_write_dword(cs
, R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D
);
124 radeon_cs_write_dword(cs
, cmdpacket0(rmesa
->radeonScreen
,
125 R300_ZB_ZCACHE_CTLSTAT
, 1));
126 radeon_cs_write_dword(cs
, R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE
);
127 radeon_cs_write_dword(cs
, cmdwait(rmesa
->radeonScreen
,
128 R300_WAIT_3D
| R300_WAIT_3D_CLEAN
));
131 static void r300_vtbl_pre_emit_atoms(radeonContextPtr radeon
)
133 BATCH_LOCALS(radeon
);
135 cp_wait(radeon
, R300_WAIT_3D
| R300_WAIT_3D_CLEAN
);
136 BEGIN_BATCH_NO_AUTOSTATE(2);
137 OUT_BATCH_REGVAL(R300_TX_INVALTAGS
, R300_TX_FLUSH
);
142 static void r300_fallback(struct gl_context
*ctx
, GLuint bit
, GLboolean mode
)
144 r300ContextPtr r300
= R300_CONTEXT(ctx
);
146 r300
->radeon
.Fallback
|= bit
;
148 r300
->radeon
.Fallback
&= ~bit
;
150 r300SwitchFallback(ctx
, R300_FALLBACK_RADEON_COMMON
, mode
);
153 static void r300_emit_query_finish(radeonContextPtr radeon
)
155 r300ContextPtr r300
= (r300ContextPtr
)radeon
;
156 struct radeon_query_object
*query
= radeon
->query
.current
;
157 BATCH_LOCALS(radeon
);
159 BEGIN_BATCH_NO_AUTOSTATE(3 * 2 *r300
->radeon
.radeonScreen
->num_gb_pipes
+ 2);
160 switch (r300
->radeon
.radeonScreen
->num_gb_pipes
) {
162 OUT_BATCH_REGVAL(R300_SU_REG_DEST
, R300_RASTER_PIPE_SELECT_3
);
163 OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR
, 1);
164 OUT_BATCH_RELOC(0, query
->bo
, query
->curr_offset
+3*sizeof(uint32_t), 0, RADEON_GEM_DOMAIN_GTT
, 0);
166 OUT_BATCH_REGVAL(R300_SU_REG_DEST
, R300_RASTER_PIPE_SELECT_2
);
167 OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR
, 1);
168 OUT_BATCH_RELOC(0, query
->bo
, query
->curr_offset
+2*sizeof(uint32_t), 0, RADEON_GEM_DOMAIN_GTT
, 0);
170 if (r300
->radeon
.radeonScreen
->chip_family
<= CHIP_FAMILY_RV380
) {
171 OUT_BATCH_REGVAL(R300_SU_REG_DEST
, R300_RASTER_PIPE_SELECT_3
);
173 OUT_BATCH_REGVAL(R300_SU_REG_DEST
, R300_RASTER_PIPE_SELECT_1
);
175 OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR
, 1);
176 OUT_BATCH_RELOC(0, query
->bo
, query
->curr_offset
+1*sizeof(uint32_t), 0, RADEON_GEM_DOMAIN_GTT
, 0);
179 OUT_BATCH_REGVAL(R300_SU_REG_DEST
, R300_RASTER_PIPE_SELECT_0
);
180 OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR
, 1);
181 OUT_BATCH_RELOC(0, query
->bo
, query
->curr_offset
, 0, RADEON_GEM_DOMAIN_GTT
, 0);
184 OUT_BATCH_REGVAL(R300_SU_REG_DEST
, R300_RASTER_PIPE_SELECT_ALL
);
186 query
->curr_offset
+= r300
->radeon
.radeonScreen
->num_gb_pipes
* sizeof(uint32_t);
187 assert(query
->curr_offset
< RADEON_QUERY_PAGE_SIZE
);
188 query
->emitted_begin
= GL_FALSE
;
191 static void rv530_emit_query_finish_single_z(radeonContextPtr radeon
)
193 BATCH_LOCALS(radeon
);
194 struct radeon_query_object
*query
= radeon
->query
.current
;
196 BEGIN_BATCH_NO_AUTOSTATE(8);
197 OUT_BATCH_REGVAL(RV530_FG_ZBREG_DEST
, RV530_FG_ZBREG_DEST_PIPE_SELECT_0
);
198 OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR
, 1);
199 OUT_BATCH_RELOC(0, query
->bo
, query
->curr_offset
, 0, RADEON_GEM_DOMAIN_GTT
, 0);
200 OUT_BATCH_REGVAL(RV530_FG_ZBREG_DEST
, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL
);
203 query
->curr_offset
+= sizeof(uint32_t);
204 assert(query
->curr_offset
< RADEON_QUERY_PAGE_SIZE
);
205 query
->emitted_begin
= GL_FALSE
;
208 static void rv530_emit_query_finish_double_z(radeonContextPtr radeon
)
210 BATCH_LOCALS(radeon
);
211 struct radeon_query_object
*query
= radeon
->query
.current
;
213 BEGIN_BATCH_NO_AUTOSTATE(14);
214 OUT_BATCH_REGVAL(RV530_FG_ZBREG_DEST
, RV530_FG_ZBREG_DEST_PIPE_SELECT_0
);
215 OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR
, 1);
216 OUT_BATCH_RELOC(0, query
->bo
, query
->curr_offset
, 0, RADEON_GEM_DOMAIN_GTT
, 0);
217 OUT_BATCH_REGVAL(RV530_FG_ZBREG_DEST
, RV530_FG_ZBREG_DEST_PIPE_SELECT_1
);
218 OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR
, 1);
219 OUT_BATCH_RELOC(0, query
->bo
, query
->curr_offset
+ sizeof(uint32_t), 0, RADEON_GEM_DOMAIN_GTT
, 0);
220 OUT_BATCH_REGVAL(RV530_FG_ZBREG_DEST
, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL
);
223 query
->curr_offset
+= 2 * sizeof(uint32_t);
224 assert(query
->curr_offset
< RADEON_QUERY_PAGE_SIZE
);
225 query
->emitted_begin
= GL_FALSE
;
228 static void r300_init_vtbl(radeonContextPtr radeon
)
230 radeon
->vtbl
.get_lock
= r300_get_lock
;
231 radeon
->vtbl
.update_viewport_offset
= r300UpdateViewportOffset
;
232 radeon
->vtbl
.emit_cs_header
= r300_vtbl_emit_cs_header
;
233 radeon
->vtbl
.swtcl_flush
= r300_swtcl_flush
;
234 radeon
->vtbl
.pre_emit_atoms
= r300_vtbl_pre_emit_atoms
;
235 radeon
->vtbl
.fallback
= r300_fallback
;
236 if (radeon
->radeonScreen
->chip_family
== CHIP_FAMILY_RV530
) {
237 if (radeon
->radeonScreen
->num_z_pipes
== 2)
238 radeon
->vtbl
.emit_query_finish
= rv530_emit_query_finish_double_z
;
240 radeon
->vtbl
.emit_query_finish
= rv530_emit_query_finish_single_z
;
242 radeon
->vtbl
.emit_query_finish
= r300_emit_query_finish
;
244 radeon
->vtbl
.check_blit
= r300_check_blit
;
245 radeon
->vtbl
.blit
= r300_blit
;
247 if (radeon
->radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
) {
248 radeon
->vtbl
.is_format_renderable
= r500IsFormatRenderable
;
250 radeon
->vtbl
.is_format_renderable
= r300IsFormatRenderable
;
254 static void r300InitConstValues(struct gl_context
*ctx
, radeonScreenPtr screen
)
256 r300ContextPtr r300
= R300_CONTEXT(ctx
);
258 ctx
->Const
.MaxTextureImageUnits
=
259 driQueryOptioni(&r300
->radeon
.optionCache
, "texture_image_units");
260 ctx
->Const
.MaxTextureCoordUnits
=
261 driQueryOptioni(&r300
->radeon
.optionCache
, "texture_coord_units");
262 ctx
->Const
.MaxTextureUnits
= MIN2(ctx
->Const
.MaxTextureImageUnits
,
263 ctx
->Const
.MaxTextureCoordUnits
);
264 ctx
->Const
.MaxCombinedTextureImageUnits
=
265 ctx
->Const
.MaxVertexTextureImageUnits
+
266 ctx
->Const
.MaxTextureImageUnits
;
269 ctx
->Const
.MaxTextureMaxAnisotropy
= 16.0;
270 ctx
->Const
.MaxTextureLodBias
= 16.0;
272 if (screen
->chip_family
>= CHIP_FAMILY_RV515
) {
273 ctx
->Const
.MaxTextureLevels
= 13;
274 ctx
->Const
.MaxCubeTextureLevels
= 13;
275 ctx
->Const
.MaxTextureRectSize
= 4096;
276 ctx
->Const
.MaxRenderbufferSize
= 4096;
279 ctx
->Const
.MaxTextureLevels
= 12;
280 ctx
->Const
.MaxCubeTextureLevels
= 12;
281 ctx
->Const
.MaxTextureRectSize
= 2048;
282 ctx
->Const
.MaxRenderbufferSize
= 2048;
285 ctx
->Const
.MinPointSize
= 1.0;
286 ctx
->Const
.MinPointSizeAA
= 1.0;
287 ctx
->Const
.MaxPointSize
= R300_POINTSIZE_MAX
;
288 ctx
->Const
.MaxPointSizeAA
= R300_POINTSIZE_MAX
;
290 ctx
->Const
.MinLineWidth
= 1.0;
291 ctx
->Const
.MinLineWidthAA
= 1.0;
292 ctx
->Const
.MaxLineWidth
= R300_LINESIZE_MAX
;
293 ctx
->Const
.MaxLineWidthAA
= R300_LINESIZE_MAX
;
295 ctx
->Const
.MaxDrawBuffers
= 1;
296 ctx
->Const
.MaxColorAttachments
= 1;
298 if (r300
->options
.hw_tcl_enabled
) {
299 ctx
->Const
.VertexProgram
.MaxNativeInstructions
= 255;
300 ctx
->Const
.VertexProgram
.MaxNativeAluInstructions
= 255;
301 ctx
->Const
.VertexProgram
.MaxNativeAttribs
= 16;
302 ctx
->Const
.VertexProgram
.MaxNativeTemps
= 32;
303 ctx
->Const
.VertexProgram
.MaxNativeParameters
= 256;
304 ctx
->Const
.VertexProgram
.MaxNativeAddressRegs
= 1;
307 if (screen
->chip_family
>= CHIP_FAMILY_RV515
) {
308 ctx
->Const
.FragmentProgram
.MaxNativeTemps
= R500_PFS_NUM_TEMP_REGS
;
309 ctx
->Const
.FragmentProgram
.MaxNativeAttribs
= 11; /* copy i915... */
311 /* The hardware limits are higher than this,
312 * but the non-KMS DRM interface artificially limits us
313 * to this many instructions.
315 * We could of course work around it in the KMS path,
316 * but it would be a mess, so it seems wiser
317 * to leave it as is. Going forward, the Gallium driver
318 * will not be subject to these limitations.
320 ctx
->Const
.FragmentProgram
.MaxNativeParameters
= 255;
321 ctx
->Const
.FragmentProgram
.MaxNativeAluInstructions
= 255;
322 ctx
->Const
.FragmentProgram
.MaxNativeTexInstructions
= 255;
323 ctx
->Const
.FragmentProgram
.MaxNativeInstructions
= 255;
324 ctx
->Const
.FragmentProgram
.MaxNativeTexIndirections
= 255;
325 ctx
->Const
.FragmentProgram
.MaxNativeAddressRegs
= 0;
327 ctx
->Const
.FragmentProgram
.MaxNativeTemps
= R300_PFS_NUM_TEMP_REGS
;
328 ctx
->Const
.FragmentProgram
.MaxNativeAttribs
= 11; /* copy i915... */
329 ctx
->Const
.FragmentProgram
.MaxNativeParameters
= R300_PFS_NUM_CONST_REGS
;
330 ctx
->Const
.FragmentProgram
.MaxNativeAluInstructions
= R300_PFS_MAX_ALU_INST
;
331 ctx
->Const
.FragmentProgram
.MaxNativeTexInstructions
= R300_PFS_MAX_TEX_INST
;
332 ctx
->Const
.FragmentProgram
.MaxNativeInstructions
= R300_PFS_MAX_ALU_INST
+ R300_PFS_MAX_TEX_INST
;
333 ctx
->Const
.FragmentProgram
.MaxNativeTexIndirections
= R300_PFS_MAX_TEX_INDIRECT
;
334 ctx
->Const
.FragmentProgram
.MaxNativeAddressRegs
= 0;
339 static void r300ParseOptions(r300ContextPtr r300
, radeonScreenPtr screen
)
341 struct r300_options options
= { 0 };
343 driParseConfigFiles(&r300
->radeon
.optionCache
, &screen
->optionCache
,
344 screen
->driScreen
->myNum
, "r300");
346 r300
->radeon
.initialMaxAnisotropy
= driQueryOptionf(&r300
->radeon
.optionCache
, "def_max_anisotropy");
348 options
.stencil_two_side_disabled
= driQueryOptionb(&r300
->radeon
.optionCache
, "disable_stencil_two_side");
349 options
.s3tc_force_enabled
= driQueryOptionb(&r300
->radeon
.optionCache
, "force_s3tc_enable");
350 options
.s3tc_force_disabled
= driQueryOptionb(&r300
->radeon
.optionCache
, "disable_s3tc");
352 if (!(screen
->chip_flags
& RADEON_CHIPSET_TCL
) || driQueryOptioni(&r300
->radeon
.optionCache
, "tcl_mode") == DRI_CONF_TCL_SW
)
353 options
.hw_tcl_enabled
= 0;
355 options
.hw_tcl_enabled
= 1;
357 options
.conformance_mode
= !driQueryOptionb(&r300
->radeon
.optionCache
, "disable_lowimpact_fallback");
359 r300
->options
= options
;
362 static void r300InitGLExtensions(struct gl_context
*ctx
)
364 r300ContextPtr r300
= R300_CONTEXT(ctx
);
366 ctx
->Extensions
.ARB_depth_texture
= true;
367 ctx
->Extensions
.ARB_fragment_program
= true;
368 ctx
->Extensions
.ARB_shadow
= true;
369 ctx
->Extensions
.ARB_shadow_ambient
= true;
370 ctx
->Extensions
.ARB_texture_border_clamp
= true;
371 ctx
->Extensions
.ARB_texture_cube_map
= true;
372 ctx
->Extensions
.ARB_texture_env_combine
= true;
373 ctx
->Extensions
.ARB_texture_env_crossbar
= true;
374 ctx
->Extensions
.ARB_texture_env_dot3
= true;
375 ctx
->Extensions
.ARB_texture_mirrored_repeat
= true;
376 ctx
->Extensions
.ARB_vertex_program
= true;
377 ctx
->Extensions
.EXT_blend_color
= true;
378 ctx
->Extensions
.EXT_blend_equation_separate
= true;
379 ctx
->Extensions
.EXT_blend_func_separate
= true;
380 ctx
->Extensions
.EXT_blend_minmax
= true;
381 ctx
->Extensions
.EXT_blend_subtract
= true;
382 ctx
->Extensions
.EXT_fog_coord
= true;
383 ctx
->Extensions
.EXT_gpu_program_parameters
= true;
384 ctx
->Extensions
.EXT_point_parameters
= true;
385 ctx
->Extensions
.EXT_provoking_vertex
= true;
386 ctx
->Extensions
.EXT_secondary_color
= true;
387 ctx
->Extensions
.EXT_shadow_funcs
= true;
388 ctx
->Extensions
.EXT_stencil_wrap
= true;
389 ctx
->Extensions
.EXT_texture_env_combine
= true;
390 ctx
->Extensions
.EXT_texture_env_dot3
= true;
391 ctx
->Extensions
.EXT_texture_filter_anisotropic
= true;
392 ctx
->Extensions
.EXT_texture_lod_bias
= true;
393 ctx
->Extensions
.EXT_texture_mirror_clamp
= true;
394 ctx
->Extensions
.EXT_texture_sRGB
= true;
395 ctx
->Extensions
.EXT_vertex_array_bgra
= true;
396 ctx
->Extensions
.ATI_separate_stencil
= true;
397 ctx
->Extensions
.ATI_texture_env_combine3
= true;
398 ctx
->Extensions
.ATI_texture_mirror_once
= true;
399 ctx
->Extensions
.MESA_pack_invert
= true;
400 ctx
->Extensions
.MESA_ycbcr_texture
= true;
401 ctx
->Extensions
.NV_blend_square
= true;
402 ctx
->Extensions
.NV_texture_rectangle
= true;
403 ctx
->Extensions
.NV_vertex_program
= true;
404 #if FEATURE_OES_EGL_image
405 ctx
->Extensions
.OES_EGL_image
= true;
408 if (r300
->radeon
.radeonScreen
->kernel_mm
) {
409 ctx
->Extensions
.EXT_framebuffer_blit
= true;
410 ctx
->Extensions
.EXT_framebuffer_object
= true;
413 ctx
->Extensions
.EXT_stencil_two_side
=
414 !r300
->options
.stencil_two_side_disabled
;
416 if (r300
->options
.s3tc_force_disabled
) {
417 ctx
->Extensions
.EXT_texture_compression_s3tc
= false;
418 } else if (ctx
->Mesa_DXTn
|| r300
->options
.s3tc_force_enabled
) {
419 ctx
->Extensions
.EXT_texture_compression_s3tc
= true;
420 ctx
->Extensions
.S3_s3tc
= true;
423 ctx
->Extensions
.ARB_occlusion_query
=
424 r300
->radeon
.radeonScreen
->drmSupportsOcclusionQueries
;
426 ctx
->Extensions
.ARB_half_float_vertex
=
427 (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_R420
);
429 ctx
->Extensions
.EXT_packed_depth_stencil
=
430 (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
);
433 static void r300InitIoctlFuncs(struct dd_function_table
*functions
)
435 functions
->Clear
= _mesa_meta_Clear
;
436 functions
->Finish
= radeonFinish
;
437 functions
->Flush
= radeonFlush
;
440 /* Create the device specific rendering context.
442 GLboolean
r300CreateContext(gl_api api
,
443 const struct gl_config
* glVisual
,
444 __DRIcontext
* driContextPriv
,
445 void *sharedContextPrivate
)
447 __DRIscreen
*sPriv
= driContextPriv
->driScreenPriv
;
448 radeonScreenPtr screen
= (radeonScreenPtr
) (sPriv
->private);
449 struct dd_function_table functions
;
451 struct gl_context
*ctx
;
454 assert(driContextPriv
);
457 r300
= (r300ContextPtr
) CALLOC(sizeof(*r300
));
461 r300ParseOptions(r300
, screen
);
463 r300
->radeon
.radeonScreen
= screen
;
464 r300_init_vtbl(&r300
->radeon
);
466 _mesa_init_driver_functions(&functions
);
467 r300InitIoctlFuncs(&functions
);
468 r300InitStateFuncs(&r300
->radeon
, &functions
);
469 r300InitTextureFuncs(&r300
->radeon
, &functions
);
470 r300InitShaderFuncs(&functions
);
471 radeonInitQueryObjFunctions(&functions
);
472 radeonInitBufferObjectFuncs(&functions
);
474 if (!radeonInitContext(&r300
->radeon
, &functions
,
475 glVisual
, driContextPriv
,
476 sharedContextPrivate
)) {
481 ctx
= r300
->radeon
.glCtx
;
484 if (r300
->options
.hw_tcl_enabled
)
485 ctx
->VertexProgram
._MaintainTnlProgram
= GL_TRUE
;
487 ctx
->FragmentProgram
._MaintainTexEnvProgram
= GL_TRUE
;
489 r300InitConstValues(ctx
, screen
);
491 _mesa_set_mvp_with_dp4( ctx
, GL_TRUE
);
493 /* Initialize the software rasterizer and helper modules.
495 _swrast_CreateContext(ctx
);
496 _vbo_CreateContext(ctx
);
497 _tnl_CreateContext(ctx
);
498 _swsetup_CreateContext(ctx
);
499 _swsetup_Wakeup(ctx
);
501 /* Install the customized pipeline:
503 _tnl_destroy_pipeline(ctx
);
504 _tnl_install_pipeline(ctx
, r300_pipeline
);
505 TNL_CONTEXT(ctx
)->Driver
.RunPipeline
= _tnl_run_pipeline
;
507 /* Configure swrast and TNL to match hardware characteristics:
509 _swrast_allow_pixel_fog(ctx
, GL_FALSE
);
510 _swrast_allow_vertex_fog(ctx
, GL_TRUE
);
511 _tnl_allow_pixel_fog(ctx
, GL_FALSE
);
512 _tnl_allow_vertex_fog(ctx
, GL_TRUE
);
514 if (r300
->options
.hw_tcl_enabled
) {
520 r300_blit_init(r300
);
521 radeon_fbo_init(&r300
->radeon
);
522 radeonInitSpanFuncs( ctx
);
523 r300InitCmdBuf(r300
);
525 r300InitShaderFunctions(r300
);
527 r300InitGLExtensions(ctx
);