summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2017-01-22 01:44:08 -0800
committerKenneth Graunke <[email protected]>2017-01-26 01:43:20 -0800
commitf8f7ea508be7fe7222cd19e0d59574cfea2decf0 (patch)
tree555d53e215f7779fae4822b20995b1a1a07fbcb1
parentfcf723b647f36fa174d29b1fe6a9732637a1f8d1 (diff)
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" <[email protected]> Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/intel_blit.c14
-rw-r--r--src/mesa/drivers/dri/i965/intel_blit.h4
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 21a16e18c38..9863ca1f94a 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 6925795656a..7cb2c7e0b27 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,