r300-gallium: Don't flush textures more than necessary.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Wed, 11 Mar 2009 22:20:16 +0000 (15:20 -0700)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Wed, 11 Mar 2009 22:23:10 +0000 (15:23 -0700)
src/gallium/drivers/r300/r300_emit.c

index 68741e9f0841a199c9a8d9b891399834a53e584f..c2ad3ac6f5d2b65ebed3f659b0780cde9ee15f36 100644 (file)
@@ -327,6 +327,7 @@ void r300_emit_dirty_state(struct r300_context* r300)
 {
     struct r300_screen* r300screen = r300_screen(r300->context.screen);
     int i;
+    int dirty_tex = 0;
 
     if (!(r300->dirty_state) && !(r300->dirty_hw)) {
         return;
@@ -382,8 +383,8 @@ void r300_emit_dirty_state(struct r300_context* r300)
             if (r300->dirty_state & (R300_NEW_SAMPLER << i)) {
                 r300_emit_sampler(r300, r300->sampler_states[i], i);
                 r300->dirty_state &= ~(R300_NEW_SAMPLER << i);
+                dirty_tex++;
             }
-            r300_flush_textures(r300);
         }
     }
 
@@ -397,11 +398,15 @@ void r300_emit_dirty_state(struct r300_context* r300)
             if (r300->dirty_state & (R300_NEW_TEXTURE << i)) {
                 r300_emit_texture(r300, r300->textures[i], i);
                 r300->dirty_state &= ~(R300_NEW_TEXTURE << i);
+                dirty_tex++;
             }
-            r300_flush_textures(r300);
         }
     }
 
+    if (dirty_tex) {
+        r300_flush_textures(r300);
+    }
+
     if (r300->dirty_state & R300_NEW_VERTEX_FORMAT) {
         r300_emit_vertex_format_state(r300);
         r300->dirty_state &= ~R300_NEW_VERTEX_FORMAT;