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:
TextureDesc mSurface;
table<Name, TextureDesc> mResourceTable;
table<Name, TextureDesc> mResourceTable;
lemon::ListGraph mGraph;
pmr::vector<FrameGraphNodePtr> mNodes{FramePool()};
public:

View File

@ -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<Texture> handle);
FrameGraph::TextureBuilder& Import(ImagePtr& ptr, AttachmentDesc desc, ResourceState state);
};
}

View File

@ -40,6 +40,7 @@ namespace api {
Name name;
ResourceState sourceState;
Resource resource;
ImagePtr image;
FrameGraphNodePtr source;
pmr::vector<FrameGraphNodePtr> targets{ FramePool() };
template<typename T>
@ -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();

View File

@ -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.

View File

@ -81,6 +81,16 @@ namespace api {
pmr::vector<BufferBarrier> bufferBarrier{FramePool()};
pmr::vector<TextureBarrier> 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<TextureDesc>();
}
else {
auto& attach = edge->CastTo<AttachmentDesc>();
barrier.mTexture = attach.ToTexture();
}
textureBarrier.push_back(barrier);
}
});

View File

@ -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<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;
}
}

View File

@ -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&)
{

View File

@ -82,7 +82,7 @@ namespace vkn {
pmr::vector<VkImageMemoryBarrier> 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];