2020-03-24 21:05:32 +01:00
|
|
|
#include "VulkanGraphicsResources.h"
|
|
|
|
|
#include "VulkanInitializer.h"
|
|
|
|
|
#include "VulkanGraphics.h"
|
|
|
|
|
#include "VulkanGraphicsEnums.h"
|
2020-04-12 15:47:19 +02:00
|
|
|
#include "VulkanCommandBuffer.h"
|
2020-03-24 21:05:32 +01:00
|
|
|
|
|
|
|
|
using namespace Seele;
|
|
|
|
|
using namespace Seele::Vulkan;
|
|
|
|
|
|
2020-05-05 01:51:13 +02:00
|
|
|
List<QueueOwnedResourceDeletion::PendingItem> QueueOwnedResourceDeletion::deletionQueue;
|
|
|
|
|
volatile bool QueueOwnedResourceDeletion::running;
|
|
|
|
|
std::mutex QueueOwnedResourceDeletion::mutex;
|
|
|
|
|
std::condition_variable QueueOwnedResourceDeletion::cv;
|
|
|
|
|
|
|
|
|
|
QueueOwnedResourceDeletion::QueueOwnedResourceDeletion()
|
|
|
|
|
{
|
|
|
|
|
worker = std::thread(&run);
|
|
|
|
|
running = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QueueOwnedResourceDeletion::~QueueOwnedResourceDeletion()
|
|
|
|
|
{
|
|
|
|
|
worker.join();
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-19 14:36:50 +02:00
|
|
|
void QueueOwnedResourceDeletion::addPendingDelete(PCmdBuffer cmdbuffer, std::function<void()> func)
|
2020-05-05 01:51:13 +02:00
|
|
|
{
|
|
|
|
|
PendingItem item;
|
2020-09-19 14:36:50 +02:00
|
|
|
item.cmdBuffer = cmdbuffer;
|
2020-05-05 01:51:13 +02:00
|
|
|
item.func = func;
|
|
|
|
|
deletionQueue.add(item);
|
|
|
|
|
std::unique_lock<std::mutex> lock(mutex);
|
|
|
|
|
cv.notify_all();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QueueOwnedResourceDeletion::run()
|
|
|
|
|
{
|
|
|
|
|
while (running || !deletionQueue.empty())
|
|
|
|
|
{
|
|
|
|
|
std::unique_lock<std::mutex> lock(mutex);
|
|
|
|
|
cv.wait(lock);
|
|
|
|
|
auto entry = deletionQueue.begin();
|
2020-09-19 14:36:50 +02:00
|
|
|
PCmdBuffer cmdBuffer = entry->cmdBuffer;
|
|
|
|
|
//cmdBuffer->getManager()->waitForCommands(cmdBuffer);
|
|
|
|
|
//cmdBuffer->begin();
|
|
|
|
|
|
|
|
|
|
//entry->func();
|
|
|
|
|
deletionQueue.remove(entry);
|
2020-05-05 01:51:13 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-01 02:17:49 +02:00
|
|
|
Semaphore::Semaphore(PGraphics graphics)
|
2020-03-24 21:05:32 +01:00
|
|
|
: graphics(graphics)
|
|
|
|
|
{
|
|
|
|
|
VkSemaphoreCreateInfo info =
|
|
|
|
|
init::SemaphoreCreateInfo();
|
|
|
|
|
VK_CHECK(vkCreateSemaphore(graphics->getDevice(), &info, nullptr, &handle));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Semaphore::~Semaphore()
|
|
|
|
|
{
|
2020-04-12 15:47:19 +02:00
|
|
|
graphics = nullptr;
|
2020-04-01 02:17:49 +02:00
|
|
|
vkDestroySemaphore(graphics->getDevice(), handle, nullptr);
|
2020-04-12 15:47:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Fence::Fence(PGraphics graphics)
|
|
|
|
|
: graphics(graphics), signaled(false)
|
|
|
|
|
{
|
|
|
|
|
VkFenceCreateInfo info =
|
|
|
|
|
init::FenceCreateInfo(0);
|
|
|
|
|
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);
|
|
|
|
|
switch (res)
|
|
|
|
|
{
|
|
|
|
|
case VK_SUCCESS:
|
|
|
|
|
signaled = true;
|
|
|
|
|
return true;
|
|
|
|
|
case VK_NOT_READY:
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Fence::reset()
|
|
|
|
|
{
|
|
|
|
|
if (signaled)
|
|
|
|
|
{
|
|
|
|
|
vkResetFences(graphics->getDevice(), 1, &fence);
|
|
|
|
|
signaled = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Fence::wait(uint32 timeout)
|
|
|
|
|
{
|
|
|
|
|
VkFence fences[] = {fence};
|
|
|
|
|
VkResult r = vkWaitForFences(graphics->getDevice(), 1, fences, true, timeout * 1000ull);
|
|
|
|
|
switch (r)
|
|
|
|
|
{
|
|
|
|
|
case VK_SUCCESS:
|
|
|
|
|
signaled = true;
|
|
|
|
|
break;
|
|
|
|
|
case VK_TIMEOUT:
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
VK_CHECK(r);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|