Commit ec3650f5 by Sean Risser

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/+/47891Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by: 's avatarSean Risser <srisser@google.com>
parent 1f48854d
......@@ -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 @@ const VkPhysicalDeviceFeatures &PhysicalDevice::getFeatures() const
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 @@ void PhysicalDevice::getFeatures(VkPhysicalDevice16BitStorageFeatures *features)
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 @@ void PhysicalDevice::getFeatures(VkPhysicalDeviceLineRasterizationFeaturesEXT *f
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;
......
......@@ -35,17 +35,7 @@ public:
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;
......
......@@ -2901,102 +2901,7 @@ VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures2(VkPhysicalDevice physica
{
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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment