#include "vkn/backend.h" #include "vkn/wrapper/device.h" #include "vkn/wrapper/device_create.h" #include "vkn/wrapper/instance.h" #include "vkn/wrapper/instance_create.h" #include "vkn/wrapper/queue.h" namespace vkn { Backend::Backend(string_view appName) : mWorkerMap(GlobalPool()) { InstanceCreator instanceCreator{}; mInstance = new (GlobalPool()) Instance(instanceCreator); DeviceCreator deviceCreator = DeviceCreator{ *mInstance }; deviceCreator.AddWindowExtension(); deviceCreator.AddQueue(Queue::TransferQueue,VkQueueFlagBits::VK_QUEUE_GRAPHICS_BIT, 1.0); deviceCreator.AddQueue(Queue::RenderQueue, VkQueueFlagBits::VK_QUEUE_GRAPHICS_BIT, 1.0); deviceCreator.AddQueue(Queue::ComputeQueue, VkQueueFlagBits::VK_QUEUE_GRAPHICS_BIT, 1.0); deviceCreator.AddQueue(Queue::PresentQueue, VkQueueFlagBits::VK_QUEUE_GRAPHICS_BIT, 1.0); mDevice = new (GlobalPool()) Device(deviceCreator); InitWorker(Queue::TransferQueue, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); InitWorker(Queue::RenderQueue, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); InitWorker(Queue::ComputeQueue, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); InitWorker(Queue::PresentQueue, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); Backend::TransferWorker = GetWorker(Queue::TransferQueue); Backend::RenderWorker = GetWorker(Queue::RenderQueue); } Backend::~Backend() { mInstance->~Instance(); mDevice->~Device(); } void Backend::InitWorker(Name name, VkCommandPoolCreateFlags flag) { auto queue = mDevice->GetQueue(name); if (queue) { auto worker = new CommandWorker(name, *mDevice, *queue, flag); mWorkerMap.emplace(name, worker); } } CommandWorker* Backend::GetWorker(Name name) { auto it = mWorkerMap.find(name); if (it != mWorkerMap.end()) { return it->second; } return nullptr; } }