Tonemapping.cpp 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Copyright (C) 2009-2017, 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/Tonemapping.h>
  6. #include <anki/renderer/DownscaleBlur.h>
  7. #include <anki/renderer/Renderer.h>
  8. namespace anki
  9. {
  10. Error Tonemapping::init(const ConfigSet& cfg)
  11. {
  12. ANKI_R_LOGI("Initializing tonemapping");
  13. Error err = initInternal(cfg);
  14. if(err)
  15. {
  16. ANKI_R_LOGE("Failed to initialize tonemapping");
  17. }
  18. return err;
  19. }
  20. Error Tonemapping::initInternal(const ConfigSet& initializer)
  21. {
  22. m_rtIdx = computeMaxMipmapCount2d(m_r->getWidth(), m_r->getHeight(), AVERAGE_LUMINANCE_RENDER_TARGET_SIZE) - 1;
  23. // Create program
  24. ANKI_CHECK(getResourceManager().loadResource("programs/TonemappingAverageLuminance.ankiprog", m_prog));
  25. ShaderProgramResourceConstantValueInitList<1> consts(m_prog);
  26. consts.add("INPUT_TEX_SIZE",
  27. UVec2(m_r->getDownscaleBlur().getPassWidth(m_rtIdx), m_r->getDownscaleBlur().getPassHeight(m_rtIdx)));
  28. const ShaderProgramResourceVariant* variant;
  29. m_prog->getOrCreateVariant(consts.get(), variant);
  30. m_grProg = variant->getProgram();
  31. // Create buffer
  32. m_luminanceBuff = getGrManager().newInstance<Buffer>(BufferInitInfo(sizeof(Vec4),
  33. BufferUsageBit::STORAGE_ALL | BufferUsageBit::UNIFORM_ALL | BufferUsageBit::BUFFER_UPLOAD_DESTINATION,
  34. BufferMapAccessBit::NONE,
  35. "AvgLum"));
  36. CommandBufferInitInfo cmdbinit;
  37. cmdbinit.m_flags = CommandBufferFlag::SMALL_BATCH | CommandBufferFlag::TRANSFER_WORK;
  38. CommandBufferPtr cmdb = getGrManager().newInstance<CommandBuffer>(cmdbinit);
  39. TransferGpuAllocatorHandle handle;
  40. ANKI_CHECK(m_r->getResourceManager().getTransferGpuAllocator().allocate(sizeof(Vec4), handle));
  41. void* data = handle.getMappedMemory();
  42. *static_cast<Vec4*>(data) = Vec4(0.5);
  43. cmdb->copyBufferToBuffer(handle.getBuffer(), handle.getOffset(), m_luminanceBuff, 0, handle.getRange());
  44. FencePtr fence;
  45. cmdb->flush(&fence);
  46. m_r->getResourceManager().getTransferGpuAllocator().release(handle, fence);
  47. return Error::NONE;
  48. }
  49. void Tonemapping::run(RenderPassWorkContext& rgraphCtx)
  50. {
  51. CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
  52. cmdb->bindShaderProgram(m_grProg);
  53. rgraphCtx.bindStorageBuffer(0, 0, m_runCtx.m_buffHandle);
  54. rgraphCtx.bindTexture(0, 0, m_r->getDownscaleBlur().getPassRt(m_rtIdx));
  55. cmdb->dispatchCompute(1, 1, 1);
  56. }
  57. void Tonemapping::populateRenderGraph(RenderingContext& ctx)
  58. {
  59. RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
  60. // Create buffer
  61. m_runCtx.m_buffHandle = rgraph.importBuffer("Avg lum", m_luminanceBuff, BufferUsageBit::NONE);
  62. // Create the pass
  63. ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("Avg lum");
  64. pass.setWork(runCallback, this, 0);
  65. pass.newConsumer({m_runCtx.m_buffHandle, BufferUsageBit::STORAGE_COMPUTE_READ_WRITE});
  66. pass.newConsumer({m_r->getDownscaleBlur().getPassRt(m_rtIdx), TextureUsageBit::SAMPLED_COMPUTE});
  67. pass.newProducer({m_runCtx.m_buffHandle, BufferUsageBit::STORAGE_COMPUTE_READ_WRITE});
  68. }
  69. } // end namespace anki