From 55bc67bf7989acfeadf0233a4bdd5660e8f0bb69 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Sun, 9 Jun 2024 23:34:38 +0200 Subject: Start work on render backend --- deimos/vulkan/vulkan_backend.cpp | 59 ++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 12 deletions(-) (limited to 'deimos/vulkan/vulkan_backend.cpp') diff --git a/deimos/vulkan/vulkan_backend.cpp b/deimos/vulkan/vulkan_backend.cpp index 173e671..87e4451 100644 --- a/deimos/vulkan/vulkan_backend.cpp +++ b/deimos/vulkan/vulkan_backend.cpp @@ -7,21 +7,22 @@ #include #include #include +#include namespace { using namespace deimos; -LogApi* log_api; -OsApi* os_api; -ApiRegistry* api_registry; +LogApi* log_api; +OsApi* os_api; +ApiRegistry* api_registry; TempAllocatorApi* temp_api; -VulkanLoaderApi* vulkan_loader_api; +VulkanLoaderApi* vulkan_loader_api; const VkAllocationCallbacks* kVkAlloc = nullptr; -class VulkanBackendImpl : public IVulkanBackend +class VulkanBackendImpl : public IVulkanBackend, public IRenderBackend { VulkanApi* m_vk; VkInstance m_instance; @@ -31,6 +32,13 @@ class VulkanBackendImpl : public IVulkanBackend VkDevice m_device; VkQueue m_queue = VK_NULL_HANDLE; + struct FrameResources + { + VkCommandPool cmd_pool = VK_NULL_HANDLE; + }; + + FrameResources m_frame_resources; + public: VulkanBackendImpl( VulkanApi* vk, @@ -45,6 +53,33 @@ public: m_vk->GetDeviceQueue(m_device, m_queue_family, 0, &m_queue); Ensures(m_queue != VK_NULL_HANDLE); } + + IRenderBackend* AsRenderBackend() override + { + return this; + } + + void BeginFrame() override + { + VkCommandPoolCreateInfo create_info; + create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + create_info.pNext = nullptr; + create_info.flags = 0; + create_info.queueFamilyIndex = m_queue_family; + + VkResult res = m_vk->CreateCommandPool(m_device, &create_info, kVkAlloc, &m_frame_resources.cmd_pool); + if (res != VK_SUCCESS) + { + log_api->LogError("Couldn't allocate Vulkan command pool: $", (int)res); + return; + } + } + + void EndFrame() override + { + m_vk->DeviceWaitIdle(m_device); + m_vk->DestroyCommandPool(m_device, m_frame_resources.cmd_pool, kVkAlloc); + } }; StatusOr CreateInstance(VulkanApi* vk) @@ -85,7 +120,7 @@ StatusOr CreateInstance(VulkanApi* vk) const VkResult res = vk->CreateInstance(&create_info, kVkAlloc, &instance); if (res != VK_SUCCESS) { - return InternalError("vkCreateInstance failed"); + return RuntimeError("vkCreateInstance failed"); } return instance; @@ -105,7 +140,7 @@ StatusOr CreateSurface(VulkanApi* vk, VkInstance instance, OsWindo const VkResult res = vk->CreateWin32SurfaceKHR(instance, &create_info, kVkAlloc, &surface); if (res != VK_SUCCESS) { - return InternalError("vkCreateWin32SurfaceKHR failed"); + return RuntimeError("vkCreateWin32SurfaceKHR failed"); } return surface; @@ -119,7 +154,7 @@ StatusOr FindQueueFamily(VulkanApi* vk, VkPhysicalDevice physical_devi vk->GetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_family_count, nullptr); if (queue_family_count == 0) { - return InternalError("No queue on this physical device"); + return RuntimeError("No queue on this physical device"); } log_api->LogInfo("Physical device has $ queue families", queue_family_count); @@ -143,7 +178,7 @@ StatusOr FindQueueFamily(VulkanApi* vk, VkPhysicalDevice physical_devi } } - return InternalError("Couldn't find a suitable queue"); + return RuntimeError("Couldn't find a suitable queue"); } Status FindPhysicalDevice( @@ -159,7 +194,7 @@ Status FindPhysicalDevice( vk->EnumeratePhysicalDevices(instance, &physical_device_count, nullptr); if (physical_device_count == 0) { - return InternalError("No Vulkan device found"); + return RuntimeError("No Vulkan device found"); } log_api->LogInfo("Found $ physical devices", physical_device_count); @@ -196,7 +231,7 @@ Status FindPhysicalDevice( log_api->LogInfo("Incompatible because: $", maybe_queue_family); } - return InternalError("No suitable device found"); + return RuntimeError("No suitable device found"); } StatusOr CreateDevice(VulkanApi* vk, VkPhysicalDevice physical_device, uint32_t queue_family) @@ -233,7 +268,7 @@ StatusOr CreateDevice(VulkanApi* vk, VkPhysicalDevice physical_device, const VkResult res = vk->CreateDevice(physical_device, &create_info, kVkAlloc, &device); if (res != VK_SUCCESS) { - return InternalError("vkCreateDeviceFailed"); + return RuntimeError("vkCreateDeviceFailed"); } return device; -- cgit