|
@@ -19,24 +19,32 @@ Error DownscaleBlur::initSubpass(U idx, const UVec2& inputTexSize)
|
|
|
{
|
|
{
|
|
|
Subpass& pass = m_passes[idx];
|
|
Subpass& pass = m_passes[idx];
|
|
|
|
|
|
|
|
|
|
+ pass.m_width = inputTexSize.x() / 2;
|
|
|
|
|
+ pass.m_height = inputTexSize.y() / 2;
|
|
|
|
|
+
|
|
|
// frag shader
|
|
// frag shader
|
|
|
ANKI_CHECK(m_r->createShaderf("shaders/DownscaleBlur.frag.glsl",
|
|
ANKI_CHECK(m_r->createShaderf("shaders/DownscaleBlur.frag.glsl",
|
|
|
pass.m_frag,
|
|
pass.m_frag,
|
|
|
- "#define TEXTURE_SIZE vec2(%f, %f)\n"
|
|
|
|
|
- "#define TEXTURE_MIPMAP float(%u)\n",
|
|
|
|
|
|
|
+ "#define TEXTURE_SIZE vec2(%f, %f)\n",
|
|
|
F32(inputTexSize.x()),
|
|
F32(inputTexSize.x()),
|
|
|
- F32(inputTexSize.y()),
|
|
|
|
|
- idx));
|
|
|
|
|
|
|
+ F32(inputTexSize.y())));
|
|
|
|
|
|
|
|
// prog
|
|
// prog
|
|
|
m_r->createDrawQuadShaderProgram(pass.m_frag->getGrShader(), pass.m_prog);
|
|
m_r->createDrawQuadShaderProgram(pass.m_frag->getGrShader(), pass.m_prog);
|
|
|
|
|
|
|
|
|
|
+ // RT
|
|
|
|
|
+ pass.m_rt = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(pass.m_width,
|
|
|
|
|
+ pass.m_height,
|
|
|
|
|
+ IS_COLOR_ATTACHMENT_PIXEL_FORMAT,
|
|
|
|
|
+ TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE
|
|
|
|
|
+ | TextureUsageBit::SAMPLED_COMPUTE,
|
|
|
|
|
+ SamplingFilter::LINEAR));
|
|
|
|
|
+
|
|
|
// FB
|
|
// FB
|
|
|
FramebufferInitInfo fbInit;
|
|
FramebufferInitInfo fbInit;
|
|
|
fbInit.m_colorAttachmentCount = 1;
|
|
fbInit.m_colorAttachmentCount = 1;
|
|
|
- fbInit.m_colorAttachments[0].m_texture = m_r->getIs().getRt();
|
|
|
|
|
|
|
+ fbInit.m_colorAttachments[0].m_texture = pass.m_rt;
|
|
|
fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
|
|
fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
|
|
|
- fbInit.m_colorAttachments[0].m_surface.m_level = idx + 1;
|
|
|
|
|
pass.m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
|
|
pass.m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
|
|
|
|
|
|
|
|
return ErrorCode::NONE;
|
|
return ErrorCode::NONE;
|
|
@@ -57,7 +65,8 @@ Error DownscaleBlur::init(const ConfigSet& cfg)
|
|
|
|
|
|
|
|
Error DownscaleBlur::initInternal(const ConfigSet&)
|
|
Error DownscaleBlur::initInternal(const ConfigSet&)
|
|
|
{
|
|
{
|
|
|
- m_passes.create(getAllocator(), m_r->getIs().getRtMipmapCount() - 1);
|
|
|
|
|
|
|
+ const U passCount = computeMaxMipmapCount2d(m_r->getWidth(), m_r->getHeight(), DOWNSCALE_BLUR_DOWN_TO) - 1;
|
|
|
|
|
+ m_passes.create(getAllocator(), passCount);
|
|
|
|
|
|
|
|
UVec2 size(m_r->getWidth(), m_r->getHeight());
|
|
UVec2 size(m_r->getWidth(), m_r->getHeight());
|
|
|
for(U i = 0; i < m_passes.getSize(); ++i)
|
|
for(U i = 0; i < m_passes.getSize(); ++i)
|
|
@@ -69,38 +78,54 @@ Error DownscaleBlur::initInternal(const ConfigSet&)
|
|
|
return ErrorCode::NONE;
|
|
return ErrorCode::NONE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void DownscaleBlur::setPreRunBarriers(RenderingContext& ctx)
|
|
|
|
|
+{
|
|
|
|
|
+ ctx.m_commandBuffer->setTextureSurfaceBarrier(m_passes[0].m_rt,
|
|
|
|
|
+ TextureUsageBit::NONE,
|
|
|
|
|
+ TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
|
|
|
+ TextureSurfaceInfo(0, 0, 0, 0));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void DownscaleBlur::run(RenderingContext& ctx)
|
|
void DownscaleBlur::run(RenderingContext& ctx)
|
|
|
{
|
|
{
|
|
|
CommandBufferPtr cmdb = ctx.m_commandBuffer;
|
|
CommandBufferPtr cmdb = ctx.m_commandBuffer;
|
|
|
|
|
|
|
|
cmdb->bindTexture(0, 0, m_r->getIs().getRt());
|
|
cmdb->bindTexture(0, 0, m_r->getIs().getRt());
|
|
|
|
|
|
|
|
- UVec2 size(m_r->getWidth(), m_r->getHeight());
|
|
|
|
|
for(U i = 0; i < m_passes.getSize(); ++i)
|
|
for(U i = 0; i < m_passes.getSize(); ++i)
|
|
|
{
|
|
{
|
|
|
- size /= 2;
|
|
|
|
|
Subpass& pass = m_passes[i];
|
|
Subpass& pass = m_passes[i];
|
|
|
|
|
|
|
|
- if(i > 0)
|
|
|
|
|
|
|
+ if(i > 0u)
|
|
|
{
|
|
{
|
|
|
- cmdb->setTextureSurfaceBarrier(m_r->getIs().getRt(),
|
|
|
|
|
|
|
+ cmdb->setTextureSurfaceBarrier(m_passes[i - 1].m_rt,
|
|
|
TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
|
TextureUsageBit::SAMPLED_FRAGMENT,
|
|
TextureUsageBit::SAMPLED_FRAGMENT,
|
|
|
- TextureSurfaceInfo(i, 0, 0, 0));
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ TextureSurfaceInfo(0, 0, 0, 0));
|
|
|
|
|
|
|
|
- cmdb->setTextureSurfaceBarrier(m_r->getIs().getRt(),
|
|
|
|
|
- TextureUsageBit::NONE,
|
|
|
|
|
- TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
|
|
|
- TextureSurfaceInfo(i + 1, 0, 0, 0));
|
|
|
|
|
|
|
+ cmdb->setTextureSurfaceBarrier(pass.m_rt,
|
|
|
|
|
+ TextureUsageBit::NONE,
|
|
|
|
|
+ TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
|
|
|
+ TextureSurfaceInfo(0, 0, 0, 0));
|
|
|
|
|
|
|
|
- cmdb->beginRenderPass(pass.m_fb);
|
|
|
|
|
- cmdb->setViewport(0, 0, size.x(), size.y());
|
|
|
|
|
|
|
+ cmdb->bindTexture(0, 0, m_passes[i - 1].m_rt);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ cmdb->setViewport(0, 0, pass.m_width, pass.m_height);
|
|
|
cmdb->bindShaderProgram(pass.m_prog);
|
|
cmdb->bindShaderProgram(pass.m_prog);
|
|
|
|
|
|
|
|
|
|
+ cmdb->beginRenderPass(pass.m_fb);
|
|
|
m_r->drawQuad(cmdb);
|
|
m_r->drawQuad(cmdb);
|
|
|
cmdb->endRenderPass();
|
|
cmdb->endRenderPass();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void DownscaleBlur::setPostRunBarriers(RenderingContext& ctx)
|
|
|
|
|
+{
|
|
|
|
|
+ ctx.m_commandBuffer->setTextureSurfaceBarrier(m_passes.getBack().m_rt,
|
|
|
|
|
+ TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
|
|
|
+ TextureUsageBit::SAMPLED_COMPUTE | TextureUsageBit::SAMPLED_FRAGMENT,
|
|
|
|
|
+ TextureSurfaceInfo(0, 0, 0, 0));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
} // end namespace anki
|
|
} // end namespace anki
|