yuzu-qt: Load Vulkan device info at startup
Loading it when the configuration opens now incurs a noticeable delay. We also don't need to rediscover the same data repeatedly each time the configuration opens. Moves vulkan device info discovery to yuzu's startup as opposed to the configure_graphics constructor.
This commit is contained in:
		| @@ -210,6 +210,8 @@ add_executable(yuzu | |||||||
|     util/url_request_interceptor.h |     util/url_request_interceptor.h | ||||||
|     util/util.cpp |     util/util.cpp | ||||||
|     util/util.h |     util/util.h | ||||||
|  |     vk_device_info.cpp | ||||||
|  |     vk_device_info.h | ||||||
|     compatdb.cpp |     compatdb.cpp | ||||||
|     compatdb.h |     compatdb.h | ||||||
|     yuzu.qrc |     yuzu.qrc | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ | |||||||
| #include "common/settings.h" | #include "common/settings.h" | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "ui_configure.h" | #include "ui_configure.h" | ||||||
|  | #include "vk_device_info.h" | ||||||
| #include "yuzu/configuration/config.h" | #include "yuzu/configuration/config.h" | ||||||
| #include "yuzu/configuration/configure_audio.h" | #include "yuzu/configuration/configure_audio.h" | ||||||
| #include "yuzu/configuration/configure_cpu.h" | #include "yuzu/configuration/configure_cpu.h" | ||||||
| @@ -28,6 +29,7 @@ | |||||||
|  |  | ||||||
| ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, | ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, | ||||||
|                                  InputCommon::InputSubsystem* input_subsystem, |                                  InputCommon::InputSubsystem* input_subsystem, | ||||||
|  |                                  std::vector<VkDeviceInfo::Record>& vk_device_records, | ||||||
|                                  Core::System& system_, bool enable_web_config) |                                  Core::System& system_, bool enable_web_config) | ||||||
|     : QDialog(parent), ui{std::make_unique<Ui::ConfigureDialog>()}, |     : QDialog(parent), ui{std::make_unique<Ui::ConfigureDialog>()}, | ||||||
|       registry(registry_), system{system_}, audio_tab{std::make_unique<ConfigureAudio>(system_, |       registry(registry_), system{system_}, audio_tab{std::make_unique<ConfigureAudio>(system_, | ||||||
| @@ -38,7 +40,8 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, | |||||||
|       general_tab{std::make_unique<ConfigureGeneral>(system_, this)}, |       general_tab{std::make_unique<ConfigureGeneral>(system_, this)}, | ||||||
|       graphics_advanced_tab{std::make_unique<ConfigureGraphicsAdvanced>(system_, this)}, |       graphics_advanced_tab{std::make_unique<ConfigureGraphicsAdvanced>(system_, this)}, | ||||||
|       graphics_tab{std::make_unique<ConfigureGraphics>( |       graphics_tab{std::make_unique<ConfigureGraphics>( | ||||||
|           system_, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, this)}, |           system_, vk_device_records, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, | ||||||
|  |           this)}, | ||||||
|       hotkeys_tab{std::make_unique<ConfigureHotkeys>(system_.HIDCore(), this)}, |       hotkeys_tab{std::make_unique<ConfigureHotkeys>(system_.HIDCore(), this)}, | ||||||
|       input_tab{std::make_unique<ConfigureInput>(system_, this)}, |       input_tab{std::make_unique<ConfigureInput>(system_, this)}, | ||||||
|       network_tab{std::make_unique<ConfigureNetwork>(system_, this)}, |       network_tab{std::make_unique<ConfigureNetwork>(system_, this)}, | ||||||
|   | |||||||
| @@ -4,7 +4,9 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include <memory> | #include <memory> | ||||||
|  | #include <vector> | ||||||
| #include <QDialog> | #include <QDialog> | ||||||
|  | #include "yuzu/vk_device_info.h" | ||||||
|  |  | ||||||
| namespace Core { | namespace Core { | ||||||
| class System; | class System; | ||||||
| @@ -40,8 +42,9 @@ class ConfigureDialog : public QDialog { | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, |     explicit ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, | ||||||
|                              InputCommon::InputSubsystem* input_subsystem, Core::System& system_, |                              InputCommon::InputSubsystem* input_subsystem, | ||||||
|                              bool enable_web_config = true); |                              std::vector<VkDeviceInfo::Record>& vk_device_records, | ||||||
|  |                              Core::System& system_, bool enable_web_config = true); | ||||||
|     ~ConfigureDialog() override; |     ~ConfigureDialog() override; | ||||||
|  |  | ||||||
|     void ApplyConfiguration(); |     void ApplyConfiguration(); | ||||||
|   | |||||||
| @@ -1,10 +1,6 @@ | |||||||
| // SPDX-FileCopyrightText: 2016 Citra Emulator Project | // SPDX-FileCopyrightText: 2016 Citra Emulator Project | ||||||
| // SPDX-License-Identifier: GPL-2.0-or-later | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
| // Include this early to include Vulkan headers how we want to |  | ||||||
| #include "video_core/vulkan_common/vulkan_device.h" |  | ||||||
| #include "video_core/vulkan_common/vulkan_wrapper.h" |  | ||||||
|  |  | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| #include <functional> | #include <functional> | ||||||
| #include <iosfwd> | #include <iosfwd> | ||||||
| @@ -34,13 +30,11 @@ | |||||||
| #include "common/settings.h" | #include "common/settings.h" | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "ui_configure_graphics.h" | #include "ui_configure_graphics.h" | ||||||
| #include "video_core/vulkan_common/vulkan_instance.h" |  | ||||||
| #include "video_core/vulkan_common/vulkan_library.h" |  | ||||||
| #include "video_core/vulkan_common/vulkan_surface.h" |  | ||||||
| #include "yuzu/configuration/configuration_shared.h" | #include "yuzu/configuration/configuration_shared.h" | ||||||
| #include "yuzu/configuration/configure_graphics.h" | #include "yuzu/configuration/configure_graphics.h" | ||||||
| #include "yuzu/qt_common.h" | #include "yuzu/qt_common.h" | ||||||
| #include "yuzu/uisettings.h" | #include "yuzu/uisettings.h" | ||||||
|  | #include "yuzu/vk_device_info.h" | ||||||
|  |  | ||||||
| static const std::vector<VkPresentModeKHR> default_present_modes{VK_PRESENT_MODE_IMMEDIATE_KHR, | static const std::vector<VkPresentModeKHR> default_present_modes{VK_PRESENT_MODE_IMMEDIATE_KHR, | ||||||
|                                                                  VK_PRESENT_MODE_FIFO_KHR}; |                                                                  VK_PRESENT_MODE_FIFO_KHR}; | ||||||
| @@ -77,9 +71,10 @@ static constexpr Settings::VSyncMode PresentModeToSetting(VkPresentModeKHR mode) | |||||||
| } | } | ||||||
|  |  | ||||||
| ConfigureGraphics::ConfigureGraphics(const Core::System& system_, | ConfigureGraphics::ConfigureGraphics(const Core::System& system_, | ||||||
|  |                                      std::vector<VkDeviceInfo::Record>& records_, | ||||||
|                                      const std::function<void()>& expose_compute_option_, |                                      const std::function<void()>& expose_compute_option_, | ||||||
|                                      QWidget* parent) |                                      QWidget* parent) | ||||||
|     : QWidget(parent), ui{std::make_unique<Ui::ConfigureGraphics>()}, |     : QWidget(parent), ui{std::make_unique<Ui::ConfigureGraphics>()}, records{records_}, | ||||||
|       expose_compute_option{expose_compute_option_}, system{system_} { |       expose_compute_option{expose_compute_option_}, system{system_} { | ||||||
|     vulkan_device = Settings::values.vulkan_device.GetValue(); |     vulkan_device = Settings::values.vulkan_device.GetValue(); | ||||||
|     RetrieveVulkanDevices(); |     RetrieveVulkanDevices(); | ||||||
| @@ -504,47 +499,19 @@ void ConfigureGraphics::UpdateAPILayout() { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void ConfigureGraphics::RetrieveVulkanDevices() try { | void ConfigureGraphics::RetrieveVulkanDevices() { | ||||||
|     if (UISettings::values.has_broken_vulkan) { |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     using namespace Vulkan; |  | ||||||
|  |  | ||||||
|     auto* window = this->window()->windowHandle(); |  | ||||||
|     auto wsi = QtCommon::GetWindowSystemInfo(window); |  | ||||||
|  |  | ||||||
|     vk::InstanceDispatch dld; |  | ||||||
|     const auto library = OpenLibrary(); |  | ||||||
|     const vk::Instance instance = CreateInstance(*library, dld, VK_API_VERSION_1_1, wsi.type); |  | ||||||
|     const std::vector<VkPhysicalDevice> physical_devices = instance.EnumeratePhysicalDevices(); |  | ||||||
|     vk::SurfaceKHR surface = CreateSurface(instance, wsi); |  | ||||||
|  |  | ||||||
|     vulkan_devices.clear(); |     vulkan_devices.clear(); | ||||||
|     vulkan_devices.reserve(physical_devices.size()); |     vulkan_devices.reserve(records.size()); | ||||||
|     device_present_modes.clear(); |     device_present_modes.clear(); | ||||||
|     device_present_modes.reserve(physical_devices.size()); |     device_present_modes.reserve(records.size()); | ||||||
|     for (const VkPhysicalDevice device : physical_devices) { |     for (const auto& record : records) { | ||||||
|         const auto physical_device = vk::PhysicalDevice(device, dld); |         vulkan_devices.push_back(QString::fromStdString(record.name)); | ||||||
|         const std::string name = physical_device.GetProperties().deviceName; |         device_present_modes.push_back(record.vsync_support); | ||||||
|         const std::vector<VkPresentModeKHR> present_modes = |  | ||||||
|             physical_device.GetSurfacePresentModesKHR(*surface); |  | ||||||
|         vulkan_devices.push_back(QString::fromStdString(name)); |  | ||||||
|         device_present_modes.push_back(present_modes); |  | ||||||
|  |  | ||||||
|         VkPhysicalDeviceDriverProperties driver_properties{}; |         if (record.is_intel_proprietary) { | ||||||
|         driver_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES; |  | ||||||
|         driver_properties.pNext = nullptr; |  | ||||||
|         VkPhysicalDeviceProperties2 properties{}; |  | ||||||
|         properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; |  | ||||||
|         properties.pNext = &driver_properties; |  | ||||||
|         dld.vkGetPhysicalDeviceProperties2(physical_device, &properties); |  | ||||||
|         if (driver_properties.driverID == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) { |  | ||||||
|             expose_compute_option(); |             expose_compute_option(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } catch (const Vulkan::vk::Exception& exception) { |  | ||||||
|     LOG_ERROR(Frontend, "Failed to enumerate devices with error: {}", exception.what()); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| Settings::RendererBackend ConfigureGraphics::GetCurrentGraphicsBackend() const { | Settings::RendererBackend ConfigureGraphics::GetCurrentGraphicsBackend() const { | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ | |||||||
| #include <qobjectdefs.h> | #include <qobjectdefs.h> | ||||||
| #include <vulkan/vulkan_core.h> | #include <vulkan/vulkan_core.h> | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
|  | #include "vk_device_info.h" | ||||||
|  |  | ||||||
| class QEvent; | class QEvent; | ||||||
| class QObject; | class QObject; | ||||||
| @@ -39,6 +40,7 @@ class ConfigureGraphics : public QWidget { | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     explicit ConfigureGraphics(const Core::System& system_, |     explicit ConfigureGraphics(const Core::System& system_, | ||||||
|  |                                std::vector<VkDeviceInfo::Record>& records, | ||||||
|                                const std::function<void()>& expose_compute_option_, |                                const std::function<void()>& expose_compute_option_, | ||||||
|                                QWidget* parent = nullptr); |                                QWidget* parent = nullptr); | ||||||
|     ~ConfigureGraphics() override; |     ~ConfigureGraphics() override; | ||||||
| @@ -77,6 +79,7 @@ private: | |||||||
|     ConfigurationShared::CheckState use_disk_shader_cache; |     ConfigurationShared::CheckState use_disk_shader_cache; | ||||||
|     ConfigurationShared::CheckState use_asynchronous_gpu_emulation; |     ConfigurationShared::CheckState use_asynchronous_gpu_emulation; | ||||||
|  |  | ||||||
|  |     std::vector<VkDeviceInfo::Record>& records; | ||||||
|     std::vector<QString> vulkan_devices; |     std::vector<QString> vulkan_devices; | ||||||
|     std::vector<std::vector<VkPresentModeKHR>> device_present_modes; |     std::vector<std::vector<VkPresentModeKHR>> device_present_modes; | ||||||
|     std::vector<VkPresentModeKHR> |     std::vector<VkPresentModeKHR> | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ | |||||||
| #include <memory> | #include <memory> | ||||||
| #include <string> | #include <string> | ||||||
| #include <utility> | #include <utility> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
| #include <fmt/format.h> | #include <fmt/format.h> | ||||||
|  |  | ||||||
| @@ -34,8 +35,10 @@ | |||||||
| #include "yuzu/configuration/configure_system.h" | #include "yuzu/configuration/configure_system.h" | ||||||
| #include "yuzu/uisettings.h" | #include "yuzu/uisettings.h" | ||||||
| #include "yuzu/util/util.h" | #include "yuzu/util/util.h" | ||||||
|  | #include "yuzu/vk_device_info.h" | ||||||
|  |  | ||||||
| ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::string& file_name, | ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::string& file_name, | ||||||
|  |                                    std::vector<VkDeviceInfo::Record>& vk_device_records, | ||||||
|                                    Core::System& system_) |                                    Core::System& system_) | ||||||
|     : QDialog(parent), |     : QDialog(parent), | ||||||
|       ui(std::make_unique<Ui::ConfigurePerGame>()), title_id{title_id_}, system{system_} { |       ui(std::make_unique<Ui::ConfigurePerGame>()), title_id{title_id_}, system{system_} { | ||||||
| @@ -50,7 +53,7 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::st | |||||||
|     general_tab = std::make_unique<ConfigureGeneral>(system_, this); |     general_tab = std::make_unique<ConfigureGeneral>(system_, this); | ||||||
|     graphics_advanced_tab = std::make_unique<ConfigureGraphicsAdvanced>(system_, this); |     graphics_advanced_tab = std::make_unique<ConfigureGraphicsAdvanced>(system_, this); | ||||||
|     graphics_tab = std::make_unique<ConfigureGraphics>( |     graphics_tab = std::make_unique<ConfigureGraphics>( | ||||||
|         system_, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, this); |         system_, vk_device_records, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, this); | ||||||
|     input_tab = std::make_unique<ConfigureInputPerGame>(system_, game_config.get(), this); |     input_tab = std::make_unique<ConfigureInputPerGame>(system_, game_config.get(), this); | ||||||
|     system_tab = std::make_unique<ConfigureSystem>(system_, this); |     system_tab = std::make_unique<ConfigureSystem>(system_, this); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,11 +5,13 @@ | |||||||
|  |  | ||||||
| #include <memory> | #include <memory> | ||||||
| #include <string> | #include <string> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
| #include <QDialog> | #include <QDialog> | ||||||
| #include <QList> | #include <QList> | ||||||
|  |  | ||||||
| #include "core/file_sys/vfs_types.h" | #include "core/file_sys/vfs_types.h" | ||||||
|  | #include "vk_device_info.h" | ||||||
| #include "yuzu/configuration/config.h" | #include "yuzu/configuration/config.h" | ||||||
|  |  | ||||||
| namespace Core { | namespace Core { | ||||||
| @@ -45,6 +47,7 @@ class ConfigurePerGame : public QDialog { | |||||||
| public: | public: | ||||||
|     // Cannot use std::filesystem::path due to https://bugreports.qt.io/browse/QTBUG-73263 |     // Cannot use std::filesystem::path due to https://bugreports.qt.io/browse/QTBUG-73263 | ||||||
|     explicit ConfigurePerGame(QWidget* parent, u64 title_id_, const std::string& file_name, |     explicit ConfigurePerGame(QWidget* parent, u64 title_id_, const std::string& file_name, | ||||||
|  |                               std::vector<VkDeviceInfo::Record>& vk_device_records, | ||||||
|                               Core::System& system_); |                               Core::System& system_); | ||||||
|     ~ConfigurePerGame() override; |     ~ConfigurePerGame() override; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -147,6 +147,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual | |||||||
| #include "yuzu/startup_checks.h" | #include "yuzu/startup_checks.h" | ||||||
| #include "yuzu/uisettings.h" | #include "yuzu/uisettings.h" | ||||||
| #include "yuzu/util/clickable_label.h" | #include "yuzu/util/clickable_label.h" | ||||||
|  | #include "yuzu/vk_device_info.h" | ||||||
|  |  | ||||||
| #ifdef YUZU_DBGHELP | #ifdef YUZU_DBGHELP | ||||||
| #include "yuzu/mini_dump.h" | #include "yuzu/mini_dump.h" | ||||||
| @@ -440,6 +441,8 @@ GMainWindow::GMainWindow(std::unique_ptr<Config> config_, bool has_broken_vulkan | |||||||
|  |  | ||||||
|         renderer_status_button->setDisabled(true); |         renderer_status_button->setDisabled(true); | ||||||
|         renderer_status_button->setChecked(false); |         renderer_status_button->setChecked(false); | ||||||
|  |     } else { | ||||||
|  |         VkDeviceInfo::PopulateRecords(vk_device_records, this->window()->windowHandle()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| #if defined(HAVE_SDL2) && !defined(_WIN32) | #if defined(HAVE_SDL2) && !defined(_WIN32) | ||||||
| @@ -3493,7 +3496,8 @@ void GMainWindow::OnConfigure() { | |||||||
|     const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue(); |     const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue(); | ||||||
|  |  | ||||||
|     Settings::SetConfiguringGlobal(true); |     Settings::SetConfiguringGlobal(true); | ||||||
|     ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get(), *system, |     ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get(), | ||||||
|  |                                      vk_device_records, *system, | ||||||
|                                      !multiplayer_state->IsHostingPublicRoom()); |                                      !multiplayer_state->IsHostingPublicRoom()); | ||||||
|     connect(&configure_dialog, &ConfigureDialog::LanguageChanged, this, |     connect(&configure_dialog, &ConfigureDialog::LanguageChanged, this, | ||||||
|             &GMainWindow::OnLanguageChanged); |             &GMainWindow::OnLanguageChanged); | ||||||
| @@ -3764,7 +3768,7 @@ void GMainWindow::OpenPerGameConfiguration(u64 title_id, const std::string& file | |||||||
|     const auto v_file = Core::GetGameFileFromPath(vfs, file_name); |     const auto v_file = Core::GetGameFileFromPath(vfs, file_name); | ||||||
|  |  | ||||||
|     Settings::SetConfiguringGlobal(false); |     Settings::SetConfiguringGlobal(false); | ||||||
|     ConfigurePerGame dialog(this, title_id, file_name, *system); |     ConfigurePerGame dialog(this, title_id, file_name, vk_device_records, *system); | ||||||
|     dialog.LoadFromFile(v_file); |     dialog.LoadFromFile(v_file); | ||||||
|     const auto result = dialog.exec(); |     const auto result = dialog.exec(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -118,6 +118,10 @@ enum class ReinitializeKeyBehavior { | |||||||
|     Warning, |     Warning, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | namespace VkDeviceInfo { | ||||||
|  | class Record; | ||||||
|  | } | ||||||
|  |  | ||||||
| class GMainWindow : public QMainWindow { | class GMainWindow : public QMainWindow { | ||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
|  |  | ||||||
| @@ -418,6 +422,8 @@ private: | |||||||
|  |  | ||||||
|     GameListPlaceholder* game_list_placeholder; |     GameListPlaceholder* game_list_placeholder; | ||||||
|  |  | ||||||
|  |     std::vector<VkDeviceInfo::Record> vk_device_records; | ||||||
|  |  | ||||||
|     // Status bar elements |     // Status bar elements | ||||||
|     QLabel* message_label = nullptr; |     QLabel* message_label = nullptr; | ||||||
|     QLabel* shader_building_label = nullptr; |     QLabel* shader_building_label = nullptr; | ||||||
|   | |||||||
							
								
								
									
										53
									
								
								src/yuzu/vk_device_info.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/yuzu/vk_device_info.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | #include "video_core/vulkan_common/vulkan_device.h" | ||||||
|  |  | ||||||
|  | #include <vector> | ||||||
|  | #include "common/dynamic_library.h" | ||||||
|  | #include "video_core/vulkan_common/vulkan_instance.h" | ||||||
|  | #include "video_core/vulkan_common/vulkan_library.h" | ||||||
|  | #include "video_core/vulkan_common/vulkan_surface.h" | ||||||
|  | #include "video_core/vulkan_common/vulkan_wrapper.h" | ||||||
|  | #include "yuzu/qt_common.h" | ||||||
|  | #include "yuzu/vk_device_info.h" | ||||||
|  |  | ||||||
|  | namespace VkDeviceInfo { | ||||||
|  | Record::Record(std::string_view name_, const std::vector<VkPresentModeKHR>& vsync_modes_, | ||||||
|  |                bool is_intel_proprietary_) | ||||||
|  |     : name{name_}, vsync_support{vsync_modes_}, is_intel_proprietary{is_intel_proprietary_} {} | ||||||
|  |  | ||||||
|  | Record::~Record() = default; | ||||||
|  |  | ||||||
|  | void PopulateRecords(std::vector<Record>& records, QWindow* window) try { | ||||||
|  |     using namespace Vulkan; | ||||||
|  |  | ||||||
|  |     auto wsi = QtCommon::GetWindowSystemInfo(window); | ||||||
|  |  | ||||||
|  |     vk::InstanceDispatch dld; | ||||||
|  |     const auto library = OpenLibrary(); | ||||||
|  |     const vk::Instance instance = CreateInstance(*library, dld, VK_API_VERSION_1_1, wsi.type); | ||||||
|  |     const std::vector<VkPhysicalDevice> physical_devices = instance.EnumeratePhysicalDevices(); | ||||||
|  |     vk::SurfaceKHR surface = CreateSurface(instance, wsi); | ||||||
|  |  | ||||||
|  |     records.clear(); | ||||||
|  |     records.reserve(physical_devices.size()); | ||||||
|  |     for (const VkPhysicalDevice device : physical_devices) { | ||||||
|  |         const auto physical_device = vk::PhysicalDevice(device, dld); | ||||||
|  |         const std::string name = physical_device.GetProperties().deviceName; | ||||||
|  |         const std::vector<VkPresentModeKHR> present_modes = | ||||||
|  |             physical_device.GetSurfacePresentModesKHR(*surface); | ||||||
|  |  | ||||||
|  |         VkPhysicalDeviceDriverProperties driver_properties{}; | ||||||
|  |         driver_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES; | ||||||
|  |         driver_properties.pNext = nullptr; | ||||||
|  |         VkPhysicalDeviceProperties2 properties{}; | ||||||
|  |         properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; | ||||||
|  |         properties.pNext = &driver_properties; | ||||||
|  |         dld.vkGetPhysicalDeviceProperties2(physical_device, &properties); | ||||||
|  |  | ||||||
|  |         records.push_back(VkDeviceInfo::Record(name, present_modes, | ||||||
|  |                                                driver_properties.driverID == | ||||||
|  |                                                    VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS)); | ||||||
|  |     } | ||||||
|  | } catch (const Vulkan::vk::Exception& exception) { | ||||||
|  |     LOG_ERROR(Frontend, "Failed to enumerate devices with error: {}", exception.what()); | ||||||
|  | } | ||||||
|  | } // namespace VkDeviceInfo | ||||||
							
								
								
									
										27
									
								
								src/yuzu/vk_device_info.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/yuzu/vk_device_info.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <string> | ||||||
|  | #include <string_view> | ||||||
|  | #include <vector> | ||||||
|  | #include "vulkan/vulkan_core.h" | ||||||
|  |  | ||||||
|  | namespace Settings { | ||||||
|  | enum class VSyncMode : u32; | ||||||
|  | } | ||||||
|  | // #include "common/settings.h" | ||||||
|  |  | ||||||
|  | namespace VkDeviceInfo { | ||||||
|  | // Short class to record Vulkan driver information for configuration purposes | ||||||
|  | class Record { | ||||||
|  | public: | ||||||
|  |     explicit Record(std::string_view name, const std::vector<VkPresentModeKHR>& vsync_modes, | ||||||
|  |                     bool is_intel_proprietary); | ||||||
|  |     ~Record(); | ||||||
|  |  | ||||||
|  |     const std::string name; | ||||||
|  |     const std::vector<VkPresentModeKHR> vsync_support; | ||||||
|  |     const bool is_intel_proprietary; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | void PopulateRecords(std::vector<Record>& records, QWindow* window); | ||||||
|  | } // namespace VkDeviceInfo | ||||||
		Reference in New Issue
	
	Block a user
	 lat9nq
					lat9nq