|
@@ -7,6 +7,7 @@
|
|
|
#include <AnKi/Renderer/Renderer.h>
|
|
#include <AnKi/Renderer/Renderer.h>
|
|
|
#include <AnKi/Renderer/GBuffer.h>
|
|
#include <AnKi/Renderer/GBuffer.h>
|
|
|
#include <AnKi/Renderer/ClusterBinning2.h>
|
|
#include <AnKi/Renderer/ClusterBinning2.h>
|
|
|
|
|
+#include <AnKi/Util/Tracer.h>
|
|
|
|
|
|
|
|
namespace anki {
|
|
namespace anki {
|
|
|
|
|
|
|
@@ -47,6 +48,8 @@ Error GBufferPost::initInternal()
|
|
|
|
|
|
|
|
void GBufferPost::populateRenderGraph(RenderingContext& ctx)
|
|
void GBufferPost::populateRenderGraph(RenderingContext& ctx)
|
|
|
{
|
|
{
|
|
|
|
|
+ ANKI_TRACE_SCOPED_EVENT(GBufferPost);
|
|
|
|
|
+
|
|
|
if(GpuSceneArrays::Decal::getSingleton().getElementCount() == 0)
|
|
if(GpuSceneArrays::Decal::getSingleton().getElementCount() == 0)
|
|
|
{
|
|
{
|
|
|
// If there are no decals don't bother
|
|
// If there are no decals don't bother
|
|
@@ -59,50 +62,45 @@ void GBufferPost::populateRenderGraph(RenderingContext& ctx)
|
|
|
GraphicsRenderPassDescription& rpass = rgraph.newGraphicsRenderPass("GBuffPost");
|
|
GraphicsRenderPassDescription& rpass = rgraph.newGraphicsRenderPass("GBuffPost");
|
|
|
|
|
|
|
|
rpass.setWork([this](RenderPassWorkContext& rgraphCtx) {
|
|
rpass.setWork([this](RenderPassWorkContext& rgraphCtx) {
|
|
|
- run(rgraphCtx);
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
|
|
|
|
|
|
|
|
- rpass.setFramebufferInfo(m_fbDescr, {getRenderer().getGBuffer().getColorRt(0), getRenderer().getGBuffer().getColorRt(1)});
|
|
|
|
|
|
|
+ cmdb.setViewport(0, 0, getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y());
|
|
|
|
|
+ cmdb.bindShaderProgram(m_grProg.get());
|
|
|
|
|
|
|
|
- rpass.newTextureDependency(getRenderer().getGBuffer().getColorRt(0), TextureUsageBit::kAllFramebuffer);
|
|
|
|
|
- rpass.newTextureDependency(getRenderer().getGBuffer().getColorRt(1), TextureUsageBit::kAllFramebuffer);
|
|
|
|
|
- rpass.newTextureDependency(getRenderer().getGBuffer().getDepthRt(), TextureUsageBit::kSampledFragment,
|
|
|
|
|
- TextureSubresourceInfo(DepthStencilAspectBit::kDepth));
|
|
|
|
|
-
|
|
|
|
|
- rpass.newBufferDependency(getRenderer().getClusterBinning2().getClustersBufferHandle(), BufferUsageBit::kStorageFragmentRead);
|
|
|
|
|
- rpass.newBufferDependency(getRenderer().getClusterBinning2().getPackedObjectsBufferHandle(GpuSceneNonRenderableObjectType::kDecal),
|
|
|
|
|
- BufferUsageBit::kStorageFragmentRead);
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ cmdb.setBlendFactors(0, BlendFactor::kOne, BlendFactor::kSrcAlpha, BlendFactor::kZero, BlendFactor::kOne);
|
|
|
|
|
+ cmdb.setBlendFactors(1, BlendFactor::kOne, BlendFactor::kSrcAlpha, BlendFactor::kZero, BlendFactor::kOne);
|
|
|
|
|
|
|
|
-void GBufferPost::run(RenderPassWorkContext& rgraphCtx)
|
|
|
|
|
-{
|
|
|
|
|
- CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
|
|
|
|
|
|
|
+ // Bind all
|
|
|
|
|
+ cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
|
|
|
|
|
|
|
|
- cmdb.setViewport(0, 0, getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y());
|
|
|
|
|
- cmdb.bindShaderProgram(m_grProg.get());
|
|
|
|
|
|
|
+ rgraphCtx.bindTexture(0, 1, getRenderer().getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::kDepth));
|
|
|
|
|
|
|
|
- cmdb.setBlendFactors(0, BlendFactor::kOne, BlendFactor::kSrcAlpha, BlendFactor::kZero, BlendFactor::kOne);
|
|
|
|
|
- cmdb.setBlendFactors(1, BlendFactor::kOne, BlendFactor::kSrcAlpha, BlendFactor::kZero, BlendFactor::kOne);
|
|
|
|
|
|
|
+ cmdb.bindSampler(0, 2, getRenderer().getSamplers().m_trilinearRepeat.get());
|
|
|
|
|
|
|
|
- // Bind all
|
|
|
|
|
- cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
|
|
|
|
|
|
|
+ cmdb.bindUniformBuffer(0, 3, getRenderer().getClusterBinning2().getClusteredShadingUniforms());
|
|
|
|
|
+ cmdb.bindStorageBuffer(0, 4, getRenderer().getClusterBinning2().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kDecal));
|
|
|
|
|
+ cmdb.bindStorageBuffer(0, 5, getRenderer().getClusterBinning2().getClustersBuffer());
|
|
|
|
|
|
|
|
- rgraphCtx.bindTexture(0, 1, getRenderer().getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::kDepth));
|
|
|
|
|
|
|
+ cmdb.bindAllBindless(1);
|
|
|
|
|
|
|
|
- cmdb.bindSampler(0, 2, getRenderer().getSamplers().m_trilinearRepeat.get());
|
|
|
|
|
|
|
+ // Draw
|
|
|
|
|
+ cmdb.draw(PrimitiveTopology::kTriangles, 3);
|
|
|
|
|
|
|
|
- cmdb.bindUniformBuffer(0, 3, getRenderer().getClusterBinning2().getClusteredShadingUniforms());
|
|
|
|
|
- cmdb.bindStorageBuffer(0, 4, getRenderer().getClusterBinning2().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kDecal));
|
|
|
|
|
- cmdb.bindStorageBuffer(0, 5, getRenderer().getClusterBinning2().getClustersBuffer());
|
|
|
|
|
|
|
+ // Restore state
|
|
|
|
|
+ cmdb.setBlendFactors(0, BlendFactor::kOne, BlendFactor::kZero);
|
|
|
|
|
+ cmdb.setBlendFactors(1, BlendFactor::kOne, BlendFactor::kZero);
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
- cmdb.bindAllBindless(1);
|
|
|
|
|
|
|
+ rpass.setFramebufferInfo(m_fbDescr, {getRenderer().getGBuffer().getColorRt(0), getRenderer().getGBuffer().getColorRt(1)});
|
|
|
|
|
|
|
|
- // Draw
|
|
|
|
|
- cmdb.draw(PrimitiveTopology::kTriangles, 3);
|
|
|
|
|
|
|
+ rpass.newTextureDependency(getRenderer().getGBuffer().getColorRt(0), TextureUsageBit::kAllFramebuffer);
|
|
|
|
|
+ rpass.newTextureDependency(getRenderer().getGBuffer().getColorRt(1), TextureUsageBit::kAllFramebuffer);
|
|
|
|
|
+ rpass.newTextureDependency(getRenderer().getGBuffer().getDepthRt(), TextureUsageBit::kSampledFragment,
|
|
|
|
|
+ TextureSubresourceInfo(DepthStencilAspectBit::kDepth));
|
|
|
|
|
|
|
|
- // Restore state
|
|
|
|
|
- cmdb.setBlendFactors(0, BlendFactor::kOne, BlendFactor::kZero);
|
|
|
|
|
- cmdb.setBlendFactors(1, BlendFactor::kOne, BlendFactor::kZero);
|
|
|
|
|
|
|
+ rpass.newBufferDependency(getRenderer().getClusterBinning2().getClustersBufferHandle(), BufferUsageBit::kStorageFragmentRead);
|
|
|
|
|
+ rpass.newBufferDependency(getRenderer().getClusterBinning2().getPackedObjectsBufferHandle(GpuSceneNonRenderableObjectType::kDecal),
|
|
|
|
|
+ BufferUsageBit::kStorageFragmentRead);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
} // end namespace anki
|
|
} // end namespace anki
|