Merge branch 'radeon-fbo-hacking' into radeon-rewrite
[platform/upstream/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_swtcl.h"
68 #include "radeon_bocs_wrapper.h"
69
70
71 #include "vblank.h"
72 #include "utils.h"
73 #include "xmlpool.h"            /* for symbolic values of enum-type options */
74
75 /* hw_tcl_on derives from future_hw_tcl_on when its safe to change it. */
76 int future_hw_tcl_on = 1;
77 int hw_tcl_on = 1;
78
79 #define need_GL_VERSION_2_0
80 #define need_GL_ARB_point_parameters
81 #define need_GL_ARB_vertex_program
82 #define need_GL_EXT_blend_equation_separate
83 #define need_GL_EXT_blend_func_separate
84 #define need_GL_EXT_blend_minmax
85 #define need_GL_EXT_framebuffer_object
86 #define need_GL_EXT_fog_coord
87 #define need_GL_EXT_gpu_program_parameters
88 #define need_GL_EXT_secondary_color
89 #define need_GL_EXT_stencil_two_side
90 #define need_GL_ATI_separate_stencil
91 #define need_GL_NV_vertex_program
92
93 #include "extension_helper.h"
94
95
96 const struct dri_extension card_extensions[] = {
97   /* *INDENT-OFF* */
98   {"GL_ARB_depth_texture",              NULL},
99   {"GL_ARB_fragment_program",           NULL},
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_ATI_separate_stencil",           GL_ATI_separate_stencil_functions},
131   {"GL_ATI_texture_env_combine3",       NULL},
132   {"GL_ATI_texture_mirror_once",        NULL},
133   {"GL_MESA_pack_invert",               NULL},
134   {"GL_MESA_ycbcr_texture",             NULL},
135   {"GL_MESAX_texture_float",            NULL},
136   {"GL_NV_blend_square",                NULL},
137   {"GL_NV_vertex_program",              GL_NV_vertex_program_functions},
138   {"GL_SGIS_generate_mipmap",           NULL},
139   {NULL,                                NULL}
140   /* *INDENT-ON* */
141 };
142
143
144 const struct dri_extension mm_extensions[] = {
145   { "GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions },
146   { NULL, NULL }
147 };
148
149 /**
150  * The GL 2.0 functions are needed to make display lists work with
151  * functions added by GL_ATI_separate_stencil.
152  */
153 const struct dri_extension gl_20_extension[] = {
154   {"GL_VERSION_2_0",                    GL_VERSION_2_0_functions },
155 };
156
157
158 extern struct tnl_pipeline_stage _r300_render_stage;
159 extern const struct tnl_pipeline_stage _r300_tcl_stage;
160
161 static const struct tnl_pipeline_stage *r300_pipeline[] = {
162
163         /* Try and go straight to t&l
164          */
165         &_r300_tcl_stage,
166
167         /* Catch any t&l fallbacks
168          */
169         &_tnl_vertex_transform_stage,
170         &_tnl_normal_transform_stage,
171         &_tnl_lighting_stage,
172         &_tnl_fog_coordinate_stage,
173         &_tnl_texgen_stage,
174         &_tnl_texture_transform_stage,
175         &_tnl_vertex_program_stage,
176
177         /* Try again to go to tcl?
178          *     - no good for asymmetric-twoside (do with multipass)
179          *     - no good for asymmetric-unfilled (do with multipass)
180          *     - good for material
181          *     - good for texgen
182          *     - need to manipulate a bit of state
183          *
184          * - worth it/not worth it?
185          */
186
187         /* Else do them here.
188          */
189         &_r300_render_stage,
190         &_tnl_render_stage,     /* FALLBACK  */
191         0,
192 };
193
194 static void r300RunPipeline(GLcontext * ctx)
195 {
196     _mesa_lock_context_textures(ctx);
197
198     if (ctx->NewState)
199         _mesa_update_state_locked(ctx);
200     
201     _tnl_run_pipeline(ctx);
202     _mesa_unlock_context_textures(ctx);
203 }
204
205 static void r300_get_lock(radeonContextPtr rmesa)
206 {
207         drm_radeon_sarea_t *sarea = rmesa->sarea;
208
209         if (sarea->ctx_owner != rmesa->dri.hwContext) {
210                 sarea->ctx_owner = rmesa->dri.hwContext;
211                 if (!rmesa->radeonScreen->kernel_mm)
212                         radeon_bo_legacy_texture_age(rmesa->radeonScreen->bom);
213         }
214 }                 
215
216 static void r300_vtbl_emit_cs_header(struct radeon_cs *cs, radeonContextPtr rmesa)
217 {
218     /* please flush pipe do all pending work */
219     radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
220                                   R300_SC_SCREENDOOR, 1));
221     radeon_cs_write_dword(cs, 0x0);
222     radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
223                                   R300_SC_SCREENDOOR, 1));
224     radeon_cs_write_dword(cs, 0x00FFFFFF);
225     radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
226                                   R300_SC_HYPERZ, 1));
227     radeon_cs_write_dword(cs, 0x0);
228     radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
229                                   R300_US_CONFIG, 1));
230     radeon_cs_write_dword(cs, 0x0);
231     radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
232                                   R300_ZB_CNTL, 1));
233     radeon_cs_write_dword(cs, 0x0);
234     radeon_cs_write_dword(cs, cmdwait(rmesa->radeonScreen, R300_WAIT_3D));
235     radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
236                                   R300_RB3D_DSTCACHE_CTLSTAT, 1));
237     radeon_cs_write_dword(cs, R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
238     radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
239                                   R300_ZB_ZCACHE_CTLSTAT, 1));
240     radeon_cs_write_dword(cs, R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE);
241     radeon_cs_write_dword(cs, cmdwait(rmesa->radeonScreen,
242                                R300_WAIT_3D | R300_WAIT_3D_CLEAN));
243 }
244
245 static void r300_vtbl_pre_emit_atoms(radeonContextPtr radeon)
246 {
247         r300ContextPtr r300 = (r300ContextPtr)radeon;
248         BATCH_LOCALS(radeon);
249         
250         r300->vap_flush_needed = GL_TRUE;
251         
252         cp_wait(radeon, R300_WAIT_3D | R300_WAIT_3D_CLEAN);
253         BEGIN_BATCH_NO_AUTOSTATE(2);
254         OUT_BATCH_REGVAL(R300_TX_INVALTAGS, R300_TX_FLUSH);
255         END_BATCH();
256         end_3d(radeon);
257 }
258
259 static void r300_fallback(GLcontext *ctx, GLuint bit, GLboolean mode)
260 {
261         r300ContextPtr r300 = R300_CONTEXT(ctx);
262         if (mode)
263                 r300->radeon.Fallback |= bit;
264         else
265                 r300->radeon.Fallback &= ~bit;
266 }
267
268 static void r300_init_vtbl(radeonContextPtr radeon)
269 {
270         radeon->vtbl.get_lock = r300_get_lock;
271         radeon->vtbl.update_viewport_offset = r300UpdateViewportOffset;
272         radeon->vtbl.emit_cs_header = r300_vtbl_emit_cs_header;
273         radeon->vtbl.swtcl_flush = r300_swtcl_flush;
274         radeon->vtbl.pre_emit_atoms = r300_vtbl_pre_emit_atoms;
275         radeon->vtbl.fallback = r300_fallback;
276 }
277
278
279 /* Create the device specific rendering context.
280  */
281 GLboolean r300CreateContext(const __GLcontextModes * glVisual,
282                             __DRIcontextPrivate * driContextPriv,
283                             void *sharedContextPrivate)
284 {
285         __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
286         radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
287         struct dd_function_table functions;
288         r300ContextPtr r300;
289         GLcontext *ctx;
290         int tcl_mode;
291
292         assert(glVisual);
293         assert(driContextPriv);
294         assert(screen);
295
296         /* Allocate the R300 context */
297         r300 = (r300ContextPtr) CALLOC(sizeof(*r300));
298         if (!r300)
299                 return GL_FALSE;
300
301         if (!(screen->chip_flags & RADEON_CHIPSET_TCL))
302                 hw_tcl_on = future_hw_tcl_on = 0;
303
304         r300_init_vtbl(&r300->radeon);
305         /* Parse configuration files.
306          * Do this here so that initialMaxAnisotropy is set before we create
307          * the default textures.
308          */
309         driParseConfigFiles(&r300->radeon.optionCache, &screen->optionCache,
310                             screen->driScreen->myNum, "r300");
311         r300->radeon.initialMaxAnisotropy = driQueryOptionf(&r300->radeon.optionCache,
312                                                      "def_max_anisotropy");
313
314         /* Init default driver functions then plug in our R300-specific functions
315          * (the texture functions are especially important)
316          */
317         _mesa_init_driver_functions(&functions);
318         r300InitIoctlFuncs(&functions);
319         r300InitStateFuncs(&functions);
320         r300InitTextureFuncs(&functions);
321         r300InitShaderFuncs(&functions);
322
323         if (!radeonInitContext(&r300->radeon, &functions,
324                                glVisual, driContextPriv,
325                                sharedContextPrivate)) {
326                 FREE(r300);
327                 return GL_FALSE;
328         }
329
330         /* Init r300 context data */
331         r300->radeon.texture_depth = driQueryOptioni(&r300->radeon.optionCache,
332                                               "texture_depth");
333         if (r300->radeon.texture_depth == DRI_CONF_TEXTURE_DEPTH_FB)
334                 r300->radeon.texture_depth = (screen->cpp == 4) ?
335                     DRI_CONF_TEXTURE_DEPTH_32 : DRI_CONF_TEXTURE_DEPTH_16;
336
337         /* Set the maximum texture size small enough that we can guarentee that
338          * all texture units can bind a maximal texture and have them both in
339          * texturable memory at once.
340          */
341
342         ctx = r300->radeon.glCtx;
343
344         ctx->Const.MaxTextureImageUnits =
345             driQueryOptioni(&r300->radeon.optionCache, "texture_image_units");
346         ctx->Const.MaxTextureCoordUnits =
347             driQueryOptioni(&r300->radeon.optionCache, "texture_coord_units");
348         ctx->Const.MaxTextureUnits =
349             MIN2(ctx->Const.MaxTextureImageUnits,
350                  ctx->Const.MaxTextureCoordUnits);
351         ctx->Const.MaxTextureMaxAnisotropy = 16.0;
352         ctx->Const.MaxTextureLodBias = 16.0;
353
354         if (screen->chip_family >= CHIP_FAMILY_RV515) {
355             ctx->Const.MaxTextureLevels = 13;
356             ctx->Const.MaxTextureRectSize = 4096;
357         }
358
359         ctx->Const.MinPointSize = 1.0;
360         ctx->Const.MinPointSizeAA = 1.0;
361         ctx->Const.MaxPointSize = R300_POINTSIZE_MAX;
362         ctx->Const.MaxPointSizeAA = R300_POINTSIZE_MAX;
363
364         ctx->Const.MinLineWidth = 1.0;
365         ctx->Const.MinLineWidthAA = 1.0;
366         ctx->Const.MaxLineWidth = R300_LINESIZE_MAX;
367         ctx->Const.MaxLineWidthAA = R300_LINESIZE_MAX;
368
369         /* Needs further modifications */
370 #if 0
371         ctx->Const.MaxArrayLockSize =
372             ( /*512 */ RADEON_BUFFER_SIZE * 16 * 1024) / (4 * 4);
373 #endif
374
375         ctx->Const.MaxDrawBuffers = 1;
376
377         /* Initialize the software rasterizer and helper modules.
378          */
379         _swrast_CreateContext(ctx);
380         _vbo_CreateContext(ctx);
381         _tnl_CreateContext(ctx);
382         _swsetup_CreateContext(ctx);
383         _swsetup_Wakeup(ctx);
384         _ae_create_context(ctx);
385
386         /* Install the customized pipeline:
387          */
388         _tnl_destroy_pipeline(ctx);
389         _tnl_install_pipeline(ctx, r300_pipeline);
390
391         /* Try and keep materials and vertices separate:
392          */
393 /*      _tnl_isolate_materials(ctx, GL_TRUE); */
394
395         /* Configure swrast and TNL to match hardware characteristics:
396          */
397         _swrast_allow_pixel_fog(ctx, GL_FALSE);
398         _swrast_allow_vertex_fog(ctx, GL_TRUE);
399         _tnl_allow_pixel_fog(ctx, GL_FALSE);
400         _tnl_allow_vertex_fog(ctx, GL_TRUE);
401
402         /* currently bogus data */
403         if (screen->chip_flags & RADEON_CHIPSET_TCL) {
404                 ctx->Const.VertexProgram.MaxInstructions = VSF_MAX_FRAGMENT_LENGTH / 4;
405                 ctx->Const.VertexProgram.MaxNativeInstructions =
406                   VSF_MAX_FRAGMENT_LENGTH / 4;
407                 ctx->Const.VertexProgram.MaxNativeAttribs = 16; /* r420 */
408                 ctx->Const.VertexProgram.MaxTemps = 32;
409                 ctx->Const.VertexProgram.MaxNativeTemps =
410                   /*VSF_MAX_FRAGMENT_TEMPS */ 32;
411                 ctx->Const.VertexProgram.MaxNativeParameters = 256;     /* r420 */
412                 ctx->Const.VertexProgram.MaxNativeAddressRegs = 1;
413         }
414
415         ctx->Const.FragmentProgram.MaxNativeTemps = PFS_NUM_TEMP_REGS;
416         ctx->Const.FragmentProgram.MaxNativeAttribs = 11;       /* copy i915... */
417         ctx->Const.FragmentProgram.MaxNativeParameters = PFS_NUM_CONST_REGS;
418         ctx->Const.FragmentProgram.MaxNativeAluInstructions = PFS_MAX_ALU_INST;
419         ctx->Const.FragmentProgram.MaxNativeTexInstructions = PFS_MAX_TEX_INST;
420         ctx->Const.FragmentProgram.MaxNativeInstructions =
421             PFS_MAX_ALU_INST + PFS_MAX_TEX_INST;
422         ctx->Const.FragmentProgram.MaxNativeTexIndirections =
423             PFS_MAX_TEX_INDIRECT;
424         ctx->Const.FragmentProgram.MaxNativeAddressRegs = 0;    /* and these are?? */
425         ctx->VertexProgram._MaintainTnlProgram = GL_TRUE;
426         ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
427
428         driInitExtensions(ctx, card_extensions, GL_TRUE);
429         if (r300->radeon.radeonScreen->kernel_mm)
430           driInitExtensions(ctx, mm_extensions, GL_FALSE);
431
432         if (driQueryOptionb
433             (&r300->radeon.optionCache, "disable_stencil_two_side"))
434                 _mesa_disable_extension(ctx, "GL_EXT_stencil_two_side");
435
436         if (r300->radeon.glCtx->Mesa_DXTn
437             && !driQueryOptionb(&r300->radeon.optionCache, "disable_s3tc")) {
438                 _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc");
439                 _mesa_enable_extension(ctx, "GL_S3_s3tc");
440         } else
441             if (driQueryOptionb(&r300->radeon.optionCache, "force_s3tc_enable"))
442         {
443                 _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc");
444         }
445
446         r300->disable_lowimpact_fallback =
447             driQueryOptionb(&r300->radeon.optionCache,
448                             "disable_lowimpact_fallback");
449         radeon_fbo_init(&r300->radeon);
450         radeonInitSpanFuncs( ctx );
451         r300InitCmdBuf(r300);
452         r300InitState(r300);
453         if (!(screen->chip_flags & RADEON_CHIPSET_TCL))
454                 r300InitSwtcl(ctx);
455
456         TNL_CONTEXT(ctx)->Driver.RunPipeline = r300RunPipeline;
457
458         tcl_mode = driQueryOptioni(&r300->radeon.optionCache, "tcl_mode");
459         if (driQueryOptionb(&r300->radeon.optionCache, "no_rast")) {
460                 fprintf(stderr, "disabling 3D acceleration\n");
461 #if R200_MERGED
462                 FALLBACK(&r300->radeon, RADEON_FALLBACK_DISABLE, 1);
463 #endif
464         }
465         if (tcl_mode == DRI_CONF_TCL_SW ||
466             !(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL)) {
467                 if (r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL) {
468                         r300->radeon.radeonScreen->chip_flags &=
469                             ~RADEON_CHIPSET_TCL;
470                         fprintf(stderr, "Disabling HW TCL support\n");
471                 }
472                 TCL_FALLBACK(r300->radeon.glCtx,
473                              RADEON_TCL_FALLBACK_TCL_DISABLE, 1);
474         }
475
476         return GL_TRUE;
477 }
478
479 /* Destroy the device specific context.
480  */
481 void r300DestroyContext(__DRIcontextPrivate * driContextPriv)
482 {
483         GET_CURRENT_CONTEXT(ctx);
484         r300ContextPtr r300 = (r300ContextPtr) driContextPriv->driverPrivate;
485         radeonContextPtr radeon = (radeonContextPtr) r300;
486         radeonContextPtr current = ctx ? RADEON_CONTEXT(ctx) : NULL;
487
488         if (RADEON_DEBUG & DEBUG_DRI) {
489                 fprintf(stderr, "Destroying context !\n");
490         }
491
492         /* check if we're deleting the currently bound context */
493         if (&r300->radeon == current) {
494                 radeonFlush(r300->radeon.glCtx);
495                 _mesa_make_current(NULL, NULL, NULL);
496         }
497
498         /* Free r300 context resources */
499         assert(r300);           /* should never be null */
500
501         if (r300) {
502                 _swsetup_DestroyContext(r300->radeon.glCtx);
503                 _tnl_DestroyContext(r300->radeon.glCtx);
504                 _vbo_DestroyContext(r300->radeon.glCtx);
505                 _swrast_DestroyContext(r300->radeon.glCtx);
506
507                 rcommonFlushCmdBuf(&r300->radeon, __FUNCTION__);
508
509                 if (radeon->state.scissor.pClipRects) {
510                         FREE(radeon->state.scissor.pClipRects);
511                         radeon->state.scissor.pClipRects = NULL;
512                 }
513
514                 r300DestroyCmdBuf(r300);
515
516                 radeonCleanupContext(&r300->radeon);
517
518
519                 /* the memory manager might be accessed when Mesa frees the shared
520                  * state, so don't destroy it earlier
521                  */
522
523
524                 FREE(r300);
525         }
526 }