ULRE/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp

78 lines
2.0 KiB
C++

#include<hgl/graph/VKRenderTarget.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKSemaphore.h>
VK_NAMESPACE_BEGIN
SwapchainRenderTarget::SwapchainRenderTarget(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rcs,Semaphore *pcs,RenderPass *rp):RenderTarget(q,rcs)
{
device=dev;
swapchain=sc;
present_info.waitSemaphoreCount = 0;
present_info.pWaitSemaphores = nullptr;
present_info.swapchainCount = 1;
present_info.pResults = nullptr;
present_info.pSwapchains = &(swapchain->swap_chain);
render_pass=rp;
extent=swapchain->extent;
current_frame=0;
present_complete_semaphore=pcs;
}
SwapchainRenderTarget::~SwapchainRenderTarget()
{
delete present_complete_semaphore;
delete swapchain;
}
int SwapchainRenderTarget::AcquireNextImage()
{
if(vkAcquireNextImageKHR(device,swapchain->swap_chain,UINT64_MAX,*(this->present_complete_semaphore),VK_NULL_HANDLE,&current_frame)==VK_SUCCESS)
return current_frame;
return -1;
}
bool SwapchainRenderTarget::PresentBackbuffer(VkSemaphore *wait_semaphores,const uint32_t count)
{
present_info.waitSemaphoreCount =count;
present_info.pWaitSemaphores =wait_semaphores;
present_info.pImageIndices =&current_frame;
VkResult result=queue->Present(&present_info);
if (!((result == VK_SUCCESS) || (result == VK_SUBOPTIMAL_KHR)))
{
if (result == VK_ERROR_OUT_OF_DATE_KHR) {
// Swap chain is no longer compatible with the surface and needs to be recreated
return false;
}
}
return(true);
}
bool SwapchainRenderTarget::PresentBackbuffer()
{
VkSemaphore sem=*render_complete_semaphore;
return this->PresentBackbuffer(&sem,1);
}
bool SwapchainRenderTarget::Submit(VkCommandBuffer cb)
{
return queue->Submit(cb,present_complete_semaphore,render_complete_semaphore);
}
bool SwapchainRenderTarget::Submit(VkCommandBuffer cb,Semaphore *pce)
{
return queue->Submit(cb,pce,render_complete_semaphore);
}
VK_NAMESPACE_END