dri/i915: Fix off-by-one in i830 clip region size.
authorAlban Browaeys <prahal@yahoo.com>
Thu, 2 Feb 2012 18:20:22 +0000 (19:20 +0100)
committerEric Anholt <eric@anholt.net>
Sat, 3 Mar 2012 01:16:12 +0000 (17:16 -0800)
The hardware, like i915, uses an inclusive bounds on min and max for
the drawing rectangle, but we were providing a number for exclusive.
The number of bits used by the hardware only covers this value going
up to the maximum size, so when we programmed 2048 as the maximum
inclusive X, it saw a maximum X of 0 and clipped all rendering.  This
caused rendering failures in gnome-shell.

Fixes piglit fbo-maxsize.

v2: dropped changes to the blitter, which does use an exclusive x2, y2.
    [change by anholt]

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=45558
Reviewed-by: Eric Anholt <eric@anholt.net>
NOTE: This is a candidate for release branches.

src/mesa/drivers/dri/i915/i830_vtbl.c

index 8acbc8718613fb4c34acb1121c1173a81ca2325f..28e95d97cc3fb8512001777f3417f19eeb72e434 100644 (file)
@@ -692,8 +692,8 @@ i830_set_draw_region(struct intel_context *intel,
    state->Buffer[I830_DESTREG_DRAWRECT1] = 0;
    state->Buffer[I830_DESTREG_DRAWRECT2] = (draw_y << 16) | draw_x;
    state->Buffer[I830_DESTREG_DRAWRECT3] =
-      ((ctx->DrawBuffer->Width + draw_x) & 0xffff) |
-      ((ctx->DrawBuffer->Height + draw_y) << 16);
+      ((ctx->DrawBuffer->Width + draw_x - 1) & 0xffff) |
+      ((ctx->DrawBuffer->Height + draw_y - 1) << 16);
    state->Buffer[I830_DESTREG_DRAWRECT4] = (draw_y << 16) | draw_x;
    state->Buffer[I830_DESTREG_DRAWRECT5] = MI_NOOP;