From c3895a8197a6c9d6c2c1fb2891023e78aad509ff Mon Sep 17 00:00:00 2001 From: PixelyIon Date: Tue, 16 Nov 2021 13:31:12 +0530 Subject: [PATCH] Support `VkPhysicalDeviceFeatures2` Extensions Implement the infrastructure to depend on `VkPhysicalDeviceFeatures2` extended feature structures which can be utilized to retrieve the specifics of features from extensions. It is implemented in the form of `vk::StructureChain` with `vk::PhysicalDeviceFeatures2` that can be extended with any extension feature structures. --- app/src/main/cpp/skyline/gpu.cpp | 12 ++++++------ app/src/main/cpp/skyline/gpu/quirk_manager.cpp | 12 ++++++------ app/src/main/cpp/skyline/gpu/quirk_manager.h | 4 +++- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/src/main/cpp/skyline/gpu.cpp b/app/src/main/cpp/skyline/gpu.cpp index e1ecce62..a083c668 100644 --- a/app/src/main/cpp/skyline/gpu.cpp +++ b/app/src/main/cpp/skyline/gpu.cpp @@ -122,16 +122,16 @@ namespace skyline::gpu { vk::raii::Device GPU::CreateDevice(const vk::raii::PhysicalDevice &physicalDevice, typeof(vk::DeviceQueueCreateInfo::queueCount) &vkQueueFamilyIndex, QuirkManager &quirks) { auto properties{physicalDevice.getProperties()}; - auto deviceFeatures2{physicalDevice.getFeatures2()}; - vk::PhysicalDeviceFeatures2 enabledFeatures2{}; // We only want to enable features we required due to potential overhead from unused features + auto deviceFeatures2{physicalDevice.getFeatures2()}; + typeof(deviceFeatures2) enabledFeatures2{}; // We only want to enable features we required due to potential overhead from unused features - #define FEAT_REQ(feature) \ - if (deviceFeatures2.features.feature) \ - enabledFeatures2.features.feature = true; \ + #define FEAT_REQ(structName, feature) \ + if (deviceFeatures2.get().feature) \ + enabledFeatures2.get().feature = true; \ else \ throw exception("Vulkan device doesn't support required feature: " #feature) - FEAT_REQ(independentBlend); + FEAT_REQ(vk::PhysicalDeviceFeatures2, features.independentBlend); #undef FEAT_REQ diff --git a/app/src/main/cpp/skyline/gpu/quirk_manager.cpp b/app/src/main/cpp/skyline/gpu/quirk_manager.cpp index bd9b66f0..0a0d2a49 100644 --- a/app/src/main/cpp/skyline/gpu/quirk_manager.cpp +++ b/app/src/main/cpp/skyline/gpu/quirk_manager.cpp @@ -4,7 +4,7 @@ #include "quirk_manager.h" namespace skyline { - QuirkManager::QuirkManager(const vk::PhysicalDeviceProperties &properties, const vk::PhysicalDeviceFeatures2 &deviceFeatures2, vk::PhysicalDeviceFeatures2 &enabledFeatures2, const std::vector &deviceExtensions, std::vector> &enabledExtensions) { + QuirkManager::QuirkManager(const vk::PhysicalDeviceProperties &properties, const DeviceFeatures2 &deviceFeatures2, DeviceFeatures2 &enabledFeatures2, const std::vector &deviceExtensions, std::vector> &enabledExtensions) { for (auto &extension : deviceExtensions) { #define EXT_SET(name, property) \ case util::Hash(name): \ @@ -32,13 +32,13 @@ namespace skyline { #undef EXT_SET_V } - #define FEAT_SET(feature, property) \ - if (deviceFeatures2.features.feature) { \ - property = true; \ - enabledFeatures2.features.feature = true; \ + #define FEAT_SET(structName, feature, property) \ + if (deviceFeatures2.get().feature) { \ + property = true; \ + enabledFeatures2.get().feature = true; \ } - FEAT_SET(logicOp, supportsLogicOp) + FEAT_SET(vk::PhysicalDeviceFeatures2, features.logicOp, supportsLogicOp) #undef FEAT_SET } diff --git a/app/src/main/cpp/skyline/gpu/quirk_manager.h b/app/src/main/cpp/skyline/gpu/quirk_manager.h index 9a9bd774..95029c75 100644 --- a/app/src/main/cpp/skyline/gpu/quirk_manager.h +++ b/app/src/main/cpp/skyline/gpu/quirk_manager.h @@ -18,7 +18,9 @@ namespace skyline { QuirkManager() = default; - QuirkManager(const vk::PhysicalDeviceProperties &properties, const vk::PhysicalDeviceFeatures2 &deviceFeatures2, vk::PhysicalDeviceFeatures2 &enabledFeatures2, const std::vector &deviceExtensions, std::vector> &enabledExtensions); + using DeviceFeatures2 = vk::StructureChain; + + QuirkManager(const vk::PhysicalDeviceProperties &properties, const DeviceFeatures2 &deviceFeatures2, DeviceFeatures2 &enabledFeatures2, const std::vector &deviceExtensions, std::vector> &enabledExtensions); /** * @return A summary of all the GPU quirks as a human-readable string