From 05b6c1ed8464c02ddb2835159d1d9c3aec9a4aa4 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 1 Apr 2022 01:04:12 -0700 Subject: [PATCH] dzn: Fix pipeline creation when rasterization is disabled We use some of the VkGraphicsPipelineCreateInfo fields that should be ignored when rasterization in disabled, assuming those who be set to NULL by the caller in that case, which is not mandated by the Vulkan specification. Reviewed-by: Erik Faye-Lund Part-of: --- src/microsoft/vulkan/dzn_pipeline.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/microsoft/vulkan/dzn_pipeline.cpp b/src/microsoft/vulkan/dzn_pipeline.cpp index 97d941e4e26..276ef05ef4c 100644 --- a/src/microsoft/vulkan/dzn_pipeline.cpp +++ b/src/microsoft/vulkan/dzn_pipeline.cpp @@ -352,7 +352,7 @@ dzn_graphics_pipeline_translate_rast(dzn_graphics_pipeline *pipeline, const VkPipelineRasterizationStateCreateInfo *in_rast = in->pRasterizationState; const VkPipelineViewportStateCreateInfo *in_vp = - in->pViewportState; + in_rast->rasterizerDiscardEnable ? NULL : in->pViewportState; if (in_vp) { pipeline->vp.count = in_vp->viewportCount; @@ -387,8 +387,10 @@ dzn_graphics_pipeline_translate_ms(dzn_graphics_pipeline *pipeline, D3D12_GRAPHICS_PIPELINE_STATE_DESC *out, const VkGraphicsPipelineCreateInfo *in) { + const VkPipelineRasterizationStateCreateInfo *in_rast = + in->pRasterizationState; const VkPipelineMultisampleStateCreateInfo *in_ms = - in->pMultisampleState; + in_rast->rasterizerDiscardEnable ? NULL : in->pMultisampleState; /* TODO: sampleShadingEnable, minSampleShading, * alphaToOneEnable @@ -532,8 +534,10 @@ dzn_graphics_pipeline_translate_zsa(dzn_graphics_pipeline *pipeline, D3D12_GRAPHICS_PIPELINE_STATE_DESC *out, const VkGraphicsPipelineCreateInfo *in) { + const VkPipelineRasterizationStateCreateInfo *in_rast = + in->pRasterizationState; const VkPipelineDepthStencilStateCreateInfo *in_zsa = - in->pDepthStencilState; + in_rast->rasterizerDiscardEnable ? NULL : in->pDepthStencilState; if (!in_zsa) return; @@ -649,10 +653,12 @@ dzn_graphics_pipeline_translate_blend(dzn_graphics_pipeline *pipeline, D3D12_GRAPHICS_PIPELINE_STATE_DESC *out, const VkGraphicsPipelineCreateInfo *in) { + const VkPipelineRasterizationStateCreateInfo *in_rast = + in->pRasterizationState; const VkPipelineColorBlendStateCreateInfo *in_blend = - in->pColorBlendState; + in_rast->rasterizerDiscardEnable ? NULL : in->pColorBlendState; const VkPipelineMultisampleStateCreateInfo *in_ms = - in->pMultisampleState; + in_rast->rasterizerDiscardEnable ? NULL : in->pMultisampleState; if (!in_blend || !in_ms) return; @@ -776,6 +782,11 @@ dzn_graphics_pipeline_create(dzn_device *device, .Flags = D3D12_PIPELINE_STATE_FLAG_NONE, }; + const VkPipelineViewportStateCreateInfo *vp_info = + pCreateInfo->pRasterizationState->rasterizerDiscardEnable ? + NULL : pCreateInfo->pViewportState; + + ret = dzn_graphics_pipeline_translate_vi(pipeline, pAllocator, &desc, pCreateInfo, &inputs); if (ret != VK_SUCCESS) goto out; @@ -861,10 +872,7 @@ dzn_graphics_pipeline_create(dzn_device *device, !(stage_mask & VK_SHADER_STAGE_GEOMETRY_BIT))) { if (pipeline->vp.dynamic) { yz_flip_mode = DXIL_SPIRV_YZ_FLIP_CONDITIONAL; - } else if (pCreateInfo->pViewportState) { - const VkPipelineViewportStateCreateInfo *vp_info = - pCreateInfo->pViewportState; - + } else if (vp_info) { for (uint32_t i = 0; vp_info->pViewports && i < vp_info->viewportCount; i++) { if (vp_info->pViewports[i].height > 0) y_flip_mask |= BITFIELD_BIT(i);