renderer_vulkan: Remove two step initialization on VKDevice

The Vulkan device abstraction either initializes successfully on the
constructor or throws a Vulkan exception.
This commit is contained in:
ReinUsesLisp 2020-12-25 02:42:03 -03:00
parent 085adfea00
commit 53ea06dc17
6 changed files with 10 additions and 31 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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