1 /* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_context.c,v 1.9 2003/09/24 02:43:12 dawes Exp $ */
2 /**************************************************************************
4 Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
5 VA Linux Systems Inc., Fremont, California.
9 Permission is hereby granted, free of charge, to any person obtaining
10 a copy of this software and associated documentation files (the
11 "Software"), to deal in the Software without restriction, including
12 without limitation the rights to use, copy, modify, merge, publish,
13 distribute, sublicense, and/or sell copies of the Software, and to
14 permit persons to whom the Software is furnished to do so, subject to
15 the following conditions:
17 The above copyright notice and this permission notice (including the
18 next paragraph) shall be included in all copies or substantial
19 portions of the Software.
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
25 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 **************************************************************************/
33 * Kevin E. Martin <martin@valinux.com>
34 * Gareth Hughes <gareth@valinux.com>
35 * Keith Whitwell <keith@tungstengraphics.com>
39 #include "api_arrayelt.h"
41 #include "simple_list.h"
44 #include "extensions.h"
45 #include "framebuffer.h"
47 #include "swrast/swrast.h"
48 #include "swrast_setup/swrast_setup.h"
49 #include "array_cache/acache.h"
52 #include "tnl/t_pipeline.h"
54 #include "drivers/common/driverfuncs.h"
56 #include "radeon_context.h"
57 #include "radeon_ioctl.h"
58 #include "radeon_state.h"
59 #include "radeon_span.h"
60 #include "radeon_tex.h"
61 #include "radeon_swtcl.h"
62 #include "radeon_tcl.h"
63 #include "radeon_vtxfmt.h"
64 #include "radeon_maos.h"
66 #define need_GL_ARB_multisample
67 #define need_GL_ARB_texture_compression
68 #define need_GL_EXT_blend_minmax
69 #define need_GL_EXT_secondary_color
70 #include "extension_helper.h"
72 #define DRIVER_DATE "20050528"
76 #include "xmlpool.h" /* for symbolic values of enum-type options */
78 int RADEON_DEBUG
= (0);
82 /* Return the width and height of the given buffer.
84 static void radeonGetBufferSize( GLframebuffer
*buffer
,
85 GLuint
*width
, GLuint
*height
)
87 GET_CURRENT_CONTEXT(ctx
);
88 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
90 LOCK_HARDWARE( rmesa
);
91 *width
= rmesa
->dri
.drawable
->w
;
92 *height
= rmesa
->dri
.drawable
->h
;
93 UNLOCK_HARDWARE( rmesa
);
96 /* Return various strings for glGetString().
98 static const GLubyte
*radeonGetString( GLcontext
*ctx
, GLenum name
)
100 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
101 static char buffer
[128];
103 GLuint agp_mode
= rmesa
->radeonScreen
->IsPCI
? 0 :
104 rmesa
->radeonScreen
->AGPMode
;
108 return (GLubyte
*)"Tungsten Graphics, Inc.";
111 offset
= driGetRendererString( buffer
, "Radeon", DRIVER_DATE
,
114 sprintf( & buffer
[ offset
], " %sTCL",
115 !(rmesa
->TclFallback
& RADEON_TCL_FALLBACK_TCL_DISABLE
)
118 return (GLubyte
*)buffer
;
126 /* Extension strings exported by the R100 driver.
128 static const struct dri_extension card_extensions
[] =
130 { "GL_ARB_multisample", GL_ARB_multisample_functions
},
131 { "GL_ARB_multitexture", NULL
},
132 { "GL_ARB_texture_border_clamp", NULL
},
133 { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions
},
134 { "GL_ARB_texture_env_add", NULL
},
135 { "GL_ARB_texture_env_combine", NULL
},
136 { "GL_ARB_texture_env_crossbar", NULL
},
137 { "GL_ARB_texture_env_dot3", NULL
},
138 { "GL_ARB_texture_mirrored_repeat", NULL
},
139 { "GL_EXT_blend_logic_op", NULL
},
140 { "GL_EXT_blend_subtract", GL_EXT_blend_minmax_functions
},
141 { "GL_EXT_secondary_color", GL_EXT_secondary_color_functions
},
142 { "GL_EXT_stencil_wrap", NULL
},
143 { "GL_EXT_texture_edge_clamp", NULL
},
144 { "GL_EXT_texture_env_combine", NULL
},
145 { "GL_EXT_texture_env_dot3", NULL
},
146 { "GL_EXT_texture_filter_anisotropic", NULL
},
147 { "GL_EXT_texture_lod_bias", NULL
},
148 { "GL_EXT_texture_mirror_clamp", NULL
},
149 { "GL_ATI_texture_env_combine3", NULL
},
150 { "GL_ATI_texture_mirror_once", NULL
},
151 { "GL_MESA_ycbcr_texture", NULL
},
152 { "GL_NV_blend_square", NULL
},
153 { "GL_SGIS_generate_mipmap", NULL
},
157 extern const struct tnl_pipeline_stage _radeon_texrect_stage
;
158 extern const struct tnl_pipeline_stage _radeon_render_stage
;
159 extern const struct tnl_pipeline_stage _radeon_tcl_stage
;
161 static const struct tnl_pipeline_stage
*radeon_pipeline
[] = {
163 /* Try and go straight to t&l
167 /* Catch any t&l fallbacks
169 &_tnl_vertex_transform_stage
,
170 &_tnl_normal_transform_stage
,
171 &_tnl_lighting_stage
,
172 &_tnl_fog_coordinate_stage
,
174 &_tnl_texture_transform_stage
,
176 /* Scale texture rectangle to 0..1.
178 &_radeon_texrect_stage
,
180 &_radeon_render_stage
,
181 &_tnl_render_stage
, /* FALLBACK: */
187 /* Initialize the driver's misc functions.
189 static void radeonInitDriverFuncs( struct dd_function_table
*functions
)
191 functions
->GetBufferSize
= radeonGetBufferSize
;
192 functions
->ResizeBuffers
= _mesa_resize_framebuffer
;
193 functions
->GetString
= radeonGetString
;
196 static const struct dri_debug_control debug_control
[] =
198 { "fall", DEBUG_FALLBACKS
},
199 { "tex", DEBUG_TEXTURE
},
200 { "ioctl", DEBUG_IOCTL
},
201 { "prim", DEBUG_PRIMS
},
202 { "vert", DEBUG_VERTS
},
203 { "state", DEBUG_STATE
},
204 { "code", DEBUG_CODEGEN
},
205 { "vfmt", DEBUG_VFMT
},
206 { "vtxf", DEBUG_VFMT
},
207 { "verb", DEBUG_VERBOSE
},
208 { "dri", DEBUG_DRI
},
209 { "dma", DEBUG_DMA
},
210 { "san", DEBUG_SANITY
},
211 { "sync", DEBUG_SYNC
},
217 get_ust_nop( int64_t * ust
)
224 /* Create the device specific context.
227 radeonCreateContext( const __GLcontextModes
*glVisual
,
228 __DRIcontextPrivate
*driContextPriv
,
229 void *sharedContextPrivate
)
231 __DRIscreenPrivate
*sPriv
= driContextPriv
->driScreenPriv
;
232 radeonScreenPtr screen
= (radeonScreenPtr
)(sPriv
->private);
233 struct dd_function_table functions
;
234 radeonContextPtr rmesa
;
235 GLcontext
*ctx
, *shareCtx
;
237 int tcl_mode
, fthrottle_mode
;
240 assert(driContextPriv
);
243 /* Allocate the Radeon context */
244 rmesa
= (radeonContextPtr
) CALLOC( sizeof(*rmesa
) );
248 /* Parse configuration files.
249 * Do this here so that initialMaxAnisotropy is set before we create
250 * the default textures.
252 driParseConfigFiles (&rmesa
->optionCache
, &screen
->optionCache
,
253 screen
->driScreen
->myNum
, "radeon");
254 rmesa
->initialMaxAnisotropy
= driQueryOptionf(&rmesa
->optionCache
,
255 "def_max_anisotropy");
257 if ( driQueryOptionb( &rmesa
->optionCache
, "hyperz" ) ) {
258 if ( sPriv
->drmMinor
< 13 )
259 fprintf( stderr
, "DRM version 1.%d too old to support HyperZ, "
260 "disabling.\n",sPriv
->drmMinor
);
262 rmesa
->using_hyperz
= GL_TRUE
;
265 if ( sPriv
->drmMinor
>= 15 )
266 rmesa
->texmicrotile
= GL_TRUE
;
268 /* Init default driver functions then plug in our Radeon-specific functions
269 * (the texture functions are especially important)
271 _mesa_init_driver_functions( &functions
);
272 radeonInitDriverFuncs( &functions
);
273 radeonInitTextureFuncs( &functions
);
275 /* Allocate the Mesa context */
276 if (sharedContextPrivate
)
277 shareCtx
= ((radeonContextPtr
) sharedContextPrivate
)->glCtx
;
280 rmesa
->glCtx
= _mesa_create_context(glVisual
, shareCtx
,
281 &functions
, (void *) rmesa
);
286 driContextPriv
->driverPrivate
= rmesa
;
288 /* Init radeon context data */
289 rmesa
->dri
.context
= driContextPriv
;
290 rmesa
->dri
.screen
= sPriv
;
291 rmesa
->dri
.drawable
= NULL
; /* Set by XMesaMakeCurrent */
292 rmesa
->dri
.hwContext
= driContextPriv
->hHWContext
;
293 rmesa
->dri
.hwLock
= &sPriv
->pSAREA
->lock
;
294 rmesa
->dri
.fd
= sPriv
->fd
;
295 rmesa
->dri
.drmMinor
= sPriv
->drmMinor
;
297 rmesa
->radeonScreen
= screen
;
298 rmesa
->sarea
= (drm_radeon_sarea_t
*)((GLubyte
*)sPriv
->pSAREA
+
299 screen
->sarea_priv_offset
);
302 rmesa
->dma
.buf0_address
= rmesa
->radeonScreen
->buffers
->list
[0].address
;
304 (void) memset( rmesa
->texture_heaps
, 0, sizeof( rmesa
->texture_heaps
) );
305 make_empty_list( & rmesa
->swapped
);
307 rmesa
->nr_heaps
= screen
->numTexHeaps
;
308 for ( i
= 0 ; i
< rmesa
->nr_heaps
; i
++ ) {
309 rmesa
->texture_heaps
[i
] = driCreateTextureHeap( i
, rmesa
,
312 RADEON_NR_TEX_REGIONS
,
313 (drmTextureRegionPtr
)rmesa
->sarea
->tex_list
[i
],
314 & rmesa
->sarea
->tex_age
[i
],
316 sizeof( radeonTexObj
),
317 (destroy_texture_object_t
*) radeonDestroyTexObj
);
319 driSetTextureSwapCounterLocation( rmesa
->texture_heaps
[i
],
320 & rmesa
->c_textureSwaps
);
322 rmesa
->texture_depth
= driQueryOptioni (&rmesa
->optionCache
,
324 if (rmesa
->texture_depth
== DRI_CONF_TEXTURE_DEPTH_FB
)
325 rmesa
->texture_depth
= ( screen
->cpp
== 4 ) ?
326 DRI_CONF_TEXTURE_DEPTH_32
: DRI_CONF_TEXTURE_DEPTH_16
;
328 rmesa
->swtcl
.RenderIndex
= ~0;
329 rmesa
->hw
.all_dirty
= GL_TRUE
;
331 /* Set the maximum texture size small enough that we can guarentee that
332 * all texture units can bind a maximal texture and have them both in
333 * texturable memory at once.
337 ctx
->Const
.MaxTextureUnits
= 2;
338 ctx
->Const
.MaxTextureImageUnits
= 2;
339 ctx
->Const
.MaxTextureCoordUnits
= 2;
341 driCalculateMaxTextureLevels( rmesa
->texture_heaps
,
345 11, /* max 2D texture size is 2048x2048 */
346 0, /* 3D textures unsupported. */
347 0, /* cube textures unsupported. */
348 11, /* max rect texture size is 2048x2048. */
352 /* adjust max texture size a bit. Hack, but I really want to use larger textures
353 which will work just fine in 99.999999% of all cases, especially with texture compression... */
354 if (driQueryOptionb( &rmesa
->optionCache
, "texture_level_hack" ))
356 if (ctx
->Const
.MaxTextureLevels
< 12) ctx
->Const
.MaxTextureLevels
+= 1;
359 ctx
->Const
.MaxTextureMaxAnisotropy
= 16.0;
363 ctx
->Const
.MinPointSize
= 1.0;
364 ctx
->Const
.MinPointSizeAA
= 1.0;
365 ctx
->Const
.MaxPointSize
= 1.0;
366 ctx
->Const
.MaxPointSizeAA
= 1.0;
368 ctx
->Const
.MinLineWidth
= 1.0;
369 ctx
->Const
.MinLineWidthAA
= 1.0;
370 ctx
->Const
.MaxLineWidth
= 10.0;
371 ctx
->Const
.MaxLineWidthAA
= 10.0;
372 ctx
->Const
.LineWidthGranularity
= 0.0625;
374 /* Set maxlocksize (and hence vb size) small enough to avoid
375 * fallbacks in radeon_tcl.c. ie. guarentee that all vertices can
376 * fit in a single dma buffer for indexed rendering of quad strips,
379 ctx
->Const
.MaxArrayLockSize
=
380 MIN2( ctx
->Const
.MaxArrayLockSize
,
381 RADEON_BUFFER_SIZE
/ RADEON_MAX_TCL_VERTSIZE
);
385 /* Initialize the software rasterizer and helper modules.
387 _swrast_CreateContext( ctx
);
388 _ac_CreateContext( ctx
);
389 _tnl_CreateContext( ctx
);
390 _swsetup_CreateContext( ctx
);
391 _ae_create_context( ctx
);
393 /* Install the customized pipeline:
395 _tnl_destroy_pipeline( ctx
);
396 _tnl_install_pipeline( ctx
, radeon_pipeline
);
397 ctx
->Driver
.FlushVertices
= radeonFlushVertices
;
399 /* Try and keep materials and vertices separate:
401 _tnl_isolate_materials( ctx
, GL_TRUE
);
403 /* _mesa_allow_light_in_model( ctx, GL_FALSE ); */
405 /* Configure swrast and T&L to match hardware characteristics:
407 _swrast_allow_pixel_fog( ctx
, GL_FALSE
);
408 _swrast_allow_vertex_fog( ctx
, GL_TRUE
);
409 _tnl_allow_pixel_fog( ctx
, GL_FALSE
);
410 _tnl_allow_vertex_fog( ctx
, GL_TRUE
);
413 _math_matrix_ctr( &rmesa
->TexGenMatrix
[0] );
414 _math_matrix_ctr( &rmesa
->TexGenMatrix
[1] );
415 _math_matrix_ctr( &rmesa
->tmpmat
);
416 _math_matrix_set_identity( &rmesa
->TexGenMatrix
[0] );
417 _math_matrix_set_identity( &rmesa
->TexGenMatrix
[1] );
418 _math_matrix_set_identity( &rmesa
->tmpmat
);
420 driInitExtensions( ctx
, card_extensions
, GL_TRUE
);
421 if (rmesa
->glCtx
->Mesa_DXTn
) {
422 _mesa_enable_extension( ctx
, "GL_EXT_texture_compression_s3tc" );
423 _mesa_enable_extension( ctx
, "GL_S3_s3tc" );
425 else if (driQueryOptionb (&rmesa
->optionCache
, "force_s3tc_enable")) {
426 _mesa_enable_extension( ctx
, "GL_EXT_texture_compression_s3tc" );
429 if (rmesa
->dri
.drmMinor
>= 9)
430 _mesa_enable_extension( ctx
, "GL_NV_texture_rectangle");
432 /* XXX these should really go right after _mesa_init_driver_functions() */
433 radeonInitIoctlFuncs( ctx
);
434 radeonInitStateFuncs( ctx
);
435 radeonInitSpanFuncs( ctx
);
436 radeonInitState( rmesa
);
437 radeonInitSwtcl( ctx
);
439 _mesa_vector4f_alloc( &rmesa
->tcl
.ObjClean
, 0,
440 ctx
->Const
.MaxArrayLockSize
, 32 );
442 fthrottle_mode
= driQueryOptioni(&rmesa
->optionCache
, "fthrottle_mode");
443 rmesa
->iw
.irq_seq
= -1;
444 rmesa
->irqsEmitted
= 0;
445 rmesa
->do_irqs
= (rmesa
->radeonScreen
->irq
!= 0 &&
446 fthrottle_mode
== DRI_CONF_FTHROTTLE_IRQS
);
448 rmesa
->do_usleeps
= (fthrottle_mode
== DRI_CONF_FTHROTTLE_USLEEPS
);
450 rmesa
->vblank_flags
= (rmesa
->radeonScreen
->irq
!= 0)
451 ? driGetDefaultVBlankFlags(&rmesa
->optionCache
) : VBLANK_FLAG_NO_IRQ
;
453 rmesa
->get_ust
= (PFNGLXGETUSTPROC
) glXGetProcAddress( (const GLubyte
*) "__glXGetUST" );
454 if ( rmesa
->get_ust
== NULL
) {
455 rmesa
->get_ust
= get_ust_nop
;
457 (*rmesa
->get_ust
)( & rmesa
->swap_ust
);
461 RADEON_DEBUG
= driParseDebugString( getenv( "RADEON_DEBUG" ),
465 tcl_mode
= driQueryOptioni(&rmesa
->optionCache
, "tcl_mode");
466 if (driQueryOptionb(&rmesa
->optionCache
, "no_rast")) {
467 fprintf(stderr
, "disabling 3D acceleration\n");
468 FALLBACK(rmesa
, RADEON_FALLBACK_DISABLE
, 1);
469 } else if (tcl_mode
== DRI_CONF_TCL_SW
||
470 !(rmesa
->radeonScreen
->chipset
& RADEON_CHIPSET_TCL
)) {
471 if (rmesa
->radeonScreen
->chipset
& RADEON_CHIPSET_TCL
) {
472 rmesa
->radeonScreen
->chipset
&= ~RADEON_CHIPSET_TCL
;
473 fprintf(stderr
, "Disabling HW TCL support\n");
475 TCL_FALLBACK(rmesa
->glCtx
, RADEON_TCL_FALLBACK_TCL_DISABLE
, 1);
478 if (rmesa
->radeonScreen
->chipset
& RADEON_CHIPSET_TCL
) {
479 if (tcl_mode
>= DRI_CONF_TCL_VTXFMT
)
480 radeonVtxfmtInit( ctx
, tcl_mode
>= DRI_CONF_TCL_CODEGEN
);
482 _tnl_need_dlist_norm_lengths( ctx
, GL_FALSE
);
488 /* Destroy the device specific context.
490 /* Destroy the Mesa and driver specific context data.
492 void radeonDestroyContext( __DRIcontextPrivate
*driContextPriv
)
494 GET_CURRENT_CONTEXT(ctx
);
495 radeonContextPtr rmesa
= (radeonContextPtr
) driContextPriv
->driverPrivate
;
496 radeonContextPtr current
= ctx
? RADEON_CONTEXT(ctx
) : NULL
;
498 /* check if we're deleting the currently bound context */
499 if (rmesa
== current
) {
500 RADEON_FIREVERTICES( rmesa
);
501 _mesa_make_current(NULL
, NULL
, NULL
);
504 /* Free radeon context resources */
505 assert(rmesa
); /* should never be null */
507 GLboolean release_texture_heaps
;
510 release_texture_heaps
= (rmesa
->glCtx
->Shared
->RefCount
== 1);
511 _swsetup_DestroyContext( rmesa
->glCtx
);
512 _tnl_DestroyContext( rmesa
->glCtx
);
513 _ac_DestroyContext( rmesa
->glCtx
);
514 _swrast_DestroyContext( rmesa
->glCtx
);
516 radeonDestroySwtcl( rmesa
->glCtx
);
517 radeonReleaseArrays( rmesa
->glCtx
, ~0 );
518 if (rmesa
->dma
.current
.buf
) {
519 radeonReleaseDmaRegion( rmesa
, &rmesa
->dma
.current
, __FUNCTION__
);
520 radeonFlushCmdBuf( rmesa
, __FUNCTION__
);
523 if (!(rmesa
->TclFallback
& RADEON_TCL_FALLBACK_TCL_DISABLE
)) {
524 int tcl_mode
= driQueryOptioni(&rmesa
->optionCache
, "tcl_mode");
525 if (tcl_mode
>= DRI_CONF_TCL_VTXFMT
)
526 radeonVtxfmtDestroy( rmesa
->glCtx
);
529 /* free the Mesa context */
530 rmesa
->glCtx
->DriverCtx
= NULL
;
531 _mesa_destroy_context( rmesa
->glCtx
);
533 _mesa_vector4f_free( &rmesa
->tcl
.ObjClean
);
535 if (rmesa
->state
.scissor
.pClipRects
) {
536 FREE(rmesa
->state
.scissor
.pClipRects
);
537 rmesa
->state
.scissor
.pClipRects
= NULL
;
540 if ( release_texture_heaps
) {
541 /* This share group is about to go away, free our private
542 * texture object data.
546 for ( i
= 0 ; i
< rmesa
->nr_heaps
; i
++ ) {
547 driDestroyTextureHeap( rmesa
->texture_heaps
[ i
] );
548 rmesa
->texture_heaps
[ i
] = NULL
;
551 assert( is_empty_list( & rmesa
->swapped
) );
554 /* free the option cache */
555 driDestroyOptionCache (&rmesa
->optionCache
);
565 radeonSwapBuffers( __DRIdrawablePrivate
*dPriv
)
568 if (dPriv
->driContextPriv
&& dPriv
->driContextPriv
->driverPrivate
) {
569 radeonContextPtr rmesa
;
571 rmesa
= (radeonContextPtr
) dPriv
->driContextPriv
->driverPrivate
;
573 if (ctx
->Visual
.doubleBufferMode
) {
574 _mesa_notifySwapBuffers( ctx
); /* flush pending rendering comands */
576 if ( rmesa
->doPageFlip
) {
577 radeonPageFlip( dPriv
);
580 radeonCopyBuffer( dPriv
);
585 /* XXX this shouldn't be an error but we can't handle it for now */
586 _mesa_problem(NULL
, "%s: drawable has no context!", __FUNCTION__
);
591 /* Force the context `c' to be the current context and associate with it
595 radeonMakeCurrent( __DRIcontextPrivate
*driContextPriv
,
596 __DRIdrawablePrivate
*driDrawPriv
,
597 __DRIdrawablePrivate
*driReadPriv
)
599 if ( driContextPriv
) {
600 radeonContextPtr newCtx
=
601 (radeonContextPtr
) driContextPriv
->driverPrivate
;
603 if (RADEON_DEBUG
& DEBUG_DRI
)
604 fprintf(stderr
, "%s ctx %p\n", __FUNCTION__
, (void *) newCtx
->glCtx
);
606 if ( newCtx
->dri
.drawable
!= driDrawPriv
) {
607 driDrawableInitVBlank( driDrawPriv
, newCtx
->vblank_flags
);
608 newCtx
->dri
.drawable
= driDrawPriv
;
609 radeonUpdateWindow( newCtx
->glCtx
);
610 radeonUpdateViewportOffset( newCtx
->glCtx
);
613 _mesa_make_current( newCtx
->glCtx
,
614 (GLframebuffer
*) driDrawPriv
->driverPrivate
,
615 (GLframebuffer
*) driReadPriv
->driverPrivate
);
617 if (newCtx
->vb
.enabled
)
618 radeonVtxfmtMakeCurrent( newCtx
->glCtx
);
621 if (RADEON_DEBUG
& DEBUG_DRI
)
622 fprintf(stderr
, "%s ctx is null\n", __FUNCTION__
);
623 _mesa_make_current( NULL
, NULL
, NULL
);
626 if (RADEON_DEBUG
& DEBUG_DRI
)
627 fprintf(stderr
, "End %s\n", __FUNCTION__
);
631 /* Force the context `c' to be unbound from its buffer.
634 radeonUnbindContext( __DRIcontextPrivate
*driContextPriv
)
636 radeonContextPtr rmesa
= (radeonContextPtr
) driContextPriv
->driverPrivate
;
638 if (RADEON_DEBUG
& DEBUG_DRI
)
639 fprintf(stderr
, "%s ctx %p\n", __FUNCTION__
, (void *) rmesa
->glCtx
);