dzn: Fix pipeline creation when rasterization is disabled
authorBoris Brezillon <boris.brezillon@collabora.com>
Fri, 1 Apr 2022 08:04:12 +0000 (01:04 -0700)
committerMarge Bot <emma+marge@anholt.net>
Fri, 8 Apr 2022 11:54:43 +0000 (11:54 +0000)
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 <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15698>

src/microsoft/vulkan/dzn_pipeline.cpp

index 97d941e..276ef05 100644 (file)
@@ -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);