r300-gallium: Add vertex shader for surface_copy.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Wed, 1 Apr 2009 22:14:19 +0000 (15:14 -0700)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Wed, 1 Apr 2009 22:14:19 +0000 (15:14 -0700)
src/gallium/drivers/r300/r300_state_tcl.h
src/gallium/drivers/r300/r300_surface.c

index bc22cd984dd3bff6cfe12dd8566846c99d99dbc7..06767c9b02fb397fa38ad48e63f4ca7a54a45320 100644 (file)
@@ -79,6 +79,19 @@ static struct r300_vertex_shader r300_passthrough_vertex_shader = {
     .instructions[1].inst3 = 0x0,
 };
 
+static struct r300_vertex_shader r300_texture_vertex_shader = {
+        /* XXX translate these back into normal instructions */
+    .instruction_count = 2,
+    .instructions[0].inst0 = 0xF00203,
+    .instructions[0].inst1 = 0xD10001,
+    .instructions[0].inst2 = 0x1248001,
+    .instructions[0].inst3 = 0x0,
+    .instructions[1].inst0 = 0xF00203,
+    .instructions[1].inst1 = 0xD10061,
+    .instructions[1].inst2 = 0x1248061,
+    .instructions[1].inst3 = 0x0,
+};
+
 void r300_translate_vertex_shader(struct r300_context* r300,
                                   struct r300_vertex_shader* vs);
 
index 8cafe7d10455946be15fd721f871560405f8d857..ab0ecac35a455bb9dbb282b868a45ff4ec66145e 100644 (file)
@@ -39,17 +39,6 @@ static void r300_surface_setup(struct pipe_context* pipe,
     r300_emit_dsa_state(r300, &dsa_clear_state);
     r300_emit_rs_state(r300, &rs_clear_state);
 
-    /* XXX these magic numbers should be explained when
-     * this becomes a cached state object */
-    if (caps->has_tcl) {
-        r300_emit_vertex_shader(r300, &r300_passthrough_vertex_shader);
-    } else {
-        OUT_CS_REG(R300_VAP_CNTL, R300_PVS_NUM_SLOTS(5) |
-                R300_PVS_NUM_CNTLRS(5) |
-                R300_PVS_NUM_FPUS(caps->num_vert_fpus) |
-                R300_PVS_VF_MAX_VTX_NUM(12));
-    }
-
     BEGIN_CS(15);
 
     /* Pixel scissors. */
@@ -116,6 +105,18 @@ static void r300_surface_fill(struct pipe_context* pipe,
 
     r300_surface_setup(r300, dest, x, y, w, h);
 
+    /* Vertex shader setup */
+    if (caps->has_tcl) {
+        r300_emit_vertex_shader(r300, &r300_passthrough_vertex_shader);
+    } else {
+        BEGIN_CS(2);
+        OUT_CS_REG(R300_VAP_CNTL, R300_PVS_NUM_SLOTS(5) |
+                R300_PVS_NUM_CNTLRS(5) |
+                R300_PVS_NUM_FPUS(caps->num_vert_fpus) |
+                R300_PVS_VF_MAX_VTX_NUM(12));
+        END_CS;
+    }
+
     /* Fragment shader setup */
     if (caps->is_r500) {
         r500_emit_fragment_shader(r300, &r500_passthrough_fragment_shader);
@@ -222,6 +223,18 @@ static void r300_surface_copy(struct pipe_context* pipe,
     r300_emit_texture(r300, srctex, 0);
     r300_flush_textures(r300);
 
+    /* Vertex shader setup */
+    if (caps->has_tcl) {
+        r300_emit_vertex_shader(r300, &r300_texture_vertex_shader);
+    } else {
+        BEGIN_CS(2);
+        OUT_CS_REG(R300_VAP_CNTL, R300_PVS_NUM_SLOTS(5) |
+                R300_PVS_NUM_CNTLRS(5) |
+                R300_PVS_NUM_FPUS(caps->num_vert_fpus) |
+                R300_PVS_VF_MAX_VTX_NUM(12));
+        END_CS;
+    }
+
     /* Fragment shader setup */
     if (caps->is_r500) {
         r500_emit_fragment_shader(r300, &r500_texture_fragment_shader);