From 7ec1c095cc661ca014d51a233832eb266046d2dd Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sat, 1 Feb 2025 16:32:08 +0800 Subject: [PATCH] [WIP] preparing UBO/SSBO<> --- CMSceneGraph | 2 +- example/Basic/draw_triangle_in_NDC.cpp | 2 +- example/Basic/draw_triangle_use_UBO.cpp | 84 +++++++++---------- inc/hgl/WorkObject.h | 2 + inc/hgl/graph/VK.h | 1 + inc/hgl/graph/VKBuffer.h | 67 ++++++++++++++- inc/hgl/graph/VKRenderTarget.h | 42 ++++++++-- src/SceneGraph/Vulkan/VKRenderTarget.cpp | 26 ++++++ .../Vulkan/VKSwapchainRenderTarget.cpp | 6 +- src/Work/WorkManager.cpp | 3 + 10 files changed, 174 insertions(+), 61 deletions(-) diff --git a/CMSceneGraph b/CMSceneGraph index 2370ba12..72fd3649 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 2370ba12d7656da491f65be66d9e134484377866 +Subproject commit 72fd3649f3c95966d7e87cefd6a0fc2faf564cd6 diff --git a/example/Basic/draw_triangle_in_NDC.cpp b/example/Basic/draw_triangle_in_NDC.cpp index f29a2a4d..cf2ecc61 100644 --- a/example/Basic/draw_triangle_in_NDC.cpp +++ b/example/Basic/draw_triangle_in_NDC.cpp @@ -151,5 +151,5 @@ public: int os_main(int,os_char **) { - return RunFramework(OS_TEXT("RenderFramework Test")); + return RunFramework(OS_TEXT("Draw triangle in NDC space")); } diff --git a/example/Basic/draw_triangle_use_UBO.cpp b/example/Basic/draw_triangle_use_UBO.cpp index 1eb99b2c..3ecaa83c 100644 --- a/example/Basic/draw_triangle_use_UBO.cpp +++ b/example/Basic/draw_triangle_use_UBO.cpp @@ -1,6 +1,6 @@ // 该范例主要演示使用2D坐系统直接绘制一个渐变色的三角形,使用UBO传递Viewport信息 -#include"VulkanAppFramework.h" +#include #include #include #include @@ -28,10 +28,20 @@ constexpr uint8 color_data[VERTEX_COUNT*4]= //#define USE_ZERO2ONE_COORD //使用左上角0,0右下角1,1的坐标系 -class TestApp:public VulkanApplicationFramework +#ifdef USE_ZERO2ONE_COORD + constexpr VkFormat PositionFormat=VF_V2F; + #define position_data position_data_float +#else + constexpr VkFormat PositionFormat=VF_V2U16; + #define position_data position_data_u16 +#endif// + +class TestApp:public WorkObject { private: + Color4f clear_color =Color4f(0.2f,0.2f,0.2f,1.0f); + MaterialInstance * material_instance =nullptr; Renderable * render_obj =nullptr; @@ -41,7 +51,7 @@ private: bool InitMaterial() { - mtl::Material2DCreateConfig cfg(device->GetDeviceAttribute(),"VertexColor2D",Prim::Triangles); + mtl::Material2DCreateConfig cfg(GetDeviceAttribute(),"VertexColor2D",Prim::Triangles); VILConfig vil_config; @@ -55,6 +65,14 @@ private: // + 这上下两种格式要配套,否则会出错 // v vil_config.Add(VAN::Position,VF_V2U16); //这里指定VAB中使用RG16U当做顶点数据格式 + + const auto ext=GetExtent2D(); + + for(uint i=0;iGetVIL()); - - rpc.Init("Triangle",VERTEX_COUNT); - -#ifdef USE_ZERO2ONE_COORD //使用0 to 1坐标系 - if(!rpc.WriteVAB(VAN::Position, VF_V2F, position_data_float ))return(false); -#else //使用ortho坐标系 - if(!rpc.WriteVAB(VAN::Position, VF_V2U16, position_data_u16 ))return(false); -#endif//USE_ZERO2ONE_COORD - - if(!rpc.WriteVAB(VAN::Color, VF_V4UN8, color_data ))return(false); - - render_obj=db->CreateRenderable(&rpc,material_instance,pipeline); - return(true); + render_obj=CreateRenderable("Triangle",VERTEX_COUNT,material_instance,pipeline, + { + {VAN::Position,PositionFormat, position_data}, + {VAN::Color, VF_V4UN8, color_data} + }); + return(render_obj); } public: - - bool Init(uint w,uint h) + + TestApp(RenderFramework *rf):WorkObject(rf,rf->GetSwapchainRenderTarget()) { - if(!VulkanApplicationFramework::Init(w,h)) - return(false); - - #ifndef USE_ZERO2ONE_COORD - for(uint i=0;iSetClearColor(0,clear_color); - BuildCommandBuffer(render_obj); + cmd->BeginRenderPass(); + cmd->Render(render_obj); + cmd->EndRenderPass(); } -};//class TestApp:public VulkanApplicationFramework +};//class TestApp:public WorkObject -int main(int,char **) +int os_main(int,os_char **) { - return RunApp(1280,720); + return RunFramework(OS_TEXT("Draw triangle use UBO")); } diff --git a/inc/hgl/WorkObject.h b/inc/hgl/WorkObject.h index ad8324eb..a6faf10e 100644 --- a/inc/hgl/WorkObject.h +++ b/inc/hgl/WorkObject.h @@ -38,6 +38,8 @@ namespace hgl graph::GPUDevice * GetDevice (){return render_framework->GetDevice();} graph::GPUDeviceAttribute * GetDeviceAttribute (){return render_framework->GetDeviceAttribute();} + const VkExtent2D & GetExtent2D (){return cur_render_target->GetExtent();} + public: const bool IsDestroy()const{return destroy_flag;} diff --git a/inc/hgl/graph/VK.h b/inc/hgl/graph/VK.h index 59c3cc71..4cde37c7 100644 --- a/inc/hgl/graph/VK.h +++ b/inc/hgl/graph/VK.h @@ -9,6 +9,7 @@ #include #include #include +#include #include VK_NAMESPACE_BEGIN diff --git a/inc/hgl/graph/VKBuffer.h b/inc/hgl/graph/VKBuffer.h index 9109bf94..1f7f0b06 100644 --- a/inc/hgl/graph/VKBuffer.h +++ b/inc/hgl/graph/VKBuffer.h @@ -1,8 +1,8 @@ -#ifndef HGL_GRAPH_VULKAN_BUFFER_INCLUDE -#define HGL_GRAPH_VULKAN_BUFFER_INCLUDE +#pragma once #include #include + VK_NAMESPACE_BEGIN struct DeviceBufferData { @@ -50,5 +50,66 @@ public: virtual bool Write (const void *ptr,uint32_t size) {return buf.memory->Write(ptr,0,size);} bool Write (const void *ptr) {return buf.memory->Write(ptr);} };//class DeviceBuffer + +template struct DeviceBufferData +{ + T *data; /// class DeviceBufferRandomAccess +{ + DeviceBufferData *dbd; + +public: + + operator T *(){return dbd->data;} + +public: + + DeviceBufferRandomAccess(DeviceBufferData *obj) + { + dbd=obj; + + } + virtual ~DeviceBufferAccess() + { + if(!dbd)return; + delete dbd->dev_buffer; + delete dbd; + } + bool Write(const T *ptr) + { + return dbd->dev_buffer->Write(ptr); + } +}; + +template class DeviceBufferObject +{ + DeviceBufferData *dbd; + +public: + + DeviceBufferObject(DeviceBufferData *obj) + { + dbd=obj; + } + + virtual ~DeviceBufferObject() + { + if(!dbd)return; + + delete dbd->dev_buffer; + delete dbd; + } + + + +};//template class DeviceBufferObject VK_NAMESPACE_END -#endif//HGL_GRAPH_VULKAN_BUFFER_INCLUDE diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index 494a0eda..fffc11cd 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -10,6 +10,9 @@ //#include VK_NAMESPACE_BEGIN + +class RenderFramework; + /** * RenderTarget 存在几种情况: * @@ -20,12 +23,30 @@ VK_NAMESPACE_BEGIN * 所以RenderTarget的其实是一个多态类,根据不同的情况,有不同的实现 */ +template class DeviceBufferObject +{ + T data; + DeviceBuffer *dev_buffer; + + + +public: +}; + class IRenderTarget { + RenderFramework *render_framework; + VkExtent2D extent; + graph::ViewportInfo vp_info; + graph::DeviceBuffer *ubo_vp_info; public: + RenderFramework * GetRenderFramework ()const{return render_framework;} + GPUDevice * GetDevice ()const{return render_framework->GetDevice();} + VkDevice GetVkDevice ()const{return render_framework->GetDevice()->GetDevice();} + const VkExtent2D &GetExtent ()const{return extent;} virtual uint32_t GetColorCount ()=0; @@ -33,8 +54,12 @@ public: public: - IRenderTarget(const VkExtent2D &ext){extent=ext;} - virtual ~IRenderTarget()=default; + void OnResize(const VkExtent2D &ext); + +public: + + IRenderTarget(RenderFramework *,const VkExtent2D &); + virtual ~IRenderTarget(); virtual Framebuffer * GetFramebuffer ()=0; virtual RenderPass * GetRenderPass ()=0; @@ -97,14 +122,14 @@ protected: friend class SwapchainModule; friend class RenderTargetManager; - RenderTarget(RenderTargetData *rtd):IRenderTarget(rtd->fbo->GetExtent()) + RenderTarget(RenderFramework *rf,RenderTargetData *rtd):IRenderTarget(rf,rtd->fbo->GetExtent()) { data=rtd; } public: - virtual ~RenderTarget() + virtual ~RenderTarget() override { if(data) { @@ -178,7 +203,7 @@ protected: friend class RenderTargetManager; - MFRenderTarget(const uint32_t fn,RenderTarget **rtl):IRenderTarget(rtl[0]->GetFramebuffer()->GetExtent()) + MFRenderTarget(RenderFramework *rf,const uint32_t fn,RenderTarget **rtl):IRenderTarget(rf,rtl[0]->GetFramebuffer()->GetExtent()) { frame_number=fn; current_frame=0; @@ -188,7 +213,7 @@ protected: public: - virtual ~MFRenderTarget() + virtual ~MFRenderTarget() override { SAFE_CLEAR_OBJECT_ARRAY_OBJECT(rt_list,frame_number); } @@ -257,7 +282,6 @@ public: */ class SwapchainRenderTarget:public MFRenderTarget { - VkDevice device; Swapchain *swapchain; PresentInfo present_info; @@ -265,14 +289,14 @@ class SwapchainRenderTarget:public MFRenderTarget private: - SwapchainRenderTarget(VkDevice dev,Swapchain *sc,Semaphore *pcs,RenderTarget **rtl); + SwapchainRenderTarget(RenderFramework *rf,Swapchain *sc,Semaphore *pcs,RenderTarget **rtl); friend class SwapchainModule; friend class RenderTargetManager; public: - ~SwapchainRenderTarget(); + ~SwapchainRenderTarget() override; public: diff --git a/src/SceneGraph/Vulkan/VKRenderTarget.cpp b/src/SceneGraph/Vulkan/VKRenderTarget.cpp index d01dc60a..bc985fcd 100644 --- a/src/SceneGraph/Vulkan/VKRenderTarget.cpp +++ b/src/SceneGraph/Vulkan/VKRenderTarget.cpp @@ -2,9 +2,35 @@ #include #include #include +#include +#include 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) +{ + render_framework=rf; + + ubo_vp_info=GetDevice()->CreateUBO(sizeof(ViewportInfo),&vp_info); + + OnResize(ext); +} + +IRenderTarget::~IRenderTarget() +{ + SAFE_CLEAR(ubo_vp_info); +} + +void IRenderTarget::OnResize(const VkExtent2D &ext) +{ + extent=ext; + vp_info.Set(ext.width,ext.height); + ubo_vp_info->Write(&vp_info); +} + void RenderTargetData::Clear() { SAFE_CLEAR(queue); diff --git a/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp b/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp index 9b46022a..09ff4588 100644 --- a/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp +++ b/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp @@ -4,10 +4,8 @@ //#include VK_NAMESPACE_BEGIN -SwapchainRenderTarget::SwapchainRenderTarget(VkDevice dev,Swapchain *sc,Semaphore *pcs,RenderTarget **rtl):MFRenderTarget(sc->image_count,rtl) +SwapchainRenderTarget::SwapchainRenderTarget(RenderFramework *rf,Swapchain *sc,Semaphore *pcs,RenderTarget **rtl):MFRenderTarget(rf,sc->image_count,rtl) { - device=dev; - swapchain=sc; present_info.waitSemaphoreCount = 0; @@ -35,7 +33,7 @@ IRenderTarget *SwapchainRenderTarget::AcquireNextImage() //std::cout<<"AcquireNextImage present_complete_semaphore : "<swap_chain, UINT64_MAX, sem, diff --git a/src/Work/WorkManager.cpp b/src/Work/WorkManager.cpp index 68a7f188..213cba80 100644 --- a/src/Work/WorkManager.cpp +++ b/src/Work/WorkManager.cpp @@ -33,6 +33,9 @@ namespace hgl wo->MarkRenderDirty(); //临时的,未来会被更好的机制替代 WorkManager::Render(wo); + if(!rt) + return; + rt->WaitQueue(); rt->WaitFence(); }