diff --git a/example/Vulkan/DeferredModel.cpp b/example/Vulkan/DeferredModel.cpp index 681f10c6..ae6ff7c5 100644 --- a/example/Vulkan/DeferredModel.cpp +++ b/example/Vulkan/DeferredModel.cpp @@ -33,8 +33,8 @@ enum class GBufferAttachment ENUM_CLASS_RANGE(Color,Normal) };// -constexpr VkFormat gbuffer_color_format[size_t(GBufferAttachment::RANGE_SIZE)]={UFMT_RGB565,UFMT_RG8}; -constexpr VkFormat gbuffer_depth_format=FMT_D32F; +constexpr VkFormat gbuffer_color_format[size_t(GBufferAttachment::RANGE_SIZE)]={UFMT_RGB565,FMT_RG8UN}; +constexpr VkFormat gbuffer_depth_format=FMT_D16UN; struct alignas(16) PhongPointLight { @@ -105,7 +105,7 @@ private: VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - return(true); + return(gbuffer_rt); } bool InitSubpass(SubpassParam *sp,const OSString &material_filename) @@ -121,18 +121,18 @@ private: bool InitGBufferPipeline(SubpassParam *sp) { - sp->pipeline_triangles =db->CreatePipeline(sp->material,gbuffer_rt,InlinePipeline::Solid3D,Prim::Triangles); + sp->pipeline_triangles =gbuffer_rt->CreatePipeline(sp->material,InlinePipeline::Solid3D,Prim::Triangles); if(!sp->pipeline_triangles) return(false); - sp->pipeline_fan =db->CreatePipeline(sp->material,gbuffer_rt,InlinePipeline::Solid3D,Prim::Fan); + sp->pipeline_fan =gbuffer_rt->CreatePipeline(sp->material,InlinePipeline::Solid3D,Prim::Fan); return sp->pipeline_fan; } bool InitCompositionPipeline(SubpassParam *sp) { - sp->pipeline_fan=db->CreatePipeline(sp->material,sc_render_target,InlinePipeline::Solid2D,Prim::Fan); + sp->pipeline_fan=sc_render_target->CreatePipeline(sp->material,InlinePipeline::Solid2D,Prim::Fan); return sp->pipeline_fan; } diff --git a/example/Vulkan/OffscreenRender.cpp b/example/Vulkan/OffscreenRender.cpp index e69cd41a..9b464c6a 100644 --- a/example/Vulkan/OffscreenRender.cpp +++ b/example/Vulkan/OffscreenRender.cpp @@ -70,7 +70,7 @@ public: os.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D")); if(!os.material_instance)return(false); - os.pipeline=db->CreatePipeline(os.material_instance,os.render_taget,InlinePipeline::Solid2D,Prim::Fan); + os.pipeline=os.render_taget->CreatePipeline(os.material_instance,InlinePipeline::Solid2D,Prim::Fan); if(!os.pipeline)return(false); if(!InitUBO(&os,os.render_taget->GetExtent())) diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 17141cfb..781f6956 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -256,6 +256,9 @@ public: BuildCommandBuffer(sc_render_target->GetCurrentFrameIndices(),rl); } + template + Pipeline *CreatePipeline(ARGS...args){return sc_render_target->CreatePipeline(args...);} + public: int AcquireNextImage() @@ -291,38 +294,6 @@ public: return(true); } - -public: //pipeline - - Pipeline *CreatePipeline(Material *mtl,const InlinePipeline &ip,const Prim &prim=Prim::Triangles,const bool prim_restart=false) - { - return db->CreatePipeline(mtl,sc_render_target,ip,prim,prim_restart); - } - - Pipeline *CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip,const Prim &prim=Prim::Triangles,const bool prim_restart=false) - { - return db->CreatePipeline(mi,sc_render_target,ip,prim,prim_restart); - } - - Pipeline *CreatePipeline(Material *mtl,PipelineData *pd,const Prim &prim=Prim::Triangles,const bool prim_restart=false) - { - return db->CreatePipeline(mtl,sc_render_target,pd,prim,prim_restart); - } - - Pipeline *CreatePipeline(MaterialInstance *mi,PipelineData *pd,const Prim &prim=Prim::Triangles,const bool prim_restart=false) - { - return db->CreatePipeline(mi,sc_render_target,pd,prim,prim_restart); - } - - Pipeline *CreatePipeline(Material *mtl,const OSString &pipeline_name,const Prim &prim=Prim::Triangles,const bool prim_restart=false) - { - return db->CreatePipeline(mtl,sc_render_target,pipeline_name,prim,prim_restart); - } - - Pipeline *CreatePipeline(MaterialInstance *mi,const OSString &pipeline_name,const Prim &prim=Prim::Triangles,const bool prim_restart=false) - { - return db->CreatePipeline(mi,sc_render_target,pipeline_name,prim,prim_restart); - } };//class VulkanApplicationFramework class CameraAppFramework:public VulkanApplicationFramework diff --git a/inc/hgl/graph/VKPhysicalDevice.h b/inc/hgl/graph/VKPhysicalDevice.h index 33cf6418..6146d85a 100644 --- a/inc/hgl/graph/VKPhysicalDevice.h +++ b/inc/hgl/graph/VKPhysicalDevice.h @@ -109,7 +109,7 @@ public: const float GetMaxSamplerAnisotropy ()const{return properties.limits.maxSamplerAnisotropy;} const float GetMaxSamplerLodBias ()const{return properties.limits.maxSamplerLodBias;} - const void GetPointSize(float &granularity,float &min_size,float &max_size) + const void GetPointSize(float &granularity,float &min_size,float &max_size) { granularity =properties.limits.pointSizeGranularity; min_size =properties.limits.pointSizeRange[0]; diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index 2947bd1e..6ca5193d 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -16,7 +16,6 @@ VK_NAMESPACE_BEGIN using MaterialID =int; using MaterialInstanceID =int; -using PipelineID =int; using BufferID =int; using DescriptorSetsID =int; using RenderableID =int; @@ -39,7 +38,6 @@ class RenderResource IDResManage rm_material; ///<材质合集 IDResManage rm_material_instance; ///<材质实例合集 - IDResManage rm_pipeline; ///<管线合集 IDResManage rm_desc_sets; ///<描述符合集 IDResManage rm_renderables; ///<可渲染对象合集 IDResManage rm_buffers; ///<顶点缓冲区合集 @@ -56,7 +54,6 @@ public: //Add MaterialID Add(Material * mtl ){return rm_material.Add(mtl);} MaterialInstanceID Add(MaterialInstance * mi ){return rm_material_instance.Add(mi);} - PipelineID Add(Pipeline * p ){return rm_pipeline.Add(p);} DescriptorSetsID Add(DescriptorSets * ds ){return rm_desc_sets.Add(ds);} RenderableID Add(Renderable * r ){return rm_renderables.Add(r);} BufferID Add(GPUBuffer * buf ){return rm_buffers.Add(buf);} @@ -98,13 +95,6 @@ public: //Material Material * CreateMaterial(const OSString &); MaterialInstance * CreateMaterialInstance(Material *); MaterialInstance * CreateMaterialInstance(const OSString &); - - Pipeline * CreatePipeline(Material *, RenderTarget *,const InlinePipeline &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline * CreatePipeline(MaterialInstance *, RenderTarget *,const InlinePipeline &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline * CreatePipeline(Material *, RenderTarget *, PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline * CreatePipeline(MaterialInstance *, RenderTarget *, PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline * CreatePipeline(Material *, RenderTarget *,const OSString &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline * CreatePipeline(MaterialInstance *, RenderTarget *,const OSString &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); Renderable * CreateRenderable(const uint32_t vertex_count=0); TextRenderable * CreateTextRenderable(Material *); @@ -121,7 +111,6 @@ public: //Get Material * GetMaterial (const MaterialID &id){return rm_material.Get(id);} MaterialInstance * GetMaterialInstance (const MaterialInstanceID &id){return rm_material_instance.Get(id);} - Pipeline * GetPipeline (const PipelineID &id){return rm_pipeline.Get(id);} DescriptorSets * GetDescSets (const DescriptorSetsID &id){return rm_desc_sets.Get(id);} Renderable * GetRenderable (const RenderableID &id){return rm_renderables.Get(id);} GPUBuffer * GetBuffer (const BufferID &id){return rm_buffers.Get(id);} diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index 20608f61..854cba91 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -6,6 +6,7 @@ #include #include #include +#include VK_NAMESPACE_BEGIN /** * 渲染目标 @@ -28,6 +29,10 @@ protected: Texture2D **color_textures; Texture2D *depth_texture; +protected: + + ObjectList pipeline_list; + protected: friend class GPUDevice; @@ -47,6 +52,15 @@ public: virtual Texture2D * GetColorTexture (const int index=0){return color_textures[index];} virtual Texture2D * GetDepthTexture (){return depth_texture;} +public: + + Pipeline *CreatePipeline(Material *, const InlinePipeline &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline *CreatePipeline(Material *, PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline *CreatePipeline(MaterialInstance *, PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline *CreatePipeline(Material *, const OSString &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline *CreatePipeline(MaterialInstance *, const OSString &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + public: GPUSemaphore * GetRenderCompleteSemaphore (){return render_complete_semaphore;} diff --git a/src/RenderDevice/CMakeLists.txt b/src/RenderDevice/CMakeLists.txt index 2f1628cb..40abcb00 100644 --- a/src/RenderDevice/CMakeLists.txt +++ b/src/RenderDevice/CMakeLists.txt @@ -85,6 +85,8 @@ SET(VK_RENDER_PASS_SOURCE ${VK_INCLUDE_PATH}/VKFramebuffer.h VKPipeline.cpp VKRenderPass.cpp VKRenderTarget.cpp + VKRenderTargetPipeline.cpp + VKSwapchainRenderTarget.cpp VKSwapchain.cpp VKCommandBuffer.cpp) diff --git a/src/RenderDevice/VKRenderResource.cpp b/src/RenderDevice/VKRenderResource.cpp index 4fd00c5f..3974976b 100644 --- a/src/RenderDevice/VKRenderResource.cpp +++ b/src/RenderDevice/VKRenderResource.cpp @@ -71,56 +71,6 @@ MaterialInstance *RenderResource::CreateMaterialInstance(const OSString &mtl_fil return CreateMaterialInstance(mtl); } -Pipeline *RenderResource::CreatePipeline(Material *mtl,RenderTarget *rt,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) -{ - PipelineData *pd=GetPipelineData(ip); - - pd->Set(prim,prim_restart); - - Pipeline *p=device->CreatePipeline(pd,mtl,rt); - - if(p) - Add(p); - - return(p); -} - -Pipeline *RenderResource::CreatePipeline(MaterialInstance *mi,RenderTarget *rt,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) -{ - return CreatePipeline(mi->GetMaterial(),rt,ip,prim,prim_restart); -} - -Pipeline *RenderResource::CreatePipeline(Material *mtl,RenderTarget *rt,PipelineData *pd,const Prim &prim,const bool prim_restart) -{ - pd->Set(prim,prim_restart); - - Pipeline *p=device->CreatePipeline(pd,mtl,rt); - - if(p) - Add(p); - - return(p); -} - -Pipeline *RenderResource::CreatePipeline(MaterialInstance *mi,RenderTarget *rt,PipelineData *pd,const Prim &prim,const bool prim_restart) -{ - return CreatePipeline(mi->GetMaterial(),rt,pd,prim,prim_restart); -} - -Pipeline *RenderResource::CreatePipeline(Material *mtl,RenderTarget *rt,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart) -{ - PipelineData *pd=GetPipelineData(pipeline_filename); - - if(!pd)return(nullptr); - - return CreatePipeline(mtl,rt,pd,prim,prim_restart); -} - -Pipeline *RenderResource::CreatePipeline(MaterialInstance *mi,RenderTarget *rt,const OSString &filename,const Prim &prim,const bool prim_restart) -{ - return CreatePipeline(mi->GetMaterial(),rt,filename,prim,prim_restart); -} - Renderable *RenderResource::CreateRenderable(const uint32_t vertex_count) { if(!vertex_count)return(nullptr); diff --git a/src/RenderDevice/VKRenderTarget.cpp b/src/RenderDevice/VKRenderTarget.cpp index 6cdd0089..f80d6054 100644 --- a/src/RenderDevice/VKRenderTarget.cpp +++ b/src/RenderDevice/VKRenderTarget.cpp @@ -53,7 +53,8 @@ RenderTarget::RenderTarget(GPUDevice *dev,RenderPass *_rp,Framebuffer *_fb,GPUCm } RenderTarget::~RenderTarget() -{ +{ + pipeline_list.Clear(); SAFE_CLEAR(depth_texture); SAFE_CLEAR_OBJECT_ARRAY(color_textures,color_count); @@ -67,89 +68,4 @@ bool RenderTarget::Submit(GPUSemaphore *present_complete_semaphore) { return this->GPUQueue::Submit(*command_buffer,present_complete_semaphore,render_complete_semaphore); } - -SwapchainRenderTarget::SwapchainRenderTarget(GPUDevice *dev,Swapchain *sc):RenderTarget(dev,nullptr,nullptr,sc->GetImageCount()) -{ - swapchain=sc; - vk_swapchain=swapchain->GetSwapchain(); - - present_info.waitSemaphoreCount = 0; - present_info.pWaitSemaphores = nullptr; - present_info.swapchainCount = 1; - present_info.pResults = nullptr; - present_info.pSwapchains = &vk_swapchain; - - Texture2D **sc_color=swapchain->GetColorTextures(); - Texture2D *sc_depth=swapchain->GetDepthTexture(); - - this->render_pass=device->CreateRenderPass((*sc_color)->GetFormat(),sc_depth->GetFormat(),VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); - - swap_chain_count=swapchain->GetImageCount(); - - extent=swapchain->GetExtent(); - - render_frame=new Framebuffer *[swap_chain_count]; - - for(uint i=0;iCreateFramebuffer(this->render_pass,(*sc_color)->GetImageView(),sc_depth->GetImageView()); - ++sc_color; - } - - current_frame=0; - - present_complete_semaphore=dev->CreateSemaphore(); -} - -SwapchainRenderTarget::~SwapchainRenderTarget() -{ - SAFE_CLEAR_OBJECT_ARRAY(render_frame,swap_chain_count); - - delete present_complete_semaphore; -} - -int SwapchainRenderTarget::AcquireNextImage() -{ - if(vkAcquireNextImageKHR(device->GetDevice(),vk_swapchain,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=vkQueuePresentKHR(queue,&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 GPUQueue::Submit(cb,present_complete_semaphore,render_complete_semaphore); -} - -bool SwapchainRenderTarget::Submit(VkCommandBuffer cb,GPUSemaphore *pce) -{ - return GPUQueue::Submit(cb,pce,render_complete_semaphore); -} VK_NAMESPACE_END \ No newline at end of file diff --git a/src/RenderDevice/VKRenderTargetPipeline.cpp b/src/RenderDevice/VKRenderTargetPipeline.cpp new file mode 100644 index 00000000..d60035ba --- /dev/null +++ b/src/RenderDevice/VKRenderTargetPipeline.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include + +VK_NAMESPACE_BEGIN +Pipeline *RenderTarget::CreatePipeline(Material *mtl,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) +{ + if(!mtl)return(nullptr); + + PipelineData *pd=GetPipelineData(ip); + + pd->Set(prim,prim_restart); + + Pipeline *p=device->CreatePipeline(pd,mtl,this); + + if(p) + pipeline_list.Add(p); + + return p; +} + +Pipeline *RenderTarget::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) +{ + if(!mi)return(nullptr); + + return CreatePipeline(mi->GetMaterial(),ip,prim,prim_restart); +} + +Pipeline *RenderTarget::CreatePipeline(Material *mtl,PipelineData *pd,const Prim &prim,const bool prim_restart) +{ + pd->Set(prim,prim_restart); + + Pipeline *p=device->CreatePipeline(pd,mtl,this); + + if(p) + pipeline_list.Add(p); + + return(p); +} + +Pipeline *RenderTarget::CreatePipeline(MaterialInstance *mi,PipelineData *pd,const Prim &prim,const bool prim_restart) +{ + return CreatePipeline(mi->GetMaterial(),pd,prim,prim_restart); +} + +Pipeline *RenderTarget::CreatePipeline(Material *mtl,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart) +{ + PipelineData *pd=GetPipelineData(pipeline_filename); + + if(!pd)return(nullptr); + + return CreatePipeline(mtl,pd,prim,prim_restart); +} + +Pipeline *RenderTarget::CreatePipeline(MaterialInstance *mi,const OSString &filename,const Prim &prim,const bool prim_restart) +{ + return CreatePipeline(mi->GetMaterial(),filename,prim,prim_restart); +} +VK_NAMESPACE_END \ No newline at end of file diff --git a/src/RenderDevice/VKSwapchainRenderTarget.cpp b/src/RenderDevice/VKSwapchainRenderTarget.cpp new file mode 100644 index 00000000..25512fae --- /dev/null +++ b/src/RenderDevice/VKSwapchainRenderTarget.cpp @@ -0,0 +1,90 @@ +#include +#include +#include + +VK_NAMESPACE_BEGIN +SwapchainRenderTarget::SwapchainRenderTarget(GPUDevice *dev,Swapchain *sc):RenderTarget(dev,nullptr,nullptr,sc->GetImageCount()) +{ + swapchain=sc; + vk_swapchain=swapchain->GetSwapchain(); + + present_info.waitSemaphoreCount = 0; + present_info.pWaitSemaphores = nullptr; + present_info.swapchainCount = 1; + present_info.pResults = nullptr; + present_info.pSwapchains = &vk_swapchain; + + Texture2D **sc_color=swapchain->GetColorTextures(); + Texture2D *sc_depth=swapchain->GetDepthTexture(); + + this->render_pass=device->CreateRenderPass((*sc_color)->GetFormat(),sc_depth->GetFormat(),VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); + + swap_chain_count=swapchain->GetImageCount(); + + extent=swapchain->GetExtent(); + + render_frame=new Framebuffer *[swap_chain_count]; + + for(uint i=0;iCreateFramebuffer(this->render_pass,(*sc_color)->GetImageView(),sc_depth->GetImageView()); + ++sc_color; + } + + current_frame=0; + + present_complete_semaphore=dev->CreateSemaphore(); +} + +SwapchainRenderTarget::~SwapchainRenderTarget() +{ + SAFE_CLEAR_OBJECT_ARRAY(render_frame,swap_chain_count); + + delete present_complete_semaphore; +} + +int SwapchainRenderTarget::AcquireNextImage() +{ + if(vkAcquireNextImageKHR(device->GetDevice(),vk_swapchain,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=vkQueuePresentKHR(queue,&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 GPUQueue::Submit(cb,present_complete_semaphore,render_complete_semaphore); +} + +bool SwapchainRenderTarget::Submit(VkCommandBuffer cb,GPUSemaphore *pce) +{ + return GPUQueue::Submit(cb,pce,render_complete_semaphore); +} +VK_NAMESPACE_END \ No newline at end of file