Dbg.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  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/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/Util/CVarSet.h>
  18. #include <AnKi/Collision/ConvexHullShape.h>
  19. #include <AnKi/Physics/PhysicsWorld.h>
  20. namespace anki {
  21. Dbg::Dbg()
  22. {
  23. }
  24. Dbg::~Dbg()
  25. {
  26. }
  27. Error Dbg::init()
  28. {
  29. // RT descr
  30. m_rtDescr = getRenderer().create2DRenderTargetDescription(getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y(),
  31. Format::kR8G8B8A8_Unorm, "Dbg");
  32. m_rtDescr.bake();
  33. ResourceManager& rsrcManager = ResourceManager::getSingleton();
  34. ANKI_CHECK(rsrcManager.loadResource("EngineAssets/GiProbe.ankitex", m_giProbeImage));
  35. ANKI_CHECK(rsrcManager.loadResource("EngineAssets/LightBulb.ankitex", m_pointLightImage));
  36. ANKI_CHECK(rsrcManager.loadResource("EngineAssets/SpotLight.ankitex", m_spotLightImage));
  37. ANKI_CHECK(rsrcManager.loadResource("EngineAssets/GreenDecal.ankitex", m_decalImage));
  38. ANKI_CHECK(rsrcManager.loadResource("EngineAssets/Mirror.ankitex", m_reflectionImage));
  39. ANKI_CHECK(rsrcManager.loadResource("ShaderBinaries/Dbg.ankiprogbin", m_dbgProg));
  40. {
  41. BufferInitInfo buffInit("Dbg cube verts");
  42. buffInit.m_size = sizeof(Vec3) * 8;
  43. buffInit.m_usage = BufferUsageBit::kVertexOrIndex;
  44. buffInit.m_mapAccess = BufferMapAccessBit::kWrite;
  45. m_cubeVertsBuffer = GrManager::getSingleton().newBuffer(buffInit);
  46. Vec3* verts = static_cast<Vec3*>(m_cubeVertsBuffer->map(0, kMaxPtrSize, BufferMapAccessBit::kWrite));
  47. constexpr F32 kSize = 1.0f;
  48. verts[0] = Vec3(kSize, kSize, kSize); // front top right
  49. verts[1] = Vec3(-kSize, kSize, kSize); // front top left
  50. verts[2] = Vec3(-kSize, -kSize, kSize); // front bottom left
  51. verts[3] = Vec3(kSize, -kSize, kSize); // front bottom right
  52. verts[4] = Vec3(kSize, kSize, -kSize); // back top right
  53. verts[5] = Vec3(-kSize, kSize, -kSize); // back top left
  54. verts[6] = Vec3(-kSize, -kSize, -kSize); // back bottom left
  55. verts[7] = Vec3(kSize, -kSize, -kSize); // back bottom right
  56. m_cubeVertsBuffer->unmap();
  57. constexpr U kIndexCount = 12 * 2;
  58. buffInit.setName("Dbg cube indices");
  59. buffInit.m_usage = BufferUsageBit::kVertexOrIndex;
  60. buffInit.m_size = kIndexCount * sizeof(U16);
  61. m_cubeIndicesBuffer = GrManager::getSingleton().newBuffer(buffInit);
  62. U16* indices = static_cast<U16*>(m_cubeIndicesBuffer->map(0, kMaxPtrSize, BufferMapAccessBit::kWrite));
  63. U c = 0;
  64. indices[c++] = 0;
  65. indices[c++] = 1;
  66. indices[c++] = 1;
  67. indices[c++] = 2;
  68. indices[c++] = 2;
  69. indices[c++] = 3;
  70. indices[c++] = 3;
  71. indices[c++] = 0;
  72. indices[c++] = 4;
  73. indices[c++] = 5;
  74. indices[c++] = 5;
  75. indices[c++] = 6;
  76. indices[c++] = 6;
  77. indices[c++] = 7;
  78. indices[c++] = 7;
  79. indices[c++] = 4;
  80. indices[c++] = 0;
  81. indices[c++] = 4;
  82. indices[c++] = 1;
  83. indices[c++] = 5;
  84. indices[c++] = 2;
  85. indices[c++] = 6;
  86. indices[c++] = 3;
  87. indices[c++] = 7;
  88. m_cubeIndicesBuffer->unmap();
  89. ANKI_ASSERT(c == kIndexCount);
  90. }
  91. return Error::kNone;
  92. }
  93. void Dbg::drawNonRenderable(GpuSceneNonRenderableObjectType type, U32 objCount, const RenderingContext& ctx, const ImageResource& image,
  94. CommandBuffer& cmdb)
  95. {
  96. ShaderProgramResourceVariantInitInfo variantInitInfo(m_dbgProg);
  97. variantInitInfo.addMutation("DEPTH_FAIL_VISUALIZATION", U32(m_ditheredDepthTestOn != 0));
  98. variantInitInfo.addMutation("OBJECT_TYPE", U32(type));
  99. variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kVertex | ShaderTypeBit::kPixel, "Bilboards");
  100. const ShaderProgramResourceVariant* variant;
  101. m_dbgProg->getOrCreateVariant(variantInitInfo, variant);
  102. cmdb.bindShaderProgram(&variant->getProgram());
  103. class Constants
  104. {
  105. public:
  106. Mat4 m_viewProjMat;
  107. Mat3x4 m_camTrf;
  108. } consts;
  109. consts.m_viewProjMat = ctx.m_matrices.m_viewProjection;
  110. consts.m_camTrf = ctx.m_matrices.m_cameraTransform;
  111. cmdb.setFastConstants(&consts, sizeof(consts));
  112. cmdb.bindSrv(1, 0, getClusterBinning().getPackedObjectsBuffer(type));
  113. cmdb.bindSrv(2, 0, getRenderer().getPrimaryNonRenderableVisibility().getVisibleIndicesBuffer(type));
  114. cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
  115. cmdb.bindSrv(3, 0, TextureView(&image.getTexture(), TextureSubresourceDesc::all()));
  116. cmdb.bindSrv(4, 0, TextureView(&m_spotLightImage->getTexture(), TextureSubresourceDesc::all()));
  117. cmdb.draw(PrimitiveTopology::kTriangles, 6, objCount);
  118. }
  119. void Dbg::run(RenderPassWorkContext& rgraphCtx, const RenderingContext& ctx)
  120. {
  121. ANKI_TRACE_SCOPED_EVENT(Dbg);
  122. ANKI_ASSERT(g_cvarRenderDbgScene || g_cvarRenderDbgPhysics);
  123. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  124. // Set common state
  125. cmdb.setViewport(0, 0, getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y());
  126. cmdb.setDepthWrite(false);
  127. cmdb.setBlendFactors(0, BlendFactor::kSrcAlpha, BlendFactor::kOneMinusSrcAlpha);
  128. cmdb.setDepthCompareOperation((m_depthTestOn) ? CompareOperation::kLess : CompareOperation::kAlways);
  129. cmdb.setLineWidth(2.0f);
  130. cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
  131. rgraphCtx.bindSrv(0, 0, getGBuffer().getDepthRt());
  132. // GBuffer renderables
  133. if(g_cvarRenderDbgScene)
  134. {
  135. const U32 allAabbCount = GpuSceneArrays::RenderableBoundingVolumeGBuffer::getSingleton().getElementCount();
  136. ShaderProgramResourceVariantInitInfo variantInitInfo(m_dbgProg);
  137. variantInitInfo.addMutation("DEPTH_FAIL_VISUALIZATION", U32(m_ditheredDepthTestOn != 0));
  138. variantInitInfo.addMutation("OBJECT_TYPE", 0);
  139. variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kVertex | ShaderTypeBit::kPixel, "Renderables");
  140. const ShaderProgramResourceVariant* variant;
  141. m_dbgProg->getOrCreateVariant(variantInitInfo, variant);
  142. cmdb.bindShaderProgram(&variant->getProgram());
  143. class Constants
  144. {
  145. public:
  146. Vec4 m_color;
  147. Mat4 m_viewProjMat;
  148. } consts;
  149. consts.m_color = Vec4(1.0f, 0.0f, 1.0f, 1.0f);
  150. consts.m_viewProjMat = ctx.m_matrices.m_viewProjection;
  151. cmdb.setFastConstants(&consts, sizeof(consts));
  152. cmdb.bindVertexBuffer(0, BufferView(m_cubeVertsBuffer.get()), sizeof(Vec3));
  153. cmdb.setVertexAttribute(VertexAttributeSemantic::kPosition, 0, Format::kR32G32B32_Sfloat, 0);
  154. cmdb.bindIndexBuffer(BufferView(m_cubeIndicesBuffer.get()), IndexType::kU16);
  155. cmdb.bindSrv(1, 0, GpuSceneArrays::RenderableBoundingVolumeGBuffer::getSingleton().getBufferView());
  156. BufferView indicesBuff;
  157. BufferHandle dep;
  158. getGBuffer().getVisibleAabbsBuffer(indicesBuff, dep);
  159. cmdb.bindSrv(2, 0, indicesBuff);
  160. cmdb.drawIndexed(PrimitiveTopology::kLines, 12 * 2, allAabbCount);
  161. }
  162. // Forward shading renderables
  163. if(g_cvarRenderDbgScene)
  164. {
  165. const U32 allAabbCount = GpuSceneArrays::RenderableBoundingVolumeForward::getSingleton().getElementCount();
  166. if(allAabbCount)
  167. {
  168. cmdb.bindSrv(1, 0, GpuSceneArrays::RenderableBoundingVolumeForward::getSingleton().getBufferView());
  169. BufferView indicesBuff;
  170. BufferHandle dep;
  171. getRenderer().getForwardShading().getVisibleAabbsBuffer(indicesBuff, dep);
  172. cmdb.bindSrv(2, 0, indicesBuff);
  173. cmdb.drawIndexed(PrimitiveTopology::kLines, 12 * 2, allAabbCount);
  174. }
  175. }
  176. // Draw non-renderables
  177. if(g_cvarRenderDbgScene)
  178. {
  179. drawNonRenderable(GpuSceneNonRenderableObjectType::kLight, GpuSceneArrays::Light::getSingleton().getElementCount(), ctx, *m_pointLightImage,
  180. cmdb);
  181. drawNonRenderable(GpuSceneNonRenderableObjectType::kDecal, GpuSceneArrays::Decal::getSingleton().getElementCount(), ctx, *m_decalImage, cmdb);
  182. drawNonRenderable(GpuSceneNonRenderableObjectType::kGlobalIlluminationProbe,
  183. GpuSceneArrays::GlobalIlluminationProbe::getSingleton().getElementCount(), ctx, *m_giProbeImage, cmdb);
  184. drawNonRenderable(GpuSceneNonRenderableObjectType::kReflectionProbe, GpuSceneArrays::ReflectionProbe::getSingleton().getElementCount(), ctx,
  185. *m_reflectionImage, cmdb);
  186. }
  187. // Physics
  188. if(g_cvarRenderDbgPhysics)
  189. {
  190. class MyPhysicsDebugDrawerInterface final : public PhysicsDebugDrawerInterface
  191. {
  192. public:
  193. RendererDynamicArray<HVec4> m_positions;
  194. RendererDynamicArray<Array<U8, 4>> m_colors;
  195. void drawLines(ConstWeakArray<Vec3> lines, Array<U8, 4> color) override
  196. {
  197. static constexpr U32 kMaxVerts = 1024 * 100;
  198. for(const Vec3& pos : lines)
  199. {
  200. if(m_positions.getSize() >= kMaxVerts)
  201. {
  202. break;
  203. }
  204. m_positions.emplaceBack(HVec4(pos.xyz0()));
  205. m_colors.emplaceBack(color);
  206. }
  207. }
  208. } drawerInterface;
  209. PhysicsWorld::getSingleton().debugDraw(drawerInterface);
  210. const U32 vertCount = drawerInterface.m_positions.getSize();
  211. if(vertCount)
  212. {
  213. HVec4* positions;
  214. const BufferView positionBuff =
  215. RebarTransientMemoryPool::getSingleton().allocate(drawerInterface.m_positions.getSizeInBytes(), sizeof(HVec4), positions);
  216. memcpy(positions, drawerInterface.m_positions.getBegin(), drawerInterface.m_positions.getSizeInBytes());
  217. U8* colors;
  218. const BufferView colorBuff =
  219. RebarTransientMemoryPool::getSingleton().allocate(drawerInterface.m_colors.getSizeInBytes(), sizeof(U8) * 4, colors);
  220. memcpy(colors, drawerInterface.m_colors.getBegin(), drawerInterface.m_colors.getSizeInBytes());
  221. ShaderProgramResourceVariantInitInfo variantInitInfo(m_dbgProg);
  222. variantInitInfo.addMutation("DEPTH_FAIL_VISUALIZATION", U32(m_ditheredDepthTestOn != 0));
  223. variantInitInfo.addMutation("OBJECT_TYPE", 0);
  224. variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kVertex | ShaderTypeBit::kPixel, "Lines");
  225. const ShaderProgramResourceVariant* variant;
  226. m_dbgProg->getOrCreateVariant(variantInitInfo, variant);
  227. cmdb.bindShaderProgram(&variant->getProgram());
  228. cmdb.setVertexAttribute(VertexAttributeSemantic::kPosition, 0, Format::kR16G16B16A16_Sfloat, 0);
  229. cmdb.setVertexAttribute(VertexAttributeSemantic::kColor, 1, Format::kR8G8B8A8_Unorm, 0);
  230. cmdb.bindVertexBuffer(0, positionBuff, sizeof(HVec4));
  231. cmdb.bindVertexBuffer(1, colorBuff, sizeof(U8) * 4);
  232. cmdb.setFastConstants(&ctx.m_matrices.m_viewProjection, sizeof(ctx.m_matrices.m_viewProjection));
  233. cmdb.draw(PrimitiveTopology::kLines, vertCount);
  234. }
  235. }
  236. // Restore state
  237. cmdb.setDepthCompareOperation(CompareOperation::kLess);
  238. cmdb.setDepthWrite(true);
  239. }
  240. void Dbg::populateRenderGraph(RenderingContext& ctx)
  241. {
  242. ANKI_TRACE_SCOPED_EVENT(Dbg);
  243. if(!g_cvarRenderDbgScene && !g_cvarRenderDbgPhysics)
  244. {
  245. return;
  246. }
  247. RenderGraphBuilder& rgraph = ctx.m_renderGraphDescr;
  248. // Create RT
  249. m_runCtx.m_rt = rgraph.newRenderTarget(m_rtDescr);
  250. // Create pass
  251. GraphicsRenderPass& pass = rgraph.newGraphicsRenderPass("Debug");
  252. pass.setWork([this, &ctx](RenderPassWorkContext& rgraphCtx) {
  253. run(rgraphCtx, ctx);
  254. });
  255. GraphicsRenderPassTargetDesc colorRti(m_runCtx.m_rt);
  256. colorRti.m_loadOperation = RenderTargetLoadOperation::kClear;
  257. GraphicsRenderPassTargetDesc depthRti(getGBuffer().getDepthRt());
  258. depthRti.m_loadOperation = RenderTargetLoadOperation::kLoad;
  259. depthRti.m_subresource.m_depthStencilAspect = DepthStencilAspectBit::kDepth;
  260. pass.setRenderpassInfo({colorRti}, &depthRti);
  261. pass.newTextureDependency(m_runCtx.m_rt, TextureUsageBit::kRtvDsvWrite);
  262. pass.newTextureDependency(getGBuffer().getDepthRt(), TextureUsageBit::kSrvPixel | TextureUsageBit::kRtvDsvRead);
  263. if(g_cvarRenderDbgScene)
  264. {
  265. BufferView indicesBuff;
  266. BufferHandle dep;
  267. getGBuffer().getVisibleAabbsBuffer(indicesBuff, dep);
  268. pass.newBufferDependency(dep, BufferUsageBit::kSrvGeometry);
  269. if(GpuSceneArrays::RenderableBoundingVolumeForward::getSingleton().getElementCount())
  270. {
  271. getRenderer().getForwardShading().getVisibleAabbsBuffer(indicesBuff, dep);
  272. pass.newBufferDependency(dep, BufferUsageBit::kSrvGeometry);
  273. }
  274. }
  275. }
  276. } // end namespace anki