diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 15 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_device.cpp | 12 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_device.h | 3 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.h | 2 |
6 files changed, 10 insertions, 31 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index f64318f25..fdce11b06 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp | |||
| @@ -133,10 +133,8 @@ bool RendererVulkan::Init() try { | |||
| 133 | debug_callback = CreateDebugCallback(instance); | 133 | debug_callback = CreateDebugCallback(instance); |
| 134 | } | 134 | } |
| 135 | surface = CreateSurface(instance, render_window); | 135 | surface = CreateSurface(instance, render_window); |
| 136 | if (!PickDevices()) { | ||
| 137 | return false; | ||
| 138 | } | ||
| 139 | 136 | ||
| 137 | InitializeDevice(); | ||
| 140 | Report(); | 138 | Report(); |
| 141 | 139 | ||
| 142 | memory_manager = std::make_unique<VKMemoryManager>(*device); | 140 | memory_manager = std::make_unique<VKMemoryManager>(*device); |
| @@ -178,21 +176,16 @@ void RendererVulkan::ShutDown() { | |||
| 178 | device.reset(); | 176 | device.reset(); |
| 179 | } | 177 | } |
| 180 | 178 | ||
| 181 | bool RendererVulkan::PickDevices() { | 179 | void RendererVulkan::InitializeDevice() { |
| 182 | const std::vector<VkPhysicalDevice> devices = instance.EnumeratePhysicalDevices(); | 180 | const std::vector<VkPhysicalDevice> devices = instance.EnumeratePhysicalDevices(); |
| 183 | const s32 device_index = Settings::values.vulkan_device.GetValue(); | 181 | const s32 device_index = Settings::values.vulkan_device.GetValue(); |
| 184 | if (device_index < 0 || device_index >= static_cast<s32>(devices.size())) { | 182 | if (device_index < 0 || device_index >= static_cast<s32>(devices.size())) { |
| 185 | LOG_ERROR(Render_Vulkan, "Invalid device index {}!", device_index); | 183 | LOG_ERROR(Render_Vulkan, "Invalid device index {}!", device_index); |
| 186 | return false; | 184 | throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); |
| 187 | } | ||
| 188 | const vk::PhysicalDevice physical_device(devices[static_cast<std::size_t>(device_index)], dld); | ||
| 189 | if (!VKDevice::IsSuitable(physical_device, *surface)) { | ||
| 190 | return false; | ||
| 191 | } | 185 | } |
| 192 | 186 | const vk::PhysicalDevice physical_device(devices[static_cast<size_t>(device_index)], dld); | |
| 193 | device = | 187 | device = |
| 194 | std::make_unique<VKDevice>(*instance, instance_version, physical_device, *surface, dld); | 188 | std::make_unique<VKDevice>(*instance, instance_version, physical_device, *surface, dld); |
| 195 | return device->Create(); | ||
| 196 | } | 189 | } |
| 197 | 190 | ||
| 198 | void RendererVulkan::Report() const { | 191 | void RendererVulkan::Report() const { |
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index 7c5ce1da4..a05b3bd38 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h | |||
| @@ -56,7 +56,7 @@ public: | |||
| 56 | static std::vector<std::string> EnumerateDevices(); | 56 | static std::vector<std::string> EnumerateDevices(); |
| 57 | 57 | ||
| 58 | private: | 58 | private: |
| 59 | bool PickDevices(); | 59 | void InitializeDevice(); |
| 60 | 60 | ||
| 61 | void Report() const; | 61 | void Report() const; |
| 62 | 62 | ||
diff --git a/src/video_core/renderer_vulkan/vk_device.cpp b/src/video_core/renderer_vulkan/vk_device.cpp index f3dd6eae1..831603e87 100644 --- a/src/video_core/renderer_vulkan/vk_device.cpp +++ b/src/video_core/renderer_vulkan/vk_device.cpp | |||
| @@ -212,11 +212,7 @@ VKDevice::VKDevice(VkInstance instance_, u32 instance_version_, vk::PhysicalDevi | |||
| 212 | instance_version{instance_version_}, format_properties{GetFormatProperties(physical, dld)} { | 212 | instance_version{instance_version_}, format_properties{GetFormatProperties(physical, dld)} { |
| 213 | SetupFamilies(surface); | 213 | SetupFamilies(surface); |
| 214 | SetupFeatures(); | 214 | SetupFeatures(); |
| 215 | } | ||
| 216 | |||
| 217 | VKDevice::~VKDevice() = default; | ||
| 218 | 215 | ||
| 219 | bool VKDevice::Create() { | ||
| 220 | const auto queue_cis = GetDeviceQueueCreateInfos(); | 216 | const auto queue_cis = GetDeviceQueueCreateInfos(); |
| 221 | const std::vector extensions = LoadExtensions(); | 217 | const std::vector extensions = LoadExtensions(); |
| 222 | 218 | ||
| @@ -426,12 +422,7 @@ bool VKDevice::Create() { | |||
| 426 | }; | 422 | }; |
| 427 | first_next = &diagnostics_nv; | 423 | first_next = &diagnostics_nv; |
| 428 | } | 424 | } |
| 429 | |||
| 430 | logical = vk::Device::Create(physical, queue_cis, extensions, first_next, dld); | 425 | logical = vk::Device::Create(physical, queue_cis, extensions, first_next, dld); |
| 431 | if (!logical) { | ||
| 432 | LOG_ERROR(Render_Vulkan, "Failed to create logical device"); | ||
| 433 | return false; | ||
| 434 | } | ||
| 435 | 426 | ||
| 436 | CollectTelemetryParameters(); | 427 | CollectTelemetryParameters(); |
| 437 | CollectToolingInfo(); | 428 | CollectToolingInfo(); |
| @@ -455,9 +446,10 @@ bool VKDevice::Create() { | |||
| 455 | present_queue = logical.GetQueue(present_family); | 446 | present_queue = logical.GetQueue(present_family); |
| 456 | 447 | ||
| 457 | use_asynchronous_shaders = Settings::values.use_asynchronous_shaders.GetValue(); | 448 | use_asynchronous_shaders = Settings::values.use_asynchronous_shaders.GetValue(); |
| 458 | return true; | ||
| 459 | } | 449 | } |
| 460 | 450 | ||
| 451 | VKDevice::~VKDevice() = default; | ||
| 452 | |||
| 461 | VkFormat VKDevice::GetSupportedFormat(VkFormat wanted_format, VkFormatFeatureFlags wanted_usage, | 453 | VkFormat VKDevice::GetSupportedFormat(VkFormat wanted_format, VkFormatFeatureFlags wanted_usage, |
| 462 | FormatType format_type) const { | 454 | FormatType format_type) const { |
| 463 | if (IsFormatSupported(wanted_format, wanted_usage, format_type)) { | 455 | if (IsFormatSupported(wanted_format, wanted_usage, format_type)) { |
diff --git a/src/video_core/renderer_vulkan/vk_device.h b/src/video_core/renderer_vulkan/vk_device.h index 9673f47c7..67617f86d 100644 --- a/src/video_core/renderer_vulkan/vk_device.h +++ b/src/video_core/renderer_vulkan/vk_device.h | |||
| @@ -28,9 +28,6 @@ public: | |||
| 28 | VkSurfaceKHR surface, const vk::InstanceDispatch& dld); | 28 | VkSurfaceKHR surface, const vk::InstanceDispatch& dld); |
| 29 | ~VKDevice(); | 29 | ~VKDevice(); |
| 30 | 30 | ||
| 31 | /// Initializes the device. Returns true on success. | ||
| 32 | bool Create(); | ||
| 33 | |||
| 34 | /** | 31 | /** |
| 35 | * Returns a format supported by the device for the passed requeriments. | 32 | * Returns a format supported by the device for the passed requeriments. |
| 36 | * @param wanted_format The ideal format to be returned. It may not be the returned format. | 33 | * @param wanted_format The ideal format to be returned. It may not be the returned format. |
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 8698c3f92..5e15ad607 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp | |||
| @@ -580,7 +580,7 @@ void Semaphore::SetObjectNameEXT(const char* name) const { | |||
| 580 | 580 | ||
| 581 | Device Device::Create(VkPhysicalDevice physical_device, Span<VkDeviceQueueCreateInfo> queues_ci, | 581 | Device Device::Create(VkPhysicalDevice physical_device, Span<VkDeviceQueueCreateInfo> queues_ci, |
| 582 | Span<const char*> enabled_extensions, const void* next, | 582 | Span<const char*> enabled_extensions, const void* next, |
| 583 | DeviceDispatch& dispatch) noexcept { | 583 | DeviceDispatch& dispatch) { |
| 584 | const VkDeviceCreateInfo ci{ | 584 | const VkDeviceCreateInfo ci{ |
| 585 | .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, | 585 | .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, |
| 586 | .pNext = next, | 586 | .pNext = next, |
| @@ -593,11 +593,8 @@ Device Device::Create(VkPhysicalDevice physical_device, Span<VkDeviceQueueCreate | |||
| 593 | .ppEnabledExtensionNames = enabled_extensions.data(), | 593 | .ppEnabledExtensionNames = enabled_extensions.data(), |
| 594 | .pEnabledFeatures = nullptr, | 594 | .pEnabledFeatures = nullptr, |
| 595 | }; | 595 | }; |
| 596 | |||
| 597 | VkDevice device; | 596 | VkDevice device; |
| 598 | if (dispatch.vkCreateDevice(physical_device, &ci, nullptr, &device) != VK_SUCCESS) { | 597 | Check(dispatch.vkCreateDevice(physical_device, &ci, nullptr, &device)); |
| 599 | return {}; | ||
| 600 | } | ||
| 601 | Load(device, dispatch); | 598 | Load(device, dispatch); |
| 602 | return Device(device, dispatch); | 599 | return Device(device, dispatch); |
| 603 | } | 600 | } |
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index af3083c84..912cab46c 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h | |||
| @@ -796,7 +796,7 @@ class Device : public Handle<VkDevice, NoOwner, DeviceDispatch> { | |||
| 796 | public: | 796 | public: |
| 797 | static Device Create(VkPhysicalDevice physical_device, Span<VkDeviceQueueCreateInfo> queues_ci, | 797 | static Device Create(VkPhysicalDevice physical_device, Span<VkDeviceQueueCreateInfo> queues_ci, |
| 798 | Span<const char*> enabled_extensions, const void* next, | 798 | Span<const char*> enabled_extensions, const void* next, |
| 799 | DeviceDispatch& dispatch) noexcept; | 799 | DeviceDispatch& dispatch); |
| 800 | 800 | ||
| 801 | Queue GetQueue(u32 family_index) const noexcept; | 801 | Queue GetQueue(u32 family_index) const noexcept; |
| 802 | 802 | ||