diff --git a/CMSceneGraph b/CMSceneGraph index ffcb2f8f..f8661597 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit ffcb2f8fdc46a5dffc04692e4ff9fdcc1512cf3a +Subproject commit f866159787c98e29029c2b4dba3de8f6455473da diff --git a/inc/hgl/graph/VKBuffer.h b/inc/hgl/graph/VKBuffer.h index 0a1d6d2d..0c72e660 100644 --- a/inc/hgl/graph/VKBuffer.h +++ b/inc/hgl/graph/VKBuffer.h @@ -2,6 +2,7 @@ #include #include +#include VK_NAMESPACE_BEGIN struct DeviceBufferData @@ -53,6 +54,8 @@ public: template class DeviceBufferMap { +protected: + DeviceBuffer *dev_buf; T data_map; @@ -86,4 +89,30 @@ public: } };//template class DeviceBufferMap +template class UBOInstance:public DeviceBufferMap +{ + DescriptorSetType desc_set_type; + AnsiString ubo_name; + +public: + + const DescriptorSetType & set_type()const{return desc_set_type;} + const AnsiString & name ()const{return ubo_name;} + DeviceBuffer * ubo ()const{return this->dev_buf;} + +public: + + UBOInstance(DeviceBuffer *buf,const DescriptorSetType dst,const AnsiString &n):DeviceBufferMap(buf) + { + desc_set_type=dst; + ubo_name=n; + } + + UBOInstance(DeviceBuffer *buf,const ShaderBufferDesc *desc):DeviceBufferMap(buf) + { + desc_set_type=desc->set_type; + ubo_name=desc->name; + } +};//template class UBOInstance:public DeviceBufferMap + VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKDescriptorBindingManage.h b/inc/hgl/graph/VKDescriptorBindingManage.h index a70b7c43..92279fa4 100644 --- a/inc/hgl/graph/VKDescriptorBindingManage.h +++ b/inc/hgl/graph/VKDescriptorBindingManage.h @@ -2,7 +2,7 @@ #include #include -#include +#include VK_NAMESPACE_BEGIN @@ -48,7 +48,22 @@ public: if(name.IsEmpty()||!dbm) return(false); - return AddUBO(name,dbm->GetDeviceBuffer()); + return ubo_map.Add(name,dbm->GetDeviceBuffer()); + } + + template + bool AddUBO(const UBOInstance *ubo_instance) + { + if(!ubo_instance) + return(false); + + if(ubo_instance->set_type()!=set_type) + return(false); + + if(ubo_instance->name().IsEmpty()) + return(false); + + return ubo_map.Add(ubo_instance->name(),ubo_instance->ubo()); } DeviceBuffer *GetUBO(const AnsiString &name) diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index 88b2ad82..65dac1f6 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -123,6 +123,18 @@ public: //Buffer相关 { \ DeviceBuffer *buf=Create##LargeName(T::GetSize()); \ return(buf?new T(buf):nullptr); \ + } \ +\ + template T *Create##LargeName(const ShaderBufferDesc *desc) \ + { \ + DeviceBuffer *buf=Create##LargeName(T::GetSize()); \ + return(buf?new T(buf,desc):nullptr); \ + } \ +\ + template T *Create##LargeName(const DescriptorSetType &set_type,const AnsiString &name) \ + { \ + DeviceBuffer *buf=Create##LargeName(T::GetSize()); \ + return(buf?new T(buf,set_type,name):nullptr); \ } CREATE_BUFFER_OBJECT(UBO,UNIFORM) diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index 7356a4aa..5b849d0c 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -15,7 +15,7 @@ VK_NAMESPACE_BEGIN class RenderFramework; -using UBOViewportInfo=DeviceBufferMap; +using UBOViewportInfo=UBOInstance; class IRenderTarget { diff --git a/src/SceneGraph/CameraControl.cpp b/src/SceneGraph/CameraControl.cpp index 225a8fd7..dbf0de5f 100644 --- a/src/SceneGraph/CameraControl.cpp +++ b/src/SceneGraph/CameraControl.cpp @@ -13,7 +13,7 @@ namespace hgl::graph camera_info=ubo_camera_info->data(); desc_binding_camera=new DescriptorBinding(DescriptorSetType::Camera); - desc_binding_camera->AddUBO(mtl::SBS_CameraInfo.name,ubo_camera_info); + desc_binding_camera->AddUBO(ubo_camera_info); } CameraControl::~CameraControl() diff --git a/src/SceneGraph/RenderFramework.cpp b/src/SceneGraph/RenderFramework.cpp index 8fa2c0a0..78fbd500 100644 --- a/src/SceneGraph/RenderFramework.cpp +++ b/src/SceneGraph/RenderFramework.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -146,7 +147,7 @@ void RenderFramework::CreateDefaultRenderer() if(!default_camera_control) { - auto ubo_camera_info=device->CreateUBO(); + auto ubo_camera_info=device->CreateUBO(&mtl::SBS_CameraInfo); default_camera_control=new FirstPersonCameraControl(rt->GetViewportInfo(),default_camera,ubo_camera_info); } diff --git a/src/SceneGraph/Vulkan/VKRenderTarget.cpp b/src/SceneGraph/Vulkan/VKRenderTarget.cpp index c4502e54..eb12a8c2 100644 --- a/src/SceneGraph/Vulkan/VKRenderTarget.cpp +++ b/src/SceneGraph/Vulkan/VKRenderTarget.cpp @@ -13,9 +13,9 @@ IRenderTarget::IRenderTarget(RenderFramework *rf,const VkExtent2D &ext):desc_bin { render_framework=rf; - ubo_vp_info=GetDevice()->CreateUBO(); + ubo_vp_info=GetDevice()->CreateUBO(&mtl::SBS_ViewportInfo); - desc_binding.AddUBO(mtl::SBS_ViewportInfo.name,ubo_vp_info); + desc_binding.AddUBO(ubo_vp_info); OnResize(ext); }