diff --git a/inc/hgl/graph/VK.h b/inc/hgl/graph/VK.h index 61e1f7c8..007ad7ba 100644 --- a/inc/hgl/graph/VK.h +++ b/inc/hgl/graph/VK.h @@ -70,6 +70,7 @@ class TileData; class DeviceMemory; class DeviceBuffer; struct DeviceBufferData; +template class DeviceBufferMap; struct PrimitiveDataBuffer; struct PrimitiveRenderData; diff --git a/inc/hgl/graph/VKBuffer.h b/inc/hgl/graph/VKBuffer.h index 81aca0f8..9b02275d 100644 --- a/inc/hgl/graph/VKBuffer.h +++ b/inc/hgl/graph/VKBuffer.h @@ -51,4 +51,39 @@ public: bool Write (const void *ptr) {return buf.memory->Write(ptr);} };//class DeviceBuffer +template class DeviceBufferMap +{ + DeviceBuffer *dev_buf; + T data_map; + +public: + + static const VkDeviceSize GetSize() + { + return sizeof(T); + } + +public: + + DeviceBufferMap(DeviceBuffer *buf) + { + dev_buf=buf; + } + + virtual ~DeviceBufferMap() + { + delete dev_buf; + } + + operator DeviceBuffer *(){return dev_buf;} + + T *data(){return &data_map;} + + void Update() + { + if(dev_buf) + dev_buf->Write(&data_map,sizeof(T)); + } +}; + VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index 2cc3f6be..5a8e5c5b 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -126,6 +126,17 @@ public: //Buffer相关 #undef CREATE_BUFFER_OBJECT + template + T *CreateUBO() + { + DeviceBuffer *buf=CreateUBO(T::GetSize()); + + if(!buf) + return(nullptr); + + return(new T(buf)); + } + GPUArrayBuffer *CreateArrayInUBO(const VkDeviceSize &uint_size); GPUArrayBuffer *CreateArrayInSSBO(const VkDeviceSize &uint_size); diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index cbd8c88e..0ca4d9df 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -14,6 +14,8 @@ VK_NAMESPACE_BEGIN class RenderFramework; +using UBOViewportInfo=DeviceBufferMap; + /** * RenderTarget 存在几种情况: * @@ -29,8 +31,8 @@ class IRenderTarget RenderFramework *render_framework; VkExtent2D extent; - graph::ViewportInfo vp_info; - graph::DeviceBuffer *ubo_vp_info; + + UBOViewportInfo *ubo_vp_info; DescriptorBinding desc_binding; diff --git a/src/SceneGraph/Vulkan/VKRenderTarget.cpp b/src/SceneGraph/Vulkan/VKRenderTarget.cpp index e6ed57af..b00dc512 100644 --- a/src/SceneGraph/Vulkan/VKRenderTarget.cpp +++ b/src/SceneGraph/Vulkan/VKRenderTarget.cpp @@ -16,9 +16,9 @@ IRenderTarget::IRenderTarget(RenderFramework *rf,const VkExtent2D &ext):desc_bin { render_framework=rf; - ubo_vp_info=GetDevice()->CreateUBO(sizeof(ViewportInfo),&vp_info); + ubo_vp_info=GetDevice()->CreateUBO(); - desc_binding.AddUBO(mtl::SBS_ViewportInfo.name,ubo_vp_info); + desc_binding.AddUBO(mtl::SBS_ViewportInfo.name,*ubo_vp_info); OnResize(ext); } @@ -31,8 +31,10 @@ IRenderTarget::~IRenderTarget() void IRenderTarget::OnResize(const VkExtent2D &ext) { extent=ext; - vp_info.Set(ext.width,ext.height); - ubo_vp_info->Write(&vp_info); + + ubo_vp_info->data()->Set(ext.width,ext.height); + + ubo_vp_info->Update(); } void RenderTargetData::Clear()