From 4e85c325ffe88e6c8500cc54a5359324102d32c4 Mon Sep 17 00:00:00 2001 From: Juston Li Date: Mon, 7 Aug 2023 15:34:07 -0700 Subject: [PATCH] venus: implement VK_EXT_vertex_input_dynamic_state requires a fixup to ignore static pVertexInputState if dynamic state is used. Signed-off-by: Juston Li Part-of: --- docs/features.txt | 2 +- src/virtio/vulkan/vn_command_buffer.c | 14 ++++++++++++++ src/virtio/vulkan/vn_physical_device.c | 4 ++++ src/virtio/vulkan/vn_pipeline.c | 25 +++++++++++++++++++++++-- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/docs/features.txt b/docs/features.txt index 0cf3de2f820..b68a31d9a81 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -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) diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index 7d6996df6cb..7f6d2cffc40 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -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); +} diff --git a/src/virtio/vulkan/vn_physical_device.c b/src/virtio/vulkan/vn_physical_device.c index bf5c9cc88fe..2f90b540b6b 100644 --- a/src/virtio/vulkan/vn_physical_device.c +++ b/src/virtio/vulkan/vn_physical_device.c @@ -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, diff --git a/src/virtio/vulkan/vn_pipeline.c b/src/virtio/vulkan/vn_pipeline.c index b2124da82ce..7ac9404c57f 100644 --- a/src/virtio/vulkan/vn_pipeline.c +++ b/src/virtio/vulkan/vn_pipeline.c @@ -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; }