r600: try and get everything in the draw in one IB
authorAlex Deucher <alexdeucher@gmail.com>
Thu, 20 Aug 2009 16:10:42 +0000 (12:10 -0400)
committerAlex Deucher <alexdeucher@gmail.com>
Thu, 20 Aug 2009 16:12:23 +0000 (12:12 -0400)
fixes corruption issues with apps like teapot and
geartrain.

src/mesa/drivers/dri/r600/r700_render.c

index 58b4491d00dd6cb3e5f86c9564984eab5060292f..80df78f1233d55fc099cbe18da1ae3a11db60790 100644 (file)
@@ -341,10 +341,9 @@ void r700EmitState(GLcontext * ctx)
                return;
 
        rcommonEnsureCmdBufSpace(&context->radeon,
-                                context->radeon.hw.max_state_size, __FUNCTION__);
+                                652, __FUNCTION__);
 
        r700SendSQConfig(context);
-
        r700SendUCPState(context);
        r700SendContextStates(context);
        r700SendViewportState(context, 0);
@@ -357,10 +356,18 @@ static GLboolean r700RunRender(GLcontext * ctx,
                                           struct tnl_pipeline_stage *stage)
 {
     context_t *context = R700_CONTEXT(ctx);
-    unsigned int i;
+    radeonContextPtr radeon = &context->radeon;
+    unsigned int i, ind_count = 0;
     TNLcontext *tnl = TNL_CONTEXT(ctx);
     struct vertex_buffer *vb = &tnl->vb;
 
+    for (i = 0; i < vb->PrimitiveCount; i++)
+           ind_count += vb->Primitive[i].count + 10;
+
+    /* just an estimate, need to properly calculate this */
+    rcommonEnsureCmdBufSpace(&context->radeon,
+                            radeon->hw.max_state_size + ind_count, __FUNCTION__);
+
     r700Start3D(context);
 
     r700UpdateShaders(ctx);