Mesa (master): i965: Make intelEmitCopyBlit not truncate large strides.

Kenneth Graunke kwg at kemper.freedesktop.org
Thu Jan 26 09:43:35 UTC 2017


Module: Mesa
Branch: master
Commit: f8f7ea508be7fe7222cd19e0d59574cfea2decf0
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f8f7ea508be7fe7222cd19e0d59574cfea2decf0

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Sun Jan 22 01:44:08 2017 -0800

i965: Make intelEmitCopyBlit not truncate large strides.

When trying to blit larger tiled surfaces, the pitch can be larger than
32768 bytes, which means it won't fit in a GLshort.  Passing it in will
truncate the stride to 0, which has...surprising results.

The pitch can be up to 32,768 DWords, or 128kB.  We measure it in bytes,
but divide by 4 when programming it.  So we need to handle values up to
131,072.  Switch from GLshort to int32_t to avoid the truncation.

Fixes GL45-CTS.gtf30.GL3Tests.depth_texture.depth_texture_copyteximage
at widths greater than 8192.

v2: Use int32_t as negative values can be used (Jason).

Cc: "17.0" <mesa-stable at lists.freedesktop.org>
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>

---

 src/mesa/drivers/dri/i965/intel_blit.c | 14 +++++---------
 src/mesa/drivers/dri/i965/intel_blit.h |  4 ++--
 2 files changed, 7 insertions(+), 11 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/intel_blit.c b/src/mesa/drivers/dri/i965/intel_blit.c
index 21a16e1..9863ca1 100644
--- a/src/mesa/drivers/dri/i965/intel_blit.c
+++ b/src/mesa/drivers/dri/i965/intel_blit.c
@@ -235,13 +235,9 @@ emit_miptree_blit(struct brw_context *brw,
     *    represented per scan line’s worth of graphics data depends on the
     *    color depth.
     *
-    * Furthermore, intelEmitCopyBlit (which is called below) uses a signed
-    * 16-bit integer to represent buffer pitch, so it can only handle buffer
-    * pitches < 32k. However, the pitch is measured in bytes for linear buffers
-    * and dwords for tiled buffers.
-    *
-    * As a result of these two limitations, we can only use the blitter to do
-    * this copy when the miptree's pitch is less than 32k linear or 128k tiled.
+    * The blitter's pitch is a signed 16-bit integer, but measured in bytes
+    * for linear surfaces and DWords for tiled surfaces.  So the maximum
+    * pitch is 32k linear and 128k tiled.
     */
    if (blt_pitch(src_mt) >= 32768 || blt_pitch(dst_mt) >= 32768) {
       perf_debug("Falling back due to >= 32k/128k pitch\n");
@@ -577,12 +573,12 @@ xy_blit_cmd(uint32_t src_tiling, uint32_t src_tr_mode,
 bool
 intelEmitCopyBlit(struct brw_context *brw,
 		  GLuint cpp,
-		  GLshort src_pitch,
+		  int32_t src_pitch,
 		  drm_intel_bo *src_buffer,
 		  GLuint src_offset,
 		  uint32_t src_tiling,
 		  uint32_t src_tr_mode,
-		  GLshort dst_pitch,
+		  int32_t dst_pitch,
 		  drm_intel_bo *dst_buffer,
 		  GLuint dst_offset,
 		  uint32_t dst_tiling,
diff --git a/src/mesa/drivers/dri/i965/intel_blit.h b/src/mesa/drivers/dri/i965/intel_blit.h
index 6925795..7cb2c7e 100644
--- a/src/mesa/drivers/dri/i965/intel_blit.h
+++ b/src/mesa/drivers/dri/i965/intel_blit.h
@@ -31,12 +31,12 @@
 bool
 intelEmitCopyBlit(struct brw_context *brw,
                   GLuint cpp,
-                  GLshort src_pitch,
+                  int32_t src_pitch,
                   drm_intel_bo *src_buffer,
                   GLuint src_offset,
                   uint32_t src_tiling,
                   uint32_t src_tr_mode,
-                  GLshort dst_pitch,
+                  int32_t dst_pitch,
                   drm_intel_bo *dst_buffer,
                   GLuint dst_offset,
                   uint32_t dst_tiling,




More information about the mesa-commit mailing list