86 lines
2.6 KiB
C++
86 lines
2.6 KiB
C++
|
#include "SHPch.h"
|
||
|
#include "SHVkQueue.h"
|
||
|
#include "Tools/SHLogger.h"
|
||
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||
|
#include "Graphics/Synchronization/SHVkSemaphore.h"
|
||
|
#include "Graphics/Synchronization/SHVkFence.h"
|
||
|
#include "Graphics/Commands/SHVkCommandBuffer.h"
|
||
|
|
||
|
|
||
|
namespace SHADE
|
||
|
{
|
||
|
/***************************************************************************/
|
||
|
/*!
|
||
|
|
||
|
\brief
|
||
|
Non default ctor to initialize variables.
|
||
|
|
||
|
\param inVkQueue
|
||
|
The vulkan queue handle to initialize this class with.
|
||
|
|
||
|
\param parent
|
||
|
The queue family this queue originated from.
|
||
|
|
||
|
*/
|
||
|
/***************************************************************************/
|
||
|
SHVkQueue::SHVkQueue(vk::Queue inVkQueue, SHQueueFamilyIndex parent, Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl) noexcept
|
||
|
: vkQueue{ inVkQueue }
|
||
|
, parentFamily{ parent }
|
||
|
, logicalDeviceHdl{ inLogicalDeviceHdl }
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
vk::Queue SHVkQueue::GetVkQueue(void) const noexcept
|
||
|
{
|
||
|
return vkQueue;
|
||
|
}
|
||
|
|
||
|
void SHVkQueue::SubmitCommandBuffer(std::initializer_list<Handle<SHVkCommandBuffer>> cmdBuffers, std::initializer_list<Handle<SHVkSemaphore>> signalSems /*= {}*/, std::initializer_list<Handle<SHVkSemaphore>> waitSems /*= {}*/, vk::PipelineStageFlagBits waitDstStageMask /*= {}*/, Handle<SHVkFence> const& optionalFence /*= {}*/) noexcept
|
||
|
{
|
||
|
std::vector<vk::Semaphore> vkWaitSems{ waitSems.size() };
|
||
|
uint32_t i = 0;
|
||
|
for (auto& sem : waitSems)
|
||
|
{
|
||
|
vkWaitSems[i] = sem->GetVkSem();
|
||
|
++i;
|
||
|
}
|
||
|
|
||
|
std::vector<vk::Semaphore> vkSignalSems{ signalSems.size() };
|
||
|
i = 0;
|
||
|
for (auto& sem : signalSems)
|
||
|
{
|
||
|
vkSignalSems[i] = sem->GetVkSem();
|
||
|
++i;
|
||
|
}
|
||
|
|
||
|
std::vector<vk::CommandBuffer> vkCmdBuffers{ cmdBuffers.size() };
|
||
|
i = 0;
|
||
|
for (auto& cmdBuffer : cmdBuffers)
|
||
|
{
|
||
|
vkCmdBuffers[i] = cmdBuffer->GetVkCommandBuffer();
|
||
|
++i;
|
||
|
}
|
||
|
|
||
|
vk::PipelineStageFlags mask = waitDstStageMask;
|
||
|
|
||
|
vk::SubmitInfo submitInfo
|
||
|
{
|
||
|
.waitSemaphoreCount = static_cast<uint32_t>(vkWaitSems.size()),
|
||
|
.pWaitSemaphores = vkWaitSems.data(),
|
||
|
.pWaitDstStageMask = &mask,
|
||
|
.commandBufferCount = static_cast<uint32_t>(vkCmdBuffers.size()),
|
||
|
.pCommandBuffers = vkCmdBuffers.data(),
|
||
|
.signalSemaphoreCount = static_cast<uint32_t>(vkSignalSems.size()),
|
||
|
.pSignalSemaphores = vkSignalSems.data(),
|
||
|
};
|
||
|
|
||
|
// #BackEndTest: Submit the queue
|
||
|
if (auto result = vkQueue.submit(1, &submitInfo, (optionalFence) ? optionalFence->GetVkFence() : nullptr); result != vk::Result::eSuccess)
|
||
|
{
|
||
|
SHVulkanDebugUtil::ReportVkError(result, "Failed to submit command buffer. ");
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|