Files
Seele/src/Engine/Graphics/Vulkan/Resources.cpp
T

146 lines
3.0 KiB
C++
Raw Normal View History

2023-11-01 23:12:30 +01:00
#include "Resources.h"
#include "Enums.h"
#include "Graphics.h"
2023-11-17 22:31:26 +01:00
#include "Command.h"
#include "Window.h"
2020-03-24 21:05:32 +01:00
using namespace Seele;
using namespace Seele::Vulkan;
2020-04-01 02:17:49 +02:00
Semaphore::Semaphore(PGraphics graphics)
2020-03-24 21:05:32 +01:00
: graphics(graphics)
{
2023-11-15 00:06:00 +01:00
VkSemaphoreCreateInfo info = {
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
.pNext = nullptr,
.flags = 0,
};
2020-03-24 21:05:32 +01:00
VK_CHECK(vkCreateSemaphore(graphics->getDevice(), &info, nullptr, &handle));
}
Semaphore::~Semaphore()
{
2023-11-17 22:31:26 +01:00
graphics->getDestructionManager()->queueSemaphore(graphics->getGraphicsCommands()->getCommands(), handle);
2020-04-12 15:47:19 +02:00
}
Fence::Fence(PGraphics graphics)
2021-04-01 16:40:14 +02:00
: graphics(graphics)
2022-04-15 23:45:44 +02:00
, signaled(false)
2020-04-12 15:47:19 +02:00
{
2023-11-15 00:06:00 +01:00
VkFenceCreateInfo info = {
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
.pNext = nullptr,
.flags = 0
};
2020-04-12 15:47:19 +02:00
VK_CHECK(vkCreateFence(graphics->getDevice(), &info, nullptr, &fence));
}
Fence::~Fence()
{
vkDestroyFence(graphics->getDevice(), fence, nullptr);
}
bool Fence::isSignaled()
{
if (signaled)
{
return true;
}
VkResult res = vkGetFenceStatus(graphics->getDevice(), fence);
2023-11-15 00:06:00 +01:00
if (res == VK_SUCCESS)
2020-04-12 15:47:19 +02:00
{
2022-04-15 23:45:44 +02:00
signaled = true;
2023-11-15 00:06:00 +01:00
return true;
}
if (res == VK_NOT_READY)
{
return false;
2020-04-12 15:47:19 +02:00
}
}
void Fence::reset()
{
if (signaled)
{
vkResetFences(graphics->getDevice(), 1, &fence);
2022-04-15 23:45:44 +02:00
signaled = false;
2020-04-12 15:47:19 +02:00
}
}
void Fence::wait(uint32 timeout)
{
VkFence fences[] = {fence};
2023-11-15 17:42:57 +01:00
VkResult r = vkWaitForFences(graphics->getDevice(), 1, fences, true, timeout);
if (r == VK_SUCCESS)
2020-04-12 15:47:19 +02:00
{
2022-04-15 23:45:44 +02:00
signaled = true;
2023-11-15 00:06:00 +01:00
}
2023-11-15 17:42:57 +01:00
else if (r == VK_TIMEOUT)
2023-11-15 00:06:00 +01:00
{
2023-11-15 17:42:57 +01:00
return;
}
else if (r != VK_NOT_READY)
{
VK_CHECK(r);
2020-04-12 15:47:19 +02:00
}
}
2020-10-03 11:00:10 +02:00
2023-11-12 16:11:27 +01:00
DestructionManager::DestructionManager(PGraphics graphics)
: graphics(graphics)
{
}
DestructionManager::~DestructionManager()
{
}
2023-11-15 00:06:00 +01:00
void DestructionManager::queueBuffer(PCommand cmd, VkBuffer buffer)
2023-11-12 16:11:27 +01:00
{
buffers[cmd].add(buffer);
}
2023-11-15 00:06:00 +01:00
void DestructionManager::queueImage(PCommand cmd, VkImage image)
2023-11-12 16:11:27 +01:00
{
images[cmd].add(image);
}
2023-11-15 00:06:00 +01:00
void DestructionManager::queueImageView(PCommand cmd, VkImageView image)
2023-11-12 16:11:27 +01:00
{
views[cmd].add(image);
}
2023-11-15 00:06:00 +01:00
void DestructionManager::queueSemaphore(PCommand cmd, VkSemaphore sem)
{
sems[cmd].add(sem);
}
2023-11-15 17:42:57 +01:00
void DestructionManager::queueAllocation(PCommand cmd, OSubAllocation alloc)
2023-11-12 16:11:27 +01:00
{
2023-11-15 17:42:57 +01:00
allocs[cmd].add(std::move(alloc));
}
void DestructionManager::notifyCmdComplete(PCommand cmd)
{
for(auto buf : buffers[cmd])
2023-11-12 16:11:27 +01:00
{
vkDestroyBuffer(graphics->getDevice(), buf, nullptr);
}
2023-11-15 17:42:57 +01:00
for(auto view : views[cmd])
2023-11-12 16:11:27 +01:00
{
vkDestroyImageView(graphics->getDevice(), view, nullptr);
}
2023-11-15 17:42:57 +01:00
for(auto img : images[cmd])
2023-11-12 16:11:27 +01:00
{
vkDestroyImage(graphics->getDevice(), img, nullptr);
}
2023-11-15 17:42:57 +01:00
for (auto sem : sems[cmd])
2023-11-15 00:06:00 +01:00
{
vkDestroySemaphore(graphics->getDevice(), sem, nullptr);
}
2023-11-15 17:42:57 +01:00
buffers[cmd].clear();
images[cmd].clear();
views[cmd].clear();
sems[cmd].clear();
allocs[cmd].clear();
2020-10-03 11:00:10 +02:00
}