From 2a48964aaeaffef9841af998710e9f16074fdfc1 Mon Sep 17 00:00:00 2001 From: ouczbs Date: Fri, 13 Dec 2024 22:03:56 +0800 Subject: [PATCH] framegraph bugfix --- engine/include/engine.natvis | 2 +- .../modules/engine/app/include/event/event.h | 161 +++--------------- .../engine/app/include/event/event_system.h | 2 +- .../engine/render/impl/renderapi_impl.inl | 3 - .../render/include/render/graph/frame_graph.h | 29 ++-- .../render/graph/frame_graph_builder.inl | 6 +- .../engine/render/include/render/graph/type.h | 4 - .../render/include/render/imgui_system.h | 9 - .../render/include/render/pass/demo_pass.h | 2 +- .../engine/render/include/render/type.h | 28 +++ .../engine/render/src/graph/frame_graph.cpp | 117 +++++++------ .../render/src/graph/frame_graph_builder.cpp | 7 - .../modules/engine/render/src/graph/type.cpp | 45 +---- .../engine/render/src/pass/demo_pass.cpp | 12 +- .../render/vulkan/include/vkn/vulkan_imgui.h | 10 +- .../render/vulkan/src/vulkan_context.cpp | 2 +- .../render/vulkan/src/vulkan_imgui.cpp | 22 ++- .../render/vulkan/src/vulkan_window.cpp | 2 +- game/zworld/src/zworld.cpp | 2 +- 19 files changed, 166 insertions(+), 299 deletions(-) diff --git a/engine/include/engine.natvis b/engine/include/engine.natvis index d575aad..fc37abb 100644 --- a/engine/include/engine.natvis +++ b/engine/include/engine.natvis @@ -9,6 +9,6 @@ - {g_memory_blocks[(flag3_memory29 >> 16) % 0x2000] + 2*(flag3_memory29 % 0x10000) + 2,s} + {g_memory_blocks[(flag3_memory29 >> 16) % 0x2000] + 2*(flag3_memory29 % 0x10000) + 2,s} \ No newline at end of file diff --git a/engine/modules/engine/app/include/event/event.h b/engine/modules/engine/app/include/event/event.h index ecc5062..d343f84 100644 --- a/engine/modules/engine/app/include/event/event.h +++ b/engine/modules/engine/app/include/event/event.h @@ -5,24 +5,16 @@ namespace api{ using pmr::Name; //* Utility functions to create std::functions without std::placeholder - template - class Event; - - /** - * @brief Event that can call all of its subscribers - * - * @tparam R Return type - * @tparam Args Function arguments - */ + template + class Event {}; template class Event { private: + Name name; using Delegate = std::function; - using FuncMap = std::unordered_map; - std::unordered_map listeners; - //std::unordered_map constListeners; + std::unordered_map listeners; template - static consteval auto add_const(R(Type::* ptr)(Args...)) { + static constexpr auto add_const(R(Type::* ptr)(Args...)) { using MethodType = R(Type::*)(Args...)const; return (MethodType)ptr; } @@ -33,155 +25,46 @@ namespace api{ }; } public: - Event() = default; - - /** - * @brief Subscribes a member function to the event. - * - * @tparam Invoker The instance type to call the member function - * @tparam Type The type containing the member function - * @param id Unique identifier of the subscribing function - * @param func The function to call when the event is raised - * @param invoker The instance owning the member function - */ + Event(Name name) : name(name){}; template - void Subscribe(const Name& id, R(Type::*func)(Args... args),const Invoker* invoker) { - Subscribe(id, add_const(func), invoker); + void Subscribe(R(Type::*func)(Args... args),const Invoker* invoker) { + Subscribe(add_const(func), invoker); } - - /** - * @brief Subscribes a const member function to the event. - * - * @tparam Invoker The instance type to call the member function - * @tparam Type The type containing the member function - * @param id Unique identifier of the subscribing function - * @param func The const function to call when the event is raised - * @param invoker The instance owning the member function - */ template - void Subscribe(const Name& id, R (Type::*func)(Args... args) const, const Invoker* invoker) { - Delegate deleg{ std::move(EasyBind(func, invoker)) }; + void Subscribe(R (Type::*func)(Args... args) const, const Invoker* invoker) { auto found{ listeners.find(invoker) }; - if (found != listeners.end()) { - auto iter{ found->second.find(id) }; - if (iter != found->second.end()) { - iter->second = std::move(deleg); - } - else { - found->second.emplace(id, std::move(deleg)); - } - } - else { - listeners.emplace(invoker, FuncMap{ {id, {std::move(deleg)}} }); + if (found == listeners.end()) { + listeners.emplace(invoker, EasyBind(func, invoker)); } } - /** - * @brief Subscribes a free function or a std::function reference to the event - * - * @param id Unique identifier of the subscribing function - * @param func The function to call when the event is raised - */ - void Subscribe(const Name& id,const std::function& func) { - auto found{listeners.find(nullptr)}; - - if (found != listeners.end()) { - auto iter{found->second.find(id)}; - if (iter != found->second.end()) { - iter->second = func; - } - else { - found->second.emplace(id, func); - } - } else { - listeners.emplace(nullptr, FuncMap{{id, {func}}}); + void Subscribe(Name key,const std::function& func) { + auto id = key.data(); + auto found{listeners.find(id)}; + if (found == listeners.end()) { + listeners.emplace(id, func); } } - - /** - * @brief Unsubscribes a member function from an event - * - * @tparam Invoker - * @param id Unique identifier of the subscribed function - * @param invoker The instance owning the member function - */ template - void Unsubscribe(const Name& id,const Invoker* invoker) { + void Unsubscribe(const Invoker* invoker) { auto found {listeners.find(invoker)}; - - if (found != listeners.end()) { - auto iter {found->second.find(id)}; - if (iter != found->second.end()) { - found->second.erase(iter); - } - if (found->second.empty()) { - listeners.erase(found); - } - } - } - /** - * @brief Unsubscribes a free function/lambda from an event - * - * @param id Unique identifier of the subscribed function/lambda - */ - void Unsubscribe(const Name& id) { - auto found{listeners.find(nullptr)}; - - if (found != listeners.end()) { - auto iter{found->second.find(id)}; - if (iter != found->second.end()) { - found->second.erase(iter); - } - if (found->second.empty()) { - listeners.erase(found); - } - } - } - - /** - * @brief Unsubscribes all functions owned by the invoker const instance from this event - * - * @param invoker Const instance subscribed to this event - */ - template - void RemoveListener(const Invoker* invoker) { - auto found{ listeners.find(invoker)}; if (found != listeners.end()) { listeners.erase(found); } } - - /** - * @brief Unsubscribes all free functions/lambdas from this event - */ - void RemoveFreeFunctions() { - auto found{listeners.find(nullptr)}; + void Unsubscribe(Name key) { + auto id = key.data(); + auto found{listeners.find(id)}; if (found != listeners.end()) { listeners.erase(found); } } - - // TODO: Check if args should be lvalues or not. - /** - * @brief Calls all subscribed functions - * - * @param args - */ void Invoke(Args... args) { - for (auto& listener : listeners) { - for (auto& func : listener.second) { - func.second(std::forward(args)...); - } + for (auto& func : listeners) { + func.second(std::forward(args)...); } } - - /** - * @brief Calls all subscribed functions (this is equivalent to Invoke()) - * - * @param args - */ void operator()(Args... args) { Invoke(std::forward(args)...); } - }; } \ No newline at end of file diff --git a/engine/modules/engine/app/include/event/event_system.h b/engine/modules/engine/app/include/event/event_system.h index e689e78..9364156 100644 --- a/engine/modules/engine/app/include/event/event_system.h +++ b/engine/modules/engine/app/include/event/event_system.h @@ -8,6 +8,6 @@ namespace api { EventSystem(); void Initialize() override; void Finalize() override; - Event BeginRenderFrame; + Event BeginRenderFrame{"BeginRenderFrame"}; }; } \ No newline at end of file diff --git a/engine/modules/engine/render/impl/renderapi_impl.inl b/engine/modules/engine/render/impl/renderapi_impl.inl index 9b533e3..60dbb3c 100644 --- a/engine/modules/engine/render/impl/renderapi_impl.inl +++ b/engine/modules/engine/render/impl/renderapi_impl.inl @@ -25,9 +25,6 @@ namespace api { for (auto view : context.views) { RenderView(view); } -#ifdef WITH_EDITOR - //ImguiSystem::Ptr()->Render(); -#endif } RenderAPI::RenderAPI(RenderContext* ctx) : context(*ctx) { diff --git a/engine/modules/engine/render/include/render/graph/frame_graph.h b/engine/modules/engine/render/include/render/graph/frame_graph.h index 9d61582..d309e2c 100644 --- a/engine/modules/engine/render/include/render/graph/frame_graph.h +++ b/engine/modules/engine/render/include/render/graph/frame_graph.h @@ -8,40 +8,31 @@ namespace api { class TextureBuilder; class RenderPassBuilder; public: + inline static Name NameSurface{ "surface" }; TextureDesc mSurface; - table mResourceTable; - table mResourcePool; - table mResourceViewPool; + table mTextureTable; + table mTexturePool; + table mTextureViewPool; lemon::ListGraph mGraph; pmr::vector mNodes{FramePool()}; public: template FrameGraphNodePtr AddRenderPass() { return AddRenderPass(&T::Setup, &T::Execute); } - using RenderPassSetupFunction = std::function; + using RenderPassSetupFunction = std::function; FrameGraphNodePtr AddRenderPass(const RenderPassSetupFunction& setup, const RenderPassNodeExecuteFn& executor); - FrameGraphNodePtr AddPresent(const FrameGraphEdgePtr& edge); - using TextureSetupFunction = std::function; - FrameGraphEdgePtr CreateTexture(const TextureSetupFunction& setup); + TextureBuilder CreateTextureBuild(); void InitSurface(const pmr::vector& surfaces); void Compile(); void Execute(FRenderView& view); void Clear(); - TextureDesc Resource(Name name) { - static Name surface("surface"); - if (name == surface) { - return mSurface; - } - auto it = mResourceTable.find(name); - if (it == mResourceTable.end()) { - return {}; - } - return it->second; - } + ResourceState Resolve(Name name,TextureDesc& desc, ResourceState state); + ResourceState Resolve(Name name, AttachmentDesc& desc, ResourceState state); + ResourceState Resolve(Name name, BufferDesc& desc, ResourceState state); ImagePtr ResolveTexture(TextureDesc desc); ImageViewPtr ResolveTextureView(TextureViewDesc desc); public: + void ExecutePresentPass(FRenderView& view); void ExecuteRenderPass(RenderPassNode* node, FRenderView& view); - void ExecutePresentPass(RenderPassNode* node, FRenderView& view); void ExecuteComputePass(RenderPassNode* node, FRenderView& view); void ExecuteCopyPass(RenderPassNode* node, FRenderView& view); diff --git a/engine/modules/engine/render/include/render/graph/frame_graph_builder.inl b/engine/modules/engine/render/include/render/graph/frame_graph_builder.inl index c093423..5271e1f 100644 --- a/engine/modules/engine/render/include/render/graph/frame_graph_builder.inl +++ b/engine/modules/engine/render/include/render/graph/frame_graph_builder.inl @@ -13,13 +13,13 @@ namespace api { FrameGraph::RenderPassBuilder& Attach(AttachmentDesc desc, ResourceState state); FrameGraph::RenderPassBuilder& Read(const FrameGraphEdgePtr& refEdge, ResourceState state); FrameGraph::RenderPassBuilder& Write(const FrameGraphEdgePtr& refEdge, ResourceState state); - FrameGraph::RenderPassBuilder& Present(const FrameGraphEdgePtr& refEdge, ResourceState state); }; struct FrameGraph::TextureBuilder { FrameGraph& graph; - FrameGraphEdgePtr& edge; + FrameGraphEdgePtr edge; public: - TextureBuilder(FrameGraph* graph, FrameGraphEdgePtr& edge)noexcept : graph(*graph), edge(edge) {}; + TextureBuilder(FrameGraph* graph)noexcept : graph(*graph) { edge.Make(); }; FrameGraph::TextureBuilder& Import(pmr::Name name, AttachmentDesc desc, ResourceState state); + FrameGraphEdgePtr Edge() { return edge; } }; } \ No newline at end of file diff --git a/engine/modules/engine/render/include/render/graph/type.h b/engine/modules/engine/render/include/render/graph/type.h index 0eb1a5c..1b851dd 100644 --- a/engine/modules/engine/render/include/render/graph/type.h +++ b/engine/modules/engine/render/include/render/graph/type.h @@ -32,7 +32,6 @@ namespace api { NodeType type{ NodeType::Render }; RenderPassNode* node; FrameGraphNodePtr() : node(nullptr){}; - FrameGraphNodePtr(GraphNodeRef ref, NodeType type = NodeType::Present); FrameGraphNodePtr(GraphNodeRef ref, const RenderPassNodeExecuteFn& executor, NodeType type = NodeType::Render); operator bool() const { return node; @@ -40,12 +39,10 @@ namespace api { RenderPassNode* operator ->()const { return node; } - void Presnet(FrameGraph&, RenderPassContext&); }; struct FrameResource { using Resource = std::variant; Name name; - ResourceState sourceState; Resource resource; FrameGraphNodePtr source; pmr::vector targets{ FramePool() }; @@ -81,7 +78,6 @@ namespace api { FrameResource* operator ->()const { return resource; } - void Resolve(FrameGraph* graph); void ResolveView(FrameGraph* graph); }; using RenderPassEdgeIterFn = std::function; diff --git a/engine/modules/engine/render/include/render/imgui_system.h b/engine/modules/engine/render/include/render/imgui_system.h index 040e441..e4e89e0 100644 --- a/engine/modules/engine/render/include/render/imgui_system.h +++ b/engine/modules/engine/render/include/render/imgui_system.h @@ -7,15 +7,6 @@ namespace api { SINGLETON_IMPL(ImguiSystem) public: ImguiSystem(); - // 渲染开始和结束 - virtual void Render() { - BeginEditorRender(); - EditorRender(); - EndEditorRender(); - } - virtual void BeginEditorRender() = 0; - virtual void EditorRender() = 0; - virtual void EndEditorRender() = 0; }; } #endif // WITH_EDITOR \ No newline at end of file diff --git a/engine/modules/engine/render/include/render/pass/demo_pass.h b/engine/modules/engine/render/include/render/pass/demo_pass.h index 755ce98..9896d70 100644 --- a/engine/modules/engine/render/include/render/pass/demo_pass.h +++ b/engine/modules/engine/render/include/render/pass/demo_pass.h @@ -4,7 +4,7 @@ namespace api { class DemoPass : public RenderPass { public: - static bool Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder); + static void Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder); static void Execute(FrameGraph&, RenderPassContext&); }; diff --git a/engine/modules/engine/render/include/render/type.h b/engine/modules/engine/render/include/render/type.h index 5941aa9..795d918 100644 --- a/engine/modules/engine/render/include/render/type.h +++ b/engine/modules/engine/render/include/render/type.h @@ -174,6 +174,8 @@ namespace api { using ImagePtr = void*; using ImageViewPtr = void*; using BufferPtr = void*; + struct BufferBarrier; + struct TextureBarrier; struct BufferDesc { BufferPtr buffer; void* mappingAddr; @@ -183,6 +185,7 @@ namespace api { static BufferDesc Make() { return {}; } + BufferBarrier ToBarrier(ResourceState from, ResourceState to); }; struct TextureViewDesc { ImagePtr image; @@ -215,6 +218,7 @@ namespace api { desc.dimension = dimension; return desc; } + TextureBarrier ToBarrier(ResourceState from, ResourceState to); }; struct AttachmentDesc { ImagePtr image; @@ -248,6 +252,7 @@ namespace api { desc.dimension = dimension; return desc; } + TextureBarrier ToBarrier(ResourceState from, ResourceState to); }; struct TextureBarrier { @@ -280,6 +285,29 @@ namespace api { const TextureBarrier* pTextureBarriers; uint32_t textureBarriersCount; }; + inline BufferBarrier BufferDesc::ToBarrier(ResourceState from, ResourceState to) + { + BufferBarrier barrier; + barrier.mSrcState = from; + barrier.mDstState = to; + return barrier; + } + inline TextureBarrier TextureDesc::ToBarrier(ResourceState from, ResourceState to) + { + TextureBarrier barrier; + barrier.mSrcState = from; + barrier.mDstState = to; + barrier.mTexture = *this; + return barrier; + } + inline TextureBarrier AttachmentDesc::ToBarrier(ResourceState from, ResourceState to) + { + TextureBarrier barrier; + barrier.mSrcState = from; + barrier.mDstState = to; + barrier.mTexture = ToTexture(); + return barrier; + } } #include "meta/hash.h" namespace std { diff --git a/engine/modules/engine/render/src/graph/frame_graph.cpp b/engine/modules/engine/render/src/graph/frame_graph.cpp index 5b6ab38..ae17347 100644 --- a/engine/modules/engine/render/src/graph/frame_graph.cpp +++ b/engine/modules/engine/render/src/graph/frame_graph.cpp @@ -24,29 +24,17 @@ namespace api { if (k1.depth != k2.depth) return false; return true; } - FrameGraphNodePtr FrameGraph::AddPresent(const FrameGraphEdgePtr& edge) - { - FrameGraphNodePtr node_ptr{ mGraph.addNode()}; - RenderPassBuilder builder{ this, node_ptr }; - builder.Read(edge, ResourceState::PRESENT); - mNodes.push_back(node_ptr); - return node_ptr; - } FrameGraphNodePtr FrameGraph::AddRenderPass(const RenderPassSetupFunction& setup, const RenderPassNodeExecuteFn& executor) { FrameGraphNodePtr node_ptr{ mGraph.addNode(), executor }; RenderPassBuilder builder{ this, node_ptr }; - if(setup(*this, builder)) - mNodes.push_back(node_ptr); + setup(*this, builder); + mNodes.push_back(node_ptr); return node_ptr; } - FrameGraphEdgePtr FrameGraph::CreateTexture(const TextureSetupFunction& setup) + FrameGraph::TextureBuilder FrameGraph::CreateTextureBuild() { - FrameGraphEdgePtr edge{}; - edge.Make(); - TextureBuilder builder(this, edge); - setup(*this, builder); - return edge; + return TextureBuilder{this}; } void FrameGraph::InitSurface(const pmr::vector& surfaces) { @@ -76,17 +64,17 @@ namespace api { case RenderPassType::Render: ExecuteRenderPass(node.node, view); break; - case RenderPassType::Present: - ExecutePresentPass(node.node, view); - break; case RenderPassType::Compute: ExecuteComputePass(node.node, view); break; case RenderPassType::Copy: ExecuteCopyPass(node.node, view); break; + default: + break; } } + ExecutePresentPass(view); } void FrameGraph::Clear() { @@ -102,9 +90,20 @@ namespace api { std::get(node->executor)(*this, context); RenderAPI::Ptr()->EndRenderPass(node); } - void FrameGraph::ExecutePresentPass(RenderPassNode* node, FRenderView& view) + void FrameGraph::ExecutePresentPass(FRenderView& view) { - ExecuteResourceBarriers(node, RenderPassType::Present); + if (mSurface.state == ResourceState::PRESENT) { + return; + } + TextureBarrier barrier{}; + barrier.mSrcState = mSurface.state; + barrier.mDstState = ResourceState::PRESENT; + barrier.mTexture = mSurface; + ResourceBarrierDesc desc{}; + desc.type = RenderPassType::Present; + desc.textureBarriersCount = 1; + desc.pTextureBarriers = &barrier; + RenderAPI::Ptr()->ExecuteResourceBarriers(desc); } void FrameGraph::ExecuteComputePass(RenderPassNode* node, FRenderView& view) { @@ -120,32 +119,23 @@ namespace api { { pmr::vector bufferBarrier{FramePool()}; pmr::vector textureBarrier{ FramePool() }; + auto graph = &RenderAPI::Ptr()->graph; node->ForeachEdge([&](FrameResource* resource, FrameGraphEdgePtr edge) { - edge.Resolve(&RenderAPI::Ptr()->graph); - if (!edge || edge.targetState == resource->sourceState) { - return; - } - if (resource->IsBuffer()) { - BufferBarrier barrier{}; - barrier.mSrcState = resource->sourceState; - barrier.mDstState = edge.targetState; - bufferBarrier.push_back(barrier); - } - else { - TextureBarrier barrier{}; - barrier.mSrcState = resource->sourceState; - barrier.mDstState = edge.targetState; - if (edge->IsTexture()) { - barrier.mTexture = edge->CastTo(); + std::visit([&](auto& desc) { + ResourceState targetState = edge.targetState; + ResourceState sourceState = graph->Resolve(resource->name, desc, targetState); + if (sourceState != targetState) { + auto barrier = desc.ToBarrier(sourceState, targetState); + using T = decltype(barrier); + if constexpr (std::is_same_v) { + bufferBarrier.push_back(barrier); + } + else { + textureBarrier.push_back(barrier); + } } - else { - auto& attach = edge->CastTo(); - barrier.mTexture = attach.ToTexture(); - } - textureBarrier.push_back(barrier); - } - resource->sourceState = edge.targetState; - }); + }, resource->resource); + }); if (bufferBarrier.empty() && textureBarrier.empty()) { return; } @@ -157,32 +147,47 @@ namespace api { desc.pTextureBarriers = textureBarrier.data(); RenderAPI::Ptr()->ExecuteResourceBarriers(desc); } - void RenderPassNode::ForeachEdge(RenderPassEdgeIterFn fn) { - for (auto& edge : inEdges) { - fn(edge.resource, edge); + ResourceState FrameGraph::Resolve(Name name, TextureDesc& desc, ResourceState state) + { + ResourceState sourceState = ResourceState::UNDEFINED; + if (name == NameSurface) { + mSurface = desc; } - for (auto& edge : outEdges) { - fn(edge.resource, edge); + return sourceState; + } + ResourceState FrameGraph::Resolve(Name name, AttachmentDesc& desc, ResourceState state) + { + ResourceState sourceState = ResourceState::UNDEFINED; + if (name == NameSurface) { + sourceState = mSurface.state; + mSurface.state = state; + return sourceState; } + return sourceState; + } + ResourceState FrameGraph::Resolve(Name name, BufferDesc& desc, ResourceState state) + { + ResourceState sourceState = ResourceState::UNDEFINED; + return sourceState; } ImagePtr FrameGraph::ResolveTexture(TextureDesc desc) { - auto it = mResourcePool.find(desc); - if (it != mResourcePool.end()) { + auto it = mTexturePool.find(desc); + if (it != mTexturePool.end()) { return it->second; } ImagePtr image = RenderAPI::Ptr()->CreateTexture(desc); - mResourcePool.emplace(desc, image); + mTexturePool.emplace(desc, image); return image; } ImageViewPtr FrameGraph::ResolveTextureView(TextureViewDesc desc) { - auto it = mResourceViewPool.find(desc); - if (it != mResourceViewPool.end()) { + auto it = mTextureViewPool.find(desc); + if (it != mTextureViewPool.end()) { return it->second; } ImageViewPtr view = RenderAPI::Ptr()->CreateTextureView(desc); - mResourceViewPool.emplace(desc, view); + mTextureViewPool.emplace(desc, view); return view; } } diff --git a/engine/modules/engine/render/src/graph/frame_graph_builder.cpp b/engine/modules/engine/render/src/graph/frame_graph_builder.cpp index 72d9345..1ca6d59 100644 --- a/engine/modules/engine/render/src/graph/frame_graph_builder.cpp +++ b/engine/modules/engine/render/src/graph/frame_graph_builder.cpp @@ -60,13 +60,6 @@ namespace api { graph.mGraph.addEdge(node.ref, refEdge->source.ref); return *this; } - FrameGraph::RenderPassBuilder& FrameGraph::RenderPassBuilder::Present(const FrameGraphEdgePtr& refEdge, ResourceState state) - { - Write(refEdge, state); - graph.mNodes.push_back(node); - graph.AddPresent(refEdge); - return *this; - } FrameGraph::TextureBuilder& FrameGraph::TextureBuilder::Import(pmr::Name name, AttachmentDesc desc, ResourceState state) { edge->name = name; diff --git a/engine/modules/engine/render/src/graph/type.cpp b/engine/modules/engine/render/src/graph/type.cpp index 988d29b..0da64c1 100644 --- a/engine/modules/engine/render/src/graph/type.cpp +++ b/engine/modules/engine/render/src/graph/type.cpp @@ -1,51 +1,20 @@ #include "render/graph/type.h" #include "render/renderapi.h" namespace api { - void FrameGraphEdgePtr::Resolve(FrameGraph* graph) - { - if (!resource) { - Make(); - } - ImagePtr* imageptr; - if (resource->IsAttachment()) { - AttachmentDesc& desc = resource->CastTo(); - imageptr = &desc.image; - } - else if (resource->IsTexture()) { - TextureDesc& desc = resource->CastTo(); - imageptr = &desc.image; - } - if (*imageptr) { - return; - } - TextureDesc desc = graph->Resource(resource->name); - if (!desc.image) { - graph->ResolveTexture(desc); - } - else { - *imageptr = desc.image; - } - } void FrameGraphEdgePtr::ResolveView(FrameGraph* graph) { - if (!resource) { - Make(); - } if (resource->IsAttachment()) { AttachmentDesc& attach = resource->CastTo(); TextureViewDesc desc = attach.ToTextureView(); attach.imageView = graph->ResolveTextureView(desc); } } - FrameGraphNodePtr::FrameGraphNodePtr(GraphNodeRef ref, NodeType type) - : ref(ref), type(type) - { - node = new (FramePool()) RenderPassNode(); - node->executor = [&](FrameGraph& graph, RenderPassContext& ctx) { - this->Presnet(graph, ctx); - }; - } - void FrameGraphNodePtr::Presnet(FrameGraph&, RenderPassContext&) { - + void RenderPassNode::ForeachEdge(RenderPassEdgeIterFn fn) { + for (auto& edge : inEdges) { + fn(edge.resource, edge); + } + for (auto& edge : outEdges) { + fn(edge.resource, edge); + } } } diff --git a/engine/modules/engine/render/src/pass/demo_pass.cpp b/engine/modules/engine/render/src/pass/demo_pass.cpp index 0599582..83c95f9 100644 --- a/engine/modules/engine/render/src/pass/demo_pass.cpp +++ b/engine/modules/engine/render/src/pass/demo_pass.cpp @@ -9,20 +9,18 @@ namespace api { static RscHandle material; static RscHandle shader; static RscHandle mesh; - bool DemoPass::Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder) + void DemoPass::Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder) { AttachmentDesc surface{}; surface.FromTexture(graph.mSurface); surface.colorFormat = TinyImageFormat_B8G8R8A8_SRGB; surface.sampleCount = SAMPLE_COUNT_1; surface.dimension = TextureDimension::TEX_2D; - auto edge = graph.CreateTexture( - [=](FrameGraph& graph, FrameGraph::TextureBuilder& builder) { - builder.Import("surface", surface, ResourceState::COLOR_ATTACHMENT); - }); + auto edge = graph.CreateTextureBuild() + .Import(FrameGraph::NameSurface, surface, ResourceState::COLOR_ATTACHMENT) + .Edge(); builder.Name("MiniPass") - .Present(edge, edge.targetState); - return false; + .Write(edge, edge.targetState); } void DemoPass::Execute(FrameGraph& graph, RenderPassContext& ctx) { diff --git a/engine/modules/render/vulkan/include/vkn/vulkan_imgui.h b/engine/modules/render/vulkan/include/vkn/vulkan_imgui.h index 1a90e4e..fbcc436 100644 --- a/engine/modules/render/vulkan/include/vkn/vulkan_imgui.h +++ b/engine/modules/render/vulkan/include/vkn/vulkan_imgui.h @@ -1,11 +1,15 @@ #pragma once #include "render/imgui_system.h" +#include "render/graph/frame_graph.h" namespace vkn { + using api::FrameGraph; + using api::RenderPassContext; class VulkanImguiSystem : public api::ImguiSystem { + public: void Initialize() override; void Finalize() override; - void BeginEditorRender() override; - void EditorRender() override; - void EndEditorRender() override; + void Render(); + static void Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder); + static void Execute(FrameGraph&, RenderPassContext&); }; } \ No newline at end of file diff --git a/engine/modules/render/vulkan/src/vulkan_context.cpp b/engine/modules/render/vulkan/src/vulkan_context.cpp index 549d80c..8cf5276 100644 --- a/engine/modules/render/vulkan/src/vulkan_context.cpp +++ b/engine/modules/render/vulkan/src/vulkan_context.cpp @@ -61,7 +61,7 @@ namespace vkn { { vkEndCommandBuffer(surfaceCommand); VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT }; // 等待渲染阶段 - VkSemaphore waitSemaphores[] = { graphSemaphore }; + VkSemaphore waitSemaphores[] = { graphSemaphore ? graphSemaphore : surfaceSemaphore }; VkSemaphore signalSemaphores[] = { presentSemaphore };// 渲染完成信号量 VkSubmitInfo submitInfo{}; submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; diff --git a/engine/modules/render/vulkan/src/vulkan_imgui.cpp b/engine/modules/render/vulkan/src/vulkan_imgui.cpp index be45233..da96927 100644 --- a/engine/modules/render/vulkan/src/vulkan_imgui.cpp +++ b/engine/modules/render/vulkan/src/vulkan_imgui.cpp @@ -8,8 +8,10 @@ #include "vkn/wrapper/queue.h" #include "imgui/imgui_impl_vulkan.h" #include "imgui/imgui_impl_sdl2.h" +#include "event/event_system.h" #include "tinyimageformat/tinyimageformat_apis.h" namespace vkn { + using api::EventSystem; static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE; static VkRenderPass g_RenderPass = VK_NULL_HANDLE; static VkCommandPool g_CommandPool = VK_NULL_HANDLE; @@ -164,19 +166,27 @@ namespace vkn { auto& surfaces = window->Swapchain()->GetSurface(); //CreateFrameBuffer(API, renderPass, surfaces); //CreateCommandPool(backend.GetDevice().Ptr(), pQueue->QueueFamilyIndex(), surfaces.size()); + EventSystem::Ptr()->BeginRenderFrame.Subscribe(&VulkanImguiSystem::Render, this); + } void VulkanImguiSystem::Finalize() { } - void VulkanImguiSystem::BeginEditorRender() + void VulkanImguiSystem::Render() + { + if(false) + VulkanAPI::Ptr()->graph.AddRenderPass(); + } + void VulkanImguiSystem::Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder) + { + + } + void VulkanImguiSystem::Execute(FrameGraph&, RenderPassContext&) { ImGui_ImplVulkan_NewFrame(); ImGui_ImplSDL2_NewFrame(); ImGui::NewFrame(); - } - void VulkanImguiSystem::EditorRender() - { static float my_float = 0.5f; ImGui::Begin("Hello, ImGui!"); ImGui::Text("This is some useful text."); @@ -184,8 +194,10 @@ namespace vkn { ImGui::End(); ImGui::Render(); + + } - void VulkanImguiSystem::EndEditorRender() + void EndEditorRender() { /* VulkanAPI* API = VulkanAPI::Ptr(); diff --git a/engine/modules/render/vulkan/src/vulkan_window.cpp b/engine/modules/render/vulkan/src/vulkan_window.cpp index fc98f3d..e237a2c 100644 --- a/engine/modules/render/vulkan/src/vulkan_window.cpp +++ b/engine/modules/render/vulkan/src/vulkan_window.cpp @@ -70,7 +70,7 @@ namespace vkn { desc.width = args.width; desc.height = args.height; desc.format = TinyImageFormat_FromVkFormat((TinyImageFormat_VkFormat)args.imageFormat); - desc.state = ResourceState::PRESENT; + desc.state = ResourceState::UNDEFINED; desc.sampleCount = SampleCount::SAMPLE_COUNT_1; desc.arraySize = 1; desc.mipLevel = 1; diff --git a/game/zworld/src/zworld.cpp b/game/zworld/src/zworld.cpp index ebfc9a1..03247fb 100644 --- a/game/zworld/src/zworld.cpp +++ b/game/zworld/src/zworld.cpp @@ -27,7 +27,7 @@ void ZWorldModule::OnLoad(int argc, char** argv) #ifdef WITH_EDITOR //绑定窗口交互 ImGui_ImplSDL2_InitForVulkan(window->GetPtr()); #endif - EventSystem::Ptr()->BeginRenderFrame.Subscribe("zworld", []() { + EventSystem::Ptr()->BeginRenderFrame.Subscribe(mInfo.name, []() { API->graph.AddRenderPass(); }); }