2020-03-24 21:05:32 +01:00
|
|
|
#include "VulkanQueue.h"
|
|
|
|
|
#include "VulkanInitializer.h"
|
|
|
|
|
#include "VulkanGraphics.h"
|
2020-04-12 15:47:19 +02:00
|
|
|
#include "VulkanAllocator.h"
|
|
|
|
|
#include "VulkanCommandBuffer.h"
|
|
|
|
|
#include "VulkanGraphicsEnums.h"
|
2020-03-24 21:05:32 +01:00
|
|
|
|
|
|
|
|
using namespace Seele;
|
|
|
|
|
using namespace Seele::Vulkan;
|
|
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
Queue::Queue(PGraphics graphics, Gfx::QueueType queueType, uint32 familyIndex, uint32 queueIndex)
|
2020-05-05 01:51:13 +02:00
|
|
|
: familyIndex(familyIndex), graphics(graphics), queueType(queueType)
|
|
|
|
|
{
|
2020-03-24 21:05:32 +01:00
|
|
|
vkGetDeviceQueue(graphics->getDevice(), familyIndex, queueIndex, &queue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Queue::~Queue()
|
|
|
|
|
{
|
2020-04-12 15:47:19 +02:00
|
|
|
}
|
|
|
|
|
|
2020-05-05 01:51:13 +02:00
|
|
|
void Queue::submitCommandBuffer(PCmdBuffer cmdBuffer, uint32 numSignalSemaphores, VkSemaphore *signalSemaphores)
|
2020-04-12 15:47:19 +02:00
|
|
|
{
|
|
|
|
|
assert(cmdBuffer->state == CmdBuffer::State::Ended);
|
2020-05-05 01:51:13 +02:00
|
|
|
|
2020-04-12 15:47:19 +02:00
|
|
|
PFence fence = cmdBuffer->fence;
|
|
|
|
|
assert(!fence->isSignaled());
|
|
|
|
|
|
|
|
|
|
const VkCommandBuffer cmdBuffers[] = {cmdBuffer->handle};
|
|
|
|
|
|
|
|
|
|
VkSubmitInfo submitInfo =
|
|
|
|
|
init::SubmitInfo();
|
|
|
|
|
submitInfo.commandBufferCount = 1;
|
|
|
|
|
submitInfo.pCommandBuffers = cmdBuffers;
|
|
|
|
|
submitInfo.signalSemaphoreCount = static_cast<uint32>(numSignalSemaphores);
|
|
|
|
|
submitInfo.pSignalSemaphores = signalSemaphores;
|
|
|
|
|
|
|
|
|
|
Array<VkSemaphore> waitSemaphores;
|
2020-05-05 01:51:13 +02:00
|
|
|
if (cmdBuffer->waitSemaphores.size() > 0)
|
2020-04-12 15:47:19 +02:00
|
|
|
{
|
2020-05-05 01:51:13 +02:00
|
|
|
for (PSemaphore semaphore : cmdBuffer->waitSemaphores)
|
2020-04-12 15:47:19 +02:00
|
|
|
{
|
|
|
|
|
waitSemaphores.add(semaphore->getHandle());
|
|
|
|
|
}
|
|
|
|
|
submitInfo.waitSemaphoreCount = static_cast<uint32>(cmdBuffer->waitSemaphores.size());
|
|
|
|
|
submitInfo.pWaitSemaphores = waitSemaphores.data();
|
|
|
|
|
submitInfo.pWaitDstStageMask = cmdBuffer->waitFlags.data();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VK_CHECK(vkQueueSubmit(queue, 1, &submitInfo, fence->getHandle()));
|
|
|
|
|
|
|
|
|
|
cmdBuffer->state = CmdBuffer::State::Submitted;
|
|
|
|
|
cmdBuffer->waitFlags.clear();
|
|
|
|
|
cmdBuffer->waitSemaphores.clear();
|
|
|
|
|
|
2020-05-05 01:51:13 +02:00
|
|
|
if (Gfx::waitIdleOnSubmit)
|
2020-04-12 15:47:19 +02:00
|
|
|
{
|
|
|
|
|
fence->wait(200 * 1000ull);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cmdBuffer->refreshFence();
|
|
|
|
|
graphics->getStagingManager()->clearPending();
|
2020-03-24 21:05:32 +01:00
|
|
|
}
|