summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
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/video_core/renderer_vulkan
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/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.cpp35
1 files changed, 13 insertions, 22 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