#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 const& inLogicalDeviceHdl) noexcept : vkQueue{ inVkQueue } , parentFamily{ parent } , logicalDeviceHdl{ inLogicalDeviceHdl } { } vk::Queue SHVkQueue::GetVkQueue(void) const noexcept { return vkQueue; } void SHVkQueue::SubmitCommandBuffer(std::initializer_list> cmdBuffers, std::initializer_list> signalSems /*= {}*/, std::initializer_list> waitSems /*= {}*/, vk::PipelineStageFlagBits waitDstStageMask /*= {}*/, Handle const& optionalFence /*= {}*/) noexcept { std::vector vkWaitSems{ waitSems.size() }; uint32_t i = 0; for (auto& sem : waitSems) { vkWaitSems[i] = sem->GetVkSem(); ++i; } std::vector vkSignalSems{ signalSems.size() }; i = 0; for (auto& sem : signalSems) { vkSignalSems[i] = sem->GetVkSem(); ++i; } std::vector vkCmdBuffers{ cmdBuffers.size() }; i = 0; for (auto& cmdBuffer : cmdBuffers) { vkCmdBuffers[i] = cmdBuffer->GetVkCommandBuffer(); ++i; } vk::PipelineStageFlags mask = waitDstStageMask; vk::SubmitInfo submitInfo { .waitSemaphoreCount = static_cast(vkWaitSems.size()), .pWaitSemaphores = vkWaitSems.data(), .pWaitDstStageMask = &mask, .commandBufferCount = static_cast(vkCmdBuffers.size()), .pCommandBuffers = vkCmdBuffers.data(), .signalSemaphoreCount = static_cast(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. "); } } }