ULRE/src/SceneGraph/Vulkan/VKQueue.cpp

99 lines
2.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include<hgl/graph/VKQueue.h>
#include<hgl/graph/VKSemaphore.h>
VK_NAMESPACE_BEGIN
namespace
{
const VkPipelineStageFlags pipe_stage_flags=VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
}//namespace
DeviceQueue::DeviceQueue(VkDevice dev,VkQueue q,Fence **fl,const uint32_t fc)
{
device=dev;
queue=q;
current_fence=0;
fence_list=fl;
fence_count=fc;
submit_info.pWaitDstStageMask = &pipe_stage_flags;
}
DeviceQueue::~DeviceQueue()
{
SAFE_CLEAR_OBJECT_ARRAY_OBJECT(fence_list,fence_count)
}
bool DeviceQueue::WaitQueue()
{
VkResult result=vkQueueWaitIdle(queue);
if(result!=VK_SUCCESS)
return(false);
return(true);
}
bool DeviceQueue::WaitFence(const bool wait_all,uint64_t time_out)
{
VkResult result;
VkFence fence=*fence_list[current_fence];
result=vkWaitForFences(device,1,&fence,wait_all,time_out);
result=vkResetFences(device,1,&fence);
if(++current_fence==fence_count)
current_fence=0;
return(true);
}
bool DeviceQueue::Submit(const VkCommandBuffer *cmd_buf,const uint32_t cb_count,Semaphore *wait_sem,Semaphore *complete_sem)
{
VkSemaphore ws;
VkSemaphore cs;
if(wait_sem)
{
ws=*wait_sem;
submit_info.waitSemaphoreCount =1;
submit_info.pWaitSemaphores =&ws;
}
else
{
submit_info.waitSemaphoreCount =0;
submit_info.pWaitSemaphores =nullptr;
}
if(complete_sem)
{
cs=*complete_sem;
submit_info.signalSemaphoreCount=1;
submit_info.pSignalSemaphores =&cs;
}
else
{
submit_info.signalSemaphoreCount=0;
submit_info.pSignalSemaphores =nullptr;
}
submit_info.commandBufferCount =cb_count;
submit_info.pCommandBuffers =cmd_buf;
VkFence fence=*fence_list[current_fence];
VkResult result=vkQueueSubmit(queue,1,&submit_info,fence);
//不在这里立即等待fence完成是因为有可能queue submit需要久一点工作时间我们这个时间可以去干别的。等在AcquireNextImage时再去等待fence而且是另一帧的fence。这样有利于异步处理
return(result==VK_SUCCESS);
}
bool DeviceQueue::Submit(const VkCommandBuffer &cmd_buf,Semaphore *wait_sem,Semaphore *complete_sem)
{
return Submit(&cmd_buf,1,wait_sem,complete_sem);
}
VK_NAMESPACE_END