From d39e202dac8a00a803d8b93724115c5090caabb0 Mon Sep 17 00:00:00 2001 From: Chad Versace Date: Mon, 25 Jul 2022 14:32:25 -0700 Subject: [PATCH] venus/pipeline: Ignore pViewportState::pScissors Signed-off-by: Chad Versace Reviewed-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_pipeline.c | 39 ++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/virtio/vulkan/vn_pipeline.c b/src/virtio/vulkan/vn_pipeline.c index 330eb3b21bd..156a7c94b2f 100644 --- a/src/virtio/vulkan/vn_pipeline.c +++ b/src/virtio/vulkan/vn_pipeline.c @@ -251,6 +251,7 @@ struct vn_graphics_pipeline_create_info_fix { bool ignore_tessellation_state; bool ignore_viewport_state; bool ignore_viewports; + bool ignore_scissors; bool ignore_multisample_state; bool ignore_depth_stencil_state; bool ignore_color_blend_state; @@ -313,6 +314,7 @@ vn_fix_graphics_pipeline_create_info( struct { bool rasterizer_discard_enable; bool viewport; + bool scissor; } has_dynamic_state = { 0 }; if (info->pDynamicState) { @@ -324,6 +326,9 @@ vn_fix_graphics_pipeline_create_info( case VK_DYNAMIC_STATE_VIEWPORT: has_dynamic_state.viewport = true; break; + case VK_DYNAMIC_STATE_SCISSOR: + has_dynamic_state.scissor = true; + break; default: break; } @@ -427,6 +432,23 @@ vn_fix_graphics_pipeline_create_info( } } + /* Ignore pScissors? + * VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748 + * + * Even if pViewportState is non-null, we must not dereference it if it + * is ignored. + */ + if (!fix.ignore_viewport_state && info->pViewportState && + info->pViewportState->pScissors) { + const bool has_dynamic_scissor = + has_pre_raster_state && has_dynamic_state.scissor; + + if (has_dynamic_scissor) { + fix.ignore_scissors = true; + any_fix = true; + } + } + /* Ignore pMultisampleState? * VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00751 */ @@ -480,11 +502,18 @@ vn_fix_graphics_pipeline_create_info( if (fix.ignore_viewport_state) fixes->create_infos[i].pViewportState = NULL; - if (fix.ignore_viewports && fixes->create_infos[i].pViewportState) { - fixes->viewport_state_create_infos[i] = *info->pViewportState; - fixes->viewport_state_create_infos[i].pViewports = NULL; - fixes->create_infos[i].pViewportState = - &fixes->viewport_state_create_infos[i]; + if (fixes->create_infos[i].pViewportState) { + if (fix.ignore_viewports || fix.ignore_scissors) { + fixes->viewport_state_create_infos[i] = *info->pViewportState; + fixes->create_infos[i].pViewportState = + &fixes->viewport_state_create_infos[i]; + } + + if (fix.ignore_viewports) + fixes->viewport_state_create_infos[i].pViewports = NULL; + + if (fix.ignore_scissors) + fixes->viewport_state_create_infos[i].pScissors = NULL; } if (fix.ignore_multisample_state)