diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-06-09 23:34:38 +0200 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-06-09 23:34:38 +0200 |
commit | 55bc67bf7989acfeadf0233a4bdd5660e8f0bb69 (patch) | |
tree | ab61b00bfd351c32cc99298f4466c86baf6d1514 /deimos/vulkan/vulkan_backend.cpp | |
parent | 909304e44763c58c0ebbe40068a58784ebaced7b (diff) |
Start work on render backend
Diffstat (limited to 'deimos/vulkan/vulkan_backend.cpp')
-rw-r--r-- | deimos/vulkan/vulkan_backend.cpp | 59 |
1 files changed, 47 insertions, 12 deletions
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 <deimos/core/temp_allocator.h>
#include <deimos/core/log.h>
#include <deimos/core/os.h>
+#include <deimos/render/backend.h>
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<VkInstance> CreateInstance(VulkanApi* vk)
@@ -85,7 +120,7 @@ StatusOr<VkInstance> 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<VkSurfaceKHR> 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<uint32_t> 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<uint32_t> 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<VkDevice> CreateDevice(VulkanApi* vk, VkPhysicalDevice physical_device, uint32_t queue_family)
@@ -233,7 +268,7 @@ StatusOr<VkDevice> 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;
|