فهرست منبع

renderer_vulkan: Remove two step initialization on VKDevice

The Vulkan device abstraction either initializes successfully on the
constructor or throws a Vulkan exception.
ReinUsesLisp 5 سال پیش
والد
کامیت
53ea06dc17

+ 4 - 11
src/video_core/renderer_vulkan/renderer_vulkan.cpp

@@ -133,10 +133,8 @@ bool RendererVulkan::Init() try {
         debug_callback = CreateDebugCallback(instance);
     }
     surface = CreateSurface(instance, render_window);
-    if (!PickDevices()) {
-        return false;
-    }
 
+    InitializeDevice();
     Report();
 
     memory_manager = std::make_unique<VKMemoryManager>(*device);
@@ -178,21 +176,16 @@ void RendererVulkan::ShutDown() {
     device.reset();
 }
 
-bool RendererVulkan::PickDevices() {
+void RendererVulkan::InitializeDevice() {
     const std::vector<VkPhysicalDevice> devices = instance.EnumeratePhysicalDevices();
     const s32 device_index = Settings::values.vulkan_device.GetValue();
     if (device_index < 0 || device_index >= static_cast<s32>(devices.size())) {
         LOG_ERROR(Render_Vulkan, "Invalid device index {}!", device_index);
-        return false;
-    }
-    const vk::PhysicalDevice physical_device(devices[static_cast<std::size_t>(device_index)], dld);
-    if (!VKDevice::IsSuitable(physical_device, *surface)) {
-        return false;
+        throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
     }
-
+    const vk::PhysicalDevice physical_device(devices[static_cast<size_t>(device_index)], dld);
     device =
         std::make_unique<VKDevice>(*instance, instance_version, physical_device, *surface, dld);
-    return device->Create();
 }
 
 void RendererVulkan::Report() const {

+ 1 - 1
src/video_core/renderer_vulkan/renderer_vulkan.h

@@ -56,7 +56,7 @@ public:
     static std::vector<std::string> EnumerateDevices();
 
 private:
-    bool PickDevices();
+    void InitializeDevice();
 
     void Report() const;
 

+ 2 - 10
src/video_core/renderer_vulkan/vk_device.cpp

@@ -212,11 +212,7 @@ VKDevice::VKDevice(VkInstance instance_, u32 instance_version_, vk::PhysicalDevi
       instance_version{instance_version_}, format_properties{GetFormatProperties(physical, dld)} {
     SetupFamilies(surface);
     SetupFeatures();
-}
-
-VKDevice::~VKDevice() = default;
 
-bool VKDevice::Create() {
     const auto queue_cis = GetDeviceQueueCreateInfos();
     const std::vector extensions = LoadExtensions();
 
@@ -426,12 +422,7 @@ bool VKDevice::Create() {
         };
         first_next = &diagnostics_nv;
     }
-
     logical = vk::Device::Create(physical, queue_cis, extensions, first_next, dld);
-    if (!logical) {
-        LOG_ERROR(Render_Vulkan, "Failed to create logical device");
-        return false;
-    }
 
     CollectTelemetryParameters();
     CollectToolingInfo();
@@ -455,9 +446,10 @@ bool VKDevice::Create() {
     present_queue = logical.GetQueue(present_family);
 
     use_asynchronous_shaders = Settings::values.use_asynchronous_shaders.GetValue();
-    return true;
 }
 
+VKDevice::~VKDevice() = default;
+
 VkFormat VKDevice::GetSupportedFormat(VkFormat wanted_format, VkFormatFeatureFlags wanted_usage,
                                       FormatType format_type) const {
     if (IsFormatSupported(wanted_format, wanted_usage, format_type)) {

+ 0 - 3
src/video_core/renderer_vulkan/vk_device.h

@@ -28,9 +28,6 @@ public:
                       VkSurfaceKHR surface, const vk::InstanceDispatch& dld);
     ~VKDevice();
 
-    /// Initializes the device. Returns true on success.
-    bool Create();
-
     /**
      * Returns a format supported by the device for the passed requeriments.
      * @param wanted_format The ideal format to be returned. It may not be the returned format.

+ 2 - 5
src/video_core/vulkan_common/vulkan_wrapper.cpp

@@ -580,7 +580,7 @@ void Semaphore::SetObjectNameEXT(const char* name) const {
 
 Device Device::Create(VkPhysicalDevice physical_device, Span<VkDeviceQueueCreateInfo> queues_ci,
                       Span<const char*> enabled_extensions, const void* next,
-                      DeviceDispatch& dispatch) noexcept {
+                      DeviceDispatch& dispatch) {
     const VkDeviceCreateInfo ci{
         .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
         .pNext = next,
@@ -593,11 +593,8 @@ Device Device::Create(VkPhysicalDevice physical_device, Span<VkDeviceQueueCreate
         .ppEnabledExtensionNames = enabled_extensions.data(),
         .pEnabledFeatures = nullptr,
     };
-
     VkDevice device;
-    if (dispatch.vkCreateDevice(physical_device, &ci, nullptr, &device) != VK_SUCCESS) {
-        return {};
-    }
+    Check(dispatch.vkCreateDevice(physical_device, &ci, nullptr, &device));
     Load(device, dispatch);
     return Device(device, dispatch);
 }

+ 1 - 1
src/video_core/vulkan_common/vulkan_wrapper.h

@@ -796,7 +796,7 @@ class Device : public Handle<VkDevice, NoOwner, DeviceDispatch> {
 public:
     static Device Create(VkPhysicalDevice physical_device, Span<VkDeviceQueueCreateInfo> queues_ci,
                          Span<const char*> enabled_extensions, const void* next,
-                         DeviceDispatch& dispatch) noexcept;
+                         DeviceDispatch& dispatch);
 
     Queue GetQueue(u32 family_index) const noexcept;