2
0

RtMaterialFetchDbg.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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/RtMaterialFetchDbg.h>
  6. #include <AnKi/Renderer/Renderer.h>
  7. #include <AnKi/Renderer/AccelerationStructureBuilder.h>
  8. #include <AnKi/Renderer/GBuffer.h>
  9. #include <AnKi/GpuMemory/GpuVisibleTransientMemoryPool.h>
  10. #include <AnKi/GpuMemory/UnifiedGeometryBuffer.h>
  11. #include <AnKi/Util/Tracer.h>
  12. #include <AnKi/Shaders/Include/MaterialTypes.h>
  13. namespace anki {
  14. Error RtMaterialFetchDbg::init()
  15. {
  16. ANKI_CHECK(RtMaterialFetchRendererObject::init());
  17. // Ray gen and miss
  18. {
  19. ANKI_CHECK(ResourceManager::getSingleton().loadResource("ShaderBinaries/RtMaterialFetchDbg.ankiprogbin", m_rtProg));
  20. ShaderProgramResourceVariantInitInfo variantInitInfo(m_rtProg);
  21. variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kRayGen, "RtMaterialFetch");
  22. const ShaderProgramResourceVariant* variant;
  23. m_rtProg->getOrCreateVariant(variantInitInfo, variant);
  24. m_libraryGrProg.reset(&variant->getProgram());
  25. m_rayGenShaderGroupIdx = variant->getShaderGroupHandleIndex();
  26. }
  27. {
  28. ANKI_CHECK(ResourceManager::getSingleton().loadResource("ShaderBinaries/RtMaterialFetchMiss.ankiprogbin", m_missProg));
  29. ShaderProgramResourceVariantInitInfo variantInitInfo(m_missProg);
  30. variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kMiss, "RtMaterialFetch");
  31. const ShaderProgramResourceVariant* variant;
  32. m_missProg->getOrCreateVariant(variantInitInfo, variant);
  33. m_missShaderGroupIdx = variant->getShaderGroupHandleIndex();
  34. }
  35. m_sbtRecordSize = getAlignedRoundUp(GrManager::getSingleton().getDeviceCapabilities().m_sbtRecordAlignment,
  36. GrManager::getSingleton().getDeviceCapabilities().m_shaderGroupHandleSize + U32(sizeof(UVec4)));
  37. m_rtDesc = getRenderer().create2DRenderTargetDescription(getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y(),
  38. Format::kR8G8B8A8_Unorm, "RtMaterialFetch");
  39. m_rtDesc.bake();
  40. return Error::kNone;
  41. }
  42. void RtMaterialFetchDbg::populateRenderGraph(RenderingContext& ctx)
  43. {
  44. RenderGraphBuilder& rgraph = ctx.m_renderGraphDescr;
  45. // SBT build
  46. BufferHandle sbtHandle;
  47. BufferView sbtBuffer;
  48. buildShaderBindingTablePass("RtMaterialFetchDbg: Build SBT", m_libraryGrProg.get(), m_rayGenShaderGroupIdx, m_missShaderGroupIdx, m_sbtRecordSize,
  49. rgraph, sbtHandle, sbtBuffer);
  50. // Ray gen
  51. {
  52. m_runCtx.m_rt = rgraph.newRenderTarget(m_rtDesc);
  53. NonGraphicsRenderPass& rpass = rgraph.newNonGraphicsRenderPass("RtMaterialFetch");
  54. rpass.newBufferDependency(sbtHandle, BufferUsageBit::kShaderBindingTable);
  55. rpass.newTextureDependency(m_runCtx.m_rt, TextureUsageBit::kUavDispatchRays);
  56. setRgenSpace2Dependencies(rpass);
  57. rpass.newAccelerationStructureDependency(getRenderer().getAccelerationStructureBuilder().getAccelerationStructureHandle(),
  58. AccelerationStructureUsageBit::kSrvDispatchRays);
  59. rpass.setWork([this, sbtBuffer, &ctx](RenderPassWorkContext& rgraphCtx) {
  60. ANKI_TRACE_SCOPED_EVENT(RtMaterialFetchRayGen);
  61. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  62. cmdb.bindShaderProgram(m_libraryGrProg.get());
  63. // More globals
  64. cmdb.bindSampler(ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
  65. cmdb.bindSrv(ANKI_MATERIAL_REGISTER_GPU_SCENE, 0, GpuSceneBuffer::getSingleton().getBufferView());
  66. cmdb.bindSrv(ANKI_MATERIAL_REGISTER_MESH_LODS, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
  67. cmdb.bindSrv(ANKI_MATERIAL_REGISTER_TRANSFORMS, 0, GpuSceneArrays::Transform::getSingleton().getBufferView());
  68. cmdb.bindSrv(ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
  69. #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) \
  70. cmdb.bindSrv( \
  71. reg, 0, \
  72. BufferView(&UnifiedGeometryBuffer::getSingleton().getBuffer(), 0, \
  73. getAlignedRoundDown(getFormatInfo(Format::k##fmt).m_texelSize, UnifiedGeometryBuffer::getSingleton().getBuffer().getSize())), \
  74. Format::k##fmt);
  75. #include <AnKi/Shaders/Include/UnifiedGeometryTypes.def.h>
  76. bindRgenSpace2Resources(ctx, rgraphCtx);
  77. rgraphCtx.bindUav(0, 2, m_runCtx.m_rt);
  78. Vec4 dummy[3];
  79. cmdb.setFastConstants(&dummy, sizeof(dummy));
  80. cmdb.dispatchRays(sbtBuffer, m_sbtRecordSize, GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getElementCount(), 1,
  81. getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y(), 1);
  82. });
  83. }
  84. }
  85. } // end namespace anki