venus: implement VK_EXT_vertex_input_dynamic_state
authorJuston Li <justonli@google.com>
Mon, 7 Aug 2023 22:34:07 +0000 (15:34 -0700)
committerMarge Bot <emma+marge@anholt.net>
Wed, 13 Sep 2023 00:00:39 +0000 (00:00 +0000)
requires a fixup to ignore static pVertexInputState if dynamic state
is used.

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

docs/features.txt
src/virtio/vulkan/vn_command_buffer.c
src/virtio/vulkan/vn_physical_device.c
src/virtio/vulkan/vn_pipeline.c

index 0cf3de2..b68a31d 100644 (file)
@@ -608,7 +608,7 @@ Khronos extensions that are not part of any Vulkan version:
   VK_EXT_shader_module_identifier                       DONE (anv, hasvk, radv, tu, v3dv)
   VK_EXT_transform_feedback                             DONE (anv, hasvk, lvp, nvk, radv, tu, vn)
   VK_EXT_vertex_attribute_divisor                       DONE (anv, dzn, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn)
-  VK_EXT_vertex_input_dynamic_state                     DONE (anv, lvp, nvk, radv, tu)
+  VK_EXT_vertex_input_dynamic_state                     DONE (anv, lvp, nvk, radv, tu, vn)
   VK_EXT_ycbcr_image_arrays                             DONE (anv, hasvk, nvk, radv)
   VK_ANDROID_external_memory_android_hardware_buffer    DONE (anv, radv, vn)
   VK_ANDROID_native_buffer                              DONE (anv, radv, tu, v3dv, vn)
index 7d6996d..7f6d2cf 100644 (file)
@@ -2340,3 +2340,17 @@ vn_CmdPushDescriptorSetWithTemplateKHR(
 
    mtx_unlock(&templ->mutex);
 }
+
+void
+vn_CmdSetVertexInputEXT(
+   VkCommandBuffer commandBuffer,
+   uint32_t vertexBindingDescriptionCount,
+   const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions,
+   uint32_t vertexAttributeDescriptionCount,
+   const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions)
+{
+   VN_CMD_ENQUEUE(vkCmdSetVertexInputEXT, commandBuffer,
+                  vertexBindingDescriptionCount, pVertexBindingDescriptions,
+                  vertexAttributeDescriptionCount,
+                  pVertexAttributeDescriptions);
+}
index bf5c9cc..2f90b54 100644 (file)
@@ -171,6 +171,8 @@ vn_physical_device_init_features(struct vn_physical_device *physical_dev)
       VkPhysicalDeviceTransformFeedbackFeaturesEXT transform_feedback;
       VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT
          vertex_attribute_divisor;
+      VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT
+         vertex_input_dynamic_state;
    } local_feats;
 
    /* Clear the struct so that all unqueried features will be VK_FALSE. */
@@ -261,6 +263,7 @@ vn_physical_device_init_features(struct vn_physical_device *physical_dev)
    VN_ADD_PNEXT_EXT(feats2, ROBUSTNESS_2_FEATURES_EXT, local_feats.robustness_2, exts->EXT_robustness2);
    VN_ADD_PNEXT_EXT(feats2, TRANSFORM_FEEDBACK_FEATURES_EXT, local_feats.transform_feedback, exts->EXT_transform_feedback);
    VN_ADD_PNEXT_EXT(feats2, VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, local_feats.vertex_attribute_divisor, exts->EXT_vertex_attribute_divisor);
+   VN_ADD_PNEXT_EXT(feats2, VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT, local_feats.vertex_input_dynamic_state, exts->EXT_vertex_input_dynamic_state);
 
    /* clang-format on */
 
@@ -1127,6 +1130,7 @@ vn_physical_device_get_passthrough_extensions(
       .EXT_shader_subgroup_ballot = true,
       .EXT_transform_feedback = true,
       .EXT_vertex_attribute_divisor = true,
+      .EXT_vertex_input_dynamic_state = true,
 
       /* vendor */
       .VALVE_mutable_descriptor_type = true,
index b2124da..7ac9404 100644 (file)
@@ -363,6 +363,7 @@ struct vn_graphics_pipeline_create_info_fix {
    bool ignore_multisample_state;
    bool ignore_depth_stencil_state;
    bool ignore_color_blend_state;
+   bool ignore_vertex_input_state;
    bool ignore_base_pipeline_handle;
 };
 
@@ -429,6 +430,7 @@ vn_fix_graphics_pipeline_create_info(
          bool viewport_with_count;
          bool scissor;
          bool scissor_with_count;
+         bool vertex_input;
       } has_dynamic_state = { 0 };
 
       if (info->pDynamicState) {
@@ -450,6 +452,9 @@ vn_fix_graphics_pipeline_create_info(
             case VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT:
                has_dynamic_state.scissor_with_count = true;
                break;
+            case VK_DYNAMIC_STATE_VERTEX_INPUT_EXT:
+               has_dynamic_state.vertex_input = true;
+               break;
             default:
                break;
             }
@@ -498,8 +503,10 @@ vn_fix_graphics_pipeline_create_info(
        * then vertex input state is included in a complete graphics pipeline.
        *
        * We support no extension yet that allows the vertex stage to be
-       * omitted, such as VK_EXT_vertex_input_dynamic_state or
-       * VK_EXT_graphics_pipeline_library.
+       * omitted such as VK_EXT_graphics_pipeline_library.
+       *
+       * VK_EXT_vertex_input_dynamic_state allows for the state to be set
+       * dynamically but vertex stage must be included regardless.
        */
       const bool UNUSED has_vertex_input_state = true;
 
@@ -639,6 +646,17 @@ vn_fix_graphics_pipeline_create_info(
          any_fix |= fix.ignore_color_blend_state;
       }
 
+      /* Ignore pVertexInputState?
+       * The Vulkan spec (1.3.264) says:
+       * VK_DYNAMIC_STATE_VERTEX_INPUT_EXT specifies that the
+       * pVertexInputState state will be ignored and must be set dynamically
+       * with vkCmdSetVertexInputEXT before any drawing commands
+       */
+      if (info->pVertexInputState && has_dynamic_state.vertex_input) {
+         fix.ignore_vertex_input_state = true;
+         any_fix = true;
+      }
+
       /* Ignore basePipelineHandle?
        *    VUID-VkGraphicsPipelineCreateInfo-flags-00722
        *    VUID-VkGraphicsPipelineCreateInfo-flags-00724
@@ -692,6 +710,9 @@ vn_fix_graphics_pipeline_create_info(
       if (fix.ignore_color_blend_state)
          fixes->create_infos[i].pColorBlendState = NULL;
 
+      if (fix.ignore_vertex_input_state)
+         fixes->create_infos[i].pVertexInputState = NULL;
+
       if (fix.ignore_base_pipeline_handle)
          fixes->create_infos[i].basePipelineHandle = VK_NULL_HANDLE;
    }