i965: Require pixel alignment for GPU copy blit
authorCody Northrop <cody@lunarg.com>
Mon, 15 Sep 2014 22:14:20 +0000 (16:14 -0600)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 17 Dec 2014 00:04:14 +0000 (16:04 -0800)
The blitter will start at a pixel's natural alignment. For PBOs, if the
provided offset if not aligned, bits will get dropped.

This change adds offset alignment check for src and dst, kicking back if
the requirements are not met.

The change is based on following verbiage from BSPEC:
 Color pixel sizes supported are 8, 16, and 32 bits per pixel (bpp).
 All pixels are naturally aligned.

Found in the following locations:
page 35 of intel-gfx-prm-osrc-hsw-blitter.pdf
page 29 of ivb_ihd_os_vol1_part4.pdf
page 29 of snb_ihd_os_vol1_part5.pdf

This behavior was observed with Steam Big Picture rendering incorrect
icon colors.  The fix has been tested on Ubuntu and SteamOS on Haswell.

Signed-off-by: Cody Northrop <cody@lunarg.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83908
Reviewed-by: Neil Roberts <neil@linux.intel.com>
src/mesa/drivers/dri/i915/intel_blit.c
src/mesa/drivers/dri/i965/intel_blit.c

index d4e269dc8418b28d27840afc8bfb7e504a4db7f7..9a68625318abbc9a88ce7b765dbaf2465a2f9ccf 100644 (file)
@@ -271,9 +271,10 @@ intelEmitCopyBlit(struct intel_context *intel,
        dst_buffer, dst_pitch, dst_offset, dst_x, dst_y, w, h);
 
    /* Blit pitch must be dword-aligned.  Otherwise, the hardware appears to drop
-    * the low bits.
+    * the low bits.  Offsets must be naturally aligned.
     */
-   if (src_pitch % 4 != 0 || dst_pitch % 4 != 0)
+   if (src_pitch % 4 != 0 || src_offset % cpp != 0 ||
+       dst_pitch % 4 != 0 || dst_offset % cpp != 0)
       return false;
 
    /* For big formats (such as floating point), do the copy using 16 or 32bpp
index 8d816718bf03f6c21648c502d37c7ac81eed1779..400d3d3d9e7a6929b55b4b23789898e2bfa0e8dd 100644 (file)
@@ -344,9 +344,10 @@ intelEmitCopyBlit(struct brw_context *brw,
        dst_buffer, dst_pitch, dst_offset, dst_x, dst_y, w, h);
 
    /* Blit pitch must be dword-aligned.  Otherwise, the hardware appears to drop
-    * the low bits.
+    * the low bits.  Offsets must be naturally aligned.
     */
-   if (src_pitch % 4 != 0 || dst_pitch % 4 != 0)
+   if (src_pitch % 4 != 0 || src_offset % cpp != 0 ||
+       dst_pitch % 4 != 0 || dst_offset % cpp != 0)
       return false;
 
    /* For big formats (such as floating point), do the copy using 16 or 32bpp