radeonsi: fix guardband handling for large values
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 <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6685>
diff --git a/src/gallium/drivers/radeonsi/si_state_viewport.c b/src/gallium/drivers/radeonsi/si_state_viewport.c
index 2db1e2b..9d62b2c 100644
--- a/src/gallium/drivers/radeonsi/si_state_viewport.c
+++ b/src/gallium/drivers/radeonsi/si_state_viewport.c
@@ -273,13 +273,15 @@
* 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);