newly RenderTarget&SwapchainRenderTarget class

This commit is contained in:
hyzboy 2021-12-15 19:57:35 +08:00
parent 96dc95276b
commit 87293f778c
6 changed files with 69 additions and 36 deletions

View File

@ -50,7 +50,7 @@ namespace hgl
GPUBuffer *tile_buffer; ///<Tile暂存缓冲区
List<ImageRegion> commit_list;
List<Image2DRegion> commit_list;
uint8 *commit_ptr;
bool CommitTile(TileObject *,const void *,const uint,const int,const int); ///<提交一个Tile数据

View File

@ -33,6 +33,7 @@ class VulkanInstance;
class GPUPhysicalDevice;
class GPUDevice;
struct GPUDeviceAttribute;
class GPUQueue;
class ImageView;
class Framebuffer;
struct Swapchain;

View File

@ -11,10 +11,12 @@ VK_NAMESPACE_BEGIN
/**
*
*/
class RenderTarget:public GPUQueue
class RenderTarget
{
protected:
GPUQueue *queue;
RenderPass *render_pass;
Framebuffer *fbo;
@ -32,8 +34,8 @@ protected:
friend class GPUDevice;
RenderTarget(GPUDevice *dev,Framebuffer *_fb,const uint32_t fence_count=1);
RenderTarget(GPUDevice *dev,RenderPass *_rp,Framebuffer *_fb,Texture2D **color_texture_list,const uint32_t color_count,Texture2D *depth_texture,const uint32_t fence_count=1);
RenderTarget(GPUQueue *,GPUSemaphore *);
RenderTarget(GPUQueue *,GPUSemaphore *,RenderPass *_rp,Framebuffer *_fb,Texture2D **color_texture_list,const uint32_t color_count,Texture2D *depth_texture);
public:
@ -52,6 +54,9 @@ public: // command buffer
GPUSemaphore * GetRenderCompleteSemaphore (){return render_complete_semaphore;}
virtual bool Submit (RenderCmdBuffer *,GPUSemaphore *present_complete_semaphore=nullptr);
bool WaitQueue(){return queue->WaitQueue();}
bool WaitFence(){return queue->WaitFence();}
};//class RenderTarget
/**
@ -59,6 +64,7 @@ public: // command buffer
*/
class SwapchainRenderTarget:public RenderTarget
{
VkDevice device;
Swapchain *swapchain;
VkSwapchainKHR vk_swapchain;
PresentInfo present_info;
@ -72,7 +78,7 @@ class SwapchainRenderTarget:public RenderTarget
public:
SwapchainRenderTarget(GPUDevice *dev,Swapchain *sc);
SwapchainRenderTarget(VkDevice dev,Swapchain *sc,GPUQueue *q,GPUSemaphore *rcs,GPUSemaphore *pcs,RenderPass *rp,Framebuffer **fbo_list);
~SwapchainRenderTarget();
Framebuffer * GetFramebuffer ()override {return render_frame[current_frame];}

View File

@ -33,7 +33,10 @@ RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,RenderPas
if(fb)
{
RenderTarget *rt=new RenderTarget(this,rp,fb,color_texture_list,color_count,depth_texture,fence_count);
GPUQueue *q=CreateQueue(fence_count,false);
GPUSemaphore *render_complete_semaphore=CreateGPUSemaphore();
RenderTarget *rt=new RenderTarget(q,render_complete_semaphore,rp,fb,color_texture_list,color_count,depth_texture);
color_texture_list.DiscardObject();
return rt;
@ -53,4 +56,35 @@ RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,const uin
return CreateRenderTarget(fbi,rp,fence_count);
}
SwapchainRenderTarget *GPUDevice::CreateSwapchainRT()
{
const uint32_t count=swapchain->GetImageCount();
GPUQueue *q=CreateQueue(count,false);
GPUSemaphore *render_complete_semaphore=CreateGPUSemaphore();
GPUSemaphore *present_complete_semaphore=CreateGPUSemaphore();
Texture2D **sc_color=swapchain->GetColorTextures();
Texture2D *sc_depth=swapchain->GetDepthTexture();
Framebuffer **render_frame=new Framebuffer *[count];
for(uint32_t i=0;i<count;i++)
{
render_frame[i]=CreateFramebuffer(device_render_pass,(*sc_color)->GetImageView(),sc_depth->GetImageView());
++sc_color;
}
SwapchainRenderTarget *srt=new SwapchainRenderTarget( attr->device,
swapchain,
q,
render_complete_semaphore,
present_complete_semaphore,
device_render_pass,
render_frame
);
return srt;
}
VK_NAMESPACE_END

View File

@ -6,23 +6,21 @@
#include<hgl/graph/VKFramebuffer.h>
VK_NAMESPACE_BEGIN
RenderTarget::RenderTarget(GPUDevice *dev,Framebuffer *_fb,const uint32_t fence_count):GPUQueue(dev,dev->GetGraphicsQueue(),fence_count)
RenderTarget::RenderTarget(GPUQueue *q,GPUSemaphore *s)
{
queue=q;
render_pass=nullptr;
fbo=_fb;
fbo=nullptr;
if(fbo)
color_count=fbo->GetColorCount();
else
color_count=0;
color_textures=nullptr;
depth_texture=nullptr;
render_complete_semaphore=dev->CreateGPUSemaphore();
render_complete_semaphore=s;
}
RenderTarget::RenderTarget(GPUDevice *dev,RenderPass *_rp,Framebuffer *_fb,Texture2D **ctl,const uint32_t cc,Texture2D *dt,const uint32_t fence_count):GPUQueue(dev,dev->GetGraphicsQueue(),fence_count)
RenderTarget::RenderTarget(GPUQueue *q,GPUSemaphore *s,RenderPass *_rp,Framebuffer *_fb,Texture2D **ctl,const uint32_t cc,Texture2D *dt)
{
queue=q;
render_pass=_rp;
fbo=_fb;
@ -48,11 +46,12 @@ RenderTarget::RenderTarget(GPUDevice *dev,RenderPass *_rp,Framebuffer *_fb,Textu
}
}
render_complete_semaphore=dev->CreateGPUSemaphore();
render_complete_semaphore=s;
}
RenderTarget::~RenderTarget()
{
SAFE_CLEAR(queue);
SAFE_CLEAR(depth_texture);
SAFE_CLEAR_OBJECT_ARRAY(color_textures,color_count);
@ -62,6 +61,6 @@ RenderTarget::~RenderTarget()
bool RenderTarget::Submit(RenderCmdBuffer *command_buffer,GPUSemaphore *present_complete_semaphore)
{
return this->GPUQueue::Submit(*command_buffer,present_complete_semaphore,render_complete_semaphore);
return queue->Submit(*command_buffer,present_complete_semaphore,render_complete_semaphore);
}
VK_NAMESPACE_END

View File

@ -3,8 +3,10 @@
#include<hgl/graph/VKSemaphore.h>
VK_NAMESPACE_BEGIN
SwapchainRenderTarget::SwapchainRenderTarget(GPUDevice *dev,Swapchain *sc):RenderTarget(dev,nullptr,sc->GetImageCount())
SwapchainRenderTarget::SwapchainRenderTarget(VkDevice dev,Swapchain *sc,GPUQueue *q,GPUSemaphore *rcs,GPUSemaphore *pcs,RenderPass *rp,Framebuffer **fbo_list):RenderTarget(q,rcs)
{
device=dev;
swapchain=sc;
vk_swapchain=swapchain->GetSwapchain();
@ -14,26 +16,17 @@ SwapchainRenderTarget::SwapchainRenderTarget(GPUDevice *dev,Swapchain *sc):Rende
present_info.pResults = nullptr;
present_info.pSwapchains = &vk_swapchain;
Texture2D **sc_color=swapchain->GetColorTextures();
Texture2D *sc_depth=swapchain->GetDepthTexture();
render_pass=dev->GetRenderPass();
render_pass=rp;
swap_chain_count=swapchain->GetImageCount();
extent=swapchain->GetExtent();
render_frame=new Framebuffer *[swap_chain_count];
for(uint i=0;i<swap_chain_count;i++)
{
render_frame[i]=device->CreateFramebuffer(render_pass,(*sc_color)->GetImageView(),sc_depth->GetImageView());
++sc_color;
}
render_frame=fbo_list;
current_frame=0;
present_complete_semaphore=dev->CreateGPUSemaphore();
present_complete_semaphore=pcs;
}
SwapchainRenderTarget::~SwapchainRenderTarget()
@ -45,7 +38,7 @@ SwapchainRenderTarget::~SwapchainRenderTarget()
int SwapchainRenderTarget::AcquireNextImage()
{
if(vkAcquireNextImageKHR(device->GetDevice(),vk_swapchain,UINT64_MAX,*(this->present_complete_semaphore),VK_NULL_HANDLE,&current_frame)==VK_SUCCESS)
if(vkAcquireNextImageKHR(device,vk_swapchain,UINT64_MAX,*(this->present_complete_semaphore),VK_NULL_HANDLE,&current_frame)==VK_SUCCESS)
return current_frame;
return -1;
@ -57,7 +50,7 @@ bool SwapchainRenderTarget::PresentBackbuffer(VkSemaphore *wait_semaphores,const
present_info.pWaitSemaphores =wait_semaphores;
present_info.pImageIndices =&current_frame;
VkResult result=vkQueuePresentKHR(queue,&present_info);
VkResult result=queue->Present(&present_info);
if (!((result == VK_SUCCESS) || (result == VK_SUBOPTIMAL_KHR)))
{
@ -80,11 +73,11 @@ bool SwapchainRenderTarget::PresentBackbuffer()
bool SwapchainRenderTarget::Submit(VkCommandBuffer cb)
{
return GPUQueue::Submit(cb,present_complete_semaphore,render_complete_semaphore);
return queue->Submit(cb,present_complete_semaphore,render_complete_semaphore);
}
bool SwapchainRenderTarget::Submit(VkCommandBuffer cb,GPUSemaphore *pce)
{
return GPUQueue::Submit(cb,pce,render_complete_semaphore);
return queue->Submit(cb,pce,render_complete_semaphore);
}
VK_NAMESPACE_END