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 c2d058f..0a681ec 100644 --- a/engine/modules/engine/render/include/render/graph/frame_graph.h +++ b/engine/modules/engine/render/include/render/graph/frame_graph.h @@ -10,6 +10,7 @@ namespace api { public: TextureDesc mSurface; table mResourceTable; + table mResourceTable; lemon::ListGraph mGraph; pmr::vector mNodes{FramePool()}; public: diff --git a/engine/modules/engine/render/include/render/graph/frame_graph_builder.h b/engine/modules/engine/render/include/render/graph/frame_graph_builder.h index e239648..cdfc6a1 100644 --- a/engine/modules/engine/render/include/render/graph/frame_graph_builder.h +++ b/engine/modules/engine/render/include/render/graph/frame_graph_builder.h @@ -14,6 +14,7 @@ namespace api { FrameGraph::RenderPassBuilder& Write(BufferDesc desc, ResourceState state); FrameGraph::RenderPassBuilder& Attach(AttachmentDesc desc, ResourceState state); FrameGraph::RenderPassBuilder& Read(const FrameGraphEdgePtr& edge); + FrameGraph::RenderPassBuilder& Write(const FrameGraphEdgePtr& edge); }; struct FrameGraph::TextureBuilder { FrameGraph& graph; @@ -21,6 +22,6 @@ namespace api { public: TextureBuilder(FrameGraph* graph, FrameGraphEdgePtr& edge)noexcept : graph(*graph), edge(edge) {}; FrameGraph::TextureBuilder& Name(pmr::Name name); - FrameGraph::TextureBuilder& Import(RscHandle handle); + FrameGraph::TextureBuilder& Import(ImagePtr& ptr, AttachmentDesc desc, ResourceState state); }; } \ 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 8902cf3..f62bdd9 100644 --- a/engine/modules/engine/render/include/render/graph/type.h +++ b/engine/modules/engine/render/include/render/graph/type.h @@ -40,6 +40,7 @@ namespace api { Name name; ResourceState sourceState; Resource resource; + ImagePtr image; FrameGraphNodePtr source; pmr::vector targets{ FramePool() }; template @@ -57,9 +58,9 @@ namespace api { } }; struct FrameGraphEdgePtr { - uint8_t isImport : 1; ResourceState targetState; FrameResource* resource; + ImagePtr* ppImage; FrameGraphEdgePtr() = default; FrameResource* Make() { resource = new (FramePool()) FrameResource(); diff --git a/engine/modules/engine/render/include/render/type.h b/engine/modules/engine/render/include/render/type.h index 82f7dcf..4144159 100644 --- a/engine/modules/engine/render/include/render/type.h +++ b/engine/modules/engine/render/include/render/type.h @@ -26,6 +26,9 @@ namespace api { static AttachmentDesc Make() { return {}; } + TextureDesc ToTexture() { + return TextureDesc{image}; + } }; enum class TargetBufferFlags : uint32_t { NONE = 0x0u, //!< No buffer selected. diff --git a/engine/modules/engine/render/src/graph/frame_graph.cpp b/engine/modules/engine/render/src/graph/frame_graph.cpp index 9e4e656..1ed2199 100644 --- a/engine/modules/engine/render/src/graph/frame_graph.cpp +++ b/engine/modules/engine/render/src/graph/frame_graph.cpp @@ -81,6 +81,16 @@ namespace api { pmr::vector bufferBarrier{FramePool()}; pmr::vector textureBarrier{ FramePool() }; node->ForeachEdge([&](FrameResource* resource, FrameGraphEdgePtr edge) { + if (edge) { + if (!edge->image) { + if (edge.ppImage) { + edge->image = *edge.ppImage; + } + else { + edge->image = Resource(""); + } + } + } if (!edge || edge.targetState == resource->sourceState) { return; } @@ -94,6 +104,13 @@ namespace api { TextureBarrier barrier{}; barrier.mSrcState = resource->sourceState; barrier.mDstState = edge.targetState; + if (edge->IsTexture()) { + barrier.mTexture = edge->CastTo(); + } + else { + auto& attach = edge->CastTo(); + barrier.mTexture = attach.ToTexture(); + } textureBarrier.push_back(barrier); } }); 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 926d6dd..e21a737 100644 --- a/engine/modules/engine/render/src/graph/frame_graph_builder.cpp +++ b/engine/modules/engine/render/src/graph/frame_graph_builder.cpp @@ -18,6 +18,7 @@ namespace api { resource = edge.Make(); resource->source = node; resource->resource = desc; + edge->image = desc.image; node->inEdges.push_back(edge); return *this; } @@ -40,6 +41,7 @@ namespace api { resource = edge.Make(); resource->source = node; resource->resource = desc; + edge->image = desc.image; node->outEdges.push_back(edge); return *this; } @@ -53,14 +55,26 @@ namespace api { graph.mGraph.addEdge(edge->source.ref, node.ref); return *this; } + FrameGraph::RenderPassBuilder& FrameGraph::RenderPassBuilder::Write(const FrameGraphEdgePtr& edge) + { + if (!edge) { return *this; } + node->outEdges.emplace_back(edge); + edge->targets.emplace_back(node); + if (edge->source) + graph.mGraph.addEdge(node.ref, edge->source.ref); + return *this; + } FrameGraph::TextureBuilder& FrameGraph::TextureBuilder::Name(pmr::Name name) { edge->name = name; return *this; } - FrameGraph::TextureBuilder& FrameGraph::TextureBuilder::Import(RscHandle handle) + FrameGraph::TextureBuilder& FrameGraph::TextureBuilder::Import(ImagePtr& ptr, AttachmentDesc desc, ResourceState state) { - edge.isImport = true; + edge.ppImage = &ptr; + edge.targetState = state; + edge->resource = desc; + edge->image = desc.image; return *this; } } \ No newline at end of file diff --git a/engine/modules/engine/render/src/pass/demo_pass.cpp b/engine/modules/engine/render/src/pass/demo_pass.cpp index 4ba82c4..de3fa6a 100644 --- a/engine/modules/engine/render/src/pass/demo_pass.cpp +++ b/engine/modules/engine/render/src/pass/demo_pass.cpp @@ -4,10 +4,14 @@ namespace api { void DemoPass::Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder) { AttachmentDesc surface{}; - surface.image = graph.mSurface.image; surface.colorFormat = TinyImageFormat_B8G8R8_UNORM; + auto edge = graph.CreateTexture( + [=](FrameGraph& graph, FrameGraph::TextureBuilder& builder) { + builder.Name("import") + .Import(graph.mSurface, surface, ResourceState::PRESENT); + }); builder.Name("MiniPass") - .Attach(surface, ResourceState::PRESENT); + .Write(edge); } void DemoPass::Execute(FrameGraph&, RenderPassContext&) { diff --git a/engine/modules/render/vulkan/src/vulkan_api.cpp b/engine/modules/render/vulkan/src/vulkan_api.cpp index 74a93f0..fc554a3 100644 --- a/engine/modules/render/vulkan/src/vulkan_api.cpp +++ b/engine/modules/render/vulkan/src/vulkan_api.cpp @@ -82,7 +82,7 @@ namespace vkn { pmr::vector imageBarriers{ FramePool() }; imageBarriers.reserve(desc.textureBarriersCount); using api::ResourceState; - VkPipelineStageFlags srcStageMask, dstStageMask; + VkPipelineStageFlags srcStageMask = 0, dstStageMask = 0; for (uint32_t i = 0; i < desc.textureBarriersCount; i++) { auto& barrier = desc.pTextureBarriers[i];