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)
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);
+}
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. */
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 */
.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,
bool ignore_multisample_state;
bool ignore_depth_stencil_state;
bool ignore_color_blend_state;
+ bool ignore_vertex_input_state;
bool ignore_base_pipeline_handle;
};
bool viewport_with_count;
bool scissor;
bool scissor_with_count;
+ bool vertex_input;
} has_dynamic_state = { 0 };
if (info->pDynamicState) {
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;
}
* 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;
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
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;
}