diff options
Diffstat (limited to 'deimos/vulkan')
-rw-r--r-- | deimos/vulkan/BUILD | 1 | ||||
-rw-r--r-- | deimos/vulkan/vulkan_backend.cpp | 59 | ||||
-rw-r--r-- | deimos/vulkan/vulkan_backend.h | 6 | ||||
-rw-r--r-- | deimos/vulkan/vulkan_device_functions.inc | 4 |
4 files changed, 58 insertions, 12 deletions
diff --git a/deimos/vulkan/BUILD b/deimos/vulkan/BUILD index 238261f..8d4ef3a 100644 --- a/deimos/vulkan/BUILD +++ b/deimos/vulkan/BUILD @@ -16,6 +16,7 @@ cc_library( deps = [
"//deimos/core",
"//3rd_party/vulkan",
+ "//deimos/render",
],
visibility = ["//:__subpackages__"],
)
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;
diff --git a/deimos/vulkan/vulkan_backend.h b/deimos/vulkan/vulkan_backend.h index 90aaf2a..031c81b 100644 --- a/deimos/vulkan/vulkan_backend.h +++ b/deimos/vulkan/vulkan_backend.h @@ -8,11 +8,17 @@ namespace deimos class ApiRegistry;
class Allocator;
+class IRenderBackend;
struct OsWindow;
class IVulkanBackend
{
public:
+ IVulkanBackend() = default;
+ deimos_NO_COPY_MOVE(IVulkanBackend); + virtual ~IVulkanBackend() = default;
+
+ virtual IRenderBackend* AsRenderBackend() = 0;
};
class VulkanBackendApi
diff --git a/deimos/vulkan/vulkan_device_functions.inc b/deimos/vulkan/vulkan_device_functions.inc index 8267fb9..f83ebb7 100644 --- a/deimos/vulkan/vulkan_device_functions.inc +++ b/deimos/vulkan/vulkan_device_functions.inc @@ -1,4 +1,8 @@ // NOLINTBEGIN
FN(DestroyDevice)
FN(GetDeviceQueue)
+FN(CreateCommandPool)
+FN(ResetCommandPool)
+FN(DestroyCommandPool)
+FN(DeviceWaitIdle)
// NOLINTEND
|