From f8f7ea508be7fe7222cd19e0d59574cfea2decf0 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Sun, 22 Jan 2017 01:44:08 -0800 Subject: [PATCH] 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" Signed-off-by: Kenneth Graunke Reviewed-by: Jason Ekstrand --- 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 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, -- 2.30.2