From 868c04205c3859a816593595aa513ee603f736ad Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 25 May 2011 09:25:03 +1000 Subject: [PATCH] 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 --- src/gallium/drivers/r600/evergreen_state.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) 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, -- 2.30.2