Commit 13205b93 by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Cleanup device feature query and enabling

All device extension features and properties queries are now performed in a single call for each (i.e. one for features, one for properties), with all the extension structs chained. Then based on which feature is present (not just whether the extension is supported), the extensions and features are enabled. In the process, it fixes the following issues: - If VK_EXT_vertex_attribute_divisor is present, but the necessary vertexAttributeInstanceRateDivisor feature is not supported, that feature is not enabled and the emulation path is taken. Incidentally, this also fixes an issue with renderdoc that refuses to replay captures on such devices. - If VK_EXT_transform_feedback is present, but the necessary transformFeedback feature is not supported, similarly that feature is not enabled and the emulation path is taken. Bug: angleproject:4306 Bug: angleproject:4027 Change-Id: I0969064cba811d215c37dfe551b0ceedb334051c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2005111 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarTobin Ehlis <tobine@google.com>
parent 3b2780e6
...@@ -220,6 +220,8 @@ class RendererVk : angle::NonCopyable ...@@ -220,6 +220,8 @@ class RendererVk : angle::NonCopyable
angle::Result initializeDevice(DisplayVk *displayVk, uint32_t queueFamilyIndex); angle::Result initializeDevice(DisplayVk *displayVk, uint32_t queueFamilyIndex);
void ensureCapsInitialized() const; void ensureCapsInitialized() const;
void queryDeviceExtensionFeatures(const ExtensionNameList &deviceExtensionNames);
void initFeatures(const ExtensionNameList &extensions); void initFeatures(const ExtensionNameList &extensions);
void initPipelineCacheVkKey(); void initPipelineCacheVkKey();
angle::Result initPipelineCache(DisplayVk *display, angle::Result initPipelineCache(DisplayVk *display,
...@@ -252,10 +254,13 @@ class RendererVk : angle::NonCopyable ...@@ -252,10 +254,13 @@ class RendererVk : angle::NonCopyable
VkDebugReportCallbackEXT mDebugReportCallback; VkDebugReportCallbackEXT mDebugReportCallback;
VkPhysicalDevice mPhysicalDevice; VkPhysicalDevice mPhysicalDevice;
VkPhysicalDeviceProperties mPhysicalDeviceProperties; VkPhysicalDeviceProperties mPhysicalDeviceProperties;
VkPhysicalDeviceSubgroupProperties mPhysicalDeviceSubgroupProperties;
VkPhysicalDeviceFeatures mPhysicalDeviceFeatures; VkPhysicalDeviceFeatures mPhysicalDeviceFeatures;
VkPhysicalDeviceLineRasterizationFeaturesEXT mLineRasterizationFeatures; VkPhysicalDeviceLineRasterizationFeaturesEXT mLineRasterizationFeatures;
VkPhysicalDeviceProvokingVertexFeaturesEXT mProvokingVertexFeatures; VkPhysicalDeviceProvokingVertexFeaturesEXT mProvokingVertexFeatures;
VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT mVertexAttributeDivisorFeatures;
VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT mVertexAttributeDivisorProperties;
VkPhysicalDeviceTransformFeedbackFeaturesEXT mTransformFeedbackFeatures;
VkPhysicalDeviceSubgroupProperties mPhysicalDeviceSubgroupProperties;
std::vector<VkQueueFamilyProperties> mQueueFamilyProperties; std::vector<VkQueueFamilyProperties> mQueueFamilyProperties;
std::mutex mQueueMutex; std::mutex mQueueMutex;
VkQueue mQueue; VkQueue mQueue;
......
...@@ -103,16 +103,15 @@ namespace vk ...@@ -103,16 +103,15 @@ namespace vk
{ {
struct Format; struct Format;
// Append ptr to end of pNext chain beginning at chainStart // Prepend ptr to the pNext chain at chainStart
template <typename VulkanStruct1, typename VulkanStruct2> template <typename VulkanStruct1, typename VulkanStruct2>
void AppendToPNextChain(VulkanStruct1 *chainStart, VulkanStruct2 *ptr) void AddToPNextChain(VulkanStruct1 *chainStart, VulkanStruct2 *ptr)
{ {
ASSERT(ptr->pNext == nullptr);
VkBaseOutStructure *localPtr = reinterpret_cast<VkBaseOutStructure *>(chainStart); VkBaseOutStructure *localPtr = reinterpret_cast<VkBaseOutStructure *>(chainStart);
while (localPtr->pNext) ptr->pNext = localPtr->pNext;
{ localPtr->pNext = reinterpret_cast<VkBaseOutStructure *>(ptr);
localPtr = localPtr->pNext;
}
localPtr->pNext = reinterpret_cast<VkBaseOutStructure *>(ptr);
} }
extern const char *gLoaderLayersPathEnv; extern const char *gLoaderLayersPathEnv;
......
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