diff --git a/inc/hgl/graph/RenderFramework.h b/inc/hgl/graph/RenderFramework.h index fddac536..36ac7ea9 100644 --- a/inc/hgl/graph/RenderFramework.h +++ b/inc/hgl/graph/RenderFramework.h @@ -40,11 +40,13 @@ protected: public: - Window * GetWindow (){return win;} - GPUDevice * GetDevice (){return device;} - GPUDeviceAttribute * GetDeviceAttribute (){return device->GetDeviceAttribute();} + Window * GetWindow ()const{return win;} + GPUDevice * GetDevice ()const{return device;} + VkDevice GetVkDevice ()const{return device->GetDevice();} + const GPUPhysicalDevice * GetPhysicalDevice ()const{return device->GetPhysicalDevice();} + GPUDeviceAttribute * GetDeviceAttribute ()const{return device->GetDeviceAttribute();} - RenderResource * GetRenderResource (){return render_resource;} + RenderResource * GetRenderResource ()const{return render_resource;} public: diff --git a/inc/hgl/graph/VK.h b/inc/hgl/graph/VK.h index 4cde37c7..61e1f7c8 100644 --- a/inc/hgl/graph/VK.h +++ b/inc/hgl/graph/VK.h @@ -36,6 +36,9 @@ struct VertexAttribDataPtr using BindingMap =Map; using BindingMapArray =BindingMap[VK_DESCRIPTOR_TYPE_RANGE_SIZE]; +class GraphModule; +class RenderFramework; + class VulkanInstance; class GPUPhysicalDevice; class GPUDevice; @@ -44,9 +47,13 @@ class DeviceQueue; class ImageView; class Framebuffer; struct Swapchain; +class IRenderTarget; class RenderTarget; +class MFRenderTarget; class SwapchainRenderTarget; +struct CopyBufferToImageInfo; + class Texture; class Texture1D; class Texture1DArray; @@ -58,6 +65,8 @@ class TextureCubeArray; class Sampler; +class TileData; + class DeviceMemory; class DeviceBuffer; struct DeviceBufferData; diff --git a/inc/hgl/graph/VKBuffer.h b/inc/hgl/graph/VKBuffer.h index 1f7f0b06..81aca0f8 100644 --- a/inc/hgl/graph/VKBuffer.h +++ b/inc/hgl/graph/VKBuffer.h @@ -51,65 +51,4 @@ public: 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 diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index fffc11cd..365c2986 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -23,16 +23,6 @@ class RenderFramework; * 所以RenderTarget的其实是一个多态类,根据不同的情况,有不同的实现 */ -template class DeviceBufferObject -{ - T data; - DeviceBuffer *dev_buffer; - - - -public: -}; - class IRenderTarget { RenderFramework *render_framework; @@ -44,8 +34,8 @@ class IRenderTarget public: RenderFramework * GetRenderFramework ()const{return render_framework;} - GPUDevice * GetDevice ()const{return render_framework->GetDevice();} - VkDevice GetVkDevice ()const{return render_framework->GetDevice()->GetDevice();} + GPUDevice * GetDevice ()const; + VkDevice GetVkDevice ()const; const VkExtent2D &GetExtent ()const{return extent;} diff --git a/inc/hgl/graph/module/GraphModule.h b/inc/hgl/graph/module/GraphModule.h index 9ce324b1..cb680fd5 100644 --- a/inc/hgl/graph/module/GraphModule.h +++ b/inc/hgl/graph/module/GraphModule.h @@ -1,20 +1,26 @@ #pragma once -#include +#include #include VK_NAMESPACE_BEGIN +class TextureManager; +class RenderTargetManager; +class RenderPassManager; + class GraphModule { - GPUDevice *device; + RenderFramework *render_framework; public: - GPUDevice * GetDevice () {return device;} ///<取得GPU设备 - VkDevice GetVkDevice ()const {return device->GetDevice();} ///<取得VkDevice - const GPUPhysicalDevice * GetPhysicalDevice ()const {return device->GetPhysicalDevice();} ///<取得物理设备 - GPUDeviceAttribute *GetDeviceAttribute () {return device->GetDeviceAttribute();} ///<取得设备属性 + RenderFramework * GetRenderFramework ()const{return render_framework;} ///<取得渲染框架 + GPUDevice * GetDevice (); ///<取得GPU设备 + VkDevice GetVkDevice ()const; ///<取得VkDevice + const GPUPhysicalDevice * GetPhysicalDevice ()const; ///<取得物理设备 + GPUDeviceAttribute *GetDeviceAttribute ()const; ///<取得设备属性 + VkPipelineCache GetPipelineCache ()const; ///<取得PipelineCache public: @@ -22,7 +28,7 @@ public: public: - GraphModule(GPUDevice *dev){device=dev;} + GraphModule(RenderFramework *rf){render_framework=rf;} virtual ~GraphModule()=default; virtual const size_t GetTypeHash()const noexcept=0; @@ -47,7 +53,7 @@ public: public: - GraphModuleInherit(GPUDevice *dev,const AnsiString &name):BASE(dev) + GraphModuleInherit(RenderFramework *rf,const AnsiString &name):BASE(rf) { manager_name=name; } @@ -57,6 +63,6 @@ public: #define GRAPH_MODULE_CLASS(class_name) class class_name:public GraphModuleInherit -#define GRAPH_MODULE_CONSTRUCT(class_name) class_name::class_name(GPUDevice *dev):GraphModuleInherit(dev,#class_name) +#define GRAPH_MODULE_CONSTRUCT(class_name) class_name::class_name(RenderFramework *rf):GraphModuleInherit(rf,#class_name) VK_NAMESPACE_END diff --git a/inc/hgl/graph/module/GraphModuleManager.h b/inc/hgl/graph/module/GraphModuleManager.h index d69cd5c7..62a68e69 100644 --- a/inc/hgl/graph/module/GraphModuleManager.h +++ b/inc/hgl/graph/module/GraphModuleManager.h @@ -5,11 +5,9 @@ VK_NAMESPACE_BEGIN -class GraphModule; - class GraphModuleManager { - GPUDevice *device; + RenderFramework *render_framework; protected: @@ -18,13 +16,14 @@ protected: public: - GraphModuleManager(GPUDevice *dev){device=dev;} + GraphModuleManager(RenderFramework *rf){render_framework=rf;} virtual ~GraphModuleManager(); public: - GPUDevice * GetDevice() {return device;} ///<取得GPU设备 + RenderFramework * GetRenderFramework ()const{return render_framework;} ///<取得渲染框架 + GPUDevice * GetDevice ()const; ///<取得GPU设备 public: @@ -46,7 +45,7 @@ public: if(Contains()) return Get(); - T *result=new T(device); + T *result=new T(render_framework); Registry(result); diff --git a/inc/hgl/graph/module/RenderPassManager.h b/inc/hgl/graph/module/RenderPassManager.h index 7cf6c5be..8b546976 100644 --- a/inc/hgl/graph/module/RenderPassManager.h +++ b/inc/hgl/graph/module/RenderPassManager.h @@ -15,15 +15,13 @@ inline util::Hash *CreateRenderPassHash() GRAPH_MODULE_CLASS(RenderPassManager) { - VkPipelineCache pipeline_cache; - util::Hash *hash; Map RenderPassList; private: - RenderPassManager(GPUDevice *); + RenderPassManager(RenderFramework *); ~RenderPassManager(); friend class GraphModuleManager; diff --git a/inc/hgl/graph/module/RenderTargetManager.h b/inc/hgl/graph/module/RenderTargetManager.h index 8c7aac5b..914478ed 100644 --- a/inc/hgl/graph/module/RenderTargetManager.h +++ b/inc/hgl/graph/module/RenderTargetManager.h @@ -14,7 +14,7 @@ GRAPH_MODULE_CLASS(RenderTargetManager) public: - RenderTargetManager(GPUDevice *,TextureManager *tm,RenderPassManager *rpm); + RenderTargetManager(RenderFramework *,TextureManager *tm,RenderPassManager *rpm); virtual ~RenderTargetManager()=default; public: //FrameBuffer相关 diff --git a/inc/hgl/graph/module/SwapchainModule.h b/inc/hgl/graph/module/SwapchainModule.h index 7c8fc8bf..50452eeb 100644 --- a/inc/hgl/graph/module/SwapchainModule.h +++ b/inc/hgl/graph/module/SwapchainModule.h @@ -4,10 +4,6 @@ VK_NAMESPACE_BEGIN -class RenderTargetManager; -class RenderPassManager; -class RenderPass; - GRAPH_MODULE_CLASS(SwapchainModule) { TextureManager * tex_manager =nullptr; @@ -30,7 +26,7 @@ public: public: - SwapchainModule(GPUDevice *,TextureManager *tm,RenderTargetManager *rtm,RenderPassManager *rpm); + SwapchainModule(RenderFramework *,TextureManager *tm,RenderTargetManager *rtm,RenderPassManager *rpm); virtual ~SwapchainModule(); // RenderCmdBuffer *BeginRender(); @@ -41,10 +37,10 @@ public: RenderPass * GetRenderPass ()const{return sc_render_pass;} - const VkExtent2D & GetSwapchainSize()const{return sc_render_target->GetExtent();} + const VkExtent2D & GetSwapchainSize()const; SwapchainRenderTarget * GetRenderTarget ()const{return sc_render_target;} - IRenderTarget * AcquireNextImage()const{return sc_render_target->AcquireNextImage();} + IRenderTarget * AcquireNextImage()const; };//class SwapchainModule:public GraphModule VK_NAMESPACE_END diff --git a/inc/hgl/graph/module/TextureManager.h b/inc/hgl/graph/module/TextureManager.h index 348c2b6f..28fdd263 100644 --- a/inc/hgl/graph/module/TextureManager.h +++ b/inc/hgl/graph/module/TextureManager.h @@ -34,7 +34,7 @@ private: public: - TextureManager(GPUDevice *); + TextureManager(RenderFramework *rf); virtual ~TextureManager(); const VkFormatProperties GetFormatProperties(const VkFormat)const; diff --git a/res b/res index fe8fcabe..e1a36d78 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit fe8fcabeb54f7a5b23f38260e6e09bbdcf015b7f +Subproject commit e1a36d78f0eead5f6bb65493432c4690637b991d diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index bf665936..1cf1bbd2 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -53,6 +53,7 @@ SET(GRAPH_MODULE_FILES ${SGM_HEADER_PATH}/GraphModule.h ${SGM_HEADER_PATH}/RenderModule.h ${SGM_HEADER_PATH}/SwapchainModule.h + ${SGM_SOURCE_PATH}/GraphModule.cpp ${SGM_SOURCE_PATH}/GraphModuleManager.cpp ${SGM_SOURCE_PATH}/RenderPassManager.cpp ${SGM_SOURCE_PATH}/TextureManager.cpp diff --git a/src/SceneGraph/RenderFramework.cpp b/src/SceneGraph/RenderFramework.cpp index e8f9a7fa..155f6710 100644 --- a/src/SceneGraph/RenderFramework.cpp +++ b/src/SceneGraph/RenderFramework.cpp @@ -91,7 +91,7 @@ bool RenderFramework::Init(uint w,uint h) win->Join(this); - module_manager=new GraphModuleManager(device); + module_manager=new GraphModuleManager(this); rp_manager=module_manager->GetOrCreate(); @@ -103,10 +103,10 @@ bool RenderFramework::Init(uint w,uint h) if(!tex_manager) return(false); - rt_manager=new RenderTargetManager(device,tex_manager,rp_manager); + rt_manager=new RenderTargetManager(this,tex_manager,rp_manager); module_manager->Registry(rt_manager); - sc_module=new SwapchainModule(device,tex_manager,rt_manager,rp_manager); + sc_module=new SwapchainModule(this,tex_manager,rt_manager,rp_manager); module_manager->Registry(sc_module); OnResize(w,h); diff --git a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp index bebfd626..b9208db7 100644 --- a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp +++ b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include"CopyBufferToImage.h" VK_NAMESPACE_BEGIN void GenerateMipmaps(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels,const uint32_t layer_count); diff --git a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2DArray.cpp b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2DArray.cpp index b8176f07..b1411b9a 100644 --- a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2DArray.cpp +++ b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2DArray.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include"CopyBufferToImage.h" VK_NAMESPACE_BEGIN void GenerateMipmaps(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels,const uint32_t layer_count); diff --git a/src/SceneGraph/Vulkan/Texture/VKDeviceTextureCube.cpp b/src/SceneGraph/Vulkan/Texture/VKDeviceTextureCube.cpp index a6347326..43e39af5 100644 --- a/src/SceneGraph/Vulkan/Texture/VKDeviceTextureCube.cpp +++ b/src/SceneGraph/Vulkan/Texture/VKDeviceTextureCube.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include"BufferImageCopy2D.h" VK_NAMESPACE_BEGIN void GenerateMipmaps(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels,const uint32_t layer_count); diff --git a/src/SceneGraph/Vulkan/VKDeviceFramebuffer.cpp b/src/SceneGraph/Vulkan/VKDeviceFramebuffer.cpp index cdb60427..f0ad043a 100644 --- a/src/SceneGraph/Vulkan/VKDeviceFramebuffer.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceFramebuffer.cpp @@ -1,4 +1,7 @@ #include +#include +#include +#include VK_NAMESPACE_BEGIN VkFramebuffer CreateVulkanFramebuffer(VkDevice device,RenderPass *rp,const VkExtent2D &extent,VkImageView *attachments,const uint attachmentCount) diff --git a/src/SceneGraph/module/GraphModule.cpp b/src/SceneGraph/module/GraphModule.cpp new file mode 100644 index 00000000..feab83d1 --- /dev/null +++ b/src/SceneGraph/module/GraphModule.cpp @@ -0,0 +1,14 @@ +#include +#include +#include + +VK_NAMESPACE_BEGIN + + GPUDevice * GraphModule::GetDevice () {return render_framework->GetDevice();} + VkDevice GraphModule::GetVkDevice ()const {return render_framework->GetVkDevice();} +const GPUPhysicalDevice * GraphModule::GetPhysicalDevice ()const {return render_framework->GetPhysicalDevice();} + GPUDeviceAttribute *GraphModule::GetDeviceAttribute ()const {return render_framework->GetDeviceAttribute();} + + VkPipelineCache GraphModule::GetPipelineCache ()const {return render_framework->GetDeviceAttribute()->pipeline_cache;} + +VK_NAMESPACE_END diff --git a/src/SceneGraph/module/GraphModuleManager.cpp b/src/SceneGraph/module/GraphModuleManager.cpp index 53e15e94..d6377f1a 100644 --- a/src/SceneGraph/module/GraphModuleManager.cpp +++ b/src/SceneGraph/module/GraphModuleManager.cpp @@ -1,8 +1,14 @@ #include #include +#include VK_NAMESPACE_BEGIN +GPUDevice *GraphModuleManager::GetDevice()const +{ + return render_framework->GetDevice(); +} + bool GraphModuleManager::Registry(GraphModule *gm) { if(!gm) diff --git a/src/SceneGraph/module/RenderPassManager.cpp b/src/SceneGraph/module/RenderPassManager.cpp index f88664dd..db525e09 100644 --- a/src/SceneGraph/module/RenderPassManager.cpp +++ b/src/SceneGraph/module/RenderPassManager.cpp @@ -1,5 +1,6 @@ #include #include +#include VK_NAMESPACE_BEGIN void CreateSubpassDependency(List &subpass_dependency_list,const uint32_t count) @@ -186,8 +187,6 @@ bool CreateDepthAttachment( List &ref_list,Listpipeline_cache; - hash=CreateRenderPassHash(); } @@ -287,7 +286,7 @@ RenderPass *RenderPassManager::CreateRenderPass(const ListGetColorFormatList(),depth_format)); + return(new RenderPass(GetVkDevice(),GetPipelineCache(),render_pass,rbi->GetColorFormatList(),depth_format)); } RenderPass *RenderPassManager::AcquireRenderPass(const RenderbufferInfo *rbi,const uint subpass_count) diff --git a/src/SceneGraph/module/RenderTargetManager.cpp b/src/SceneGraph/module/RenderTargetManager.cpp index 759da6fb..40112f31 100644 --- a/src/SceneGraph/module/RenderTargetManager.cpp +++ b/src/SceneGraph/module/RenderTargetManager.cpp @@ -1,10 +1,12 @@ #include +#include +#include #include #include VK_NAMESPACE_BEGIN -RenderTargetManager::RenderTargetManager(GPUDevice *dev,TextureManager *tm,RenderPassManager *rpm):GraphModuleInherit(dev,"RenderTargetManager") +RenderTargetManager::RenderTargetManager(RenderFramework *rf,TextureManager *tm,RenderPassManager *rpm):GraphModuleInherit(rf,"RenderTargetManager") { tex_manager=tm; rp_manager=rpm; @@ -58,7 +60,7 @@ RenderTarget *RenderTargetManager::CreateRT(const FramebufferInfo *fbi,RenderPas color_texture_list.DiscardObject(); - return(new RenderTarget(rtd)); + return(new RenderTarget(GetRenderFramework(),rtd)); } SAFE_CLEAR(depth_texture); diff --git a/src/SceneGraph/module/SwapchainModule.cpp b/src/SceneGraph/module/SwapchainModule.cpp index 804ed539..e4cdb609 100644 --- a/src/SceneGraph/module/SwapchainModule.cpp +++ b/src/SceneGraph/module/SwapchainModule.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -217,12 +218,12 @@ bool SwapchainModule::CreateSwapchainRenderTarget() rtd->color_textures[0] =sc_image->color; rtd->depth_texture =sc_image->depth; - rt_list[i]=new RenderTarget(rtd); + rt_list[i]=new RenderTarget(GetRenderFramework(),rtd); ++sc_image; } - sc_render_target=new SwapchainRenderTarget( device->GetDevice(), + sc_render_target=new SwapchainRenderTarget( GetRenderFramework(), swapchain, device->CreateGPUSemaphore(), rt_list @@ -236,7 +237,7 @@ SwapchainModule::~SwapchainModule() SAFE_CLEAR(sc_render_target); } -SwapchainModule::SwapchainModule(GPUDevice *dev,TextureManager *tm,RenderTargetManager *rtm,RenderPassManager *rpm):GraphModuleInherit(dev,"SwapchainModule") +SwapchainModule::SwapchainModule(RenderFramework *rf,TextureManager *tm,RenderTargetManager *rtm,RenderPassManager *rpm):GraphModuleInherit(rf,"SwapchainModule") { tex_manager=tm; rt_manager=rtm; @@ -263,7 +264,9 @@ void SwapchainModule::OnResize(const VkExtent2D &extent) { SAFE_CLEAR(sc_render_target) - GetDeviceAttribute()->RefreshSurfaceCaps(); + GPUDeviceAttribute *dev_attr=GetDeviceAttribute(); + + dev_attr->RefreshSurfaceCaps(); CreateSwapchainRenderTarget(); } @@ -281,4 +284,8 @@ void SwapchainModule::OnResize(const VkExtent2D &extent) // sc_render_target->WaitFence(); //} +const VkExtent2D & SwapchainModule::GetSwapchainSize()const{return sc_render_target->GetExtent();} + + IRenderTarget * SwapchainModule::AcquireNextImage()const{return sc_render_target->AcquireNextImage();} + VK_NAMESPACE_END diff --git a/src/SceneGraph/module/TextureManager.cpp b/src/SceneGraph/module/TextureManager.cpp index ea972ba9..0c980312 100644 --- a/src/SceneGraph/module/TextureManager.cpp +++ b/src/SceneGraph/module/TextureManager.cpp @@ -11,6 +11,7 @@ const VkFormatProperties TextureManager::GetFormatProperties(const VkFormat form GRAPH_MODULE_CONSTRUCT(TextureManager) { + auto dev=GetDevice(); auto phy_device=GetPhysicalDevice(); texture_cmd_buf=dev->CreateTextureCommandBuffer(phy_device->GetDeviceName()+AnsiString(":TexCmdBuffer"));