MipmapGenerator.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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::kSrvPixel, TextureSubresourceDesc::surface(readMip, face, layer));
  26. rpass.newTextureDependency(target.m_handle, TextureUsageBit::kRtvDsvWrite, TextureSubresourceDesc::surface(readMip + 1, face, layer));
  27. GraphicsRenderPassTargetDesc rtInfo;
  28. rtInfo.m_handle = target.m_handle;
  29. rtInfo.m_subresource = TextureSubresourceDesc::surface(readMip + 1, face, layer);
  30. rpass.setRenderpassInfo({rtInfo});
  31. rpass.setWork([this, rt = target.m_handle, readMip, face, layer,
  32. viewport = target.m_targetSize >> (readMip + 1)](RenderPassWorkContext& rgraphCtx) {
  33. ANKI_TRACE_SCOPED_EVENT(MipmapGenerator);
  34. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  35. cmdb.bindShaderProgram(m_genMipsGrProg.get());
  36. cmdb.setViewport(0, 0, viewport.x(), viewport.y());
  37. rgraphCtx.bindSrv(0, 0, rt, TextureSubresourceDesc::surface(readMip, face, layer));
  38. cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
  39. drawQuad(cmdb);
  40. });
  41. }
  42. }
  43. }
  44. }
  45. } // end namespace anki