diff --git a/example/Vulkan/second_triangle.cpp b/example/Vulkan/second_triangle.cpp index 1daeb5d2..e035a152 100644 --- a/example/Vulkan/second_triangle.cpp +++ b/example/Vulkan/second_triangle.cpp @@ -60,7 +60,7 @@ private: if(!material_instance) return(false); - db->BindGlobalDescriptor(material_instance); + db->BindGlobal(material_instance); // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行,为Framework重载,默认使用swapchain的render target diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index f81b6b2a..b927f6a2 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -142,7 +142,7 @@ public: ubo_vp_info=db->CreateUBO(sizeof(ViewportInfo),&vp_info); - db->SetGlobal(GlobalDescriptor::ViewportInfo.name,ubo_vp_info); + db->AddGlobalUBO(GlobalDescriptor::ViewportInfo.name,ubo_vp_info); } return(true); diff --git a/inc/hgl/graph/VKDescriptorBindingManage.h b/inc/hgl/graph/VKDescriptorBindingManage.h new file mode 100644 index 00000000..372fd92d --- /dev/null +++ b/inc/hgl/graph/VKDescriptorBindingManage.h @@ -0,0 +1,91 @@ +#ifndef HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE +#define HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE + +#include +namespace hgl +{ + namespace graph + { + class DeviceBuffer; + class Texture; + class MaterialParameters; + + class DescriptorBinding + { + Map ubo_map; + Map ssbo_map; + Map texture_map; + + public: + + bool AddUBO(const AnsiString &name,DeviceBuffer *buf) + { + if(!buf)return(false); + if(name.IsEmpty())return(false); + + return ubo_map.Add(name,buf); + } + + DeviceBuffer *GetUBO(const AnsiString &name) + { + if(name.IsEmpty())return(nullptr); + + return GetListObject(ubo_map,name); + } + + void RemoveUBO(DeviceBuffer *buf) + { + if(!buf)return; + + ubo_map.DeleteByValue(buf); + } + + bool AddSSBO(const AnsiString &name,DeviceBuffer *buf) + { + if(!buf)return(false); + if(name.IsEmpty())return(false); + + return ssbo_map.Add(name,buf); + } + + DeviceBuffer *GetSSBO(const AnsiString &name) + { + if(name.IsEmpty())return(nullptr); + + return GetListObject(ssbo_map,name); + } + + void RemoveSSBO(DeviceBuffer *buf) + { + if(!buf)return; + + ssbo_map.DeleteByValue(buf); + } + + bool AddTexture(const AnsiString &name,Texture *tex) + { + if(!tex)return(false); + if(name.IsEmpty())return(false); + + return texture_map.Add(name,tex); + } + + Texture *GetTexture(const AnsiString &name) + { + if(name.IsEmpty())return(nullptr); + + return GetListObject(texture_map,name); + } + + void RemoveTexture(Texture *tex) + { + if(!tex)return; + + texture_map.DeleteByValue(tex); + } + + bool Bind(MaterialParameters *); + };//class DescriptorBinding + }//namespace graph +}//namespace hgl +#endif//HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index b52c02e4..becfcd2e 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -15,6 +15,8 @@ #include #include #include +#include + VK_NAMESPACE_BEGIN using MaterialID =int; using MaterialInstanceID =int; @@ -47,8 +49,7 @@ class RenderResource IDResManage rm_textures; ///<纹理合集 IDResManage rm_renderables; ///<渲染实例集合集 - Map global_buffer_map; ///<全局Buffer(UBO/SSBO) - Map global_texture_map; ///<全局Texture + DescriptorBinding global_binding; ///<全局属性描述符绑定管理 public: @@ -68,13 +69,10 @@ public: //Add public: //全局属性(对应shader中的PerGlobal set合集) - void SetGlobal(const AnsiString &name,DeviceBuffer *buf); + void AddGlobalUBO(const AnsiString &name,DeviceBuffer *buf){global_binding.AddUBO(name,buf);} + void AddGlobalSSBO(const AnsiString &name,DeviceBuffer *buf){global_binding.AddSSBO(name,buf);} - DeviceBuffer *GetGlobal(const AnsiString &name); - - void Free(DeviceBuffer *); - - void BindGlobalDescriptor(MaterialInstance *); + bool BindGlobal(MaterialInstance *mi){return global_binding.Bind(mi->GetMP(DescriptorSetType::Global));} public: // VBO/VAO diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 43e66447..e8e1ad60 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -184,6 +184,8 @@ SET(VK_TEXTURE_SOURCE ${SG_INCLUDE_PATH}/VKImageView.h SET(VK_MATERIAL_SOURCE ${SG_INCLUDE_PATH}/VKMaterial.h ${SG_INCLUDE_PATH}/VKMaterialParameters.h ${SG_INCLUDE_PATH}/VKMaterialInstance.h + ${SG_INCLUDE_PATH}/VKDescriptorBindingManage.h + Vulkan/VKDescriptorBindingManage.cpp Vulkan/VKMaterial.cpp Vulkan/VKMaterialParameters.cpp Vulkan/VKMaterialInstance.cpp) diff --git a/src/SceneGraph/Vulkan/VKDescriptorBindingManage.cpp b/src/SceneGraph/Vulkan/VKDescriptorBindingManage.cpp new file mode 100644 index 00000000..237eaad1 --- /dev/null +++ b/src/SceneGraph/Vulkan/VKDescriptorBindingManage.cpp @@ -0,0 +1,44 @@ +#include +#include + +VK_NAMESPACE_BEGIN +bool DescriptorBinding::Bind(MaterialParameters *mp) +{ + if(!mp)return(false); + + { + const auto *dp=ubo_map.GetDataList(); + + for(uint i=0;iBindUBO((*dp)->left,(*dp)->right); + + ++dp; + } + } + + { + const auto *dp=ssbo_map.GetDataList(); + + for(uint i=0;iBindSSBO((*dp)->left,(*dp)->right); + + ++dp; + } + } + + //{ + // const auto *dp=texture_map.GetDataList(); + + // for(uint i=0;iBindImageSampler((*dp)->left,(*dp)->right); + + // ++dp; + // } + //} + + mp->Update(); +} +VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKRenderResource.cpp b/src/SceneGraph/Vulkan/VKRenderResource.cpp index 66f5e32f..6319d05c 100644 --- a/src/SceneGraph/Vulkan/VKRenderResource.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResource.cpp @@ -5,61 +5,6 @@ #include VK_NAMESPACE_BEGIN -void RenderResource::SetGlobal(const AnsiString &name,DeviceBuffer *buf) -{ - if(!buf)return; - if(name.IsEmpty())return; - - global_buffer_map.Add(name,buf); -} - -DeviceBuffer *RenderResource::GetGlobal(const AnsiString &name) -{ - if(name.IsEmpty())return(nullptr); - - DeviceBuffer *buf; - - if(global_buffer_map.Get(name,buf)) - return buf; - else - return nullptr; -} - -void RenderResource::Free(DeviceBuffer *buf) -{ - rm_buffers.Release(buf); - - global_buffer_map.DeleteByValue(buf); -} - -void RenderResource::BindGlobalDescriptor(MaterialInstance *mi) -{ - if(!mi)return; - - const uint count=global_buffer_map.GetCount(); - - if(count<=0)return; - - auto **gb_list=global_buffer_map.GetDataList(); - - auto *mp=mi->GetMP(DescriptorSetType::Global); - - if(!mp) - return; - - if(mp->GetDescriptorCount()<=0) - return; - - for(uint i=0;iBindUBO((*gb_list)->left,(*gb_list)->right); - - ++gb_list; - } - - mp->Update(); -} - VBO *RenderResource::CreateVBO(VkFormat format,uint32_t count,const void *data,SharingMode sharing_mode) { VBO *vb=device->CreateVBO(format,count,data,sharing_mode);