[Mesa-dev] [PATCH] r200: revalidate after radeon_update_renderbuffers

Daniel Vetter daniel.vetter at ffwll.ch
Sat Oct 9 13:33:50 PDT 2010

By calling radeon_draw_buffers (which sets the necessary flags
in radeon->NewGLState) and revalidating if NewGLState is non-zero
in r200TclPrimitive. This fixes an assert in libdrm (the color-/
depthbuffer was changed but not yet validated) and and stops the
kernel cs checker from complaining about them (when they're too

Thanks to Mario Kleiner for the hint to call radeon_draw_buffer
(instead of my half-broken hack).

Cc: Mario Kleiner <mario.kleiner at tuebingen.mpg.de>
Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
I've also tested on my rv570 agp. r300c seems to suffer from the same
problem: it crashes glxgears with and without this patch. r300g seems to be

I'll see whether I can create a r300c patch, too (after this patch survived

Please review and apply.

Thanks, Daniel

 src/mesa/drivers/dri/r200/r200_tcl.c               |    2 ++
 .../drivers/dri/radeon/radeon_common_context.c     |    8 +++++---
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/mesa/drivers/dri/r200/r200_tcl.c b/src/mesa/drivers/dri/r200/r200_tcl.c
index 4ae0f30..ba54177 100644
--- a/src/mesa/drivers/dri/r200/r200_tcl.c
+++ b/src/mesa/drivers/dri/r200/r200_tcl.c
@@ -265,6 +265,8 @@ void r200TclPrimitive( GLcontext *ctx,
    GLuint newprim = hw_prim | R200_VF_TCL_OUTPUT_VTX_ENABLE;
+   if (rmesa->radeon.NewGLState)
+      r200ValidateState( ctx );
    if (newprim != rmesa->tcl.hw_primitive ||
        !discrete_prim[hw_prim&0xf]) {
diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.c b/src/mesa/drivers/dri/radeon/radeon_common_context.c
index 85e4988..8804b9c 100644
--- a/src/mesa/drivers/dri/radeon/radeon_common_context.c
+++ b/src/mesa/drivers/dri/radeon/radeon_common_context.c
@@ -521,6 +521,7 @@ void radeon_prepare_render(radeonContextPtr radeon)
     __DRIcontext *driContext = radeon->dri.context;
     __DRIdrawable *drawable;
     __DRIscreen *screen;
+    struct radeon_framebuffer *draw;
     screen = driContext->driScreenPriv;
     if (!screen->dri2.loader)
@@ -531,9 +532,10 @@ void radeon_prepare_render(radeonContextPtr radeon)
 	if (drawable->lastStamp != drawable->dri2.stamp)
 	    radeon_update_renderbuffers(driContext, drawable, GL_FALSE);
-	/* Intel driver does the equivalent of this, no clue if it is needed:
-	 * radeon_draw_buffer(radeon->glCtx, &(drawable->driverPrivate)->base);
-	 */
+	draw = drawable->driverPrivate;
+	radeon_draw_buffer(radeon->glCtx, &draw->base);
 	driContext->dri2.draw_stamp = drawable->dri2.stamp;

More information about the mesa-dev mailing list