summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Berry <stereotype441@gmail.com>2012-01-09 14:45:04 -0800
committerIan Romanick <ian.d.romanick@intel.com>2012-01-19 12:56:15 -0800
commit29f07f64613234aa00a296613906937d50c6d1d4 (patch)
tree00acb215b920c30d195cbf758762e027e119e3ed
parent1f18137d289ea938144ddfba2a203a2406a7aaa6 (diff)
i965 gen4-6: Fix off-by-one errors brw_create_constant_surface()
Commit 9bdc44a52804a64219a0ca1a061b18596863e524 (i965: Replace struct with bit shifting for WM pull constant surfaces) accidentally introduced off-by-one errors into the calculation of the surface width, height, and depth. This patch restores the correct computation. The reason this wasn't noticed by Piglit tests is that the size of our constant surfaces is always less than 2^20, therefore the off-by-one error was causing the "depth" field of the surface to be set to all 1's. The hardware interpreted this as an extremely large surface, so overflow checking was effectively disabled. No Piglit regressions on Sandy Bridge. NOTE: This is a candidate for the 7.11 and 8.0 branches. Reviewed-by: Eric Anholt <eric@anholt.net> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> (cherry picked from commit f6f43bd5a276990c58c021bc047e60f9763df479)
-rw-r--r--src/mesa/drivers/dri/i965/brw_wm_surface_state.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
index 89fea9cc952..5ec8d67d390 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
@@ -283,10 +283,10 @@ brw_create_constant_surface(struct brw_context *brw,
surf[1] = bo->offset; /* reloc */
- surf[2] = (((w & 0x7f) - 1) << BRW_SURFACE_WIDTH_SHIFT |
- (((w >> 7) & 0x1fff) - 1) << BRW_SURFACE_HEIGHT_SHIFT);
+ surf[2] = ((w & 0x7f) << BRW_SURFACE_WIDTH_SHIFT |
+ ((w >> 7) & 0x1fff) << BRW_SURFACE_HEIGHT_SHIFT);
- surf[3] = ((((w >> 20) & 0x7f) - 1) << BRW_SURFACE_DEPTH_SHIFT |
+ surf[3] = (((w >> 20) & 0x7f) << BRW_SURFACE_DEPTH_SHIFT |
(width * 16 - 1) << BRW_SURFACE_PITCH_SHIFT);
surf[4] = 0;