From 0329070233eb443f822973af2745c290bb9470d9 Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Tue, 2 Jul 2024 14:02:41 +0200 Subject: [PATCH] panvk: Emit viewport when state is NULL When rasterizerDiscardEnable is active, it is allowed to have viewport and scissor disabled. In case we don't have any viewport defined we now define an empty one. This is required for "dEQP-VK.api.pipeline.pipeline_invalid_pointers_unused_structs.graphics" as it never set any viewports and cause fault on IDVS jobs as a result. Signed-off-by: Mary Guillemard Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index 975300a7993..fa35474f462 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -778,11 +778,20 @@ static void 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)) { + /* When rasterizerDiscardEnable is active, it is allowed to have viewport and + * scissor disabled. + * As a result, we define an empty one. + */ + if (!cmdbuf->state.gfx.vpd || is_dirty(cmdbuf, VP_VIEWPORTS) || + is_dirty(cmdbuf, VP_SCISSORS)) { struct panfrost_ptr vp = pan_pool_alloc_desc(&cmdbuf->desc_pool.base, VIEWPORT); - panvk_emit_viewport(&cmdbuf->vk.dynamic_graphics_state.vp, vp.cpu); + const struct vk_viewport_state *vps = + &cmdbuf->vk.dynamic_graphics_state.vp; + + if (vps->viewport_count > 0) + panvk_emit_viewport(vps, vp.cpu); cmdbuf->state.gfx.vpd = vp.gpu; }