MipmapGenerator.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Renderer/Utils/MipmapGenerator.h>
  6. #include <AnKi/Renderer/Renderer.h>
  7. #include <AnKi/Util/Tracer.h>
  8. namespace anki {
  9. Error MipmapGenerator::init()
  10. {
  11. ANKI_CHECK(loadShaderProgram("ShaderBinaries/MipmapGenerator.ankiprogbin", m_genMipsProg, m_genMipsGrProg));
  12. return Error::kNone;
  13. }
  14. void MipmapGenerator::populateRenderGraph(const MipmapGeneratorTargetArguments& target, RenderGraphBuilder& rgraph, CString passesName)
  15. {
  16. for(U32 readMip = 0; readMip < target.m_mipmapCount - 1u; ++readMip)
  17. {
  18. const U8 faceCount = (target.m_isCubeTexture) ? 6 : 1;
  19. for(U32 face = 0; face < faceCount; ++face)
  20. {
  21. for(U32 layer = 0; layer < target.m_layerCount; ++layer)
  22. {
  23. GraphicsRenderPass& rpass =
  24. rgraph.newGraphicsRenderPass(generateTempPassName("%s: mip #%u face #%u layer #%u", passesName.cstr(), readMip, face, layer));
  25. rpass.newTextureDependency(target.m_handle, TextureUsageBit::kSampledFragment, TextureSubresourceDesc::surface(readMip, face, layer));
  26. rpass.newTextureDependency(target.m_handle, TextureUsageBit::kFramebufferWrite,
  27. TextureSubresourceDesc::surface(readMip + 1, face, layer));
  28. GraphicsRenderPassTargetDesc rtInfo;
  29. rtInfo.m_handle = target.m_handle;
  30. rtInfo.m_subresource = TextureSubresourceDesc::surface(readMip + 1, face, layer);
  31. rpass.setRenderpassInfo({rtInfo});
  32. rpass.setWork([this, rt = target.m_handle, readMip, face, layer,
  33. viewport = target.m_targetSize >> (readMip + 1)](RenderPassWorkContext& rgraphCtx) {
  34. ANKI_TRACE_SCOPED_EVENT(MipmapGenerator);
  35. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  36. cmdb.bindShaderProgram(m_genMipsGrProg.get());
  37. cmdb.setViewport(0, 0, viewport.x(), viewport.y());
  38. rgraphCtx.bindTexture(ANKI_REG(t0), rt, TextureSubresourceDesc::surface(readMip, face, layer));
  39. cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_trilinearClamp.get());
  40. drawQuad(cmdb);
  41. });
  42. }
  43. }
  44. }
  45. }
  46. } // end namespace anki