From 2fbc12a0ac0472b85922c406ce14931091d74eb6 Mon Sep 17 00:00:00 2001 From: Jonathan Marek Date: Thu, 25 Jun 2020 10:55:48 -0400 Subject: [PATCH] turnip: fix huge scissor min/max case Now that tu_cs_emit_regs is used for the scissor, it hits an assert when the scissor is too large. Fixes this dEQP test: dEQP-VK.draw.scissor.static_scissor_max_int32 Fixes: 9c0ae5704d654108fd36b ("turnip: fix empty scissor case") Signed-off-by: Jonathan Marek Part-of: --- src/freedreno/vulkan/tu_pipeline.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index 794aa4a..54d011b 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -1562,6 +1562,15 @@ tu6_emit_scissor(struct tu_cs *cs, const VkRect2D *scissor) if (max.y == 0) min.y = max.y = 1; + /* avoid overflow with large scissor + * note the max will be limited to min - 1, so that empty scissor works + */ + uint32_t scissor_max = BITFIELD_MASK(15); + min.x = MIN2(scissor_max, min.x); + min.y = MIN2(scissor_max, min.y); + max.x = MIN2(scissor_max, max.x); + max.y = MIN2(scissor_max, max.y); + tu_cs_emit_regs(cs, A6XX_GRAS_SC_SCREEN_SCISSOR_TL_0(.x = min.x, .y = min.y), A6XX_GRAS_SC_SCREEN_SCISSOR_BR_0(.x = max.x - 1, .y = max.y - 1)); -- 2.7.4