From ff8222c2561ff75a8a1722e4942dd0d9ceb3b8c2 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sat, 18 Jan 2025 20:28:14 +0800 Subject: [PATCH] moved device_render_pass to RenderFramework from GPUDevice. --- CMCore | 2 +- inc/hgl/graph/RenderFramework.h | 11 ++- inc/hgl/graph/VKDevice.h | 7 -- inc/hgl/graph/module/GraphModuleManager.h | 24 +++++- inc/hgl/graph/module/RenderPassManager.h | 4 +- res | 2 +- src/SceneGraph/CMakeLists.txt | 1 - src/SceneGraph/RenderFramework.cpp | 86 +++++++++++++++++++- src/SceneGraph/Vulkan/VKDevice.cpp | 5 -- src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp | 25 ------ 10 files changed, 120 insertions(+), 47 deletions(-) delete mode 100644 src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp diff --git a/CMCore b/CMCore index 5aad7d81..1bcd213b 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 5aad7d81419d02141b3b3f53661e2c8e3e763163 +Subproject commit 1bcd213b63ed080863fd4a51eaec5fe6205e7589 diff --git a/inc/hgl/graph/RenderFramework.h b/inc/hgl/graph/RenderFramework.h index 3c32580d..8bf65edf 100644 --- a/inc/hgl/graph/RenderFramework.h +++ b/inc/hgl/graph/RenderFramework.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -29,11 +29,14 @@ public: Window * GetWindow (){return win;} GPUDevice * GetDevice (){return device;} + RenderPass * GetRenderPass (){return device_render_pass;} + public: GraphModuleManager *GetModuleManager(){return module_manager;} RenderPassManager * GetRenderPassManager(){return render_pass_manager;} + public: RenderFramework(const OSString &); @@ -41,6 +44,12 @@ public: virtual bool Init(uint w,uint h); +public: // event + + void OnResize(uint w,uint h); + void OnActive(bool); + void OnClose(); + };//class RenderFramework VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index 99024271..618bf369 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -37,15 +37,10 @@ class GPUDevice private: - RenderPass *device_render_pass; - RTSwapchain *sc_rt; RTSwapchain *CreateSwapchainRenderTarget(); - void InitRenderPassManage(); - void ClearRenderPassManage(); - private: VkCommandBuffer CreateCommandBuffer(const AnsiString &); @@ -78,8 +73,6 @@ public: const VkColorSpaceKHR GetColorSpace ()const {return attr->surface_format.colorSpace;} VkQueue GetGraphicsQueue () {return attr->graphics_queue;} - RenderPass * GetRenderPass () {return device_render_pass;} - RTSwapchain * GetSwapchainRT () {return sc_rt;} const VkExtent2D & GetSwapchainSize ()const {return sc_rt->GetExtent();} diff --git a/inc/hgl/graph/module/GraphModuleManager.h b/inc/hgl/graph/module/GraphModuleManager.h index b06f0e71..d69cd5c7 100644 --- a/inc/hgl/graph/module/GraphModuleManager.h +++ b/inc/hgl/graph/module/GraphModuleManager.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -28,14 +28,30 @@ public: public: - GraphModule * GetModule(const size_t type_hash) {return GetObjectFromList(module_map,type_hash);} ///<取得指定类型的模块 + GraphModule * Get(const size_t type_hash) {return GetObjectFromList(module_map,type_hash);} ///<取得指定类型的模块 template - T * GetModule() {return(GetModule(typeid(T).hash_code()));} ///<取得指定类型的模块 + T * Get() {return((T *)Get(typeid(T).hash_code()));} ///<取得指定类型的模块 - bool ConatainsModule(const size_t &type_hash)const {return module_map.ContainsKey(type_hash);} ///<确认是否包含指定类型的模块 + bool Contains(const size_t &type_hash)const {return module_map.ContainsKey(type_hash);} ///<确认是否包含指定类型的模块 + + template + bool Contains()const{return Contains(typeid(T).hash_code());} ///<确认是否包含指定类型的模块 bool Registry(GraphModule *); ///<注册一个模块 bool Unregistry(GraphModule *); ///<注销一个模块 + + template + T *GetOrCreate() ///<注册一个模块 + { + if(Contains()) + return Get(); + + T *result=new T(device); + + Registry(result); + + return result; + } };//class GraphModuleManager VK_NAMESPACE_END diff --git a/inc/hgl/graph/module/RenderPassManager.h b/inc/hgl/graph/module/RenderPassManager.h index 608a159a..c0c1cbd0 100644 --- a/inc/hgl/graph/module/RenderPassManager.h +++ b/inc/hgl/graph/module/RenderPassManager.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -25,6 +25,8 @@ private: RenderPassManager(GPUDevice *); ~RenderPassManager(); + friend class GraphModuleManager; + private: RenderPass * CreateRenderPass( const List &desc_list, diff --git a/res b/res index e1a36d78..475d8ad4 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit e1a36d78f0eead5f6bb65493432c4690637b991d +Subproject commit 475d8ad43ceee084cd24f5d0bed59de9f6aa36fd diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 36c9e073..61fce339 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -183,7 +183,6 @@ SET(VK_DEVICE_SOURCE Vulkan/VKDeviceMemory.cpp Vulkan/VKDeviceMaterial.cpp Vulkan/VKDeviceFramebuffer.cpp Vulkan/VKDeviceSwapchain.cpp - Vulkan/VKDeviceRenderPass.cpp Vulkan/VKDeviceRenderTarget.cpp) SET(VK_PHYSICAL_DEVICE_SOURCE ${SG_INCLUDE_PATH}/VKPhysicalDevice.h diff --git a/src/SceneGraph/RenderFramework.cpp b/src/SceneGraph/RenderFramework.cpp index df1b6b66..d92a8b82 100644 --- a/src/SceneGraph/RenderFramework.cpp +++ b/src/SceneGraph/RenderFramework.cpp @@ -1,4 +1,8 @@ -#include +#include +#include +#include +#include +#include VK_NAMESPACE_BEGIN @@ -9,6 +13,19 @@ namespace { static int RENDER_FRAMEWORK_COUNT=0; + hgl::graph::VulkanInstance *CreateVulkanInstance(const AnsiString &app_name) + { + CreateInstanceLayerInfo cili; + + hgl_zero(cili); + + cili.lunarg.standard_validation = true; + cili.khronos.validation = true; + + InitVulkanInstanceProperties(); + + return CreateInstance(app_name,nullptr,&cili); + } }//namespace RenderFramework::RenderFramework(const OSString &an) @@ -20,6 +37,9 @@ RenderFramework::RenderFramework(const OSString &an) RenderFramework::~RenderFramework() { + SAFE_CLEAR(device_render_pass); + SAFE_CLEAR(module_manager) + --RENDER_FRAMEWORK_COUNT; if(RENDER_FRAMEWORK_COUNT==0) @@ -36,10 +56,74 @@ bool RenderFramework::Init(uint w,uint h) return(false); logger::InitLogger(app_name); + + InitNativeWindowSystem(); } ++RENDER_FRAMEWORK_COUNT; + win=CreateRenderWindow(app_name); + if(!win) + return(false); + if(!win->Create(w,h)) + { + delete win; + win=nullptr; + return(false); + } + + inst=CreateVulkanInstance(ToAnsiString(app_name)); + if(!inst) + return(false); + + VulkanHardwareRequirement vh_req; + + device=CreateRenderDevice(inst,win,&vh_req); + + if(!device) + return(false); + + win->Join(this); + + OnResize(w,h); + + module_manager=new GraphModuleManager(device); + + render_pass_manager=module_manager->GetOrCreate(); + + if(!render_pass_manager) + return(false); + + { + auto *attr=GetDevice()->GetDeviceAttribute(); + + SwapchainRenderbufferInfo rbi(attr->surface_format.format,attr->physical_device->GetDepthFormat()); + + device_render_pass=render_pass_manager->AcquireRenderPass(&rbi); + + if(!device_render_pass) + return(false); + + #ifdef _DEBUG + if(attr->debug_utils) + attr->debug_utils->SetRenderPass(device_render_pass->GetVkRenderPass(),"MainDeviceRenderPass"); + #endif//_DEBUG + } + + return(true); +} + +void RenderFramework::OnResize(uint w,uint h) +{ + io::WindowEvent::OnResize(w,h); +} + +void RenderFramework::OnActive(bool) +{ +} + +void RenderFramework::OnClose() +{ } VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKDevice.cpp b/src/SceneGraph/Vulkan/VKDevice.cpp index 22ad2725..6f00ada8 100644 --- a/src/SceneGraph/Vulkan/VKDevice.cpp +++ b/src/SceneGraph/Vulkan/VKDevice.cpp @@ -8,7 +8,6 @@ #include #include #include -#include VK_NAMESPACE_BEGIN GPUDevice::GPUDevice(GPUDeviceAttribute *da) @@ -18,8 +17,6 @@ GPUDevice::GPUDevice(GPUDeviceAttribute *da) texture_queue=nullptr; texture_cmd_buf=nullptr; - InitRenderPassManage(); - sc_rt=nullptr; Resize(attr->surface_caps.currentExtent); @@ -29,8 +26,6 @@ GPUDevice::GPUDevice(GPUDeviceAttribute *da) GPUDevice::~GPUDevice() { - ClearRenderPassManage(); - SAFE_CLEAR(sc_rt); SAFE_CLEAR(texture_queue); diff --git a/src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp b/src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp deleted file mode 100644 index 89693d84..00000000 --- a/src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include - -VK_NAMESPACE_BEGIN -void GPUDevice::InitRenderPassManage() -{ - render_pass_manage=new RenderPassManager(this); - - SwapchainRenderbufferInfo rbi(attr->surface_format.format,attr->physical_device->GetDepthFormat()); - - device_render_pass=render_pass_manage->AcquireRenderPass(&rbi); - - #ifdef _DEBUG - if(attr->debug_utils) - attr->debug_utils->SetRenderPass(device_render_pass->GetVkRenderPass(),"MainDeviceRenderPass"); - #endif//_DEBUG -} - -void GPUDevice::ClearRenderPassManage() -{ - SAFE_CLEAR(render_pass_manage); -} -VK_NAMESPACE_END