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 <justonli@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25193>
This commit is contained in:
Juston Li
2023-08-07 15:34:07 -07:00
committed by Marge Bot
parent dfbe545a2c
commit 4e85c325ff
4 changed files with 42 additions and 3 deletions

View 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)

View 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);
}

View 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,

View 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;
}