diff --git a/CMCore b/CMCore index 11e32b77..9dd89aa5 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 11e32b77f1136bcb552abb406cf73db799720e11 +Subproject commit 9dd89aa5a34ef90b983895d32645df9b53cce955 diff --git a/CMSceneGraph b/CMSceneGraph index 4949c2e3..2370ba12 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 4949c2e3e82c8a88a783579aff120617c4ecfdab +Subproject commit 2370ba12d7656da491f65be66d9e134484377866 diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 87bd4c88..d248bbe0 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -195,12 +195,12 @@ public: Resize(w,h); } - bool BuildCommandBuffer(RenderCmdBuffer *cb,RenderPass *rp,Framebuffer *fb,Renderable *ri) + bool BuildCommandBuffer(RenderCmdBuffer *cb,Framebuffer *fb,Renderable *ri) { if(!ri)return(false); cb->Begin(); - cb->BindFramebuffer(rp,fb); + cb->BindFramebuffer(fb); cb->SetClearColor(0,clear_color); cb->BeginRenderPass(); cb->BindPipeline(ri->GetPipeline()); @@ -213,12 +213,12 @@ public: return(true); } - void BuildCommandBuffer(RenderCmdBuffer *cb,RenderTarget *rt,Renderable *ri) + bool BuildCommandBuffer(RenderCmdBuffer *cb,RenderTarget *rt,Renderable *ri) { if(!cb||!rt||!ri) - return; + return(false); - BuildCommandBuffer(cb,rt->GetRenderPass(),rt->GetFramebuffer(),ri); + return BuildCommandBuffer(cb,rt->GetFramebuffer(),ri); } bool BuildCommandBuffer(uint32_t index,Renderable *ri) @@ -226,15 +226,15 @@ public: if(!ri)return(false); return BuildCommandBuffer(sc_render_target->GetRenderCmdBuffer(index), - sc_render_target->GetRenderPass(), - sc_render_target->GetFramebuffer(index),ri); + sc_render_target->GetFramebuffer(index), + ri); } bool BuildCommandBuffer(Renderable *ri) { if(!ri)return(false); - for(int32_t i=0;iGetImageCount();i++) + for(uint32_t i=0;iGetImageCount();i++) BuildCommandBuffer(i,ri); return(true); @@ -254,7 +254,7 @@ public: RenderCmdBuffer *cb=sc_render_target->GetRenderCmdBuffer(index); cb->Begin(); - cb->BindFramebuffer(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index)); + cb->BindFramebuffer(sc_render_target->GetFramebuffer(index)); cb->SetClearColor(0,clear_color); cb->BeginRenderPass(); rl->Render(cb); @@ -264,7 +264,7 @@ public: void BuildCommandBuffer(RenderList *rl) { - for(int32_t i=0;iGetImageCount();i++) + for(uint32_t i=0;iGetImageCount();i++) BuildCommandBuffer(i,rl); } diff --git a/inc/hgl/graph/VKCommandBuffer.h b/inc/hgl/graph/VKCommandBuffer.h index e5d77631..aeaeb525 100644 --- a/inc/hgl/graph/VKCommandBuffer.h +++ b/inc/hgl/graph/VKCommandBuffer.h @@ -44,11 +44,12 @@ class RenderCmdBuffer:public GPUCmdBuffer VkRect2D render_area; VkViewport viewport; - Framebuffer *fbo; RenderPassBeginInfo rp_begin; VkPipelineLayout pipeline_layout; - void SetFBO(Framebuffer *); +private: + + void SetClear(); public: @@ -78,7 +79,7 @@ public: //以上设定在Begin开始后即不可改变 - bool BindFramebuffer(RenderPass *rp,Framebuffer *fb); + bool BindFramebuffer(Framebuffer *); bool BeginRenderPass(); void NextSubpass(){vkCmdNextSubpass(cmd_buf,VK_SUBPASS_CONTENTS_INLINE);} diff --git a/inc/hgl/graph/VKFramebuffer.h b/inc/hgl/graph/VKFramebuffer.h index 5f80a34d..89f2573c 100644 --- a/inc/hgl/graph/VKFramebuffer.h +++ b/inc/hgl/graph/VKFramebuffer.h @@ -1,13 +1,13 @@ #ifndef HGL_GRAPH_VULKAN_FRAMEBUFFER_INCLUDE #define HGL_GRAPH_VULKAN_FRAMEBUFFER_INCLUDE -#include +#include VK_NAMESPACE_BEGIN class Framebuffer { VkDevice device; VkFramebuffer frame_buffer; - VkRenderPass render_pass; + RenderPass *render_pass; VkExtent2D extent; uint32_t attachment_count; @@ -18,7 +18,7 @@ private: friend class GPUDevice; - Framebuffer(VkDevice,VkFramebuffer,const VkExtent2D &,VkRenderPass,uint32_t color_count,bool depth); + Framebuffer(VkDevice,VkFramebuffer,const VkExtent2D &,RenderPass *,uint32_t color_count,bool depth); public: @@ -27,7 +27,7 @@ public: operator VkFramebuffer(){return frame_buffer;} const VkFramebuffer GetFramebuffer ()const{return frame_buffer;} - const VkRenderPass GetRenderPass ()const{return render_pass;} + RenderPass * GetRenderPass () {return render_pass;} const VkExtent2D & GetExtent ()const{return extent;} diff --git a/inc/hgl/graph/VKRenderPass.h b/inc/hgl/graph/VKRenderPass.h index b83a7f8b..71dc2bff 100644 --- a/inc/hgl/graph/VKRenderPass.h +++ b/inc/hgl/graph/VKRenderPass.h @@ -37,8 +37,10 @@ public: virtual ~RenderPass(); - VkRenderPass GetVkRenderPass(){return render_pass;} - VkPipelineCache GetPipelineCache(){return pipeline_cache;} + operator const VkRenderPass()const{return render_pass;} + + const VkRenderPass GetVkRenderPass()const{return render_pass;} + const VkPipelineCache GetPipelineCache()const{return pipeline_cache;} const uint GetColorCount()const{return color_formats.GetCount();} const List & GetColorFormat()const{return color_formats;} diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index 11bfdd98..c11295a4 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -17,7 +17,6 @@ protected: DeviceQueue *queue; - RenderPass *render_pass; Framebuffer *fbo; VkExtent2D extent; @@ -35,7 +34,7 @@ protected: friend class GPUDevice; RenderTarget(DeviceQueue *,Semaphore *); - RenderTarget(DeviceQueue *,Semaphore *,RenderPass *_rp,Framebuffer *_fb,Texture2D **color_texture_list,const uint32_t color_count,Texture2D *depth_texture); + RenderTarget(DeviceQueue *,Semaphore *,Framebuffer *_fb,Texture2D **color_texture_list,const uint32_t color_count,Texture2D *depth_texture); public: @@ -43,14 +42,12 @@ public: DeviceQueue * GetQueue () {return queue;} const VkExtent2D & GetExtent ()const {return extent;} - virtual RenderPass * GetRenderPass () {return render_pass;} - virtual const VkRenderPass GetVkRenderPass ()const {return render_pass->GetVkRenderPass();} - - virtual const uint32_t GetColorCount ()const {return fbo->GetColorCount();} + virtual RenderPass * GetRenderPass () {return GetFramebuffer()->GetRenderPass();} + virtual uint32_t GetColorCount () {return GetFramebuffer()->GetColorCount();} virtual Framebuffer * GetFramebuffer () {return fbo;} virtual Texture2D * GetColorTexture (const int index=0){return color_textures[index];} - virtual Texture2D * GetDepthTexture (){return depth_texture;} + virtual Texture2D * GetDepthTexture () {return depth_texture;} public: // command buffer @@ -76,27 +73,24 @@ class RTSwapchain:public RenderTarget public: - RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rcs,Semaphore *pcs,RenderPass *rp); + RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rcs,Semaphore *pcs); ~RTSwapchain(); + + uint32_t GetColorCount () override {return 1;} + uint32_t GetImageCount ()const {return swapchain->image_count;} + uint32_t GetCurrentFrameIndices ()const {return current_frame;} - const uint32_t GetColorCount ()const override {return 1;} ///Swapchain的FBO颜色成份只有一个 - const uint32_t GetImageCount ()const {return swapchain->image_count;} + Framebuffer * GetFramebuffer ()override {return swapchain->sc_image[current_frame].fbo;} + Framebuffer * GetFramebuffer (int index) {return swapchain->sc_image[index].fbo;} + + virtual Texture2D * GetColorTexture (const int index=0) override{return swapchain->sc_image[current_frame].color;} + virtual Texture2D * GetDepthTexture () override{return swapchain->sc_image[current_frame].depth;} - Framebuffer * GetFramebuffer ()override {return swapchain->sc_image[current_frame].fbo;} - Framebuffer * GetFramebuffer (const int index) {return swapchain->sc_image[index].fbo;} - - virtual Texture2D * GetColorTexture (const int index=0) override{return swapchain->sc_image[current_frame].color;} - virtual Texture2D * GetDepthTexture () override{return swapchain->sc_image[current_frame].depth;} - - RenderCmdBuffer *GetRenderCmdBuffer(const int index) - { - return swapchain->sc_image[index].cmd_buf; - } + RenderCmdBuffer * GetRenderCmdBuffer (int index) {return swapchain->sc_image[index].cmd_buf;} public: - const uint32_t GetCurrentFrameIndices ()const {return current_frame;} - Semaphore * GetPresentCompleteSemaphore () {return present_complete_semaphore;} + Semaphore * GetPresentSemaphore () {return present_complete_semaphore;} public: diff --git a/res b/res index 008dbd53..e1a36d78 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit 008dbd5353e6afe7add287333cbda1b5c5fffdec +Subproject commit e1a36d78f0eead5f6bb65493432c4690637b991d diff --git a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp index 529c43fc..ec7d8ea9 100644 --- a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp +++ b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp @@ -5,6 +5,7 @@ #include #include #include +#include VK_NAMESPACE_BEGIN RenderCmdBuffer::RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb):GPUCmdBuffer(attr,cb) @@ -15,7 +16,6 @@ RenderCmdBuffer::RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer hgl_zero(render_area); hgl_zero(viewport); - fbo=nullptr; pipeline_layout=VK_NULL_HANDLE; } @@ -25,13 +25,8 @@ RenderCmdBuffer::~RenderCmdBuffer() hgl_free(clear_values); } -void RenderCmdBuffer::SetFBO(Framebuffer *fb) +void RenderCmdBuffer::SetClear() { - if(fbo==fb)return; - - fbo=fb; - cv_count=fbo->GetAttachmentCount(); - if(cv_count>0) { clear_values=hgl_align_realloc(clear_values,cv_count); @@ -44,11 +39,6 @@ void RenderCmdBuffer::SetFBO(Framebuffer *fb) hgl_free(clear_values); clear_values=nullptr; } - - render_area.offset.x=0; - render_area.offset.y=0; - render_area.extent.width=0; - render_area.extent.height=0; } void RenderCmdBuffer::SetRenderArea(const VkExtent2D &ext2d) @@ -58,18 +48,19 @@ void RenderCmdBuffer::SetRenderArea(const VkExtent2D &ext2d) render_area.extent=ext2d; } -bool RenderCmdBuffer::BindFramebuffer(RenderPass *rp,Framebuffer *fb) +bool RenderCmdBuffer::BindFramebuffer(Framebuffer *fbo) { - if(!rp||!fb)return(false); + if(!fbo)return(false); - SetFBO(fb); + cv_count=fbo->GetAttachmentCount(); + SetClear(); render_area.offset.x=0; render_area.offset.y=0; - render_area.extent=fb->GetExtent(); + render_area.extent=fbo->GetExtent(); - rp_begin.renderPass = rp->GetVkRenderPass(); - rp_begin.framebuffer = *fb; + rp_begin.renderPass = *fbo->GetRenderPass(); + rp_begin.framebuffer = *fbo; rp_begin.renderArea = render_area; rp_begin.clearValueCount = cv_count; rp_begin.pClearValues = clear_values; diff --git a/src/SceneGraph/Vulkan/VKDeviceFramebuffer.cpp b/src/SceneGraph/Vulkan/VKDeviceFramebuffer.cpp index 61200448..002b4a84 100644 --- a/src/SceneGraph/Vulkan/VKDeviceFramebuffer.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceFramebuffer.cpp @@ -75,7 +75,7 @@ Framebuffer *GPUDevice::CreateFBO(RenderPass *rp,ImageView **color_list,const ui if(!fbo) return(nullptr); - return(new Framebuffer(GetDevice(),fbo,extent,rp->GetVkRenderPass(),color_count,depth)); + return(new Framebuffer(GetDevice(),fbo,extent,rp,color_count,depth)); } // //Framebuffer *GPUDevice::CreateFBO(RenderPass *rp,List &color,ImageView *depth) diff --git a/src/SceneGraph/Vulkan/VKDeviceRenderTarget.cpp b/src/SceneGraph/Vulkan/VKDeviceRenderTarget.cpp index 0c2f22e6..e988b1e2 100644 --- a/src/SceneGraph/Vulkan/VKDeviceRenderTarget.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceRenderTarget.cpp @@ -37,7 +37,7 @@ RenderTarget *GPUDevice::CreateRT(const FramebufferInfo *fbi,RenderPass *rp,cons DeviceQueue *q=CreateQueue(fence_count,false); Semaphore *render_complete_semaphore=CreateGPUSemaphore(); - RenderTarget *rt=new RenderTarget(q,render_complete_semaphore,rp,fb,color_texture_list,color_count,depth_texture); + RenderTarget *rt=new RenderTarget(q,render_complete_semaphore,fb,color_texture_list,color_count,depth_texture); color_texture_list.DiscardObject(); return rt; @@ -73,8 +73,7 @@ RTSwapchain *GPUDevice::CreateSwapchainRenderTarget() sc, q, render_complete_semaphore, - present_complete_semaphore, - sc->render_pass + present_complete_semaphore ); return srt; diff --git a/src/SceneGraph/Vulkan/VKFramebuffer.cpp b/src/SceneGraph/Vulkan/VKFramebuffer.cpp index eb2d086a..32de2677 100644 --- a/src/SceneGraph/Vulkan/VKFramebuffer.cpp +++ b/src/SceneGraph/Vulkan/VKFramebuffer.cpp @@ -7,7 +7,7 @@ VK_NAMESPACE_BEGIN -Framebuffer::Framebuffer(VkDevice dev,VkFramebuffer fb,const VkExtent2D &ext,VkRenderPass rp,uint32_t cc,bool depth) +Framebuffer::Framebuffer(VkDevice dev,VkFramebuffer fb,const VkExtent2D &ext,RenderPass *rp,uint32_t cc,bool depth) { device=dev; frame_buffer=fb; diff --git a/src/SceneGraph/Vulkan/VKRenderTarget.cpp b/src/SceneGraph/Vulkan/VKRenderTarget.cpp index 6f18ef54..75372d83 100644 --- a/src/SceneGraph/Vulkan/VKRenderTarget.cpp +++ b/src/SceneGraph/Vulkan/VKRenderTarget.cpp @@ -9,7 +9,6 @@ VK_NAMESPACE_BEGIN RenderTarget::RenderTarget(DeviceQueue *q,Semaphore *s) { queue=q; - render_pass=nullptr; fbo=nullptr; color_count=0; @@ -18,10 +17,9 @@ RenderTarget::RenderTarget(DeviceQueue *q,Semaphore *s) render_complete_semaphore=s; } -RenderTarget::RenderTarget(DeviceQueue *q,Semaphore *s,RenderPass *_rp,Framebuffer *_fb,Texture2D **ctl,const uint32_t cc,Texture2D *dt) +RenderTarget::RenderTarget(DeviceQueue *q,Semaphore *s,Framebuffer *_fb,Texture2D **ctl,const uint32_t cc,Texture2D *dt) { queue=q; - render_pass=_rp; fbo=_fb; depth_texture=dt; diff --git a/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp b/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp index 924326bc..cdb194b5 100644 --- a/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp +++ b/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp @@ -3,7 +3,7 @@ #include VK_NAMESPACE_BEGIN -RTSwapchain::RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rcs,Semaphore *pcs,RenderPass *rp):RenderTarget(q,rcs) +RTSwapchain::RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rcs,Semaphore *pcs):RenderTarget(q,rcs) { device=dev; @@ -14,8 +14,6 @@ RTSwapchain::RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rc present_info.swapchainCount = 1; present_info.pResults = nullptr; present_info.pSwapchains = &(swapchain->swap_chain); - - render_pass=rp; extent=swapchain->extent;