summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-12-25 02:27:57 -0300
committerGravatar ReinUsesLisp2020-12-31 02:07:33 -0300
commit085adfea00a525796a3bf4b2dd345e1df656c930 (patch)
treef606a6c4fb19bf3207e9fe36b692c7c17d3fcca9 /src
parentrenderer_vulkan: Initialize surface in separate file (diff)
downloadyuzu-085adfea00a525796a3bf4b2dd345e1df656c930.tar.gz
yuzu-085adfea00a525796a3bf4b2dd345e1df656c930.tar.xz
yuzu-085adfea00a525796a3bf4b2dd345e1df656c930.zip
renderer_vulkan: Throw when enumerating devices fails
Report device enumeration errors with exceptions to be consistent with other initialization related function calls. Reduces the amount of code to maintain.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.cpp35
-rw-r--r--src/video_core/vulkan_common/vulkan_instance.cpp2
-rw-r--r--src/video_core/vulkan_common/vulkan_instance.h2
-rw-r--r--src/video_core/vulkan_common/vulkan_wrapper.cpp12
-rw-r--r--src/video_core/vulkan_common/vulkan_wrapper.h3
5 files changed, 21 insertions, 33 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
index 831c204c2..f64318f25 100644
--- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp
+++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
@@ -170,7 +170,6 @@ void RendererVulkan::ShutDown() {
170 if (const auto& dev = device->GetLogical()) { 170 if (const auto& dev = device->GetLogical()) {
171 dev.WaitIdle(); 171 dev.WaitIdle();
172 } 172 }
173
174 rasterizer.reset(); 173 rasterizer.reset();
175 blit_screen.reset(); 174 blit_screen.reset();
176 scheduler.reset(); 175 scheduler.reset();
@@ -180,19 +179,13 @@ void RendererVulkan::ShutDown() {
180} 179}
181 180
182bool RendererVulkan::PickDevices() { 181bool RendererVulkan::PickDevices() {
183 const auto devices = instance.EnumeratePhysicalDevices(); 182 const std::vector<VkPhysicalDevice> devices = instance.EnumeratePhysicalDevices();
184 if (!devices) {
185 LOG_ERROR(Render_Vulkan, "Failed to enumerate physical devices");
186 return false;
187 }
188
189 const s32 device_index = Settings::values.vulkan_device.GetValue(); 183 const s32 device_index = Settings::values.vulkan_device.GetValue();
190 if (device_index < 0 || device_index >= static_cast<s32>(devices->size())) { 184 if (device_index < 0 || device_index >= static_cast<s32>(devices.size())) {
191 LOG_ERROR(Render_Vulkan, "Invalid device index {}!", device_index); 185 LOG_ERROR(Render_Vulkan, "Invalid device index {}!", device_index);
192 return false; 186 return false;
193 } 187 }
194 const vk::PhysicalDevice physical_device((*devices)[static_cast<std::size_t>(device_index)], 188 const vk::PhysicalDevice physical_device(devices[static_cast<std::size_t>(device_index)], dld);
195 dld);
196 if (!VKDevice::IsSuitable(physical_device, *surface)) { 189 if (!VKDevice::IsSuitable(physical_device, *surface)) {
197 return false; 190 return false;
198 } 191 }
@@ -224,23 +217,21 @@ void RendererVulkan::Report() const {
224 telemetry_session.AddField(field, "GPU_Vulkan_Extensions", extensions); 217 telemetry_session.AddField(field, "GPU_Vulkan_Extensions", extensions);
225} 218}
226 219
227std::vector<std::string> RendererVulkan::EnumerateDevices() { 220std::vector<std::string> RendererVulkan::EnumerateDevices() try {
228 vk::InstanceDispatch dld; 221 vk::InstanceDispatch dld;
229 Common::DynamicLibrary library = OpenLibrary(); 222 const Common::DynamicLibrary library = OpenLibrary();
230 vk::Instance instance = CreateInstance(library, dld).first; 223 const vk::Instance instance = CreateInstance(library, dld).first;
231 if (!instance) { 224 const std::vector<VkPhysicalDevice> physical_devices = instance.EnumeratePhysicalDevices();
232 return {};
233 }
234 const std::optional physical_devices = instance.EnumeratePhysicalDevices();
235 if (!physical_devices) {
236 return {};
237 }
238 std::vector<std::string> names; 225 std::vector<std::string> names;
239 names.reserve(physical_devices->size()); 226 names.reserve(physical_devices.size());
240 for (const auto& device : *physical_devices) { 227 for (const VkPhysicalDevice device : physical_devices) {
241 names.push_back(vk::PhysicalDevice(device, dld).GetProperties().deviceName); 228 names.push_back(vk::PhysicalDevice(device, dld).GetProperties().deviceName);
242 } 229 }
243 return names; 230 return names;
231
232} catch (const vk::Exception& exception) {
233 LOG_ERROR(Render_Vulkan, "Failed to enumerate devices with error: {}", exception.what());
234 return {};
244} 235}
245 236
246} // namespace Vulkan 237} // namespace Vulkan
diff --git a/src/video_core/vulkan_common/vulkan_instance.cpp b/src/video_core/vulkan_common/vulkan_instance.cpp
index d3d8630e5..ee46fc6cc 100644
--- a/src/video_core/vulkan_common/vulkan_instance.cpp
+++ b/src/video_core/vulkan_common/vulkan_instance.cpp
@@ -111,7 +111,7 @@ void RemoveUnavailableLayers(const vk::InstanceDispatch& dld, std::vector<const
111} 111}
112} // Anonymous namespace 112} // Anonymous namespace
113 113
114std::pair<vk::Instance, u32> CreateInstance(Common::DynamicLibrary& library, 114std::pair<vk::Instance, u32> CreateInstance(const Common::DynamicLibrary& library,
115 vk::InstanceDispatch& dld, 115 vk::InstanceDispatch& dld,
116 Core::Frontend::WindowSystemType window_type, 116 Core::Frontend::WindowSystemType window_type,
117 bool enable_debug_utils, bool enable_layers) { 117 bool enable_debug_utils, bool enable_layers) {
diff --git a/src/video_core/vulkan_common/vulkan_instance.h b/src/video_core/vulkan_common/vulkan_instance.h
index ff2be0a48..5acca9756 100644
--- a/src/video_core/vulkan_common/vulkan_instance.h
+++ b/src/video_core/vulkan_common/vulkan_instance.h
@@ -14,7 +14,7 @@
14namespace Vulkan { 14namespace Vulkan {
15 15
16[[nodiscard]] std::pair<vk::Instance, u32> CreateInstance( 16[[nodiscard]] std::pair<vk::Instance, u32> CreateInstance(
17 Common::DynamicLibrary& library, vk::InstanceDispatch& dld, 17 const Common::DynamicLibrary& library, vk::InstanceDispatch& dld,
18 Core::Frontend::WindowSystemType window_type = Core::Frontend::WindowSystemType::Headless, 18 Core::Frontend::WindowSystemType window_type = Core::Frontend::WindowSystemType::Headless,
19 bool enable_debug_utils = false, bool enable_layers = false); 19 bool enable_debug_utils = false, bool enable_layers = false);
20 20
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp
index f4177537b..8698c3f92 100644
--- a/src/video_core/vulkan_common/vulkan_wrapper.cpp
+++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp
@@ -465,17 +465,13 @@ Instance Instance::Create(u32 version, Span<const char*> layers, Span<const char
465 return Instance(instance, dispatch); 465 return Instance(instance, dispatch);
466} 466}
467 467
468std::optional<std::vector<VkPhysicalDevice>> Instance::EnumeratePhysicalDevices() const { 468std::vector<VkPhysicalDevice> Instance::EnumeratePhysicalDevices() const {
469 u32 num; 469 u32 num;
470 if (dld->vkEnumeratePhysicalDevices(handle, &num, nullptr) != VK_SUCCESS) { 470 Check(dld->vkEnumeratePhysicalDevices(handle, &num, nullptr));
471 return std::nullopt;
472 }
473 std::vector<VkPhysicalDevice> physical_devices(num); 471 std::vector<VkPhysicalDevice> physical_devices(num);
474 if (dld->vkEnumeratePhysicalDevices(handle, &num, physical_devices.data()) != VK_SUCCESS) { 472 Check(dld->vkEnumeratePhysicalDevices(handle, &num, physical_devices.data()));
475 return std::nullopt;
476 }
477 SortPhysicalDevices(physical_devices, *dld); 473 SortPhysicalDevices(physical_devices, *dld);
478 return std::make_optional(std::move(physical_devices)); 474 return physical_devices;
479} 475}
480 476
481DebugUtilsMessenger Instance::CreateDebugUtilsMessenger( 477DebugUtilsMessenger Instance::CreateDebugUtilsMessenger(
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h
index 012982a3f..af3083c84 100644
--- a/src/video_core/vulkan_common/vulkan_wrapper.h
+++ b/src/video_core/vulkan_common/vulkan_wrapper.h
@@ -580,7 +580,8 @@ public:
580 580
581 /// Enumerates physical devices. 581 /// Enumerates physical devices.
582 /// @return Physical devices and an empty handle on failure. 582 /// @return Physical devices and an empty handle on failure.
583 std::optional<std::vector<VkPhysicalDevice>> EnumeratePhysicalDevices() const; 583 /// @throw Exception on Vulkan error.
584 std::vector<VkPhysicalDevice> EnumeratePhysicalDevices() const;
584 585
585 /// Creates a debug callback messenger. 586 /// Creates a debug callback messenger.
586 /// @throw Exception on creation failure. 587 /// @throw Exception on creation failure.