From fbe8428af8398b82be038daa89fcbacf3bc714dc Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Tue, 1 Oct 2024 16:45:14 +0200 Subject: [PATCH] panvk/csf: Fix prepare_vp() when viewport->x is negative The scissor descriptor wants positive min/max bounds. Signed-off-by: Boris Brezillon Reviewed-by: Mary Guillemard Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 431061df37e..8425e4c3b5f 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -545,7 +545,7 @@ prepare_vp(struct panvk_cmd_buffer *cmdbuf) pan_pack(&scissor_box, SCISSOR, cfg) { /* The spec says "width must be greater than 0.0" */ - assert(viewport->x >= 0); + assert(viewport->width >= 0); int minx = (int)viewport->x; int maxx = (int)(viewport->x + viewport->width); @@ -565,10 +565,11 @@ prepare_vp(struct panvk_cmd_buffer *cmdbuf) maxx = maxx > minx ? maxx - 1 : maxx; maxy = maxy > miny ? maxy - 1 : maxy; - cfg.scissor_minimum_x = minx; - cfg.scissor_minimum_y = miny; - cfg.scissor_maximum_x = maxx; - cfg.scissor_maximum_y = maxy; + /* Clamp viewport scissor to valid range */ + cfg.scissor_minimum_x = CLAMP(minx, 0, UINT16_MAX); + cfg.scissor_minimum_y = CLAMP(miny, 0, UINT16_MAX); + cfg.scissor_maximum_x = CLAMP(maxx, 0, UINT16_MAX); + cfg.scissor_maximum_y = CLAMP(maxy, 0, UINT16_MAX); } cs_move64_to(b, cs_sr_reg64(b, 42), scissor_box);