|
@@ -18,68 +18,6 @@ GBuffer::~GBuffer()
|
|
|
{
|
|
{
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-Error GBuffer::createRt()
|
|
|
|
|
-{
|
|
|
|
|
- m_depthRt = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
|
|
|
|
|
- m_r->getHeight(),
|
|
|
|
|
- GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT,
|
|
|
|
|
- TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE
|
|
|
|
|
- | TextureUsageBit::GENERATE_MIPMAPS,
|
|
|
|
|
- SamplingFilter::NEAREST,
|
|
|
|
|
- 1,
|
|
|
|
|
- "gbuffdepth"));
|
|
|
|
|
-
|
|
|
|
|
- m_rt0 = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
|
|
|
|
|
- m_r->getHeight(),
|
|
|
|
|
- MS_COLOR_ATTACHMENT_PIXEL_FORMATS[0],
|
|
|
|
|
- TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
|
|
|
- SamplingFilter::NEAREST,
|
|
|
|
|
- 1,
|
|
|
|
|
- "gbuffrt0"));
|
|
|
|
|
-
|
|
|
|
|
- m_rt1 = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
|
|
|
|
|
- m_r->getHeight(),
|
|
|
|
|
- MS_COLOR_ATTACHMENT_PIXEL_FORMATS[1],
|
|
|
|
|
- TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
|
|
|
- SamplingFilter::NEAREST,
|
|
|
|
|
- 1,
|
|
|
|
|
- "gbuffrt1"));
|
|
|
|
|
-
|
|
|
|
|
- m_rt2 = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
|
|
|
|
|
- m_r->getHeight(),
|
|
|
|
|
- MS_COLOR_ATTACHMENT_PIXEL_FORMATS[2],
|
|
|
|
|
- TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE
|
|
|
|
|
- | TextureUsageBit::GENERATE_MIPMAPS,
|
|
|
|
|
- SamplingFilter::NEAREST,
|
|
|
|
|
- 1,
|
|
|
|
|
- "gbuffrt2"));
|
|
|
|
|
-
|
|
|
|
|
- AttachmentLoadOperation loadop = AttachmentLoadOperation::DONT_CARE;
|
|
|
|
|
-#if ANKI_EXTRA_CHECKS
|
|
|
|
|
- loadop = AttachmentLoadOperation::CLEAR;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
- FramebufferInitInfo fbInit("gbuffer");
|
|
|
|
|
- fbInit.m_colorAttachmentCount = GBUFFER_COLOR_ATTACHMENT_COUNT;
|
|
|
|
|
- fbInit.m_colorAttachments[0].m_texture = m_rt0;
|
|
|
|
|
- fbInit.m_colorAttachments[0].m_loadOperation = loadop;
|
|
|
|
|
- fbInit.m_colorAttachments[0].m_clearValue.m_colorf = {{1.0, 0.0, 0.0, 0.0}};
|
|
|
|
|
- fbInit.m_colorAttachments[1].m_texture = m_rt1;
|
|
|
|
|
- fbInit.m_colorAttachments[1].m_loadOperation = loadop;
|
|
|
|
|
- fbInit.m_colorAttachments[1].m_clearValue.m_colorf = {{0.0, 1.0, 0.0, 0.0}};
|
|
|
|
|
- fbInit.m_colorAttachments[2].m_texture = m_rt2;
|
|
|
|
|
- fbInit.m_colorAttachments[2].m_loadOperation = loadop;
|
|
|
|
|
- fbInit.m_colorAttachments[2].m_clearValue.m_colorf = {{0.0, 0.0, 1.0, 0.0}};
|
|
|
|
|
- fbInit.m_depthStencilAttachment.m_texture = m_depthRt;
|
|
|
|
|
- fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::CLEAR;
|
|
|
|
|
- fbInit.m_depthStencilAttachment.m_clearValue.m_depthStencil.m_depth = 1.0;
|
|
|
|
|
- fbInit.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::DEPTH;
|
|
|
|
|
-
|
|
|
|
|
- m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
|
|
|
|
|
-
|
|
|
|
|
- return Error::NONE;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
Error GBuffer::init(const ConfigSet& initializer)
|
|
Error GBuffer::init(const ConfigSet& initializer)
|
|
|
{
|
|
{
|
|
|
ANKI_R_LOGI("Initializing g-buffer pass");
|
|
ANKI_R_LOGI("Initializing g-buffer pass");
|
|
@@ -95,11 +33,49 @@ Error GBuffer::init(const ConfigSet& initializer)
|
|
|
|
|
|
|
|
Error GBuffer::initInternal(const ConfigSet& initializer)
|
|
Error GBuffer::initInternal(const ConfigSet& initializer)
|
|
|
{
|
|
{
|
|
|
- ANKI_CHECK(createRt());
|
|
|
|
|
|
|
+ // RT descrs
|
|
|
|
|
+ m_depthRtDescr = m_r->create2DRenderTargetDescription(m_r->getWidth(),
|
|
|
|
|
+ m_r->getHeight(),
|
|
|
|
|
+ GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT,
|
|
|
|
|
+ TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
|
|
|
|
|
+ SamplingFilter::NEAREST,
|
|
|
|
|
+ "GBuffer depth");
|
|
|
|
|
+ m_depthRtDescr.bake();
|
|
|
|
|
+
|
|
|
|
|
+ static const char* rtNames[GBUFFER_COLOR_ATTACHMENT_COUNT] = {"GBuffer rt0", "GBuffer rt1", "GBuffer rt2"};
|
|
|
|
|
+ for(U i = 0; i < GBUFFER_COLOR_ATTACHMENT_COUNT; ++i)
|
|
|
|
|
+ {
|
|
|
|
|
+ m_colorRtDescrs[i] = m_r->create2DRenderTargetDescription(m_r->getWidth(),
|
|
|
|
|
+ m_r->getHeight(),
|
|
|
|
|
+ MS_COLOR_ATTACHMENT_PIXEL_FORMATS[0],
|
|
|
|
|
+ TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
|
|
|
+ SamplingFilter::NEAREST,
|
|
|
|
|
+ rtNames[i]);
|
|
|
|
|
+ m_colorRtDescrs[i].bake();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // FB descr
|
|
|
|
|
+ AttachmentLoadOperation loadop = AttachmentLoadOperation::DONT_CARE;
|
|
|
|
|
+#if ANKI_EXTRA_CHECKS
|
|
|
|
|
+ loadop = AttachmentLoadOperation::CLEAR;
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
|
|
+ m_fbDescr.m_colorAttachmentCount = GBUFFER_COLOR_ATTACHMENT_COUNT;
|
|
|
|
|
+ m_fbDescr.m_colorAttachments[0].m_loadOperation = loadop;
|
|
|
|
|
+ m_fbDescr.m_colorAttachments[0].m_clearValue.m_colorf = {{1.0, 0.0, 0.0, 0.0}};
|
|
|
|
|
+ m_fbDescr.m_colorAttachments[1].m_loadOperation = loadop;
|
|
|
|
|
+ m_fbDescr.m_colorAttachments[1].m_clearValue.m_colorf = {{0.0, 1.0, 0.0, 0.0}};
|
|
|
|
|
+ m_fbDescr.m_colorAttachments[2].m_loadOperation = loadop;
|
|
|
|
|
+ m_fbDescr.m_colorAttachments[2].m_clearValue.m_colorf = {{0.0, 0.0, 1.0, 0.0}};
|
|
|
|
|
+ m_fbDescr.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::CLEAR;
|
|
|
|
|
+ m_fbDescr.m_depthStencilAttachment.m_clearValue.m_depthStencil.m_depth = 1.0;
|
|
|
|
|
+ m_fbDescr.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::DEPTH;
|
|
|
|
|
+ m_fbDescr.bake();
|
|
|
|
|
+
|
|
|
return Error::NONE;
|
|
return Error::NONE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void GBuffer::buildCommandBuffers(RenderingContext& ctx, U threadId, U threadCount) const
|
|
|
|
|
|
|
+void GBuffer::runInThread(CommandBufferPtr& cmdb, U32 threadId, U32 threadCount, const RenderingContext& ctx) const
|
|
|
{
|
|
{
|
|
|
ANKI_TRACE_SCOPED_EVENT(RENDER_MS);
|
|
ANKI_TRACE_SCOPED_EVENT(RENDER_MS);
|
|
|
|
|
|
|
@@ -111,24 +87,6 @@ void GBuffer::buildCommandBuffers(RenderingContext& ctx, U threadId, U threadCou
|
|
|
|
|
|
|
|
if(start != end)
|
|
if(start != end)
|
|
|
{
|
|
{
|
|
|
- // Create the command buffer
|
|
|
|
|
- CommandBufferInitInfo cinf;
|
|
|
|
|
- cinf.m_flags = CommandBufferFlag::SECOND_LEVEL | CommandBufferFlag::GRAPHICS_WORK;
|
|
|
|
|
- if(end - start < COMMAND_BUFFER_SMALL_BATCH_MAX_COMMANDS)
|
|
|
|
|
- {
|
|
|
|
|
- cinf.m_flags |= CommandBufferFlag::SMALL_BATCH;
|
|
|
|
|
- }
|
|
|
|
|
- cinf.m_framebuffer = m_fb;
|
|
|
|
|
- CommandBufferPtr cmdb = m_r->getGrManager().newInstance<CommandBuffer>(cinf);
|
|
|
|
|
- ctx.m_gbuffer.m_commandBuffers[threadId] = cmdb;
|
|
|
|
|
-
|
|
|
|
|
- // Inform on RTs
|
|
|
|
|
- TextureSurfaceInfo surf(0, 0, 0, 0);
|
|
|
|
|
- cmdb->informTextureSurfaceCurrentUsage(m_rt0, surf, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE);
|
|
|
|
|
- cmdb->informTextureSurfaceCurrentUsage(m_rt1, surf, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE);
|
|
|
|
|
- cmdb->informTextureSurfaceCurrentUsage(m_rt2, surf, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE);
|
|
|
|
|
- cmdb->informTextureSurfaceCurrentUsage(m_depthRt, surf, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE);
|
|
|
|
|
-
|
|
|
|
|
// Set some state, leave the rest to default
|
|
// Set some state, leave the rest to default
|
|
|
cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
|
|
cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
|
|
|
|
|
|
|
@@ -179,59 +137,35 @@ void GBuffer::buildCommandBuffers(RenderingContext& ctx, U threadId, U threadCou
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void GBuffer::run(RenderingContext& ctx)
|
|
|
|
|
|
|
+void GBuffer::populateRenderGraph(RenderingContext& ctx)
|
|
|
{
|
|
{
|
|
|
ANKI_TRACE_SCOPED_EVENT(RENDER_MS);
|
|
ANKI_TRACE_SCOPED_EVENT(RENDER_MS);
|
|
|
|
|
|
|
|
- CommandBufferPtr& cmdb = ctx.m_commandBuffer;
|
|
|
|
|
- cmdb->beginRenderPass(m_fb);
|
|
|
|
|
-
|
|
|
|
|
- // Set some state anyway because other stages may depend on it
|
|
|
|
|
- cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
|
|
|
|
|
|
|
+ m_ctx = &ctx;
|
|
|
|
|
+ RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
|
|
|
|
|
|
|
|
- for(U i = 0; i < m_r->getThreadPool().getThreadsCount(); ++i)
|
|
|
|
|
|
|
+ // Create RTs
|
|
|
|
|
+ Array<RenderTargetHandle, MAX_COLOR_ATTACHMENTS> rts;
|
|
|
|
|
+ for(U i = 0; i < GBUFFER_COLOR_ATTACHMENT_COUNT; ++i)
|
|
|
{
|
|
{
|
|
|
- if(ctx.m_gbuffer.m_commandBuffers[i].isCreated())
|
|
|
|
|
- {
|
|
|
|
|
- cmdb->pushSecondLevelCommandBuffer(ctx.m_gbuffer.m_commandBuffers[i]);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ m_colorRts[i] = rgraph.newRenderTarget(m_colorRtDescrs[i]);
|
|
|
|
|
+ rts[i] = m_colorRts[i];
|
|
|
}
|
|
}
|
|
|
|
|
+ m_depthRt = rgraph.newRenderTarget(m_depthRtDescr);
|
|
|
|
|
|
|
|
- cmdb->endRenderPass();
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ // Create pass
|
|
|
|
|
+ GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("GBuffer");
|
|
|
|
|
|
|
|
-void GBuffer::setPreRunBarriers(RenderingContext& ctx)
|
|
|
|
|
-{
|
|
|
|
|
- ANKI_TRACE_SCOPED_EVENT(RENDER_MS);
|
|
|
|
|
-
|
|
|
|
|
- CommandBufferPtr& cmdb = ctx.m_commandBuffer;
|
|
|
|
|
- TextureSurfaceInfo surf(0, 0, 0, 0);
|
|
|
|
|
-
|
|
|
|
|
- cmdb->setTextureSurfaceBarrier(m_rt0, TextureUsageBit::NONE, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, surf);
|
|
|
|
|
- cmdb->setTextureSurfaceBarrier(m_rt1, TextureUsageBit::NONE, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, surf);
|
|
|
|
|
- cmdb->setTextureSurfaceBarrier(m_rt2, TextureUsageBit::NONE, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, surf);
|
|
|
|
|
- cmdb->setTextureSurfaceBarrier(
|
|
|
|
|
- m_depthRt, TextureUsageBit::NONE, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE, surf);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void GBuffer::setPostRunBarriers(RenderingContext& ctx)
|
|
|
|
|
-{
|
|
|
|
|
- ANKI_TRACE_SCOPED_EVENT(RENDER_MS);
|
|
|
|
|
-
|
|
|
|
|
- CommandBufferPtr& cmdb = ctx.m_commandBuffer;
|
|
|
|
|
- TextureSurfaceInfo surf(0, 0, 0, 0);
|
|
|
|
|
-
|
|
|
|
|
- cmdb->setTextureSurfaceBarrier(
|
|
|
|
|
- m_rt0, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, surf);
|
|
|
|
|
-
|
|
|
|
|
- cmdb->setTextureSurfaceBarrier(
|
|
|
|
|
- m_rt1, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, surf);
|
|
|
|
|
|
|
+ pass.setFramebufferInfo(m_fbDescr, rts, m_depthRt);
|
|
|
|
|
+ pass.setWork(runCallback, this, m_r->getThreadPool().getThreadsCount());
|
|
|
|
|
|
|
|
- cmdb->setTextureSurfaceBarrier(
|
|
|
|
|
- m_rt2, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, surf);
|
|
|
|
|
-
|
|
|
|
|
- cmdb->setTextureSurfaceBarrier(
|
|
|
|
|
- m_depthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, surf);
|
|
|
|
|
|
|
+ for(U i = 0; i < GBUFFER_COLOR_ATTACHMENT_COUNT; ++i)
|
|
|
|
|
+ {
|
|
|
|
|
+ pass.newConsumer({m_colorRts[i], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
|
|
|
|
|
+ pass.newProducer({m_colorRts[i], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
|
|
|
|
|
+ }
|
|
|
|
|
+ pass.newConsumer({m_depthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
|
|
|
|
|
+ pass.newProducer({m_depthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
} // end namespace anki
|
|
} // end namespace anki
|