r600: handle state emit better
authorAlex Deucher <alexdeucher@gmail.com>
Sun, 2 Aug 2009 22:26:12 +0000 (18:26 -0400)
committerAlex Deucher <alexdeucher@gmail.com>
Sun, 2 Aug 2009 22:26:12 +0000 (18:26 -0400)
- move shader-related state with the rest of the shader setup/emit
- start to track dirty state better

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

index 8debecbab999d7e72bd3609af66b52283dfe6be1..dc2fb0144a28a23676b76f7908610d60d18c260e 100644 (file)
@@ -457,6 +457,9 @@ void r600InitCmdBuf(context_t *r600) /* from rcommonInitCmdBuf */
     GLuint size;
     rmesa->hw.max_state_size = 4000; /* rough estimate */
 
+    rmesa->hw.all_dirty = GL_TRUE;
+    rmesa->hw.is_dirty = GL_TRUE;
+
        /* Initialize command buffer */
        size = 256 * driQueryOptioni(&rmesa->optionCache,
                                     "command_buffer_size");
index 34a43858410f990038a6205c17c04bdebb25b95c..20376d2c36d103ec5c72207a9a7d07b90e2182a5 100644 (file)
@@ -139,6 +139,13 @@ static GLboolean r700SetupShaders(GLcontext * ctx)
 
     r600UpdateTextureState(ctx);
 
+    r700SendFSState(context); // FIXME just a place holder for now
+    r700SendPSState(context);
+    r700SendVSState(context);
+
+    r700SendTextureState(context);
+    r700SetupStreams(ctx);
+
     return GL_TRUE;
 }
 
@@ -274,18 +281,16 @@ static void r700RunRenderPrimitive(GLcontext * ctx, int start, int end, int prim
 void r700EmitState(GLcontext * ctx)
 {
        context_t *context = R700_CONTEXT(ctx);
+       radeonContextPtr radeon = &context->radeon;
+
+       if (radeon->cmdbuf.cs->cdw && !radeon->hw.is_dirty && !radeon->hw.all_dirty)
+               return;
 
        rcommonEnsureCmdBufSpace(&context->radeon,
                                 context->radeon.hw.max_state_size, __FUNCTION__);
 
        r700Start3D(context);
        r700SendSQConfig(context);
-       r700SendFSState(context); // FIXME just a place holder for now
-       r700SendPSState(context);
-       r700SendVSState(context);
-
-       r700SendTextureState(context);
-       r700SetupStreams(ctx);
 
        r700SendUCPState(context);
        r700SendContextStates(context);
@@ -325,8 +330,6 @@ static GLboolean r700RunRender(GLcontext * ctx,
 
     radeonReleaseArrays(ctx, ~0);
 
-    rcommonFlushCmdBuf( &context->radeon, __FUNCTION__ );
-
     return GL_FALSE;
 }
 
index b75f5315036875e7f47ecbb43ea007eb91325756..e95f52400a2bbc0586f23df4bcb439efae73fb0a 100644 (file)
@@ -1854,6 +1854,8 @@ void r700InitState(GLcontext * ctx) //-------------------
     /* Set up color compare mask */
     r700->CB_CLRCMP_MSK.u32All = 0xFFFFFFFF;
 
+    context->radeon.hw.all_dirty = GL_TRUE;
+
 }
 
 void r700InitStateFuncs(struct dd_function_table *functions) //-----------------