Add getPhysicalDeviceFeatures2 This function reports on a Vulkan driver's fine grained capabilities. A previous change broke some functionality in ANGLE. This is an update to that reverted patch. Bug: b/162404391 Change-Id: Ief91bac28e3ee9a7d775616c1663650e70c49b3e Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/47891 Reviewed-by: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by: Sean Risser <srisser@google.com>
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp index 137a095..0d5c777 100644 --- a/src/Vulkan/VkPhysicalDevice.cpp +++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -15,6 +15,7 @@ #include "VkPhysicalDevice.hpp" #include "VkConfig.hpp" +#include "VkStringify.hpp" #include "Pipeline/SpirvShader.hpp" // sw::SIMD::Width #include "Reactor/Reactor.hpp" @@ -128,12 +129,14 @@ return features; } -void PhysicalDevice::getFeatures(VkPhysicalDeviceSamplerYcbcrConversionFeatures *features) const +template<typename T> +static void getPhysicalDeviceSamplerYcbcrConversionFeatures(T *features) { features->samplerYcbcrConversion = VK_TRUE; } -void PhysicalDevice::getFeatures(VkPhysicalDevice16BitStorageFeatures *features) const +template<typename T> +static void getPhysicalDevice16BitStorageFeatures(T *features) { features->storageBuffer16BitAccess = VK_FALSE; features->storageInputOutput16 = VK_FALSE; @@ -141,42 +144,49 @@ features->uniformAndStorageBuffer16BitAccess = VK_FALSE; } -void PhysicalDevice::getFeatures(VkPhysicalDeviceVariablePointerFeatures *features) const +template<typename T> +static void getPhysicalDeviceVariablePointersFeatures(T *features) { features->variablePointersStorageBuffer = VK_FALSE; features->variablePointers = VK_FALSE; } -void PhysicalDevice::getFeatures(VkPhysicalDevice8BitStorageFeaturesKHR *features) const +template<typename T> +static void getPhysicalDevice8BitStorageFeaturesKHR(T *features) { features->storageBuffer8BitAccess = VK_FALSE; features->uniformAndStorageBuffer8BitAccess = VK_FALSE; features->storagePushConstant8 = VK_FALSE; } -void PhysicalDevice::getFeatures(VkPhysicalDeviceMultiviewFeatures *features) const +template<typename T> +static void getPhysicalDeviceMultiviewFeatures(T *features) { features->multiview = VK_TRUE; features->multiviewGeometryShader = VK_FALSE; features->multiviewTessellationShader = VK_FALSE; } -void PhysicalDevice::getFeatures(VkPhysicalDeviceProtectedMemoryFeatures *features) const +template<typename T> +static void getPhysicalDeviceProtectedMemoryFeatures(T *features) { features->protectedMemory = VK_FALSE; } -void PhysicalDevice::getFeatures(VkPhysicalDeviceShaderDrawParameterFeatures *features) const +template<typename T> +static void getPhysicalDeviceShaderDrawParameterFeatures(T *features) { features->shaderDrawParameters = VK_FALSE; } -void PhysicalDevice::getFeatures(VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR *features) const +template<typename T> +static void getPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR(T *features) { features->separateDepthStencilLayouts = VK_TRUE; } -void PhysicalDevice::getFeatures(VkPhysicalDeviceLineRasterizationFeaturesEXT *features) const +template<typename T> +static void getPhysicalDeviceLineRasterizationFeaturesEXT(T *features) { features->rectangularLines = VK_TRUE; features->bresenhamLines = VK_TRUE; @@ -186,16 +196,140 @@ features->stippledSmoothLines = VK_FALSE; } -void PhysicalDevice::getFeatures(VkPhysicalDeviceProvokingVertexFeaturesEXT *features) const +template<typename T> +static void getPhysicalDeviceProvokingVertexFeaturesEXT(T *features) { features->provokingVertexLast = VK_TRUE; } -void PhysicalDevice::getFeatures(VkPhysicalDeviceImageRobustnessFeaturesEXT *features) const +template<typename T> +static void getPhysicalDeviceImageRobustnessFeaturesEXT(T *features) { features->robustImageAccess = VK_TRUE; } +template<typename T> +static void getPhysicalDeviceShaderDrawParametersFeatures(T *features) +{ + features->shaderDrawParameters = VK_FALSE; +} + +template<typename T> +static void getPhysicalDeviceVulkan11Features(T *features) +{ + getPhysicalDevice16BitStorageFeatures(features); + getPhysicalDeviceMultiviewFeatures(features); + getPhysicalDeviceVariablePointersFeatures(features); + getPhysicalDeviceProtectedMemoryFeatures(features); + getPhysicalDeviceSamplerYcbcrConversionFeatures(features); + getPhysicalDeviceShaderDrawParametersFeatures(features); +} + +template<typename T> +static void getPhysicalDeviceVulkan12Features(T *features) +{ + features->samplerMirrorClampToEdge = VK_FALSE; + features->drawIndirectCount = VK_FALSE; + getPhysicalDevice8BitStorageFeaturesKHR(features); + features->shaderBufferInt64Atomics = VK_FALSE; + features->shaderSharedInt64Atomics = VK_FALSE; + features->shaderFloat16 = VK_FALSE; + features->shaderInt8 = VK_FALSE; + features->descriptorIndexing = VK_FALSE; + features->shaderInputAttachmentArrayDynamicIndexing = VK_FALSE; + features->shaderUniformTexelBufferArrayDynamicIndexing = VK_FALSE; + features->shaderStorageTexelBufferArrayDynamicIndexing = VK_FALSE; + features->shaderSampledImageArrayNonUniformIndexing = VK_FALSE; + features->shaderStorageBufferArrayNonUniformIndexing = VK_FALSE; + features->shaderStorageImageArrayNonUniformIndexing = VK_FALSE; + features->shaderInputAttachmentArrayNonUniformIndexing = VK_FALSE; + features->shaderUniformTexelBufferArrayNonUniformIndexing = VK_FALSE; + features->shaderStorageTexelBufferArrayNonUniformIndexing = VK_FALSE; + features->descriptorBindingUniformBufferUpdateAfterBind = VK_FALSE; + features->descriptorBindingSampledImageUpdateAfterBind = VK_FALSE; + features->descriptorBindingStorageImageUpdateAfterBind = VK_FALSE; + features->descriptorBindingStorageBufferUpdateAfterBind = VK_FALSE; + features->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_FALSE; + features->descriptorBindingStorageBufferUpdateAfterBind = VK_FALSE; + features->descriptorBindingUpdateUnusedWhilePending = VK_FALSE; + features->descriptorBindingPartiallyBound = VK_FALSE; + features->descriptorBindingVariableDescriptorCount = VK_FALSE; + features->runtimeDescriptorArray = VK_FALSE; + features->samplerFilterMinmax = VK_FALSE; + features->scalarBlockLayout = VK_FALSE; + features->imagelessFramebuffer = VK_FALSE; + features->uniformBufferStandardLayout = VK_FALSE; + features->shaderSubgroupExtendedTypes = VK_FALSE; + getPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR(features); + features->hostQueryReset = VK_FALSE; + features->timelineSemaphore = VK_FALSE; + features->bufferDeviceAddress = VK_FALSE; + features->bufferDeviceAddressCaptureReplay = VK_FALSE; + features->bufferDeviceAddressMultiDevice = VK_FALSE; + features->vulkanMemoryModel = VK_FALSE; + features->vulkanMemoryModelDeviceScope = VK_FALSE; + features->vulkanMemoryModelAvailabilityVisibilityChains = VK_FALSE; + features->shaderOutputViewportIndex = VK_FALSE; + features->shaderOutputLayer = VK_FALSE; + features->subgroupBroadcastDynamicId = VK_FALSE; +} + +void PhysicalDevice::getFeatures2(VkPhysicalDeviceFeatures2 *features) const +{ + features->features = getFeatures(); + VkBaseOutStructure *curExtension = reinterpret_cast<VkBaseOutStructure *>(features->pNext); + while(curExtension != nullptr) + { + // Need to switch on an integer since Provoking Vertex isn't a part of the Vulkan spec. + switch((int)curExtension->sType) + { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: + getPhysicalDeviceVulkan11Features(reinterpret_cast<VkPhysicalDeviceVulkan11Features *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: + getPhysicalDeviceVulkan12Features(reinterpret_cast<VkPhysicalDeviceVulkan12Features *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: + getPhysicalDeviceMultiviewFeatures(reinterpret_cast<VkPhysicalDeviceMultiviewFeatures *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: + getPhysicalDeviceVariablePointersFeatures(reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: + getPhysicalDevice16BitStorageFeatures(reinterpret_cast<VkPhysicalDevice16BitStorageFeatures *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: + getPhysicalDeviceSamplerYcbcrConversionFeatures(reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: + getPhysicalDeviceProtectedMemoryFeatures(reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: + getPhysicalDeviceShaderDrawParameterFeatures(reinterpret_cast<VkPhysicalDeviceShaderDrawParameterFeatures *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: + getPhysicalDeviceImageRobustnessFeaturesEXT(reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: + getPhysicalDeviceLineRasterizationFeaturesEXT(reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: + getPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR(reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR: + getPhysicalDevice8BitStorageFeaturesKHR(reinterpret_cast<VkPhysicalDevice8BitStorageFeaturesKHR *>(curExtension)); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: + getPhysicalDeviceProvokingVertexFeaturesEXT(reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT *>(curExtension)); + break; + default: + WARN("curExtension->pNext->sType = %s", vk::Stringify(curExtension->sType).c_str()); + break; + } + curExtension = reinterpret_cast<VkBaseOutStructure *>(curExtension->pNext); + } +} + VkSampleCountFlags PhysicalDevice::getSampleCounts() const { return VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT;
diff --git a/src/Vulkan/VkPhysicalDevice.hpp b/src/Vulkan/VkPhysicalDevice.hpp index fbb9719..4c8430b 100644 --- a/src/Vulkan/VkPhysicalDevice.hpp +++ b/src/Vulkan/VkPhysicalDevice.hpp
@@ -35,17 +35,7 @@ static size_t ComputeRequiredAllocationSize(const void *) { return 0; } const VkPhysicalDeviceFeatures &getFeatures() const; - void getFeatures(VkPhysicalDeviceSamplerYcbcrConversionFeatures *features) const; - void getFeatures(VkPhysicalDevice16BitStorageFeatures *features) const; - void getFeatures(VkPhysicalDeviceVariablePointerFeatures *features) const; - void getFeatures(VkPhysicalDevice8BitStorageFeaturesKHR *features) const; - void getFeatures(VkPhysicalDeviceMultiviewFeatures *features) const; - void getFeatures(VkPhysicalDeviceProtectedMemoryFeatures *features) const; - void getFeatures(VkPhysicalDeviceShaderDrawParameterFeatures *features) const; - void getFeatures(VkPhysicalDeviceLineRasterizationFeaturesEXT *features) const; - void getFeatures(VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR *features) const; - void getFeatures(VkPhysicalDeviceProvokingVertexFeaturesEXT *features) const; - void getFeatures(VkPhysicalDeviceImageRobustnessFeaturesEXT *features) const; + void getFeatures2(VkPhysicalDeviceFeatures2 *features) const; bool hasFeatures(const VkPhysicalDeviceFeatures &requestedFeatures) const; const VkPhysicalDeviceProperties &getProperties() const;
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp index 38037d3..3d90f48 100644 --- a/src/Vulkan/libVulkan.cpp +++ b/src/Vulkan/libVulkan.cpp
@@ -2901,102 +2901,7 @@ { TRACE("(VkPhysicalDevice physicalDevice = %p, VkPhysicalDeviceFeatures2* pFeatures = %p)", physicalDevice, pFeatures); - VkBaseOutStructure *extensionFeatures = reinterpret_cast<VkBaseOutStructure *>(pFeatures->pNext); - while(extensionFeatures) - { - switch((long)(extensionFeatures->sType)) - { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: - { - auto features = reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures *>(extensionFeatures); - vk::Cast(physicalDevice)->getFeatures(features); - } - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: - { - auto features = reinterpret_cast<VkPhysicalDevice16BitStorageFeatures *>(extensionFeatures); - vk::Cast(physicalDevice)->getFeatures(features); - } - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES: - { - auto features = reinterpret_cast<VkPhysicalDeviceVariablePointerFeatures *>(extensionFeatures); - vk::Cast(physicalDevice)->getFeatures(features); - } - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR: - { - auto features = reinterpret_cast<VkPhysicalDevice8BitStorageFeaturesKHR *>(extensionFeatures); - vk::Cast(physicalDevice)->getFeatures(features); - } - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: - { - auto features = reinterpret_cast<VkPhysicalDeviceMultiviewFeatures *>(extensionFeatures); - vk::Cast(physicalDevice)->getFeatures(features); - } - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: - { - auto features = reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures *>(extensionFeatures); - vk::Cast(physicalDevice)->getFeatures(features); - } - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES: - { - auto features = reinterpret_cast<VkPhysicalDeviceShaderDrawParameterFeatures *>(extensionFeatures); - vk::Cast(physicalDevice)->getFeatures(features); - } - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR: - { - auto features = reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR *>(extensionFeatures); - vk::Cast(physicalDevice)->getFeatures(features); - } - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: - { - auto features = reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT *>(extensionFeatures); - vk::Cast(physicalDevice)->getFeatures(features); - } - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: - { - auto features = reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT *>(extensionFeatures); - vk::Cast(physicalDevice)->getFeatures(features); - } - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: - { - auto features = reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT *>(extensionFeatures); - vk::Cast(physicalDevice)->getFeatures(features); - } - break; - // For unsupported structures, check that we don't expose the corresponding extension string: - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: - ASSERT(!hasDeviceExtension(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME)); - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT: - ASSERT(!hasDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME)); - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR: - ASSERT(!hasDeviceExtension(VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME)); - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: - ASSERT(!hasDeviceExtension(VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME)); - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: - ASSERT(!hasDeviceExtension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)); - break; - default: - LOG_TRAP("pFeatures->pNext sType = %s", vk::Stringify(extensionFeatures->sType).c_str()); - break; - } - - extensionFeatures = extensionFeatures->pNext; - } - - vkGetPhysicalDeviceFeatures(physicalDevice, &(pFeatures->features)); + vk::Cast(physicalDevice)->getFeatures2(pFeatures); } VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2 *pProperties)