update
This commit is contained in:
parent
d814786d26
commit
9e9fab97f4
@ -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:
|
||||
|
||||
@ -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);
|
||||
};
|
||||
}
|
||||
@ -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();
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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&)
|
||||
{
|
||||
|
||||
@ -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];
|
||||
|
||||
Loading…
Reference in New Issue
Block a user