Dbg.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. // Copyright (C) 2009-2023, 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/Dbg.h>
  6. #include <AnKi/Renderer/Renderer.h>
  7. #include <AnKi/Renderer/GBuffer.h>
  8. #include <AnKi/Renderer/LightShading.h>
  9. #include <AnKi/Renderer/FinalComposite.h>
  10. #include <AnKi/Renderer/RenderQueue.h>
  11. #include <AnKi/Renderer/ForwardShading.h>
  12. #include <AnKi/Renderer/ClusterBinning2.h>
  13. #include <AnKi/Renderer/PrimaryNonRenderableVisibility.h>
  14. #include <AnKi/Scene.h>
  15. #include <AnKi/Util/Logger.h>
  16. #include <AnKi/Util/Enum.h>
  17. #include <AnKi/Core/CVarSet.h>
  18. #include <AnKi/Collision/ConvexHullShape.h>
  19. #include <AnKi/Physics/PhysicsWorld.h>
  20. namespace anki {
  21. BoolCVar g_dbgCVar(CVarSubsystem::kRenderer, "Dbg", false, "Enable or not debug visualization");
  22. static BoolCVar g_dbgPhysicsCVar(CVarSubsystem::kRenderer, "DbgPhysics", false, "Enable or not physics debug visualization");
  23. Dbg::Dbg()
  24. {
  25. }
  26. Dbg::~Dbg()
  27. {
  28. }
  29. Error Dbg::init()
  30. {
  31. ANKI_R_LOGV("Initializing DBG");
  32. // RT descr
  33. m_rtDescr = getRenderer().create2DRenderTargetDescription(getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y(),
  34. Format::kR8G8B8A8_Unorm, "Dbg");
  35. m_rtDescr.bake();
  36. // Create FB descr
  37. m_fbDescr.m_colorAttachmentCount = 1;
  38. m_fbDescr.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::kClear;
  39. m_fbDescr.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::kLoad;
  40. m_fbDescr.m_depthStencilAttachment.m_stencilLoadOperation = AttachmentLoadOperation::kDontCare;
  41. m_fbDescr.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::kDepth;
  42. m_fbDescr.bake();
  43. ResourceManager& rsrcManager = ResourceManager::getSingleton();
  44. ANKI_CHECK(rsrcManager.loadResource("EngineAssets/GiProbe.ankitex", m_giProbeImage));
  45. ANKI_CHECK(rsrcManager.loadResource("EngineAssets/LightBulb.ankitex", m_pointLightImage));
  46. ANKI_CHECK(rsrcManager.loadResource("EngineAssets/SpotLight.ankitex", m_spotLightImage));
  47. ANKI_CHECK(rsrcManager.loadResource("EngineAssets/GreenDecal.ankitex", m_decalImage));
  48. ANKI_CHECK(rsrcManager.loadResource("EngineAssets/Mirror.ankitex", m_reflectionImage));
  49. ANKI_CHECK(rsrcManager.loadResource("ShaderBinaries/DbgRenderables.ankiprogbin", m_renderablesProg));
  50. ANKI_CHECK(rsrcManager.loadResource("ShaderBinaries/DbgBillboard.ankiprogbin", m_nonRenderablesProg));
  51. {
  52. BufferInitInfo buffInit("Dbg cube verts");
  53. buffInit.m_size = sizeof(Vec3) * 8;
  54. buffInit.m_usage = BufferUsageBit::kVertex;
  55. buffInit.m_mapAccess = BufferMapAccessBit::kWrite;
  56. m_cubeVertsBuffer = GrManager::getSingleton().newBuffer(buffInit);
  57. Vec3* verts = static_cast<Vec3*>(m_cubeVertsBuffer->map(0, kMaxPtrSize, BufferMapAccessBit::kWrite));
  58. constexpr F32 kSize = 1.0f;
  59. verts[0] = Vec3(kSize, kSize, kSize); // front top right
  60. verts[1] = Vec3(-kSize, kSize, kSize); // front top left
  61. verts[2] = Vec3(-kSize, -kSize, kSize); // front bottom left
  62. verts[3] = Vec3(kSize, -kSize, kSize); // front bottom right
  63. verts[4] = Vec3(kSize, kSize, -kSize); // back top right
  64. verts[5] = Vec3(-kSize, kSize, -kSize); // back top left
  65. verts[6] = Vec3(-kSize, -kSize, -kSize); // back bottom left
  66. verts[7] = Vec3(kSize, -kSize, -kSize); // back bottom right
  67. m_cubeVertsBuffer->unmap();
  68. constexpr U kIndexCount = 12 * 2;
  69. buffInit.setName("Dbg cube indices");
  70. buffInit.m_usage = BufferUsageBit::kIndex;
  71. buffInit.m_size = kIndexCount * sizeof(U16);
  72. m_cubeIndicesBuffer = GrManager::getSingleton().newBuffer(buffInit);
  73. U16* indices = static_cast<U16*>(m_cubeIndicesBuffer->map(0, kMaxPtrSize, BufferMapAccessBit::kWrite));
  74. U c = 0;
  75. indices[c++] = 0;
  76. indices[c++] = 1;
  77. indices[c++] = 1;
  78. indices[c++] = 2;
  79. indices[c++] = 2;
  80. indices[c++] = 3;
  81. indices[c++] = 3;
  82. indices[c++] = 0;
  83. indices[c++] = 4;
  84. indices[c++] = 5;
  85. indices[c++] = 5;
  86. indices[c++] = 6;
  87. indices[c++] = 6;
  88. indices[c++] = 7;
  89. indices[c++] = 7;
  90. indices[c++] = 4;
  91. indices[c++] = 0;
  92. indices[c++] = 4;
  93. indices[c++] = 1;
  94. indices[c++] = 5;
  95. indices[c++] = 2;
  96. indices[c++] = 6;
  97. indices[c++] = 3;
  98. indices[c++] = 7;
  99. m_cubeIndicesBuffer->unmap();
  100. ANKI_ASSERT(c == kIndexCount);
  101. }
  102. return Error::kNone;
  103. }
  104. void Dbg::drawNonRenderable(GpuSceneNonRenderableObjectType type, U32 objCount, const RenderingContext& ctx, const ImageResource& image,
  105. CommandBuffer& cmdb)
  106. {
  107. ShaderProgramResourceVariantInitInfo variantInitInfo(m_nonRenderablesProg);
  108. variantInitInfo.addMutation("DITHERED_DEPTH_TEST", U32(m_ditheredDepthTestOn != 0));
  109. variantInitInfo.addMutation("OBJECT_TYPE", U32(type));
  110. const ShaderProgramResourceVariant* variant;
  111. m_nonRenderablesProg->getOrCreateVariant(variantInitInfo, variant);
  112. cmdb.bindShaderProgram(&variant->getProgram());
  113. class Uniforms
  114. {
  115. public:
  116. Mat4 m_viewProjMat;
  117. Mat3x4 m_camTrf;
  118. } unis;
  119. unis.m_viewProjMat = ctx.m_matrices.m_viewProjection;
  120. unis.m_camTrf = ctx.m_matrices.m_cameraTransform;
  121. cmdb.setPushConstants(&unis, sizeof(unis));
  122. cmdb.bindStorageBuffer(0, 2, getRenderer().getClusterBinning2().getPackedObjectsBuffer(type));
  123. cmdb.bindStorageBuffer(0, 3, getRenderer().getPrimaryNonRenderableVisibility().getVisibleIndicesBuffer(type));
  124. cmdb.bindSampler(0, 4, getRenderer().getSamplers().m_trilinearRepeat.get());
  125. cmdb.bindTexture(0, 5, &image.getTextureView());
  126. cmdb.bindTexture(0, 6, &m_spotLightImage->getTextureView());
  127. cmdb.draw(PrimitiveTopology::kTriangles, 6, objCount);
  128. }
  129. void Dbg::run(RenderPassWorkContext& rgraphCtx, const RenderingContext& ctx)
  130. {
  131. ANKI_ASSERT(g_dbgCVar.get());
  132. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  133. // Set common state
  134. cmdb.setViewport(0, 0, getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y());
  135. cmdb.setDepthWrite(false);
  136. cmdb.setBlendFactors(0, BlendFactor::kSrcAlpha, BlendFactor::kOneMinusSrcAlpha);
  137. cmdb.setDepthCompareOperation((m_depthTestOn) ? CompareOperation::kLess : CompareOperation::kAlways);
  138. cmdb.setLineWidth(2.0f);
  139. cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
  140. rgraphCtx.bindTexture(0, 1, getRenderer().getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::kDepth));
  141. // GBuffer renderables
  142. {
  143. const U32 allAabbCount = GpuSceneArrays::RenderableAabbGBuffer::getSingleton().getElementCount();
  144. ShaderProgramResourceVariantInitInfo variantInitInfo(m_renderablesProg);
  145. variantInitInfo.addMutation("DITHERED_DEPTH_TEST", U32(m_ditheredDepthTestOn != 0));
  146. const ShaderProgramResourceVariant* variant;
  147. m_renderablesProg->getOrCreateVariant(variantInitInfo, variant);
  148. cmdb.bindShaderProgram(&variant->getProgram());
  149. class Uniforms
  150. {
  151. public:
  152. Vec4 m_color;
  153. Mat4 m_viewProjMat;
  154. } unis;
  155. unis.m_color = Vec4(1.0f, 0.0f, 1.0f, 1.0f);
  156. unis.m_viewProjMat = ctx.m_matrices.m_viewProjection;
  157. cmdb.setPushConstants(&unis, sizeof(unis));
  158. cmdb.bindVertexBuffer(0, m_cubeVertsBuffer.get(), 0, sizeof(Vec3));
  159. cmdb.setVertexAttribute(0, 0, Format::kR32G32B32_Sfloat, 0);
  160. cmdb.bindIndexBuffer(m_cubeIndicesBuffer.get(), 0, IndexType::kU16);
  161. cmdb.bindStorageBuffer(0, 2, GpuSceneArrays::RenderableAabbGBuffer::getSingleton().getBufferOffsetRange());
  162. cmdb.bindStorageBuffer(0, 3, getRenderer().getGBuffer().getVisibleAabbsBuffer());
  163. cmdb.drawIndexed(PrimitiveTopology::kLines, 12 * 2, allAabbCount);
  164. }
  165. // Forward shading renderables
  166. {
  167. const U32 allAabbCount = GpuSceneArrays::RenderableAabbForward::getSingleton().getElementCount();
  168. cmdb.bindStorageBuffer(0, 2, GpuSceneArrays::RenderableAabbForward::getSingleton().getBufferOffsetRange());
  169. cmdb.bindStorageBuffer(0, 3, getRenderer().getForwardShading().getVisibleAabbsBuffer());
  170. cmdb.drawIndexed(PrimitiveTopology::kLines, 12 * 2, allAabbCount);
  171. }
  172. // Draw non-renderables
  173. drawNonRenderable(GpuSceneNonRenderableObjectType::kLight, GpuSceneArrays::Light::getSingleton().getElementCount(), ctx, *m_pointLightImage,
  174. cmdb);
  175. drawNonRenderable(GpuSceneNonRenderableObjectType::kDecal, GpuSceneArrays::Decal::getSingleton().getElementCount(), ctx, *m_decalImage, cmdb);
  176. drawNonRenderable(GpuSceneNonRenderableObjectType::kGlobalIlluminationProbe,
  177. GpuSceneArrays::GlobalIlluminationProbe::getSingleton().getElementCount(), ctx, *m_giProbeImage, cmdb);
  178. drawNonRenderable(GpuSceneNonRenderableObjectType::kReflectionProbe, GpuSceneArrays::ReflectionProbe::getSingleton().getElementCount(), ctx,
  179. *m_reflectionImage, cmdb);
  180. // Restore state
  181. cmdb.setDepthCompareOperation(CompareOperation::kLess);
  182. }
  183. void Dbg::populateRenderGraph(RenderingContext& ctx)
  184. {
  185. if(!g_dbgCVar.get())
  186. {
  187. return;
  188. }
  189. RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
  190. // Create RT
  191. m_runCtx.m_rt = rgraph.newRenderTarget(m_rtDescr);
  192. // Create pass
  193. GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("Debug");
  194. pass.setWork(1, [this, &ctx](RenderPassWorkContext& rgraphCtx) {
  195. run(rgraphCtx, ctx);
  196. });
  197. pass.setFramebufferInfo(m_fbDescr, {m_runCtx.m_rt}, getRenderer().getGBuffer().getDepthRt());
  198. pass.newTextureDependency(m_runCtx.m_rt, TextureUsageBit::kFramebufferWrite);
  199. pass.newTextureDependency(getRenderer().getGBuffer().getDepthRt(), TextureUsageBit::kSampledFragment | TextureUsageBit::kFramebufferRead);
  200. }
  201. } // end namespace anki