diff --git a/CMSceneGraph b/CMSceneGraph index 2b286a47..f74d7045 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 2b286a47b677b285e849fc5fa5afe132ed33948f +Subproject commit f74d7045fa0d143b94103e49093fe18a1d5a884c diff --git a/inc/hgl/graph/VKCommandBuffer.h b/inc/hgl/graph/VKCommandBuffer.h index 04340606..9d7c98ba 100644 --- a/inc/hgl/graph/VKCommandBuffer.h +++ b/inc/hgl/graph/VKCommandBuffer.h @@ -29,8 +29,8 @@ public: const bool IsBegin()const{return cmd_begin;} - bool Begin(); - bool End() + virtual bool Begin(); + virtual bool End() { if(!cmd_begin) return(false); @@ -50,6 +50,8 @@ public: #endif//_DEBUG };//class GPUCmdBuffer +class DescriptorBinding; + class RenderCmdBuffer:public GPUCmdBuffer { uint32_t cv_count; @@ -60,6 +62,8 @@ class RenderCmdBuffer:public GPUCmdBuffer RenderPassBeginInfo rp_begin; VkPipelineLayout pipeline_layout; + DescriptorBinding *desc_binding=nullptr; + private: void SetClear(); @@ -69,6 +73,15 @@ public: RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb); ~RenderCmdBuffer(); + void SetDescriptorBinding(DescriptorBinding *db) { desc_binding=db; } + + bool End() override + { + desc_binding=nullptr; + + return GPUCmdBuffer::End(); + } + void SetRenderArea(const VkRect2D &ra){render_area=ra;} void SetRenderArea(const VkExtent2D &); void SetViewport(const VkViewport &vp){viewport=vp;} diff --git a/inc/hgl/graph/VKDescriptorBindingManage.h b/inc/hgl/graph/VKDescriptorBindingManage.h index c9a0aaef..863373a3 100644 --- a/inc/hgl/graph/VKDescriptorBindingManage.h +++ b/inc/hgl/graph/VKDescriptorBindingManage.h @@ -1,112 +1,109 @@ -#ifndef HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE -#define HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE +#pragma once #include #include #include #include -namespace hgl + +VK_NAMESPACE_BEGIN + +class DeviceBuffer; +class Texture; +class Material; +class MaterialParameters; + +/** + * 描述符绑定器
+ * 一般用于注册通用数据,为材质进行自动绑定。 + */ +class DescriptorBinding { - namespace graph + DescriptorSetType set_type; ///<描述符合集类型 + + Map ubo_map; + Map ssbo_map; + Map texture_map; + +public: + + DescriptorBinding(const DescriptorSetType &dst) { - class DeviceBuffer; - class Texture; - class Material; - class MaterialParameters; + set_type=dst; + } - /** - * 描述符绑定器
- * 一般用于注册通用数据,为材质进行自动绑定。 - */ - class DescriptorBinding - { - DescriptorSetType set_type; ///<描述符合集类型 + bool AddUBO(const AnsiString &name,DeviceBuffer *buf) + { + if(!buf)return(false); + if(name.IsEmpty())return(false); - Map ubo_map; - Map ssbo_map; - Map texture_map; + return ubo_map.Add(name,buf); + } - public: + DeviceBuffer *GetUBO(const AnsiString &name) + { + if(name.IsEmpty())return(nullptr); - DescriptorBinding(const DescriptorSetType &dst) - { - set_type=dst; - } + return GetObjectFromList(ubo_map,name); + } - bool AddUBO(const AnsiString &name,DeviceBuffer *buf) - { - if(!buf)return(false); - if(name.IsEmpty())return(false); + void RemoveUBO(DeviceBuffer *buf) + { + if(!buf)return; - return ubo_map.Add(name,buf); - } + ubo_map.DeleteByValue(buf); + } - DeviceBuffer *GetUBO(const AnsiString &name) - { - if(name.IsEmpty())return(nullptr); + bool AddSSBO(const AnsiString &name,DeviceBuffer *buf) + { + if(!buf)return(false); + if(name.IsEmpty())return(false); - return GetObjectFromList(ubo_map,name); - } + return ssbo_map.Add(name,buf); + } - void RemoveUBO(DeviceBuffer *buf) - { - if(!buf)return; + DeviceBuffer *GetSSBO(const AnsiString &name) + { + if(name.IsEmpty())return(nullptr); - ubo_map.DeleteByValue(buf); - } + return GetObjectFromList(ssbo_map,name); + } - bool AddSSBO(const AnsiString &name,DeviceBuffer *buf) - { - if(!buf)return(false); - if(name.IsEmpty())return(false); + void RemoveSSBO(DeviceBuffer *buf) + { + if(!buf)return; - return ssbo_map.Add(name,buf); - } + ssbo_map.DeleteByValue(buf); + } - DeviceBuffer *GetSSBO(const AnsiString &name) - { - if(name.IsEmpty())return(nullptr); + bool AddTexture(const AnsiString &name,Texture *tex) + { + if(!tex)return(false); + if(name.IsEmpty())return(false); - return GetObjectFromList(ssbo_map,name); - } + return texture_map.Add(name,tex); + } - void RemoveSSBO(DeviceBuffer *buf) - { - if(!buf)return; + Texture *GetTexture(const AnsiString &name) + { + if(name.IsEmpty())return(nullptr); - ssbo_map.DeleteByValue(buf); - } + return GetObjectFromList(texture_map,name); + } - bool AddTexture(const AnsiString &name,Texture *tex) - { - if(!tex)return(false); - if(name.IsEmpty())return(false); + void RemoveTexture(Texture *tex) + { + if(!tex)return; - return texture_map.Add(name,tex); - } + texture_map.DeleteByValue(tex); + } - Texture *GetTexture(const AnsiString &name) - { - if(name.IsEmpty())return(nullptr); +private: - return GetObjectFromList(texture_map,name); - } + void BindUBO(MaterialParameters *,const BindingMap &,bool dynamic); - void RemoveTexture(Texture *tex) - { - if(!tex)return; +public: - texture_map.DeleteByValue(tex); - } + bool Bind(Material *); +};//class DescriptorBinding - private: - - void BindUBO(MaterialParameters *,const BindingMap &,bool dynamic); - - public: - - bool Bind(Material *); - };//class DescriptorBinding - }//namespace graph -}//namespace hgl -#endif//HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE +VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index 365c2986..cbd8c88e 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -7,6 +7,7 @@ #include #include #include +#include //#include VK_NAMESPACE_BEGIN @@ -30,12 +31,15 @@ class IRenderTarget VkExtent2D extent; graph::ViewportInfo vp_info; graph::DeviceBuffer *ubo_vp_info; - + + DescriptorBinding desc_binding; + public: RenderFramework * GetRenderFramework ()const{return render_framework;} GPUDevice * GetDevice ()const; VkDevice GetVkDevice ()const; + DescriptorBinding * GetDescriptorBinding(){return &desc_binding;} const VkExtent2D &GetExtent ()const{return extent;} @@ -73,6 +77,14 @@ public: // Command Buffer virtual RenderCmdBuffer * BeginRender ()=0; virtual void EndRender ()=0; + +public: + + virtual void Bind (Material *mtl) + { + if(mtl) + desc_binding.Bind(mtl); + } };//class IRenderTarget struct RenderTargetData @@ -115,6 +127,8 @@ protected: RenderTarget(RenderFramework *rf,RenderTargetData *rtd):IRenderTarget(rf,rtd->fbo->GetExtent()) { data=rtd; + + data->cmd_buf->SetDescriptorBinding(GetDescriptorBinding()); } public: @@ -164,6 +178,7 @@ public: return(nullptr); data->cmd_buf->Begin(); + data->cmd_buf->SetDescriptorBinding(GetDescriptorBinding()); data->cmd_buf->BindFramebuffer(data->fbo); return data->cmd_buf; } diff --git a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp index ec7d8ea9..6facc8df 100644 --- a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp +++ b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp @@ -91,6 +91,9 @@ bool RenderCmdBuffer::BindDescriptorSets(Material *mtl) { if(!mtl)return(false); + if(desc_binding) + desc_binding->Bind(mtl); + { uint32_t count=0; diff --git a/src/SceneGraph/Vulkan/VKRenderTarget.cpp b/src/SceneGraph/Vulkan/VKRenderTarget.cpp index bc985fcd..e6ed57af 100644 --- a/src/SceneGraph/Vulkan/VKRenderTarget.cpp +++ b/src/SceneGraph/Vulkan/VKRenderTarget.cpp @@ -5,17 +5,21 @@ #include #include +#include //未来UBO统合看能不能不引用 + VK_NAMESPACE_BEGIN GPUDevice *IRenderTarget::GetDevice ()const{return render_framework->GetDevice();} VkDevice IRenderTarget::GetVkDevice()const{return render_framework->GetDevice()->GetDevice();} -IRenderTarget::IRenderTarget(RenderFramework *rf,const VkExtent2D &ext) +IRenderTarget::IRenderTarget(RenderFramework *rf,const VkExtent2D &ext):desc_binding(DescriptorSetType::RenderTarget) { render_framework=rf; ubo_vp_info=GetDevice()->CreateUBO(sizeof(ViewportInfo),&vp_info); + desc_binding.AddUBO(mtl::SBS_ViewportInfo.name,ubo_vp_info); + OnResize(ext); } @@ -40,4 +44,4 @@ void RenderTargetData::Clear() SAFE_CLEAR(depth_texture); } -VK_NAMESPACE_END \ No newline at end of file +VK_NAMESPACE_END diff --git a/src/ShaderGen/2d/Std2DMaterial.cpp b/src/ShaderGen/2d/Std2DMaterial.cpp index a8f56656..3310e127 100644 --- a/src/ShaderGen/2d/Std2DMaterial.cpp +++ b/src/ShaderGen/2d/Std2DMaterial.cpp @@ -45,7 +45,7 @@ bool Std2DMaterial::CustomVertexShader(ShaderCreateInfoVertex *vsc) mci->AddStruct(SBS_ViewportInfo); mci->AddUBO(VK_SHADER_STAGE_ALL_GRAPHICS, - DescriptorSetType::Static, + DescriptorSetType::RenderTarget, SBS_ViewportInfo); } diff --git a/src/ShaderGen/3d/Std3DMaterial.cpp b/src/ShaderGen/3d/Std3DMaterial.cpp index 88455bd5..cb8e79aa 100644 --- a/src/ShaderGen/3d/Std3DMaterial.cpp +++ b/src/ShaderGen/3d/Std3DMaterial.cpp @@ -61,7 +61,7 @@ bool Std3DMaterial::CustomVertexShader(ShaderCreateInfoVertex *vsc) mci->AddStruct(SBS_ViewportInfo); mci->AddUBO(VK_SHADER_STAGE_ALL_GRAPHICS, - DescriptorSetType::Static, + DescriptorSetType::RenderTarget, SBS_ViewportInfo); return(true);