From 738e202dceaa960be4e1379724289a481981cbeb Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Thu, 20 Jun 2024 11:17:41 +0200 Subject: [PATCH] panvk: Clamp viewport scissor to valid range Fix "dEQP-VK.draw.renderpass.offscreen_viewport.x_off_screen_negative_y*" tests. Also did a bit of clean up around emit_viewport. Signed-off-by: Mary Guillemard Reviewed-by: Erik Faye-Lund Part-of: --- src/panfrost/vulkan/jm/panvk_cmd_buffer.h | 3 --- src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c | 24 ++++++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/panfrost/vulkan/jm/panvk_cmd_buffer.h b/src/panfrost/vulkan/jm/panvk_cmd_buffer.h index a5173bcc674..f72dbf6cad6 100644 --- a/src/panfrost/vulkan/jm/panvk_cmd_buffer.h +++ b/src/panfrost/vulkan/jm/panvk_cmd_buffer.h @@ -208,9 +208,6 @@ void panvk_per_arch(cmd_alloc_tls_desc)(struct panvk_cmd_buffer *cmdbuf, void panvk_per_arch(cmd_prepare_tiler_context)(struct panvk_cmd_buffer *cmdbuf); -void panvk_per_arch(emit_viewport)(const VkViewport *viewport, - const VkRect2D *scissor, void *vpd); - void panvk_per_arch(cmd_preload_fb_after_batch_split)( struct panvk_cmd_buffer *cmdbuf); diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index 22a86e518d0..1ce87e1ddd1 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -720,12 +720,16 @@ panvk_draw_prepare_attributes(struct panvk_cmd_buffer *cmdbuf, draw->vs.attribute_bufs = cmdbuf->state.gfx.vs.attrib_bufs; } -void -panvk_per_arch(emit_viewport)(const VkViewport *viewport, - const VkRect2D *scissor, void *vpd) +static void +panvk_emit_viewport(const struct vk_viewport_state *vp, void *vpd) { + assert(vp->viewport_count == 1); + + const VkViewport *viewport = &vp->viewports[0]; + const VkRect2D *scissor = &vp->scissors[0]; + /* 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); @@ -743,6 +747,12 @@ panvk_per_arch(emit_viewport)(const VkViewport *viewport, maxx = maxx > minx ? maxx - 1 : maxx; maxy = maxy > miny ? maxy - 1 : maxy; + /* Clamp viewport scissor to valid range */ + minx = CLAMP(minx, 0, UINT16_MAX); + maxx = CLAMP(maxx, 0, UINT16_MAX); + miny = CLAMP(miny, 0, UINT16_MAX); + maxy = CLAMP(maxy, 0, UINT16_MAX); + assert(viewport->minDepth >= 0.0f && viewport->minDepth <= 1.0f); assert(viewport->maxDepth >= 0.0f && viewport->maxDepth <= 1.0f); @@ -761,14 +771,10 @@ panvk_draw_prepare_viewport(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) { if (is_dirty(cmdbuf, VP_VIEWPORTS) || is_dirty(cmdbuf, VP_SCISSORS)) { - const VkViewport *viewport = - &cmdbuf->vk.dynamic_graphics_state.vp.viewports[0]; - const VkRect2D *scissor = - &cmdbuf->vk.dynamic_graphics_state.vp.scissors[0]; struct panfrost_ptr vp = pan_pool_alloc_desc(&cmdbuf->desc_pool.base, VIEWPORT); - panvk_per_arch(emit_viewport)(viewport, scissor, vp.cpu); + panvk_emit_viewport(&cmdbuf->vk.dynamic_graphics_state.vp, vp.cpu); cmdbuf->state.gfx.vpd = vp.gpu; }