2020-03-24 21:05:32 +01:00
|
|
|
#include "VulkanCommandBuffer.h"
|
|
|
|
|
#include "VulkanInitializer.h"
|
|
|
|
|
#include "VulkanGraphics.h"
|
|
|
|
|
#include "VulkanGraphicsEnums.h"
|
|
|
|
|
#include "VulkanFramebuffer.h"
|
|
|
|
|
#include "VulkanRenderPass.h"
|
|
|
|
|
|
|
|
|
|
using namespace Seele;
|
|
|
|
|
using namespace Seele::Vulkan;
|
|
|
|
|
|
2020-04-01 02:17:49 +02:00
|
|
|
CmdBufferBase::CmdBufferBase(PGraphics graphics, VkCommandPool cmdPool)
|
2020-03-24 21:05:32 +01:00
|
|
|
: graphics(graphics)
|
|
|
|
|
, owner(cmdPool)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CmdBufferBase::~CmdBufferBase()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-01 02:17:49 +02:00
|
|
|
CmdBuffer::CmdBuffer(PGraphics graphics, VkCommandPool cmdPool)
|
2020-03-24 21:05:32 +01:00
|
|
|
: CmdBufferBase(graphics, cmdPool)
|
|
|
|
|
, renderPass(nullptr)
|
|
|
|
|
, framebuffer(nullptr)
|
|
|
|
|
, subpassIndex(0)
|
|
|
|
|
{
|
|
|
|
|
VkCommandBufferAllocateInfo allocInfo =
|
|
|
|
|
init::CommandBufferAllocateInfo(cmdPool,
|
|
|
|
|
VK_COMMAND_BUFFER_LEVEL_PRIMARY,
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
VK_CHECK(vkAllocateCommandBuffers(graphics->getDevice(), &allocInfo, &handle))
|
|
|
|
|
state = State::ReadyBegin;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CmdBuffer::~CmdBuffer()
|
|
|
|
|
{
|
|
|
|
|
vkFreeCommandBuffers(graphics->getDevice(), owner, 1, &handle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CmdBuffer::begin()
|
|
|
|
|
{
|
|
|
|
|
VkCommandBufferBeginInfo beginInfo =
|
|
|
|
|
init::CommandBufferBeginInfo();
|
|
|
|
|
beginInfo.pInheritanceInfo = nullptr;
|
|
|
|
|
VK_CHECK(vkBeginCommandBuffer(handle, &beginInfo));
|
|
|
|
|
state = State::InsideBegin;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CmdBuffer::end()
|
|
|
|
|
{
|
|
|
|
|
VK_CHECK(vkEndCommandBuffer(handle));
|
|
|
|
|
state = State::Ended;
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-01 02:17:49 +02:00
|
|
|
void CmdBuffer::beginRenderPass(PRenderPass renderPass, PFramebuffer framebuffer)
|
2020-03-24 21:05:32 +01:00
|
|
|
{
|
|
|
|
|
VkRenderPassBeginInfo beginInfo =
|
|
|
|
|
init::RenderPassBeginInfo();
|
|
|
|
|
beginInfo.clearValueCount = renderPass->getClearValueCount();
|
|
|
|
|
beginInfo.pClearValues = renderPass->getClearValues();
|
|
|
|
|
beginInfo.renderArea = renderPass->getRenderArea();
|
|
|
|
|
beginInfo.renderPass = renderPass->getHandle();
|
|
|
|
|
beginInfo.framebuffer = framebuffer->getHandle();
|
|
|
|
|
vkCmdBeginRenderPass(handle, &beginInfo, renderPass->getSubpassContents());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CmdBuffer::endRenderPass()
|
|
|
|
|
{
|
|
|
|
|
vkCmdEndRenderPass(handle);
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-01 02:17:49 +02:00
|
|
|
SecondaryCmdBuffer::SecondaryCmdBuffer(PGraphics graphics, VkCommandPool cmdPool)
|
2020-03-24 21:05:32 +01:00
|
|
|
: CmdBufferBase(graphics, cmdPool)
|
|
|
|
|
{
|
|
|
|
|
VkCommandBufferAllocateInfo allocInfo =
|
|
|
|
|
init::CommandBufferAllocateInfo(cmdPool,
|
|
|
|
|
VK_COMMAND_BUFFER_LEVEL_SECONDARY,
|
|
|
|
|
1);
|
|
|
|
|
VK_CHECK(vkAllocateCommandBuffers(graphics->getDevice(), &allocInfo, &handle));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SecondaryCmdBuffer::~SecondaryCmdBuffer()
|
|
|
|
|
{
|
|
|
|
|
vkFreeCommandBuffers(graphics->getDevice(), owner, 1, &handle);
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-01 02:17:49 +02:00
|
|
|
void SecondaryCmdBuffer::begin(PCmdBuffer parent)
|
2020-03-24 21:05:32 +01:00
|
|
|
{
|
|
|
|
|
VkCommandBufferBeginInfo beginInfo =
|
|
|
|
|
init::CommandBufferBeginInfo();
|
|
|
|
|
VkCommandBufferInheritanceInfo inheritanceInfo =
|
|
|
|
|
init::CommandBufferInheritanceInfo();
|
|
|
|
|
inheritanceInfo.framebuffer = parent->framebuffer->getHandle();
|
|
|
|
|
inheritanceInfo.renderPass = parent->renderPass->getHandle();
|
|
|
|
|
inheritanceInfo.subpass = parent->subpassIndex;
|
|
|
|
|
beginInfo.pInheritanceInfo = &inheritanceInfo;
|
|
|
|
|
VK_CHECK(vkBeginCommandBuffer(handle, &beginInfo));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SecondaryCmdBuffer::end()
|
|
|
|
|
{
|
|
|
|
|
VK_CHECK(vkEndCommandBuffer(handle));
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-01 02:17:49 +02:00
|
|
|
CommandBufferManager::CommandBufferManager(PGraphics graphics, PQueue queue)
|
2020-03-24 21:05:32 +01:00
|
|
|
: graphics(graphics)
|
|
|
|
|
, queue(queue)
|
|
|
|
|
{
|
|
|
|
|
VkCommandPoolCreateInfo info =
|
|
|
|
|
init::CommandPoolCreateInfo();
|
|
|
|
|
info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
|
|
|
|
info.queueFamilyIndex = queue->getFamilyIndex();
|
|
|
|
|
|
|
|
|
|
VK_CHECK(vkCreateCommandPool(graphics->getDevice(), &info, nullptr, &commandPool));
|
|
|
|
|
|
|
|
|
|
activeCmdBuffer = new CmdBuffer(graphics, commandPool);
|
|
|
|
|
activeCmdBuffer->begin();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CommandBufferManager::~CommandBufferManager()
|
|
|
|
|
{
|
|
|
|
|
vkDestroyCommandPool(graphics->getDevice(), commandPool, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PCmdBuffer CommandBufferManager::getCommands()
|
|
|
|
|
{
|
|
|
|
|
return activeCmdBuffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PSecondaryCmdBuffer CommandBufferManager::createSecondaryCmdBuffer()
|
|
|
|
|
{
|
2020-04-01 02:17:49 +02:00
|
|
|
return new SecondaryCmdBuffer(graphics, commandPool);
|
2020-03-24 21:05:32 +01:00
|
|
|
}
|
|
|
|
|
|
2020-04-01 02:17:49 +02:00
|
|
|
void CommandBufferManager::submitCommands(PSemaphore signalSemaphore)
|
2020-03-24 21:05:32 +01:00
|
|
|
{
|
2020-04-01 02:17:49 +02:00
|
|
|
if(activeCmdBuffer->state == CmdBuffer::State::InsideBegin
|
|
|
|
|
|| activeCmdBuffer->state == CmdBuffer::State::RenderPassActive)
|
|
|
|
|
{
|
|
|
|
|
if(!activeCmdBuffer->state == CmdBuffer::State::RenderPassActive)
|
|
|
|
|
{
|
|
|
|
|
std::cout << "End of renderpass forced" << std::endl;
|
|
|
|
|
activeCmdBuffer->endRenderPass();
|
|
|
|
|
}
|
|
|
|
|
activeCmdBuffer->end();
|
|
|
|
|
if(signalSemaphore != nullptr)
|
|
|
|
|
{
|
|
|
|
|
queue->submitCommandBuffer(activeCmdBuffer, signalSemaphore->getHandle());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
queue->submitCommandBuffer(activeCmdBuffer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for(int32_t i = 0; i < allocatedBuffers.size(); ++i)
|
|
|
|
|
{
|
|
|
|
|
PCmdBuffer cmdBuffer = allocatedBuffers[i];
|
|
|
|
|
cmdBuffer->refreshFences();
|
|
|
|
|
if(cmdBuffer->state == CmdBuffer::State::ReadyBegin)
|
|
|
|
|
{
|
|
|
|
|
activeCmdBuffer = cmdBuffer;
|
|
|
|
|
activeCmdBuffer->begin();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
assert(cmdBuffer->state == CmdBuffer::State::Submitted);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
activeCmdBuffer = new CmdBuffer(graphics, commandPool);
|
|
|
|
|
allocatedBuffers.add(activeCmdBuffer);
|
|
|
|
|
activeCmdBuffer->begin();
|
2020-03-24 21:05:32 +01:00
|
|
|
}
|