intel: Avoid divide by zero for very small linear blits
authorIan Romanick <ian.d.romanick@intel.com>
Thu, 2 Feb 2012 23:32:45 +0000 (16:32 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 7 Feb 2012 18:00:32 +0000 (10:00 -0800)
If size is small (such as 1),

   pitch = ROUND_DOWN_TO(MIN2(size, (1 << 15) - 1), 4);

makes pitch = 0.  Then

   height = size / pitch;

causes a division-by-zero exception.  If pitch is zero, set height to
1 and avoid the division.

This fixes piglit's bin/getteximage-formats test and glean's
bufferObject test.

NOTE: This is a candidate for the 8.0 release branch.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44971

src/mesa/drivers/dri/intel/intel_blit.c

index 9eacadd213cb5f2a6d208f096f0d38aa15f603c1..fd4a86c4e72ececd93b7fbfe46447dfa7a98797a 100644 (file)
@@ -492,7 +492,7 @@ intel_emit_linear_blit(struct intel_context *intel,
     * rounding that down to the nearest DWORD is 1 << 15 - 4
     */
    pitch = ROUND_DOWN_TO(MIN2(size, (1 << 15) - 1), 4);
-   height = size / pitch;
+   height = (pitch == 0) ? 1 : size / pitch;
    ok = intelEmitCopyBlit(intel, 1,
                          pitch, src_bo, src_offset, I915_TILING_NONE,
                          pitch, dst_bo, dst_offset, I915_TILING_NONE,