diff options
author | Kenneth Graunke <[email protected]> | 2017-01-22 01:44:08 -0800 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2017-02-03 11:08:55 +0000 |
commit | 2554c98d70f4a919fbe71c43e6261b799d2cd6ba (patch) | |
tree | 5785f1b36e027e5f5473dcee0c9b9a890dee4612 /src/mesa | |
parent | 31715781c62f506875a7fea017aff64fdac643af (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]>
(cherry picked from commit f8f7ea508be7fe7222cd19e0d59574cfea2decf0)
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_blit.c | 14 | ||||
-rw-r--r-- | 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, |