2024-08-23 22:13:05 +08:00
|
|
|
#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 {
|
2024-08-25 22:41:25 +08:00
|
|
|
CommandWorker* Backend::TransferWorker;
|
|
|
|
|
CommandWorker* Backend::RenderWorker;
|
|
|
|
|
CommandWorker* Backend::PresentWorker;
|
2024-08-23 22:13:05 +08:00
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|