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