Expose VK_EXT_extended_dynamic_state2 Only the main feature, as required by Vulkan 1.3, is exposed. Many projects still create Vulkan 1.1 and rely on the extension to get dynamic state. Bug: b/204502923 Bug: b/246064773 Change-Id: Idb4235bee77cead4bad0c09f5feb0f76a664a5e2 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/75448 Tested-by: Shahbaz Youssefi <syoussefi@google.com> Reviewed-by: Chris Forbes <chrisforbes@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
diff --git a/src/Vulkan/VkGetProcAddress.cpp b/src/Vulkan/VkGetProcAddress.cpp index 8d3cf52..393c21e 100644 --- a/src/Vulkan/VkGetProcAddress.cpp +++ b/src/Vulkan/VkGetProcAddress.cpp
@@ -552,6 +552,16 @@ MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilTestEnableEXT), MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewportWithCountEXT), } }, + // VK_EXT_extended_dynamic_state2 + { + VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, + { + MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetRasterizerDiscardEnableEXT), + MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBiasEnableEXT), + MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetPrimitiveRestartEnableEXT), + MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLogicOpEXT), + MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetPatchControlPointsEXT), + } }, // VK_EXT_vertex_input_dynamic_state { VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME,
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp index 9dd449e..09562eb 100644 --- a/src/Vulkan/VkPhysicalDevice.cpp +++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -483,6 +483,13 @@ features->extendedDynamicState = VK_TRUE; } +static void getPhysicalDeviceExtendedDynamicState2FeaturesEXT(VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *features) +{ + features->extendedDynamicState2 = VK_TRUE; + features->extendedDynamicState2LogicOp = VK_FALSE; + features->extendedDynamicState2PatchControlPoints = VK_FALSE; +} + static void getPhysicalDeviceVertexInputDynamicStateFeaturesEXT(VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *features) { features->vertexInputDynamicState = VK_TRUE; @@ -618,6 +625,9 @@ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: getPhysicalDeviceExtendedDynamicStateFeaturesEXT(reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *>(curExtension)); break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: + getPhysicalDeviceExtendedDynamicState2FeaturesEXT(reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *>(curExtension)); + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: getPhysicalDeviceVertexInputDynamicStateFeaturesEXT(reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *>(curExtension)); break; @@ -1560,6 +1570,15 @@ CheckFeature(requested, supported, stippledSmoothLines); } +bool PhysicalDevice::hasExtendedFeatures(const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *requested) const +{ + auto supported = getSupportedFeatures(requested); + + return CheckFeature(requested, supported, extendedDynamicState2) && + CheckFeature(requested, supported, extendedDynamicState2LogicOp) && + CheckFeature(requested, supported, extendedDynamicState2PatchControlPoints); +} + bool PhysicalDevice::hasExtendedFeatures(const VkPhysicalDeviceProvokingVertexFeaturesEXT *requested) const { auto supported = getSupportedFeatures(requested);
diff --git a/src/Vulkan/VkPhysicalDevice.hpp b/src/Vulkan/VkPhysicalDevice.hpp index 387ee33..af14b70 100644 --- a/src/Vulkan/VkPhysicalDevice.hpp +++ b/src/Vulkan/VkPhysicalDevice.hpp
@@ -46,6 +46,7 @@ bool hasExtendedFeatures(const VkPhysicalDeviceDepthClipEnableFeaturesEXT *features) const; bool hasExtendedFeatures(const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *features) const; bool hasExtendedFeatures(const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *features) const; + bool hasExtendedFeatures(const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *features) const; bool hasExtendedFeatures(const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *features) const; bool hasExtendedFeatures(const VkPhysicalDevicePrivateDataFeatures *features) const; bool hasExtendedFeatures(const VkPhysicalDeviceTextureCompressionASTCHDRFeatures *features) const;
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp index 326fe75..26cd636 100644 --- a/src/Vulkan/libVulkan.cpp +++ b/src/Vulkan/libVulkan.cpp
@@ -424,6 +424,7 @@ { { VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION } }, // Vulkan 1.3 promoted extensions { { VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_SPEC_VERSION } }, + { { VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_2_SPEC_VERSION } }, { { VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION } }, { { VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_SPEC_VERSION } }, { { VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME, VK_EXT_PIPELINE_CREATION_FEEDBACK_SPEC_VERSION } }, @@ -1056,6 +1057,16 @@ } } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: + { + const auto *dynamicStateFeatures = reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *>(extensionCreateInfo); + bool hasFeatures = vk::Cast(physicalDevice)->hasExtendedFeatures(dynamicStateFeatures); + if(!hasFeatures) + { + return VK_ERROR_FEATURE_NOT_PRESENT; + } + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: { const auto *dynamicStateFeatures = reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT *>(extensionCreateInfo); @@ -3078,6 +3089,20 @@ vk::Cast(commandBuffer)->setPrimitiveRestartEnable(primitiveRestartEnable); } +VKAPI_ATTR void VKAPI_CALL vkCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) +{ + TRACE("(VkCommandBuffer commandBuffer = %p, VkLogicOp logicOp = %d)", commandBuffer, logicOp); + + UNREACHABLE("extendedDynamicState2LogicOp not supported"); +} + +VKAPI_ATTR void VKAPI_CALL vkCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) +{ + TRACE("(VkCommandBuffer commandBuffer = %p, patchControlPoints = %d)", commandBuffer, patchControlPoints); + + UNREACHABLE("extendedDynamicState2PatchControlPoints not supported"); +} + VKAPI_ATTR void VKAPI_CALL vkCmdSetVertexInputEXT(VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount, const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,