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>
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user