summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2011-05-25 09:25:03 +1000
committerDave Airlie <[email protected]>2011-05-25 11:50:17 +1000
commit868c04205c3859a816593595aa513ee603f736ad (patch)
tree1ffca8b035b48357b85021838f7b95df72373c05 /src/gallium
parent7779f6d1dffde2c0501e44adc342e52803de08d4 (diff)
r600g: add workaround for buggy hw scissor on eg/cayman.
This is ported from the same fix to the DDX. Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/r600/evergreen_state.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
index dcb28065499..adf93669513 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -861,6 +861,7 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
u32 shader_mask, tl, br, target_mask;
enum radeon_family family;
+ int scissor_width, scissor_height;
if (rstate == NULL)
return;
@@ -891,8 +892,20 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
target_mask ^= 0xf << (i * 4);
shader_mask |= 0xf << (i * 4);
}
+ scissor_width = state->width;
+ scissor_height = state->height;
+ /* EG hw workaround */
+ if (scissor_width == 0)
+ scissor_width = 1;
+ if (scissor_height == 0)
+ scissor_height = 1;
+ /* cayman hw workaround */
+ if (family == CHIP_CAYMAN) {
+ if (scissor_width == 1 && scissor_height == 1)
+ scissor_width = 2;
+ }
tl = S_028240_TL_X(0) | S_028240_TL_Y(0);
- br = S_028244_BR_X(state->width) | S_028244_BR_Y(state->height);
+ br = S_028244_BR_X(scissor_width) | S_028244_BR_Y(scissor_height);
r600_pipe_state_add_reg(rstate,
R_028240_PA_SC_GENERIC_SCISSOR_TL, tl,