From f1730bed8f05e0b017875e383c9f413e7ef10b79 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 11 Sep 2020 11:52:18 +0200 Subject: [PATCH] radeonsi: fix guardband handling for large values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When minx = -32768 (ViewportBounds.Min) we'll hit the "left <= -1, ..." assert because 'left' is computed as: (-65535 / 2 - translate_x) / (minx - translate_x) This commit fixes the problem by using the full max_viewport_size => [-32768, 32767] instead of [-32767, 32767] for SI_QUANT_MODE_16_8_FIXED_POINT_1_256TH. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3502 Reviewed-by: Marek Olšák Part-of: --- src/gallium/drivers/radeonsi/si_state_viewport.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_state_viewport.c b/src/gallium/drivers/radeonsi/si_state_viewport.c index 2db1e2b6570..9d62b2c85f2 100644 --- a/src/gallium/drivers/radeonsi/si_state_viewport.c +++ b/src/gallium/drivers/radeonsi/si_state_viewport.c @@ -273,13 +273,15 @@ static void si_emit_guardband(struct si_context *ctx) * This is done by applying the inverse viewport transformation * on the viewport limits to get those limits in clip space. * - * The viewport range is [-max_viewport_size/2, max_viewport_size/2]. + * The viewport range is [-max_viewport_size/2 - 1, max_viewport_size/2]. + * (-1 to the min coord because max_viewport_size is odd and ViewportBounds + * Min/Max are -32768, 32767). */ assert(vp_as_scissor.quant_mode < ARRAY_SIZE(max_viewport_size)); max_range = max_viewport_size[vp_as_scissor.quant_mode] / 2; - left = (-max_range - vp.translate[0]) / vp.scale[0]; + left = (-max_range - 1 - vp.translate[0]) / vp.scale[0]; right = (max_range - vp.translate[0]) / vp.scale[0]; - top = (-max_range - vp.translate[1]) / vp.scale[1]; + top = (-max_range - 1 - vp.translate[1]) / vp.scale[1]; bottom = (max_range - vp.translate[1]) / vp.scale[1]; assert(left <= -1 && top <= -1 && right >= 1 && bottom >= 1);