r600: Predict emit size for next rendering.
authorPauli Nieminen <suokkos@gmail.com>
Sun, 23 Aug 2009 23:01:15 +0000 (02:01 +0300)
committerPauli Nieminen <suokkos@gmail.com>
Sun, 23 Aug 2009 23:01:15 +0000 (02:01 +0300)
src/mesa/drivers/dri/r600/r700_render.c

index c8b405f55573448f2bd08f254365ed45fd280004..a6a9728d781f9fa4be81f13f9d87cb783f50ca05 100644 (file)
@@ -298,28 +298,54 @@ static void r700RunRenderPrimitive(GLcontext * ctx, int start, int end, int prim
 
 }
 
+/* FIXME: radom values fix with correct */
+#define PRE_EMIT_STATE_BUFSZ 30
+
+static GLuint r700PredictRenderSize(GLcontext* ctx)
+{
+    context_t *context = R700_CONTEXT(ctx);
+    TNLcontext *tnl = TNL_CONTEXT(ctx);
+    struct vertex_buffer *vb = &tnl->vb;
+    GLboolean flushed;
+    GLuint dwords, i;
+    GLuint state_size;
+
+    dwords = PRE_EMIT_STATE_BUFSZ;
+    for (i = 0; i < vb->PrimitiveCount; i++)
+           dwords += vb->Primitive[i].count + 10;
+    state_size = radeonCountStateEmitSize(&context->radeon);
+    flushed = rcommonEnsureCmdBufSpace(&context->radeon,
+                            dwords + state_size, __FUNCTION__);
+
+    if (flushed)
+       dwords += radeonCountStateEmitSize(&context->radeon);
+    else
+       dwords += state_size;
+
+    if (RADEON_DEBUG & DEBUG_PRIMS)
+       fprintf(stderr, "%s: total prediction size is %d.\n", __FUNCTION__, dwords);
+    return dwords;
+}
+
 static GLboolean r700RunRender(GLcontext * ctx,
                               struct tnl_pipeline_stage *stage)
 {
     context_t *context = R700_CONTEXT(ctx);
     radeonContextPtr radeon = &context->radeon;
-    unsigned int i, ind_count = 0, id = 0;
+    unsigned int i, id = 0;
     TNLcontext *tnl = TNL_CONTEXT(ctx);
     struct vertex_buffer *vb = &tnl->vb;
     struct radeon_renderbuffer *rrb;
 
-    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__);
 
     r700UpdateShaders(ctx);
     r700SetScissor(context);
     r700SetupVertexProgram(ctx);
     r700SetupFragmentProgram(ctx);
     r600UpdateTextureState(ctx);
+
+    r700PredictRenderSize(ctx);
     r700SetupStreams(ctx);
 
     radeonEmitState(radeon);