(Stephane Marchesin, me) add hyperz support to radeon and r200 drivers. Only fast...
[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 * Authors:
32 * Keith Whitwell <keith@tungstengraphics.com>
33 * Nicolai Haehnle <prefect_@gmx.net>
34 */
35
36 #include "glheader.h"
37 #include "api_arrayelt.h"
38 #include "context.h"
39 #include "simple_list.h"
40 #include "imports.h"
41 #include "matrix.h"
42 #include "extensions.h"
43 #include "state.h"
44
45 #include "swrast/swrast.h"
46 #include "swrast_setup/swrast_setup.h"
47 #include "array_cache/acache.h"
48
49 #include "tnl/tnl.h"
50 #include "tnl/t_pipeline.h"
51
52 #include "drivers/common/driverfuncs.h"
53
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"
60
61 #include "vblank.h"
62 #include "utils.h"
63 #include "xmlpool.h" /* for symbolic values of enum-type options */
64
65
66 /* Extension strings exported by the R300 driver.
67 */
68 static const char *const card_extensions[] = {
69 "GL_ARB_multisample",
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",
97 "GL_NV_blend_square",
98 "GL_NV_vertex_program",
99 "GL_SGIS_generate_mipmap",
100 NULL
101 };
102
103 extern struct tnl_pipeline_stage _r300_render_stage;
104
105 static const struct tnl_pipeline_stage *r300_pipeline[] = {
106
107 /* Try and go straight to t&l
108 */
109 // &_r300_tcl_stage,
110
111 /* Catch any t&l fallbacks
112 */
113 &_tnl_vertex_transform_stage,
114 &_tnl_normal_transform_stage,
115 &_tnl_lighting_stage,
116 &_tnl_fog_coordinate_stage,
117 &_tnl_texgen_stage,
118 &_tnl_texture_transform_stage,
119 &_tnl_vertex_program_stage,
120
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
125 * - good for texgen
126 * - need to manipulate a bit of state
127 *
128 * - worth it/not worth it?
129 */
130
131 /* Else do them here.
132 */
133 &_r300_render_stage,
134 &_tnl_render_stage, /* FALLBACK */
135 0,
136 };
137
138
139 /* Create the device specific rendering context.
140 */
141 GLboolean r300CreateContext(const __GLcontextModes * glVisual,
142 __DRIcontextPrivate * driContextPriv,
143 void *sharedContextPrivate)
144 {
145 __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
146 radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
147 struct dd_function_table functions;
148 r300ContextPtr r300;
149 GLcontext *ctx;
150 int tcl_mode;
151
152 assert(glVisual);
153 assert(driContextPriv);
154 assert(screen);
155
156 /* Allocate the R300 context */
157 r300 = (r300ContextPtr)CALLOC(sizeof(*r300));
158 if (!r300)
159 return GL_FALSE;
160
161 /* Parse configuration files.
162 * Do this here so that initialMaxAnisotropy is set before we create
163 * the default textures.
164 */
165 driParseConfigFiles(&r300->radeon.optionCache, &screen->optionCache,
166 screen->driScreen->myNum, "r300");
167
168 /* Init default driver functions then plug in our R300-specific functions
169 * (the texture functions are especially important)
170 */
171 _mesa_init_driver_functions(&functions);
172 r300InitIoctlFuncs(&functions);
173 r300InitStateFuncs(&functions);
174 //r200InitTextureFuncs(&functions);
175
176 if (!radeonInitContext(&r300->radeon, &functions,
177 glVisual, driContextPriv, sharedContextPrivate)) {
178 FREE(r300);
179 return GL_FALSE;
180 }
181
182 /* Init r300 context data */
183
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.
187 */
188
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;
197
198 /* No wide points.
199 */
200 ctx->Const.MinPointSize = 1.0;
201 ctx->Const.MinPointSizeAA = 1.0;
202 ctx->Const.MaxPointSize = 1.0;
203 ctx->Const.MaxPointSizeAA = 1.0;
204
205 ctx->Const.MinLineWidth = 1.0;
206 ctx->Const.MinLineWidthAA = 1.0;
207 ctx->Const.MaxLineWidth = 1.0;
208 ctx->Const.MaxLineWidthAA = 1.0;
209
210 /* Initialize the software rasterizer and helper modules.
211 */
212 _swrast_CreateContext(ctx);
213 _ac_CreateContext(ctx);
214 _tnl_CreateContext(ctx);
215 _swsetup_CreateContext(ctx);
216 _ae_create_context(ctx);
217
218 /* Install the customized pipeline:
219 */
220 _tnl_destroy_pipeline(ctx);
221 _tnl_install_pipeline(ctx, r300_pipeline);
222
223 /* Try and keep materials and vertices separate:
224 */
225 _tnl_isolate_materials(ctx, GL_TRUE);
226
227 /* Configure swrast and TNL to match hardware characteristics:
228 */
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);
233
234 driInitExtensions(ctx, card_extensions, GL_TRUE);
235
236 radeonInitSpanFuncs(ctx);
237 r300InitCmdBuf(r300);
238 r300InitState(r300);
239 #if 0
240 /* plug in a few more device driver functions */
241 /* XXX these should really go right after _mesa_init_driver_functions() */
242 r200InitPixelFuncs(ctx);
243 r200InitSwtcl(ctx);
244 #endif
245 TNL_CONTEXT(ctx)->Driver.RunPipeline = _tnl_run_pipeline;
246
247 tcl_mode = driQueryOptioni(&r300->radeon.optionCache, "tcl_mode");
248 if (1 ||
249 driQueryOptionb(&r300->radeon.optionCache, "no_rast")) {
250 fprintf(stderr, "disabling 3D acceleration\n");
251 FALLBACK(&r300->radeon, RADEON_FALLBACK_DISABLE, 1);
252 }
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");
258 }
259 TCL_FALLBACK(r300->radeon.glCtx, RADEON_TCL_FALLBACK_TCL_DISABLE, 1);
260 }
261
262 return GL_TRUE;
263 }
264
265 /* Destroy the device specific context.
266 */
267 void r300DestroyContext(__DRIcontextPrivate * driContextPriv)
268 {
269 GET_CURRENT_CONTEXT(ctx);
270 r300ContextPtr r300 = (r300ContextPtr) driContextPriv->driverPrivate;
271 radeonContextPtr current = ctx ? RADEON_CONTEXT(ctx) : NULL;
272
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);
277 }
278
279 /* Free r300 context resources */
280 assert(r300); /* should never be null */
281
282 if (r300) {
283 GLboolean release_texture_heaps;
284
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);
290
291 r300DestroyCmdBuf(r300);
292
293 radeonCleanupContext(&r300->radeon);
294
295 /* free the option cache */
296 driDestroyOptionCache(&r300->radeon.optionCache);
297
298 FREE(r300);
299 }
300 }