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 **************************************************************************/
32 * Keith Whitwell <keith@tungstengraphics.com>
33 * Nicolai Haehnle <prefect_@gmx.net>
37 #include "api_arrayelt.h"
39 #include "simple_list.h"
42 #include "extensions.h"
45 #include "swrast/swrast.h"
46 #include "swrast_setup/swrast_setup.h"
47 #include "array_cache/acache.h"
50 #include "tnl/t_pipeline.h"
52 #include "drivers/common/driverfuncs.h"
54 #include "radeon_ioctl.h"
55 #include "radeon_span.h"
56 #include "r300_context.h"
57 #include "r300_cmdbuf.h"
58 #include "r300_state.h"
59 #include "r300_ioctl.h"
63 #include "xmlpool.h" /* for symbolic values of enum-type options */
66 /* Extension strings exported by the R300 driver.
68 static const char *const card_extensions
[] = {
70 "GL_ARB_multitexture",
71 "GL_ARB_texture_border_clamp",
72 "GL_ARB_texture_compression",
73 "GL_ARB_texture_cube_map",
74 "GL_ARB_texture_env_add",
75 "GL_ARB_texture_env_combine",
76 "GL_ARB_texture_env_dot3",
77 "GL_ARB_texture_mirrored_repeat",
78 "GL_ARB_vertex_buffer_object",
79 "GL_ARB_vertex_program",
80 "GL_EXT_blend_equation_separate",
81 "GL_EXT_blend_func_separate",
82 "GL_EXT_blend_minmax",
83 "GL_EXT_blend_subtract",
84 "GL_EXT_secondary_color",
85 "GL_EXT_stencil_wrap",
86 "GL_EXT_texture_edge_clamp",
87 "GL_EXT_texture_env_combine",
88 "GL_EXT_texture_env_dot3",
89 "GL_EXT_texture_filter_anisotropic",
90 "GL_EXT_texture_lod_bias",
91 "GL_EXT_texture_mirror_clamp",
92 "GL_EXT_texture_rectangle",
93 "GL_ATI_texture_env_combine3",
94 "GL_ATI_texture_mirror_once",
95 "GL_MESA_pack_invert",
96 "GL_MESA_ycbcr_texture",
98 "GL_NV_vertex_program",
99 "GL_SGIS_generate_mipmap",
103 extern struct tnl_pipeline_stage _r300_render_stage
;
105 static const struct tnl_pipeline_stage
*r300_pipeline
[] = {
107 /* Try and go straight to t&l
111 /* Catch any t&l fallbacks
113 &_tnl_vertex_transform_stage
,
114 &_tnl_normal_transform_stage
,
115 &_tnl_lighting_stage
,
116 &_tnl_fog_coordinate_stage
,
118 &_tnl_texture_transform_stage
,
119 &_tnl_vertex_program_stage
,
121 /* Try again to go to tcl?
122 * - no good for asymmetric-twoside (do with multipass)
123 * - no good for asymmetric-unfilled (do with multipass)
124 * - good for material
126 * - need to manipulate a bit of state
128 * - worth it/not worth it?
131 /* Else do them here.
134 &_tnl_render_stage
, /* FALLBACK */
139 /* Create the device specific rendering context.
141 GLboolean
r300CreateContext(const __GLcontextModes
* glVisual
,
142 __DRIcontextPrivate
* driContextPriv
,
143 void *sharedContextPrivate
)
145 __DRIscreenPrivate
*sPriv
= driContextPriv
->driScreenPriv
;
146 radeonScreenPtr screen
= (radeonScreenPtr
) (sPriv
->private);
147 struct dd_function_table functions
;
153 assert(driContextPriv
);
156 /* Allocate the R300 context */
157 r300
= (r300ContextPtr
)CALLOC(sizeof(*r300
));
161 /* Parse configuration files.
162 * Do this here so that initialMaxAnisotropy is set before we create
163 * the default textures.
165 driParseConfigFiles(&r300
->radeon
.optionCache
, &screen
->optionCache
,
166 screen
->driScreen
->myNum
, "r300");
168 /* Init default driver functions then plug in our R300-specific functions
169 * (the texture functions are especially important)
171 _mesa_init_driver_functions(&functions
);
172 r300InitIoctlFuncs(&functions
);
173 r300InitStateFuncs(&functions
);
174 //r200InitTextureFuncs(&functions);
176 if (!radeonInitContext(&r300
->radeon
, &functions
,
177 glVisual
, driContextPriv
, sharedContextPrivate
)) {
182 /* Init r300 context data */
184 /* Set the maximum texture size small enough that we can guarentee that
185 * all texture units can bind a maximal texture and have them both in
186 * texturable memory at once.
189 ctx
= r300
->radeon
.glCtx
;
190 ctx
->Const
.MaxTextureImageUnits
= driQueryOptioni(&r300
->radeon
.optionCache
,
191 "texture_image_units");
192 ctx
->Const
.MaxTextureCoordUnits
= driQueryOptioni(&r300
->radeon
.optionCache
,
193 "texture_coord_units");
194 ctx
->Const
.MaxTextureUnits
= MIN2(ctx
->Const
.MaxTextureImageUnits
,
195 ctx
->Const
.MaxTextureCoordUnits
);
196 ctx
->Const
.MaxTextureMaxAnisotropy
= 16.0;
200 ctx
->Const
.MinPointSize
= 1.0;
201 ctx
->Const
.MinPointSizeAA
= 1.0;
202 ctx
->Const
.MaxPointSize
= 1.0;
203 ctx
->Const
.MaxPointSizeAA
= 1.0;
205 ctx
->Const
.MinLineWidth
= 1.0;
206 ctx
->Const
.MinLineWidthAA
= 1.0;
207 ctx
->Const
.MaxLineWidth
= 1.0;
208 ctx
->Const
.MaxLineWidthAA
= 1.0;
210 /* Initialize the software rasterizer and helper modules.
212 _swrast_CreateContext(ctx
);
213 _ac_CreateContext(ctx
);
214 _tnl_CreateContext(ctx
);
215 _swsetup_CreateContext(ctx
);
216 _ae_create_context(ctx
);
218 /* Install the customized pipeline:
220 _tnl_destroy_pipeline(ctx
);
221 _tnl_install_pipeline(ctx
, r300_pipeline
);
223 /* Try and keep materials and vertices separate:
225 _tnl_isolate_materials(ctx
, GL_TRUE
);
227 /* Configure swrast and TNL to match hardware characteristics:
229 _swrast_allow_pixel_fog(ctx
, GL_FALSE
);
230 _swrast_allow_vertex_fog(ctx
, GL_TRUE
);
231 _tnl_allow_pixel_fog(ctx
, GL_FALSE
);
232 _tnl_allow_vertex_fog(ctx
, GL_TRUE
);
234 driInitExtensions(ctx
, card_extensions
, GL_TRUE
);
236 radeonInitSpanFuncs(ctx
);
237 r300InitCmdBuf(r300
);
240 /* plug in a few more device driver functions */
241 /* XXX these should really go right after _mesa_init_driver_functions() */
242 r200InitPixelFuncs(ctx
);
245 TNL_CONTEXT(ctx
)->Driver
.RunPipeline
= _tnl_run_pipeline
;
247 tcl_mode
= driQueryOptioni(&r300
->radeon
.optionCache
, "tcl_mode");
249 driQueryOptionb(&r300
->radeon
.optionCache
, "no_rast")) {
250 fprintf(stderr
, "disabling 3D acceleration\n");
251 FALLBACK(&r300
->radeon
, RADEON_FALLBACK_DISABLE
, 1);
253 if (tcl_mode
== DRI_CONF_TCL_SW
||
254 !(r300
->radeon
.radeonScreen
->chipset
& RADEON_CHIPSET_TCL
)) {
255 if (r300
->radeon
.radeonScreen
->chipset
& RADEON_CHIPSET_TCL
) {
256 r300
->radeon
.radeonScreen
->chipset
&= ~RADEON_CHIPSET_TCL
;
257 fprintf(stderr
, "Disabling HW TCL support\n");
259 TCL_FALLBACK(r300
->radeon
.glCtx
, RADEON_TCL_FALLBACK_TCL_DISABLE
, 1);
265 /* Destroy the device specific context.
267 void r300DestroyContext(__DRIcontextPrivate
* driContextPriv
)
269 GET_CURRENT_CONTEXT(ctx
);
270 r300ContextPtr r300
= (r300ContextPtr
) driContextPriv
->driverPrivate
;
271 radeonContextPtr current
= ctx
? RADEON_CONTEXT(ctx
) : NULL
;
273 /* check if we're deleting the currently bound context */
274 if (&r300
->radeon
== current
) {
275 radeonFlush(r300
->radeon
.glCtx
);
276 _mesa_make_current2(NULL
, NULL
, NULL
);
279 /* Free r300 context resources */
280 assert(r300
); /* should never be null */
283 GLboolean release_texture_heaps
;
285 release_texture_heaps
= (r300
->radeon
.glCtx
->Shared
->RefCount
== 1);
286 _swsetup_DestroyContext(r300
->radeon
.glCtx
);
287 _tnl_DestroyContext(r300
->radeon
.glCtx
);
288 _ac_DestroyContext(r300
->radeon
.glCtx
);
289 _swrast_DestroyContext(r300
->radeon
.glCtx
);
291 r300DestroyCmdBuf(r300
);
293 radeonCleanupContext(&r300
->radeon
);
295 /* free the option cache */
296 driDestroyOptionCache(&r300
->radeon
.optionCache
);