Dbg.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  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/ForwardShading.h>
  11. #include <AnKi/Renderer/ClusterBinning.h>
  12. #include <AnKi/Renderer/PrimaryNonRenderableVisibility.h>
  13. #include <AnKi/Scene.h>
  14. #include <AnKi/Util/Logger.h>
  15. #include <AnKi/Util/Enum.h>
  16. #include <AnKi/Util/Tracer.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 Constants
  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.bindUavBuffer(0, 2, getRenderer().getClusterBinning().getPackedObjectsBuffer(type));
  123. cmdb.bindUavBuffer(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_TRACE_SCOPED_EVENT(Dbg);
  132. ANKI_ASSERT(g_dbgCVar.get());
  133. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  134. // Set common state
  135. cmdb.setViewport(0, 0, getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y());
  136. cmdb.setDepthWrite(false);
  137. cmdb.setBlendFactors(0, BlendFactor::kSrcAlpha, BlendFactor::kOneMinusSrcAlpha);
  138. cmdb.setDepthCompareOperation((m_depthTestOn) ? CompareOperation::kLess : CompareOperation::kAlways);
  139. cmdb.setLineWidth(2.0f);
  140. cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
  141. rgraphCtx.bindTexture(0, 1, getRenderer().getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::kDepth));
  142. // GBuffer renderables
  143. {
  144. const U32 allAabbCount = GpuSceneArrays::RenderableBoundingVolumeGBuffer::getSingleton().getElementCount();
  145. ShaderProgramResourceVariantInitInfo variantInitInfo(m_renderablesProg);
  146. variantInitInfo.addMutation("DITHERED_DEPTH_TEST", U32(m_ditheredDepthTestOn != 0));
  147. const ShaderProgramResourceVariant* variant;
  148. m_renderablesProg->getOrCreateVariant(variantInitInfo, variant);
  149. cmdb.bindShaderProgram(&variant->getProgram());
  150. class Constants
  151. {
  152. public:
  153. Vec4 m_color;
  154. Mat4 m_viewProjMat;
  155. } unis;
  156. unis.m_color = Vec4(1.0f, 0.0f, 1.0f, 1.0f);
  157. unis.m_viewProjMat = ctx.m_matrices.m_viewProjection;
  158. cmdb.setPushConstants(&unis, sizeof(unis));
  159. cmdb.bindVertexBuffer(0, m_cubeVertsBuffer.get(), 0, sizeof(Vec3));
  160. cmdb.setVertexAttribute(0, 0, Format::kR32G32B32_Sfloat, 0);
  161. cmdb.bindIndexBuffer(m_cubeIndicesBuffer.get(), 0, IndexType::kU16);
  162. cmdb.bindUavBuffer(0, 2, GpuSceneArrays::RenderableBoundingVolumeGBuffer::getSingleton().getBufferOffsetRange());
  163. cmdb.bindUavBuffer(0, 3, getRenderer().getGBuffer().getVisibleAabbsBuffer());
  164. cmdb.drawIndexed(PrimitiveTopology::kLines, 12 * 2, allAabbCount);
  165. }
  166. // Forward shading renderables
  167. {
  168. const U32 allAabbCount = GpuSceneArrays::RenderableBoundingVolumeForward::getSingleton().getElementCount();
  169. cmdb.bindUavBuffer(0, 2, GpuSceneArrays::RenderableBoundingVolumeForward::getSingleton().getBufferOffsetRange());
  170. cmdb.bindUavBuffer(0, 3, getRenderer().getForwardShading().getVisibleAabbsBuffer());
  171. cmdb.drawIndexed(PrimitiveTopology::kLines, 12 * 2, allAabbCount);
  172. }
  173. // Draw non-renderables
  174. drawNonRenderable(GpuSceneNonRenderableObjectType::kLight, GpuSceneArrays::Light::getSingleton().getElementCount(), ctx, *m_pointLightImage,
  175. cmdb);
  176. drawNonRenderable(GpuSceneNonRenderableObjectType::kDecal, GpuSceneArrays::Decal::getSingleton().getElementCount(), ctx, *m_decalImage, cmdb);
  177. drawNonRenderable(GpuSceneNonRenderableObjectType::kGlobalIlluminationProbe,
  178. GpuSceneArrays::GlobalIlluminationProbe::getSingleton().getElementCount(), ctx, *m_giProbeImage, cmdb);
  179. drawNonRenderable(GpuSceneNonRenderableObjectType::kReflectionProbe, GpuSceneArrays::ReflectionProbe::getSingleton().getElementCount(), ctx,
  180. *m_reflectionImage, cmdb);
  181. // Restore state
  182. cmdb.setDepthCompareOperation(CompareOperation::kLess);
  183. }
  184. void Dbg::populateRenderGraph(RenderingContext& ctx)
  185. {
  186. ANKI_TRACE_SCOPED_EVENT(Dbg);
  187. if(!g_dbgCVar.get())
  188. {
  189. return;
  190. }
  191. RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
  192. // Create RT
  193. m_runCtx.m_rt = rgraph.newRenderTarget(m_rtDescr);
  194. // Create pass
  195. GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("Debug");
  196. pass.setWork(1, [this, &ctx](RenderPassWorkContext& rgraphCtx) {
  197. run(rgraphCtx, ctx);
  198. });
  199. pass.setFramebufferInfo(m_fbDescr, {m_runCtx.m_rt}, getRenderer().getGBuffer().getDepthRt());
  200. pass.newTextureDependency(m_runCtx.m_rt, TextureUsageBit::kFramebufferWrite);
  201. pass.newTextureDependency(getRenderer().getGBuffer().getDepthRt(), TextureUsageBit::kSampledFragment | TextureUsageBit::kFramebufferRead);
  202. }
  203. } // end namespace anki