OSDN Git Service

r300-gallium: Fix hardlock when no colors or textures are present.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Mon, 30 Mar 2009 22:50:09 +0000 (15:50 -0700)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Mon, 30 Mar 2009 22:50:09 +0000 (15:50 -0700)
src/gallium/drivers/r300/r300_state_derived.c

index d761a03..0e7a2b6 100644 (file)
@@ -211,7 +211,6 @@ static void r300_update_rs_block(struct r300_context* r300)
             rs->ip[0] |= R500_RS_COL_FMT(R300_RS_COL_FMT_0001);
         }
 
-        /* Set up at least one texture pointer or RS will not be happy. */
         if (tex_count == 0) {
             rs->ip[0] |=
                 R500_RS_SEL_S(R500_RS_IP_PTR_K0) |
@@ -220,15 +219,20 @@ static void r300_update_rs_block(struct r300_context* r300)
                 R500_RS_SEL_Q(R500_RS_IP_PTR_K1);
         }
 
+        /* Rasterize at least one color, or bad things happen. */
+        if ((col_count == 0) && (tex_count == 0)) {
+            col_count++;
+        }
+
         for (i = 0; i < tex_count; i++) {
-            rs->inst[i] |= R500_RS_INST_TEX_ID(i) | R500_RS_INST_TEX_CN_WRITE |
-                R500_RS_INST_TEX_ADDR(fp_offset);
+            rs->inst[i] |= R500_RS_INST_TEX_ID(i) |
+                R500_RS_INST_TEX_CN_WRITE | R500_RS_INST_TEX_ADDR(fp_offset);
             fp_offset++;
         }
 
         for (i = 0; i < col_count; i++) {
-            rs->inst[i] |= R500_RS_INST_COL_ID(i) | R500_RS_INST_COL_CN_WRITE |
-                R500_RS_INST_COL_ADDR(fp_offset);
+            rs->inst[i] |= R500_RS_INST_COL_ID(i) |
+                R500_RS_INST_COL_CN_WRITE | R500_RS_INST_COL_ADDR(fp_offset);
             fp_offset++;
         }
     } else {
@@ -268,15 +272,20 @@ static void r300_update_rs_block(struct r300_context* r300)
                 R300_RS_SEL_Q(R300_RS_SEL_K1);
         }
 
+        /* Rasterize at least one color, or bad things happen. */
+        if ((col_count == 0) && (tex_count == 0)) {
+            col_count++;
+        }
+
         for (i = 0; i < tex_count; i++) {
-            rs->inst[i] |= R300_RS_INST_TEX_ID(i) | R300_RS_INST_TEX_CN_WRITE |
-                R300_RS_INST_TEX_ADDR(fp_offset);
+            rs->inst[i] |= R300_RS_INST_TEX_ID(i) |
+                R300_RS_INST_TEX_CN_WRITE | R300_RS_INST_TEX_ADDR(fp_offset);
             fp_offset++;
         }
 
         for (i = 0; i < col_count; i++) {
-            rs->inst[i] |= R300_RS_INST_COL_ID(i) | R300_RS_INST_COL_CN_WRITE |
-                R300_RS_INST_COL_ADDR(fp_offset);
+            rs->inst[i] |= R300_RS_INST_COL_ID(i) |
+                R300_RS_INST_COL_CN_WRITE | R300_RS_INST_COL_ADDR(fp_offset);
             fp_offset++;
         }
     }