diff --git a/app/src/main/cpp/skyline/gpu.cpp b/app/src/main/cpp/skyline/gpu.cpp index 22bd598f..609dc122 100644 --- a/app/src/main/cpp/skyline/gpu.cpp +++ b/app/src/main/cpp/skyline/gpu.cpp @@ -122,20 +122,29 @@ 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 features{physicalDevice.getFeatures2()}; - auto extensions{physicalDevice.enumerateDeviceExtensionProperties()}; + auto deviceExtensions{physicalDevice.enumerateDeviceExtensionProperties()}; - quirks = QuirkManager(properties, features, extensions); - - constexpr std::array requiredDeviceExtensions{ - VK_KHR_SWAPCHAIN_EXTENSION_NAME, + std::vector> enabledExtensions{ + { + // Required Extensions + VK_KHR_SWAPCHAIN_EXTENSION_NAME, + } }; - for (const auto &requiredExtension : requiredDeviceExtensions) { - if (!std::any_of(extensions.begin(), extensions.end(), [&](const vk::ExtensionProperties &deviceExtension) { - return std::string_view(deviceExtension.extensionName) == std::string_view(requiredExtension); + + for (const auto &requiredExtension : enabledExtensions) { + if (!std::any_of(deviceExtensions.begin(), deviceExtensions.end(), [&](const vk::ExtensionProperties &deviceExtension) { + return std::string_view(deviceExtension.extensionName) == std::string_view(requiredExtension.data()); })) - throw exception("Cannot find Vulkan device extension: \"{}\"", requiredExtension); + throw exception("Cannot find Vulkan device extension: \"{}\"", requiredExtension.data()); } + quirks = QuirkManager(properties, features, deviceExtensions, enabledExtensions); + + std::vector pEnabledExtensions; + pEnabledExtensions.reserve(enabledExtensions.size()); + for (auto& extension : enabledExtensions) + pEnabledExtensions.push_back(extension.data()); + auto queueFamilies{physicalDevice.getQueueFamilyProperties()}; float queuePriority{1.0f}; //!< The priority of the only queue we use, it's set to the maximum of 1.0 vk::DeviceQueueCreateInfo queue{[&] { @@ -156,7 +165,7 @@ namespace skyline::gpu { if (Logger::configLevel >= Logger::LogLevel::Info) { std::string extensionString; - for (const auto &extension : extensions) + for (const auto &extension : deviceExtensions) extensionString += util::Format("\n* {} (v{}.{}.{})", extension.extensionName, VK_VERSION_MAJOR(extension.specVersion), VK_VERSION_MINOR(extension.specVersion), VK_VERSION_PATCH(extension.specVersion)); std::string queueString; @@ -175,8 +184,8 @@ namespace skyline::gpu { .pNext = &features, .queueCreateInfoCount = 1, .pQueueCreateInfos = &queue, - .enabledExtensionCount = requiredDeviceExtensions.size(), - .ppEnabledExtensionNames = requiredDeviceExtensions.data(), + .enabledExtensionCount = static_cast(pEnabledExtensions.size()), + .ppEnabledExtensionNames = pEnabledExtensions.data(), }); } diff --git a/app/src/main/cpp/skyline/gpu/quirk_manager.cpp b/app/src/main/cpp/skyline/gpu/quirk_manager.cpp index 40805b52..94e1010e 100644 --- a/app/src/main/cpp/skyline/gpu/quirk_manager.cpp +++ b/app/src/main/cpp/skyline/gpu/quirk_manager.cpp @@ -4,18 +4,21 @@ #include "quirk_manager.h" namespace skyline { - QuirkManager::QuirkManager(const vk::PhysicalDeviceProperties &properties, vk::PhysicalDeviceFeatures2 &features2, const std::vector &extensions) { - for (auto &extension : extensions) { - #define EXT_SET(name, property) \ - case util::Hash(name): \ - if (name == extensionName) \ - property = true; \ + QuirkManager::QuirkManager(const vk::PhysicalDeviceProperties &properties, vk::PhysicalDeviceFeatures2 &features2, const std::vector &deviceExtensions, std::vector> &enabledExtensions) { + for (auto &extension : deviceExtensions) { + #define EXT_SET(name, property) \ + case util::Hash(name): \ + if (name == extensionName) { \ + property = true; \ + enabledExtensions.push_back(std::array{name}); \ + } \ break - #define EXT_SET_V(name, property, version) \ - case util::Hash(name): \ - if (name == extensionName && extensionVersion >= version) \ - property = true; \ + #define EXT_SET_V(name, property, version) \ + case util::Hash(name): \ + if (name == extensionName && extensionVersion >= version) \ + property = true; \ + enabledExtensions.push_back(std::array{name}); \ break std::string_view extensionName{extension.extensionName}; diff --git a/app/src/main/cpp/skyline/gpu/quirk_manager.h b/app/src/main/cpp/skyline/gpu/quirk_manager.h index 60c6dbd9..3b1047fb 100644 --- a/app/src/main/cpp/skyline/gpu/quirk_manager.h +++ b/app/src/main/cpp/skyline/gpu/quirk_manager.h @@ -17,7 +17,7 @@ namespace skyline { QuirkManager() = default; - QuirkManager(const vk::PhysicalDeviceProperties &properties, vk::PhysicalDeviceFeatures2 &features, const std::vector &extensions); + QuirkManager(const vk::PhysicalDeviceProperties &properties, vk::PhysicalDeviceFeatures2 &features, const std::vector &deviceExtensions, std::vector> &enabledExtensions); /** * @return A summary of all the GPU quirks as a human-readable string