This commit is contained in:
ouczbs 2024-09-30 17:56:12 +08:00
parent d814786d26
commit 9e9fab97f4
8 changed files with 48 additions and 7 deletions

View File

@ -10,6 +10,7 @@ namespace api {
public: public:
TextureDesc mSurface; TextureDesc mSurface;
table<Name, TextureDesc> mResourceTable; table<Name, TextureDesc> mResourceTable;
table<Name, TextureDesc> mResourceTable;
lemon::ListGraph mGraph; lemon::ListGraph mGraph;
pmr::vector<FrameGraphNodePtr> mNodes{FramePool()}; pmr::vector<FrameGraphNodePtr> mNodes{FramePool()};
public: public:

View File

@ -14,6 +14,7 @@ namespace api {
FrameGraph::RenderPassBuilder& Write(BufferDesc desc, ResourceState state); FrameGraph::RenderPassBuilder& Write(BufferDesc desc, ResourceState state);
FrameGraph::RenderPassBuilder& Attach(AttachmentDesc desc, ResourceState state); FrameGraph::RenderPassBuilder& Attach(AttachmentDesc desc, ResourceState state);
FrameGraph::RenderPassBuilder& Read(const FrameGraphEdgePtr& edge); FrameGraph::RenderPassBuilder& Read(const FrameGraphEdgePtr& edge);
FrameGraph::RenderPassBuilder& Write(const FrameGraphEdgePtr& edge);
}; };
struct FrameGraph::TextureBuilder { struct FrameGraph::TextureBuilder {
FrameGraph& graph; FrameGraph& graph;
@ -21,6 +22,6 @@ namespace api {
public: public:
TextureBuilder(FrameGraph* graph, FrameGraphEdgePtr& edge)noexcept : graph(*graph), edge(edge) {}; TextureBuilder(FrameGraph* graph, FrameGraphEdgePtr& edge)noexcept : graph(*graph), edge(edge) {};
FrameGraph::TextureBuilder& Name(pmr::Name name); FrameGraph::TextureBuilder& Name(pmr::Name name);
FrameGraph::TextureBuilder& Import(RscHandle<Texture> handle); FrameGraph::TextureBuilder& Import(ImagePtr& ptr, AttachmentDesc desc, ResourceState state);
}; };
} }

View File

@ -40,6 +40,7 @@ namespace api {
Name name; Name name;
ResourceState sourceState; ResourceState sourceState;
Resource resource; Resource resource;
ImagePtr image;
FrameGraphNodePtr source; FrameGraphNodePtr source;
pmr::vector<FrameGraphNodePtr> targets{ FramePool() }; pmr::vector<FrameGraphNodePtr> targets{ FramePool() };
template<typename T> template<typename T>
@ -57,9 +58,9 @@ namespace api {
} }
}; };
struct FrameGraphEdgePtr { struct FrameGraphEdgePtr {
uint8_t isImport : 1;
ResourceState targetState; ResourceState targetState;
FrameResource* resource; FrameResource* resource;
ImagePtr* ppImage;
FrameGraphEdgePtr() = default; FrameGraphEdgePtr() = default;
FrameResource* Make() { FrameResource* Make() {
resource = new (FramePool()) FrameResource(); resource = new (FramePool()) FrameResource();

View File

@ -26,6 +26,9 @@ namespace api {
static AttachmentDesc Make() { static AttachmentDesc Make() {
return {}; return {};
} }
TextureDesc ToTexture() {
return TextureDesc{image};
}
}; };
enum class TargetBufferFlags : uint32_t { enum class TargetBufferFlags : uint32_t {
NONE = 0x0u, //!< No buffer selected. NONE = 0x0u, //!< No buffer selected.

View File

@ -81,6 +81,16 @@ namespace api {
pmr::vector<BufferBarrier> bufferBarrier{FramePool()}; pmr::vector<BufferBarrier> bufferBarrier{FramePool()};
pmr::vector<TextureBarrier> textureBarrier{ FramePool() }; pmr::vector<TextureBarrier> textureBarrier{ FramePool() };
node->ForeachEdge([&](FrameResource* resource, FrameGraphEdgePtr edge) { 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) { if (!edge || edge.targetState == resource->sourceState) {
return; return;
} }
@ -94,6 +104,13 @@ namespace api {
TextureBarrier barrier{}; TextureBarrier barrier{};
barrier.mSrcState = resource->sourceState; barrier.mSrcState = resource->sourceState;
barrier.mDstState = edge.targetState; barrier.mDstState = edge.targetState;
if (edge->IsTexture()) {
barrier.mTexture = edge->CastTo<TextureDesc>();
}
else {
auto& attach = edge->CastTo<AttachmentDesc>();
barrier.mTexture = attach.ToTexture();
}
textureBarrier.push_back(barrier); textureBarrier.push_back(barrier);
} }
}); });

View File

@ -18,6 +18,7 @@ namespace api {
resource = edge.Make(); resource = edge.Make();
resource->source = node; resource->source = node;
resource->resource = desc; resource->resource = desc;
edge->image = desc.image;
node->inEdges.push_back(edge); node->inEdges.push_back(edge);
return *this; return *this;
} }
@ -40,6 +41,7 @@ namespace api {
resource = edge.Make(); resource = edge.Make();
resource->source = node; resource->source = node;
resource->resource = desc; resource->resource = desc;
edge->image = desc.image;
node->outEdges.push_back(edge); node->outEdges.push_back(edge);
return *this; return *this;
} }
@ -53,14 +55,26 @@ namespace api {
graph.mGraph.addEdge(edge->source.ref, node.ref); graph.mGraph.addEdge(edge->source.ref, node.ref);
return *this; 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) FrameGraph::TextureBuilder& FrameGraph::TextureBuilder::Name(pmr::Name name)
{ {
edge->name = name; edge->name = name;
return *this; return *this;
} }
FrameGraph::TextureBuilder& FrameGraph::TextureBuilder::Import(RscHandle<Texture> 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; return *this;
} }
} }

View File

@ -4,10 +4,14 @@ namespace api {
void DemoPass::Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder) void DemoPass::Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder)
{ {
AttachmentDesc surface{}; AttachmentDesc surface{};
surface.image = graph.mSurface.image;
surface.colorFormat = TinyImageFormat_B8G8R8_UNORM; 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") builder.Name("MiniPass")
.Attach(surface, ResourceState::PRESENT); .Write(edge);
} }
void DemoPass::Execute(FrameGraph&, RenderPassContext&) void DemoPass::Execute(FrameGraph&, RenderPassContext&)
{ {

View File

@ -82,7 +82,7 @@ namespace vkn {
pmr::vector<VkImageMemoryBarrier> imageBarriers{ FramePool() }; pmr::vector<VkImageMemoryBarrier> imageBarriers{ FramePool() };
imageBarriers.reserve(desc.textureBarriersCount); imageBarriers.reserve(desc.textureBarriersCount);
using api::ResourceState; using api::ResourceState;
VkPipelineStageFlags srcStageMask, dstStageMask; VkPipelineStageFlags srcStageMask = 0, dstStageMask = 0;
for (uint32_t i = 0; i < desc.textureBarriersCount; i++) for (uint32_t i = 0; i < desc.textureBarriersCount; i++)
{ {
auto& barrier = desc.pTextureBarriers[i]; auto& barrier = desc.pTextureBarriers[i];