r300g/swtcl: move emitting AOS to prepare_for_rendering
authorMarek Olšák <maraeo@gmail.com>
Wed, 26 May 2010 18:53:56 +0000 (20:53 +0200)
committerMarek Olšák <maraeo@gmail.com>
Wed, 26 May 2010 20:22:52 +0000 (22:22 +0200)
src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_emit.h
src/gallium/drivers/r300/r300_render.c

index 8fceb539981952fe5bda731c8a6f15b4036c9a5a..40e7b4cb6030f668b58735d6fc6671b27f6ea80d 100644 (file)
@@ -864,7 +864,7 @@ void r300_emit_aos(struct r300_context* r300, unsigned offset, boolean indexed)
     END_CS;
 }
 
-void r300_emit_vertex_buffer(struct r300_context* r300)
+void r300_emit_aos_swtcl(struct r300_context *r300)
 {
     CS_LOCALS(r300);
 
@@ -1168,7 +1168,6 @@ unsigned r300_get_num_dirty_dwords(struct r300_context *r300)
 /* Emit all dirty state. */
 void r300_emit_dirty_state(struct r300_context* r300)
 {
-    struct r300_screen* r300screen = r300->screen;
     struct r300_atom* atom;
 
     foreach(atom, &r300->atom_list) {
@@ -1181,10 +1180,5 @@ void r300_emit_dirty_state(struct r300_context* r300)
         }
     }
 
-    /* Emit the VBO for SWTCL. */
-    if (!r300screen->caps.has_tcl) {
-        r300_emit_vertex_buffer(r300);
-    }
-
     r300->dirty_hw++;
 }
index 3c0edf6fdcae57d3cbc5e335e8fbe73d6fd2e9f1..da05aff45b1d26299b36ebcdb70267c6eb4f45ca 100644 (file)
@@ -76,7 +76,7 @@ void r300_emit_scissor_state(struct r300_context* r300,
 void r300_emit_textures_state(struct r300_context *r300,
                               unsigned size, void *state);
 
-void r300_emit_vertex_buffer(struct r300_context* r300);
+void r300_emit_aos_swtcl(struct r300_context *r300);
 
 void r300_emit_vertex_stream_state(struct r300_context* r300,
                                    unsigned size, void* state);
index 1961e0e53a0b46b3454ec065d1c5ad193851d09b..041ae8036b67359c2a7069d9fe49720966c08eea 100644 (file)
@@ -136,7 +136,8 @@ enum r300_prepare_flags {
     PREP_FIRST_DRAW     = (1 << 0),
     PREP_VALIDATE_VBOS  = (1 << 1),
     PREP_EMIT_AOS       = (1 << 2),
-    PREP_INDEXED        = (1 << 3)
+    PREP_EMIT_AOS_SWTCL = (1 << 3),
+    PREP_INDEXED        = (1 << 4)
 };
 
 /* Check if the requested number of dwords is available in the CS and
@@ -152,6 +153,7 @@ static void r300_prepare_for_rendering(struct r300_context *r300,
     boolean flushed = FALSE;
     boolean first_draw = flags & PREP_FIRST_DRAW;
     boolean emit_aos = flags & PREP_EMIT_AOS;
+    boolean emit_aos_swtcl = flags & PREP_EMIT_AOS_SWTCL;
 
     /* Stencil ref fallback. */
     if (r300->stencil_ref_bf_fallback) {
@@ -167,6 +169,9 @@ static void r300_prepare_for_rendering(struct r300_context *r300,
 
         if (emit_aos)
             cs_dwords += 55; /* emit_aos */
+
+        if (emit_aos_swtcl)
+            cs_dwords += 7; /* emit_aos_swtcl */
     }
 
     /* Emitted in flush. */
@@ -185,6 +190,8 @@ static void r300_prepare_for_rendering(struct r300_context *r300,
         r500_emit_index_offset(r300, index_bias);
         if (emit_aos)
             r300_emit_aos(r300, aos_offset, flags & PREP_INDEXED);
+        if (emit_aos_swtcl)
+            r300_emit_aos_swtcl(r300);
     }
 }
 
@@ -945,7 +952,8 @@ static void r500_render_draw_arrays(struct vbuf_render* render,
 
     (void) i; (void) ptr;
 
-    r300_prepare_for_rendering(r300, PREP_FIRST_DRAW, NULL, dwords, 0, 0);
+    r300_prepare_for_rendering(r300, PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
+                               NULL, dwords, 0, 0);
 
     DBG(r300, DBG_DRAW, "r300: Doing vbuf render, count %d\n", count);
 
@@ -989,7 +997,8 @@ static void r500_render_draw_elements(struct vbuf_render* render,
 
     CS_LOCALS(r300);
 
-    r300_prepare_for_rendering(r300, PREP_FIRST_DRAW, NULL, dwords, 0, 0);
+    r300_prepare_for_rendering(r300, PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
+                               NULL, dwords, 0, 0);
 
     BEGIN_CS(dwords);
     OUT_CS_REG(R300_GA_COLOR_CONTROL,