78 lines
2.0 KiB
C++
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,¤t_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 =¤t_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
|