diff --git a/inc/hgl/graph/VKCommandBuffer.h b/inc/hgl/graph/VKCommandBuffer.h index aeaeb525..8d2dda23 100644 --- a/inc/hgl/graph/VKCommandBuffer.h +++ b/inc/hgl/graph/VKCommandBuffer.h @@ -15,6 +15,8 @@ protected: VkCommandBuffer cmd_buf; + bool cmd_begin; + public: GPUCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb); @@ -23,9 +25,19 @@ public: operator VkCommandBuffer(){return cmd_buf;} operator const VkCommandBuffer()const{return cmd_buf;} operator const VkCommandBuffer *()const{return &cmd_buf;} + + const bool IsBegin()const{return cmd_begin;} bool Begin(); - bool End(){return(vkEndCommandBuffer(cmd_buf)==VK_SUCCESS);} + bool End() + { + if(!cmd_begin) + return(false); + + cmd_begin=false; + + return(vkEndCommandBuffer(cmd_buf)==VK_SUCCESS); + } #ifdef _DEBUG void SetDebugName(const AnsiString &); diff --git a/inc/hgl/graph/VKQueue.h b/inc/hgl/graph/VKQueue.h index dcb32700..3d335361 100644 --- a/inc/hgl/graph/VKQueue.h +++ b/inc/hgl/graph/VKQueue.h @@ -33,8 +33,8 @@ public: bool WaitQueue(); bool WaitFence(const bool wait_all=true,const uint64_t time_out=HGL_NANO_SEC_PER_SEC); - bool Submit(const VkCommandBuffer &cmd_buf,Semaphore *wait_sem,Semaphore *complete_sem); bool Submit(const VkCommandBuffer *cmd_buf,const uint32_t count,Semaphore *wait_sem,Semaphore *complete_sem); + bool Submit(GPUCmdBuffer *cmd_buf,Semaphore *wait_sem,Semaphore *complete_sem); };//class DeviceQueue VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_SUBMIT_QUEUE_INCLUDE diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index bc7fba3e..19ec6ba4 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -131,7 +131,7 @@ public: // Command Buffer if(!data) return(false); - return data->queue->Submit(*data->cmd_buf,wait_sem,data->render_complete_semaphore); + return data->queue->Submit(data->cmd_buf,wait_sem,data->render_complete_semaphore); } bool WaitQueue ()override{return data->queue->WaitQueue();} @@ -238,7 +238,7 @@ public: public: - int AcquireNextImage(); ///<获取下一帧的索引 + RenderCmdBuffer *AcquireNextImage(); ///<获取下一帧的索引 bool PresentBackbuffer(); ///<推送后台画面到前台 diff --git a/inc/hgl/graph/module/SwapchainModule.h b/inc/hgl/graph/module/SwapchainModule.h index 755adffa..49d0b025 100644 --- a/inc/hgl/graph/module/SwapchainModule.h +++ b/inc/hgl/graph/module/SwapchainModule.h @@ -10,8 +10,6 @@ class RenderPass; GRAPH_MODULE_CLASS(SwapchainModule) { - Swapchain * swapchain =nullptr; - TextureManager * tex_manager =nullptr; RenderTargetManager * rt_manager =nullptr; RenderPassManager * rp_manager =nullptr; @@ -20,12 +18,10 @@ GRAPH_MODULE_CLASS(SwapchainModule) SwapchainRenderTarget * sc_render_target=nullptr; - SwapchainImage * current_sc_image=nullptr; - protected: - bool CreateSwapchainFBO(); - bool CreateSwapchain(); + bool CreateSwapchainFBO(Swapchain *); + Swapchain *CreateSwapchain(); bool CreateSwapchainRenderTarget(); public: diff --git a/src/SceneGraph/Vulkan/VKCommandBuffer.cpp b/src/SceneGraph/Vulkan/VKCommandBuffer.cpp index 53a97fbf..aa3f9e5c 100644 --- a/src/SceneGraph/Vulkan/VKCommandBuffer.cpp +++ b/src/SceneGraph/Vulkan/VKCommandBuffer.cpp @@ -6,6 +6,8 @@ GPUCmdBuffer::GPUCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb) { dev_attr=attr; cmd_buf=cb; + + cmd_begin=false; } GPUCmdBuffer::~GPUCmdBuffer() @@ -22,6 +24,7 @@ bool GPUCmdBuffer::Begin() if(vkBeginCommandBuffer(cmd_buf, &cmd_buf_info)!=VK_SUCCESS) return(false); + cmd_begin=true; return(true); } diff --git a/src/SceneGraph/Vulkan/VKQueue.cpp b/src/SceneGraph/Vulkan/VKQueue.cpp index 7f7a09a0..7af7f758 100644 --- a/src/SceneGraph/Vulkan/VKQueue.cpp +++ b/src/SceneGraph/Vulkan/VKQueue.cpp @@ -1,5 +1,6 @@ #include #include +#include VK_NAMESPACE_BEGIN namespace @@ -91,8 +92,13 @@ bool DeviceQueue::Submit(const VkCommandBuffer *cmd_buf,const uint32_t cb_count, return(result==VK_SUCCESS); } -bool DeviceQueue::Submit(const VkCommandBuffer &cmd_buf,Semaphore *wait_sem,Semaphore *complete_sem) +bool DeviceQueue::Submit(GPUCmdBuffer *cmd_buf,Semaphore *wait_sem,Semaphore *complete_sem) { - return Submit(&cmd_buf,1,wait_sem,complete_sem); + if(cmd_buf->IsBegin()) + cmd_buf->End(); + + VkCommandBuffer vk_cmd=*cmd_buf; + + return Submit(&vk_cmd,1,wait_sem,complete_sem); } VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp b/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp index 3b08b638..4d6e684f 100644 --- a/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp +++ b/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp @@ -24,17 +24,22 @@ SwapchainRenderTarget::~SwapchainRenderTarget() delete swapchain; } -int SwapchainRenderTarget::AcquireNextImage() +RenderCmdBuffer *SwapchainRenderTarget::AcquireNextImage() { if(vkAcquireNextImageKHR(device, swapchain->swap_chain, UINT64_MAX, *present_complete_semaphore, VK_NULL_HANDLE, - ¤t_frame)==VK_SUCCESS) - return current_frame; + ¤t_frame)!=VK_SUCCESS) + return(nullptr); - return -1; + SwapchainImage *sc_image=&(swapchain->sc_image[current_frame]); + + sc_image->cmd_buf->Begin(); + sc_image->cmd_buf->BindFramebuffer(sc_image->fbo); + + return sc_image->cmd_buf; } bool SwapchainRenderTarget::PresentBackbuffer() diff --git a/src/SceneGraph/module/SwapchainModule.cpp b/src/SceneGraph/module/SwapchainModule.cpp index 0dc57c11..9f3c3e88 100644 --- a/src/SceneGraph/module/SwapchainModule.cpp +++ b/src/SceneGraph/module/SwapchainModule.cpp @@ -96,7 +96,7 @@ namespace } }//namespace -bool SwapchainModule::CreateSwapchainFBO() +bool SwapchainModule::CreateSwapchainFBO(Swapchain *swapchain) { if(vkGetSwapchainImagesKHR(swapchain->device,swapchain->swap_chain,&(swapchain->image_count),nullptr)!=VK_SUCCESS) return(false); @@ -119,7 +119,7 @@ bool SwapchainModule::CreateSwapchainFBO() if(!swapchain->sc_image[i].color) return(false); - swapchain->sc_image[i].depth =tex_manager->CreateTexture2D(new SwapchainDepthTextureCreateInfo(swapchain->depth_format,swapchain->extent)); + swapchain->sc_image[i].depth=tex_manager->CreateTexture2D(new SwapchainDepthTextureCreateInfo(swapchain->depth_format,swapchain->extent)); if(!swapchain->sc_image[i].depth) return(false); @@ -146,14 +146,14 @@ bool SwapchainModule::CreateSwapchainFBO() return(true); } -bool SwapchainModule::CreateSwapchain() +Swapchain *SwapchainModule::CreateSwapchain() { auto *dev_attr=GetDeviceAttribute(); if(!dev_attr) - return(false); + return(nullptr); - swapchain=new Swapchain; + Swapchain *swapchain=new Swapchain; swapchain->device =dev_attr->device; swapchain->extent =dev_attr->surface_caps.currentExtent; @@ -165,13 +165,13 @@ bool SwapchainModule::CreateSwapchain() if(swapchain->swap_chain) { - if(CreateSwapchainFBO()) + if(CreateSwapchainFBO(swapchain)) return swapchain; } delete swapchain; swapchain=nullptr; - return(false); + return(nullptr); } namespace @@ -190,7 +190,9 @@ namespace bool SwapchainModule::CreateSwapchainRenderTarget() { - if(!CreateSwapchain()) + Swapchain *swapchain=CreateSwapchain(); + + if(!swapchain) return(false); GPUDevice *device=GetDevice(); @@ -259,7 +261,6 @@ SwapchainModule::SwapchainModule(GPUDevice *dev,TextureManager *tm,RenderTargetM void SwapchainModule::OnResize(const VkExtent2D &extent) { SAFE_CLEAR(sc_render_target) - swapchain=nullptr; GetDeviceAttribute()->RefreshSurfaceCaps(); @@ -268,31 +269,15 @@ void SwapchainModule::OnResize(const VkExtent2D &extent) RenderCmdBuffer *SwapchainModule::BeginRender() { - const int index=sc_render_target->AcquireNextImage(); - - if(index<0||index>=swapchain->image_count) - return(nullptr); - - current_sc_image=&(swapchain->sc_image[index]); - - current_sc_image->cmd_buf->Begin(); - current_sc_image->cmd_buf->BindFramebuffer(current_sc_image->fbo); - - return current_sc_image->cmd_buf; + return sc_render_target->AcquireNextImage(); } void SwapchainModule::EndRender() { - if(!current_sc_image) - return; - - current_sc_image->cmd_buf->End(); sc_render_target->Submit(); sc_render_target->PresentBackbuffer(); sc_render_target->WaitQueue(); sc_render_target->WaitFence(); - - current_sc_image=nullptr; } VK_NAMESPACE_END