Module: Mesa
Branch: main
Commit: 417437c71568254b5d1895c6d2d7ff3b12139529
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=417437c71568254b5d1895c6d2d7ff3b12139529

Author: Juston Li <justo...@google.com>
Date:   Tue Oct 24 14:37:18 2023 -0700

venus: pipeline fixes for VK_EXT_extended_dynamic_state3

- pMultisampleState->pSampleMask should be ignored when
VK_DYNAMIC_STATE_SAMPLE_MASK_EXT is used.
- pRasterizationState can be null now

Signed-off-by: Juston Li <justo...@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25921>

---

 src/virtio/vulkan/vn_pipeline.c | 45 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 38 insertions(+), 7 deletions(-)

diff --git a/src/virtio/vulkan/vn_pipeline.c b/src/virtio/vulkan/vn_pipeline.c
index 1637fc96b26..b47445ca937 100644
--- a/src/virtio/vulkan/vn_pipeline.c
+++ b/src/virtio/vulkan/vn_pipeline.c
@@ -63,6 +63,9 @@ struct vn_graphics_pipeline_create_info_fields {
          /** VkPipelineViewportStateCreateInfo::pScissors */
          bool viewport_state_scissors : 1;
 
+         /** VkPipelineMultisampleStateCreateInfo::pSampleMask */
+         bool multisample_state_sample_mask : 1;
+
          /** VkPipelineRenderingCreateInfo, all format fields */
          bool rendering_info_formats : 1;
       };
@@ -119,6 +122,8 @@ struct vn_graphics_dynamic_state {
          bool viewport : 1;
          /** VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT */
          bool viewport_with_count : 1;
+         /** VK_DYNAMIC_STATE_SAMPLE_MASK_EXT */
+         bool sample_mask : 1;
          /** VK_DYNAMIC_STATE_SCISSOR */
          bool scissor : 1;
          /** VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT */
@@ -193,6 +198,7 @@ struct vn_graphics_pipeline_fix_desc {
  */
 struct vn_graphics_pipeline_fix_tmp {
    VkGraphicsPipelineCreateInfo *infos;
+   VkPipelineMultisampleStateCreateInfo *multisample_state_infos;
    VkPipelineViewportStateCreateInfo *viewport_state_infos;
 };
 
@@ -557,11 +563,14 @@ vn_graphics_pipeline_fix_tmp_alloc(const 
VkAllocationCallbacks *alloc,
 {
    struct vn_graphics_pipeline_fix_tmp *tmp;
    VkGraphicsPipelineCreateInfo *infos;
+   VkPipelineMultisampleStateCreateInfo *multisample_state_infos;
    VkPipelineViewportStateCreateInfo *viewport_state_infos;
 
    VK_MULTIALLOC(ma);
    vk_multialloc_add(&ma, &tmp, __typeof__(*tmp), 1);
    vk_multialloc_add(&ma, &infos, __typeof__(*infos), info_count);
+   vk_multialloc_add(&ma, &multisample_state_infos,
+                     __typeof__(*multisample_state_infos), info_count);
    vk_multialloc_add(&ma, &viewport_state_infos,
                      __typeof__(*viewport_state_infos), info_count);
 
@@ -569,6 +578,7 @@ vn_graphics_pipeline_fix_tmp_alloc(const 
VkAllocationCallbacks *alloc,
       return NULL;
 
    tmp->infos = infos;
+   tmp->multisample_state_infos = multisample_state_infos;
    tmp->viewport_state_infos = viewport_state_infos;
 
    return tmp;
@@ -646,6 +656,9 @@ vn_graphics_dynamic_state_update(
       case VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT:
          raw.viewport_with_count = true;
          break;
+      case VK_DYNAMIC_STATE_SAMPLE_MASK_EXT:
+         raw.sample_mask = true;
+         break;
       case VK_DYNAMIC_STATE_SCISSOR:
          raw.scissor = true;
          break;
@@ -687,6 +700,12 @@ vn_graphics_dynamic_state_update(
       dynamic->scissor_with_count |= raw.scissor_with_count;
       dynamic->rasterizer_discard_enable |= raw.rasterizer_discard_enable;
    }
+   if (direct_gpl.fragment_shader) {
+      dynamic->sample_mask |= raw.sample_mask;
+   }
+   if (direct_gpl.fragment_output) {
+      dynamic->sample_mask |= raw.sample_mask;
+   }
 }
 
 /**
@@ -983,17 +1002,16 @@ vn_graphics_pipeline_state_fill(
       valid.rasterization_state = true;
       valid.pipeline_layout = true;
 
-      state->rasterizer_discard_enable =
-         info->pRasterizationState->rasterizerDiscardEnable;
+      if (info->pRasterizationState) {
+         state->rasterizer_discard_enable =
+            info->pRasterizationState->rasterizerDiscardEnable;
+      }
 
       const bool is_raster_statically_disabled =
          !state->dynamic.rasterizer_discard_enable &&
          state->rasterizer_discard_enable;
 
       if (!is_raster_statically_disabled) {
-         /* TODO(VK_EXT_extended_dynamic_state3): pViewportState may be
-          * invalid.
-          */
          valid.viewport_state = true;
 
          valid.viewport_state_viewports =
@@ -1065,7 +1083,7 @@ vn_graphics_pipeline_state_fill(
           */
          valid.multisample_state = true;
 
-         /* TODO(VK_EXT_extended_dynamic_state3): pSampleMask may be invalid. 
*/
+         valid.multisample_state_sample_mask = !state->dynamic.sample_mask;
 
          if ((state->render_pass.attachment_aspects &
               (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) {
@@ -1105,7 +1123,7 @@ vn_graphics_pipeline_state_fill(
           */
          valid.multisample_state = true;
 
-         /* TODO(VK_EXT_extended_dynamic_state3): pSampleMask may be invalid */
+         valid.multisample_state_sample_mask = !state->dynamic.sample_mask;
 
          valid.color_blend_state |=
             (bool)(state->render_pass.attachment_aspects &
@@ -1159,6 +1177,10 @@ vn_graphics_pipeline_state_fill(
          .multisample_state =
             !valid.multisample_state &&
             info->pMultisampleState,
+         .multisample_state_sample_mask =
+            !valid.multisample_state_sample_mask &&
+            info->pMultisampleState &&
+            info->pMultisampleState->pSampleMask,
          .depth_stencil_state =
             !valid.depth_stencil_state &&
             info->pDepthStencilState,
@@ -1246,6 +1268,15 @@ vn_fix_graphics_pipeline_create_infos(
       if (fix_descs[i].erase.base_pipeline_handle)
          fix_tmp->infos[i].basePipelineHandle = VK_NULL_HANDLE;
 
+      /* VkPipelineMultisampleStateCreateInfo */
+      if (fix_descs[i].erase.multisample_state_sample_mask) {
+         /* Swap original pMultisampleState with temporary state. */
+         fix_tmp->multisample_state_infos[i] = *infos[i].pMultisampleState;
+         fix_tmp->infos[i].pMultisampleState = 
&fix_tmp->multisample_state_infos[i];
+
+         fix_tmp->multisample_state_infos[i].pSampleMask = NULL;
+      }
+
       /* VkPipelineViewportStateCreateInfo */
       if (fix_descs[i].erase.viewport_state_viewports ||
           fix_descs[i].erase.viewport_state_scissors) {

Reply via email to