Trying new meshlet gen approach
This commit is contained in:
@@ -194,7 +194,7 @@ void BasePass::publishOutputs()
|
||||
void BasePass::createRenderPass()
|
||||
{
|
||||
depthAttachment = resources->requestRenderTarget("DEPTHPREPASS_DEPTH");
|
||||
depthAttachment.setLoadOp(Gfx::SE_ATTACHMENT_LOAD_OP_LOAD);
|
||||
depthAttachment.setLoadOp(Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR);
|
||||
depthAttachment.setInitialLayout(Gfx::SE_IMAGE_LAYOUT_GENERAL);
|
||||
depthAttachment.setFinalLayout(Gfx::SE_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
||||
Gfx::RenderTargetLayout layout = Gfx::RenderTargetLayout{
|
||||
|
||||
@@ -177,6 +177,14 @@ void DepthPrepass::createRenderPass()
|
||||
.dstStage = Gfx::SE_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
||||
.srcAccess = Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
|
||||
.dstAccess = Gfx::SE_ACCESS_SHADER_READ_BIT,
|
||||
},
|
||||
{
|
||||
.srcSubpass = 0,
|
||||
.dstSubpass = ~0U,
|
||||
.srcStage = Gfx::SE_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
|
||||
.dstStage = Gfx::SE_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,
|
||||
.srcAccess = Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
|
||||
.dstAccess = Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT,
|
||||
}
|
||||
};
|
||||
renderPass = graphics->createRenderPass(std::move(layout), dependency, viewport);
|
||||
|
||||
@@ -3,93 +3,54 @@
|
||||
|
||||
namespace Seele
|
||||
{
|
||||
template<typename... RenderPasses>
|
||||
class RenderGraph;
|
||||
|
||||
template<>
|
||||
class RenderGraph<>
|
||||
class RenderGraph
|
||||
{
|
||||
public:
|
||||
RenderGraph(PRenderGraphResources) {}
|
||||
void updatePassData() {}
|
||||
protected:
|
||||
void setViewport(Gfx::PViewport) {}
|
||||
void createRenderPass() {}
|
||||
void beginFrame(const Component::Camera&) {}
|
||||
void render() {}
|
||||
void endFrame() {}
|
||||
};
|
||||
|
||||
template<typename This, typename... Rest>
|
||||
class RenderGraph<This, Rest...> : private RenderGraph<Rest...>
|
||||
{
|
||||
public:
|
||||
RenderGraph(PRenderGraphResources resources, This pass, Rest... rest)
|
||||
: RenderGraph<Rest...>(resources, std::move(rest)...)
|
||||
, resources(resources)
|
||||
, rp(std::move(pass))
|
||||
RenderGraph()
|
||||
{
|
||||
rp.setResources(resources);
|
||||
res = new RenderGraphResources();
|
||||
}
|
||||
template<typename PassData, typename... OtherData>
|
||||
void updatePassData(PassData passData, OtherData... otherData)
|
||||
{
|
||||
rp.updateViewFrame(std::move(passData));
|
||||
RenderGraph<Rest...>::updatePassData(otherData...);
|
||||
void addPass(ORenderPass pass)
|
||||
{
|
||||
pass->setResources(res);
|
||||
passes.add(std::move(pass));
|
||||
}
|
||||
void updateViewport(Gfx::PViewport viewport)
|
||||
void setViewport(Gfx::PViewport viewport)
|
||||
{
|
||||
setViewport(viewport);
|
||||
createRenderPass();
|
||||
for (auto& pass : passes)
|
||||
{
|
||||
pass->setViewport(viewport);
|
||||
}
|
||||
}
|
||||
void createRenderPass()
|
||||
{
|
||||
for (auto& pass : passes)
|
||||
{
|
||||
pass->publishOutputs();
|
||||
}
|
||||
for (auto& pass : passes)
|
||||
{
|
||||
pass->createRenderPass();
|
||||
}
|
||||
}
|
||||
void render(const Component::Camera& cam)
|
||||
{
|
||||
beginFrame(cam);
|
||||
render();
|
||||
endFrame();
|
||||
}
|
||||
protected:
|
||||
void setViewport(Gfx::PViewport viewport)
|
||||
{
|
||||
rp.setViewport(viewport);
|
||||
RenderGraph<Rest...>::setViewport(viewport);
|
||||
}
|
||||
void createRenderPass()
|
||||
{
|
||||
rp.createRenderPass();
|
||||
RenderGraph<Rest...>::createRenderPass();
|
||||
}
|
||||
void beginFrame(const Component::Camera& cam)
|
||||
{
|
||||
rp.beginFrame(cam);
|
||||
RenderGraph<Rest...>::beginFrame(cam);
|
||||
}
|
||||
void render()
|
||||
{
|
||||
rp.render();
|
||||
RenderGraph<Rest...>::render();
|
||||
}
|
||||
void endFrame()
|
||||
{
|
||||
rp.endFrame();
|
||||
RenderGraph<Rest...>::endFrame();
|
||||
for (auto& pass : passes)
|
||||
{
|
||||
pass->beginFrame(cam);
|
||||
}
|
||||
for (auto& pass : passes)
|
||||
{
|
||||
pass->render();
|
||||
}
|
||||
for (auto& pass : passes)
|
||||
{
|
||||
pass->endFrame();
|
||||
}
|
||||
}
|
||||
private:
|
||||
PRenderGraphResources resources;
|
||||
This rp;
|
||||
};
|
||||
|
||||
class RenderGraphBuilder
|
||||
{
|
||||
public:
|
||||
template<typename... RenderPasses>
|
||||
static RenderGraph<RenderPasses...> build(RenderPasses... renderPasses)
|
||||
{
|
||||
PRenderGraphResources resources = new RenderGraphResources();
|
||||
return RenderGraph<RenderPasses...>(resources, std::move(renderPasses)...);
|
||||
}
|
||||
private:
|
||||
RenderGraphBuilder() = delete;
|
||||
PRenderGraphResources res;
|
||||
List<ORenderPass> passes;
|
||||
};
|
||||
|
||||
} // namespace Seele
|
||||
|
||||
@@ -44,6 +44,7 @@ protected:
|
||||
Gfx::PViewport viewport;
|
||||
PScene scene;
|
||||
};
|
||||
DEFINE_REF(RenderPass)
|
||||
template<typename RP>
|
||||
concept RenderPassType = std::derived_from<RP, RenderPass>;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user