r300g: Need to emit a hardware scissor rectangle even if scissor is disabled.
authorMichel Dänzer <daenzer@vmware.com>
Sat, 5 Dec 2009 16:48:00 +0000 (17:48 +0100)
committerMichel Dänzer <michel@daenzer.net>
Sat, 5 Dec 2009 16:59:49 +0000 (17:59 +0100)
Just make it cover the whole framebuffer in that case. Otherwise the kernel CS
checker may complain, e.g. running progs/demos/gearbox. That runs fast now
here, but doesn't look right yet.

src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_state.c

index dd3f6ac1432a4b4a4520d8447996481ee2842a61..11cd9f855f39f3b01e278459e886478a7b5dbd6c 100644 (file)
@@ -101,6 +101,8 @@ struct r300_sampler_state {
 struct r300_scissor_state {
     uint32_t scissor_top_left;     /* R300_SC_SCISSORS_TL: 0x43e0 */
     uint32_t scissor_bottom_right; /* R300_SC_SCISSORS_BR: 0x43e4 */
+    uint32_t no_scissor_top_left;     /* R300_SC_SCISSORS_TL: 0x43e0 */
+    uint32_t no_scissor_bottom_right; /* R300_SC_SCISSORS_BR: 0x43e4 */
 };
 
 struct r300_texture_state {
index 60be03f54fcb6995c707d8db7f8d16d50068be15..04dca292167221f799895a39da1eab340a6ce5f2 100644 (file)
@@ -570,8 +570,13 @@ void r300_emit_scissor_state(struct r300_context* r300,
 
     BEGIN_CS(3);
     OUT_CS_REG_SEQ(R300_SC_SCISSORS_TL, 2);
-    OUT_CS(scissor->scissor_top_left);
-    OUT_CS(scissor->scissor_bottom_right);
+    if (r300->rs_state->rs.scissor) {
+       OUT_CS(scissor->scissor_top_left);
+       OUT_CS(scissor->scissor_bottom_right);
+    } else {
+       OUT_CS(scissor->no_scissor_top_left);
+       OUT_CS(scissor->no_scissor_bottom_right);
+    }
     END_CS;
 }
 
index 442af70e1435947c27e4f05737457fa4b1c2da1c..2bc2b79c02154837f05d319117381d68663df122 100644 (file)
@@ -302,6 +302,25 @@ static void
     r300->framebuffer_state = *state;
 
     r300->dirty_state |= R300_NEW_FRAMEBUFFERS;
+
+    if (r300_screen(r300->context.screen)->caps->is_r500) {
+        r300->scissor_state->no_scissor_top_left =
+            (0 << R300_SCISSORS_X_SHIFT) |
+            (0 << R300_SCISSORS_Y_SHIFT);
+        r300->scissor_state->no_scissor_bottom_right =
+            ((state->width - 1) << R300_SCISSORS_X_SHIFT) |
+            ((state->height - 1) << R300_SCISSORS_Y_SHIFT);
+    } else {
+        /* Offset of 1440 in non-R500 chipsets. */
+        r300->scissor_state->no_scissor_top_left =
+            ((0 + 1440) << R300_SCISSORS_X_SHIFT) |
+            ((0 + 1440) << R300_SCISSORS_Y_SHIFT);
+        r300->scissor_state->no_scissor_bottom_right =
+            (((state->width - 1) + 1440) << R300_SCISSORS_X_SHIFT) |
+            (((state->height - 1) + 1440) << R300_SCISSORS_Y_SHIFT);
+    }
+
+    r300->dirty_state |= R300_NEW_SCISSOR;
 }
 
 /* Create fragment shader state. */