Renderer.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  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/Renderer.h>
  6. #include <AnKi/Util/Tracer.h>
  7. #include <AnKi/Util/CVarSet.h>
  8. #include <AnKi/Util/HighRezTimer.h>
  9. #include <AnKi/Collision/Aabb.h>
  10. #include <AnKi/Collision/Plane.h>
  11. #include <AnKi/Collision/Functions.h>
  12. #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
  13. #include <AnKi/Core/GpuMemory/GpuSceneBuffer.h>
  14. #include <AnKi/Scene/Components/CameraComponent.h>
  15. #include <AnKi/Scene/Components/LightComponent.h>
  16. #include <AnKi/Core/StatsSet.h>
  17. #include <AnKi/Core/App.h>
  18. #include <AnKi/Renderer/ProbeReflections.h>
  19. #include <AnKi/Renderer/GBuffer.h>
  20. #include <AnKi/Renderer/GBufferPost.h>
  21. #include <AnKi/Renderer/LightShading.h>
  22. #include <AnKi/Renderer/ShadowMapping.h>
  23. #include <AnKi/Renderer/FinalComposite.h>
  24. #include <AnKi/Renderer/Bloom.h>
  25. #include <AnKi/Renderer/Tonemapping.h>
  26. #include <AnKi/Renderer/ForwardShading.h>
  27. #include <AnKi/Renderer/LensFlare.h>
  28. #include <AnKi/Renderer/Dbg.h>
  29. #include <AnKi/Renderer/VolumetricFog.h>
  30. #include <AnKi/Renderer/DepthDownscale.h>
  31. #include <AnKi/Renderer/TemporalAA.h>
  32. #include <AnKi/Renderer/UiStage.h>
  33. #include <AnKi/Renderer/VolumetricLightingAccumulation.h>
  34. #include <AnKi/Renderer/IndirectDiffuseProbes.h>
  35. #include <AnKi/Renderer/ShadowmapsResolve.h>
  36. #include <AnKi/Renderer/RtShadows.h>
  37. #include <AnKi/Renderer/AccelerationStructureBuilder.h>
  38. #include <AnKi/Renderer/MotionVectors.h>
  39. #include <AnKi/Renderer/Scale.h>
  40. #include <AnKi/Renderer/VrsSriGeneration.h>
  41. #include <AnKi/Renderer/PrimaryNonRenderableVisibility.h>
  42. #include <AnKi/Renderer/ClusterBinning.h>
  43. #include <AnKi/Renderer/Ssao.h>
  44. #include <AnKi/Renderer/Ssr.h>
  45. #include <AnKi/Renderer/Sky.h>
  46. #include <AnKi/Renderer/Utils/Drawer.h>
  47. #include <AnKi/Renderer/Utils/GpuVisibility.h>
  48. #include <AnKi/Renderer/Utils/MipmapGenerator.h>
  49. #include <AnKi/Renderer/Utils/Readback.h>
  50. #include <AnKi/Renderer/Utils/HzbGenerator.h>
  51. namespace anki {
  52. static StatCounter g_primitivesDrawnStatVar(StatCategory::kRenderer, "Primitives drawn", StatFlag::kMainThreadUpdates | StatFlag::kZeroEveryFrame);
  53. static StatCounter g_rendererCpuTimeStatVar(StatCategory::kTime, "Renderer",
  54. StatFlag::kMilisecond | StatFlag::kShowAverage | StatFlag::kMainThreadUpdates);
  55. /// Generate a Halton jitter in [-0.5, 0.5]
  56. static Vec2 generateJitter(U32 frame)
  57. {
  58. // Halton jitter
  59. Vec2 result(0.0f);
  60. constexpr U32 baseX = 2;
  61. U32 index = frame + 1;
  62. F32 invBase = 1.0f / baseX;
  63. F32 fraction = invBase;
  64. while(index > 0)
  65. {
  66. result.x() += F32(index % baseX) * fraction;
  67. index /= baseX;
  68. fraction *= invBase;
  69. }
  70. constexpr U32 baseY = 3;
  71. index = frame + 1;
  72. invBase = 1.0f / baseY;
  73. fraction = invBase;
  74. while(index > 0)
  75. {
  76. result.y() += F32(index % baseY) * fraction;
  77. index /= baseY;
  78. fraction *= invBase;
  79. }
  80. result.x() -= 0.5f;
  81. result.y() -= 0.5f;
  82. return result;
  83. }
  84. Renderer::Renderer()
  85. {
  86. }
  87. Renderer::~Renderer()
  88. {
  89. #define ANKI_RENDERER_OBJECT_DEF(name, name2, initCondition) deleteInstance(RendererMemoryPool::getSingleton(), m_##name2);
  90. #include <AnKi/Renderer/RendererObject.def.h>
  91. }
  92. Error Renderer::init(const RendererInitInfo& inf)
  93. {
  94. ANKI_TRACE_SCOPED_EVENT(RInit);
  95. const Error err = initInternal(inf);
  96. if(err)
  97. {
  98. ANKI_R_LOGE("Failed to initialize the renderer");
  99. }
  100. return err;
  101. }
  102. Error Renderer::initInternal(const RendererInitInfo& inf)
  103. {
  104. RendererMemoryPool::allocateSingleton(inf.m_allocCallback, inf.m_allocCallbackUserData);
  105. m_framePool.init(inf.m_allocCallback, inf.m_allocCallbackUserData, 10_MB, 1.0f);
  106. m_frameCount = 0;
  107. m_swapchainResolution = inf.m_swapchainSize;
  108. m_rgraph = GrManager::getSingleton().newRenderGraph();
  109. // Set from the config
  110. m_postProcessResolution = UVec2(Vec2(m_swapchainResolution) * g_renderScalingCVar);
  111. alignRoundDown(2, m_postProcessResolution.x());
  112. alignRoundDown(2, m_postProcessResolution.y());
  113. m_internalResolution = UVec2(Vec2(m_postProcessResolution) * g_internalRenderScalingCVar);
  114. alignRoundDown(2, m_internalResolution.x());
  115. alignRoundDown(2, m_internalResolution.y());
  116. ANKI_R_LOGI("Initializing offscreen renderer. Resolution %ux%u. Internal resolution %ux%u", m_postProcessResolution.x(),
  117. m_postProcessResolution.y(), m_internalResolution.x(), m_internalResolution.y());
  118. m_tileCounts.x() = (m_internalResolution.x() + kClusteredShadingTileSize - 1) / kClusteredShadingTileSize;
  119. m_tileCounts.y() = (m_internalResolution.y() + kClusteredShadingTileSize - 1) / kClusteredShadingTileSize;
  120. m_zSplitCount = g_zSplitCountCVar;
  121. if(g_meshletRenderingCVar && !GrManager::getSingleton().getDeviceCapabilities().m_meshShaders)
  122. {
  123. m_meshletRenderingType = MeshletRenderingType::kSoftware;
  124. }
  125. else if(GrManager::getSingleton().getDeviceCapabilities().m_meshShaders)
  126. {
  127. m_meshletRenderingType = MeshletRenderingType::kMeshShaders;
  128. }
  129. else
  130. {
  131. m_meshletRenderingType = MeshletRenderingType::kNone;
  132. }
  133. // A few sanity checks
  134. if(m_internalResolution.x() < 64 || m_internalResolution.y() < 64)
  135. {
  136. ANKI_R_LOGE("Incorrect sizes");
  137. return Error::kUserData;
  138. }
  139. ANKI_CHECK(ResourceManager::getSingleton().loadResource("ShaderBinaries/ClearTextureCompute.ankiprogbin", m_clearTexComputeProg));
  140. // Dummy resources
  141. {
  142. TextureInitInfo texinit("RendererDummy");
  143. texinit.m_width = texinit.m_height = 4;
  144. texinit.m_usage = TextureUsageBit::kAllSrv | TextureUsageBit::kUavCompute;
  145. texinit.m_format = Format::kR8G8B8A8_Unorm;
  146. m_dummyTex2d = createAndClearRenderTarget(texinit, TextureUsageBit::kAllSrv);
  147. texinit.m_depth = 4;
  148. texinit.m_type = TextureType::k3D;
  149. m_dummyTex3d = createAndClearRenderTarget(texinit, TextureUsageBit::kAllSrv);
  150. m_dummyBuff = GrManager::getSingleton().newBuffer(
  151. BufferInitInfo(1024, BufferUsageBit::kAllConstant | BufferUsageBit::kAllUav, BufferMapAccessBit::kNone, "Dummy"));
  152. }
  153. // Init the stages
  154. #define ANKI_RENDERER_OBJECT_DEF(name, name2, initCondition) \
  155. if(initCondition) \
  156. { \
  157. m_##name2 = newInstance<name>(RendererMemoryPool::getSingleton()); \
  158. ANKI_CHECK(m_##name2->init()); \
  159. }
  160. #include <AnKi/Renderer/RendererObject.def.h>
  161. // Init samplers
  162. {
  163. SamplerInitInfo sinit("NearestNearestClamp");
  164. sinit.m_addressing = SamplingAddressing::kClamp;
  165. sinit.m_mipmapFilter = SamplingFilter::kNearest;
  166. sinit.m_minMagFilter = SamplingFilter::kNearest;
  167. m_samplers.m_nearestNearestClamp = GrManager::getSingleton().newSampler(sinit);
  168. sinit.setName("TrilinearClamp");
  169. sinit.m_minMagFilter = SamplingFilter::kLinear;
  170. sinit.m_mipmapFilter = SamplingFilter::kLinear;
  171. m_samplers.m_trilinearClamp = GrManager::getSingleton().newSampler(sinit);
  172. sinit.setName("TrilinearRepeat");
  173. sinit.m_addressing = SamplingAddressing::kRepeat;
  174. m_samplers.m_trilinearRepeat = GrManager::getSingleton().newSampler(sinit);
  175. if(g_textureAnisotropyCVar <= 1u)
  176. {
  177. m_samplers.m_trilinearRepeatAniso = m_samplers.m_trilinearRepeat;
  178. }
  179. else
  180. {
  181. sinit.setName("TrilinearRepeatAniso");
  182. sinit.m_anisotropyLevel = g_textureAnisotropyCVar;
  183. m_samplers.m_trilinearRepeatAniso = GrManager::getSingleton().newSampler(sinit);
  184. }
  185. sinit.setName("TrilinearRepeatAnisoRezScalingBias");
  186. F32 scalingMipBias = log2(F32(m_internalResolution.x()) / F32(m_postProcessResolution.x()));
  187. if(getScale().getUsingGrUpscaler())
  188. {
  189. // DLSS wants more bias
  190. scalingMipBias -= 1.0f;
  191. }
  192. sinit.m_lodBias = scalingMipBias;
  193. m_samplers.m_trilinearRepeatAnisoResolutionScalingBias = GrManager::getSingleton().newSampler(sinit);
  194. sinit = {};
  195. sinit.setName("TrilinearClampShadow");
  196. sinit.m_minMagFilter = SamplingFilter::kLinear;
  197. sinit.m_mipmapFilter = SamplingFilter::kLinear;
  198. sinit.m_compareOperation = CompareOperation::kLessEqual;
  199. m_samplers.m_trilinearClampShadow = GrManager::getSingleton().newSampler(sinit);
  200. }
  201. for(U32 i = 0; i < m_jitterOffsets.getSize(); ++i)
  202. {
  203. m_jitterOffsets[i] = generateJitter(i);
  204. }
  205. if(m_swapchainResolution != m_postProcessResolution)
  206. {
  207. ANKI_CHECK(ResourceManager::getSingleton().loadResource("ShaderBinaries/Blit.ankiprogbin", m_blitProg));
  208. ShaderProgramResourceVariantInitInfo varInit(m_blitProg);
  209. const ShaderProgramResourceVariant* variant;
  210. varInit.requestTechniqueAndTypes(ShaderTypeBit::kVertex | ShaderTypeBit::kPixel);
  211. m_blitProg->getOrCreateVariant(varInit, variant);
  212. m_blitGrProg.reset(&variant->getProgram());
  213. ANKI_R_LOGI("There will be a blit pass to the swapchain because render scaling is not 1.0");
  214. }
  215. return Error::kNone;
  216. }
  217. Error Renderer::populateRenderGraph(RenderingContext& ctx)
  218. {
  219. // Import RTs first
  220. m_bloom2->importRenderTargets(ctx);
  221. m_tonemapping->importRenderTargets(ctx);
  222. m_vrsSriGeneration->importRenderTargets(ctx);
  223. m_gbuffer->importRenderTargets(ctx);
  224. // Populate render graph. WARNING Watch the order
  225. gpuSceneCopy(ctx);
  226. m_primaryNonRenderableVisibility->populateRenderGraph(ctx);
  227. if(m_accelerationStructureBuilder)
  228. {
  229. m_accelerationStructureBuilder->populateRenderGraph(ctx);
  230. }
  231. m_gbuffer->populateRenderGraph(ctx);
  232. m_shadowMapping->populateRenderGraph(ctx);
  233. m_clusterBinning2->populateRenderGraph(ctx);
  234. m_sky->populateRenderGraph(ctx);
  235. m_indirectDiffuseProbes->populateRenderGraph(ctx);
  236. m_probeReflections->populateRenderGraph(ctx);
  237. m_volumetricLightingAccumulation->populateRenderGraph(ctx);
  238. m_motionVectors->populateRenderGraph(ctx);
  239. m_gbufferPost->populateRenderGraph(ctx);
  240. m_depthDownscale->populateRenderGraph(ctx);
  241. m_ssr->populateRenderGraph(ctx);
  242. if(m_rtShadows)
  243. {
  244. m_rtShadows->populateRenderGraph(ctx);
  245. }
  246. m_shadowmapsResolve->populateRenderGraph(ctx);
  247. m_volumetricFog->populateRenderGraph(ctx);
  248. m_lensFlare->populateRenderGraph(ctx);
  249. m_ssao->populateRenderGraph(ctx);
  250. m_forwardShading->populateRenderGraph(ctx); // This may feel out of place but it's only visibility. Keep it just before light shading
  251. m_lightShading->populateRenderGraph(ctx);
  252. if(!getScale().getUsingGrUpscaler())
  253. {
  254. m_temporalAA->populateRenderGraph(ctx);
  255. }
  256. m_vrsSriGeneration->populateRenderGraph(ctx);
  257. m_scale->populateRenderGraph(ctx);
  258. m_bloom2->populateRenderGraph(ctx);
  259. m_tonemapping->populateRenderGraph(ctx);
  260. m_dbg->populateRenderGraph(ctx);
  261. m_finalComposite->populateRenderGraph(ctx);
  262. return Error::kNone;
  263. }
  264. void Renderer::writeGlobalRendererConstants(RenderingContext& ctx, GlobalRendererConstants& consts)
  265. {
  266. ANKI_TRACE_SCOPED_EVENT(RWriteGlobalRendererConstants);
  267. consts.m_renderingSize = Vec2(F32(m_internalResolution.x()), F32(m_internalResolution.y()));
  268. consts.m_time = F32(HighRezTimer::getCurrentTime());
  269. consts.m_frame = m_frameCount & kMaxU32;
  270. Plane nearPlane;
  271. extractClipPlane(ctx.m_matrices.m_viewProjection, FrustumPlaneType::kNear, nearPlane);
  272. consts.m_nearPlaneWSpace = Vec4(nearPlane.getNormal().xyz(), nearPlane.getOffset());
  273. consts.m_near = ctx.m_cameraNear;
  274. consts.m_far = ctx.m_cameraFar;
  275. consts.m_cameraPosition = ctx.m_matrices.m_cameraTransform.getTranslationPart().xyz();
  276. consts.m_tileCounts = m_tileCounts;
  277. consts.m_zSplitCount = m_zSplitCount;
  278. consts.m_zSplitCountOverFrustumLength = F32(m_zSplitCount) / (ctx.m_cameraFar - ctx.m_cameraNear);
  279. consts.m_zSplitMagic.x() = (ctx.m_cameraNear - ctx.m_cameraFar) / (ctx.m_cameraNear * F32(m_zSplitCount));
  280. consts.m_zSplitMagic.y() = ctx.m_cameraFar / (ctx.m_cameraNear * F32(m_zSplitCount));
  281. consts.m_lightVolumeLastZSplit = min(g_volumetricLightingAccumulationFinalZSplitCVar - 1, m_zSplitCount);
  282. consts.m_reflectionProbesMipCount = F32(m_probeReflections->getReflectionTextureMipmapCount());
  283. consts.m_matrices = ctx.m_matrices;
  284. consts.m_previousMatrices = ctx.m_prevMatrices;
  285. // Directional light
  286. const LightComponent* dirLight = SceneGraph::getSingleton().getDirectionalLight();
  287. if(dirLight)
  288. {
  289. DirectionalLight& out = consts.m_directionalLight;
  290. const U32 shadowCascadeCount = (dirLight->getShadowEnabled()) ? g_shadowCascadeCountCVar : 0;
  291. out.m_diffuseColor = dirLight->getDiffuseColor().xyz();
  292. out.m_power = dirLight->getLightPower();
  293. out.m_shadowCascadeCount_31bit_active_1bit = shadowCascadeCount << 1u;
  294. out.m_shadowCascadeCount_31bit_active_1bit |= 1;
  295. out.m_direction = dirLight->getDirection();
  296. out.m_shadowCascadeDistances =
  297. Vec4(g_shadowCascade0DistanceCVar, g_shadowCascade1DistanceCVar, g_shadowCascade2DistanceCVar, g_shadowCascade3DistanceCVar);
  298. for(U cascade = 0; cascade < shadowCascadeCount; ++cascade)
  299. {
  300. ANKI_ASSERT(ctx.m_dirLightTextureMatrices[cascade] != Mat4::getZero());
  301. out.m_textureMatrices[cascade] = ctx.m_dirLightTextureMatrices[cascade];
  302. out.m_cascadeFarPlanes[cascade] = ctx.m_dirLightFarPlanes[cascade];
  303. }
  304. }
  305. else
  306. {
  307. consts.m_directionalLight.m_shadowCascadeCount_31bit_active_1bit = 0;
  308. }
  309. }
  310. TextureInitInfo Renderer::create2DRenderTargetInitInfo(U32 w, U32 h, Format format, TextureUsageBit usage, CString name)
  311. {
  312. ANKI_ASSERT(!!(usage & TextureUsageBit::kRtvDsvWrite) || !!(usage & TextureUsageBit::kUavCompute));
  313. TextureInitInfo init(name);
  314. init.m_width = w;
  315. init.m_height = h;
  316. init.m_depth = 1;
  317. init.m_layerCount = 1;
  318. init.m_type = TextureType::k2D;
  319. init.m_format = format;
  320. init.m_mipmapCount = 1;
  321. init.m_samples = 1;
  322. init.m_usage = usage;
  323. return init;
  324. }
  325. RenderTargetDesc Renderer::create2DRenderTargetDescription(U32 w, U32 h, Format format, CString name)
  326. {
  327. RenderTargetDesc init(name);
  328. init.m_width = w;
  329. init.m_height = h;
  330. init.m_depth = 1;
  331. init.m_layerCount = 1;
  332. init.m_type = TextureType::k2D;
  333. init.m_format = format;
  334. init.m_mipmapCount = 1;
  335. init.m_samples = 1;
  336. init.m_usage = TextureUsageBit::kNone;
  337. return init;
  338. }
  339. TexturePtr Renderer::createAndClearRenderTarget(const TextureInitInfo& inf, TextureUsageBit initialUsage, const ClearValue& clearVal)
  340. {
  341. ANKI_ASSERT(!!(inf.m_usage & TextureUsageBit::kRtvDsvWrite) || !!(inf.m_usage & TextureUsageBit::kUavCompute));
  342. const U faceCount = textureTypeIsCube(inf.m_type) ? 6 : 1;
  343. Bool useCompute = false;
  344. if(!!(inf.m_usage & TextureUsageBit::kRtvDsvWrite))
  345. {
  346. useCompute = false;
  347. }
  348. else if(!!(inf.m_usage & TextureUsageBit::kUavCompute))
  349. {
  350. useCompute = true;
  351. }
  352. else
  353. {
  354. ANKI_ASSERT(!"Can't handle that");
  355. }
  356. // Create tex
  357. TexturePtr tex = GrManager::getSingleton().newTexture(inf);
  358. // Clear all surfaces
  359. CommandBufferInitInfo cmdbinit;
  360. cmdbinit.m_flags = CommandBufferFlag::kGeneralWork;
  361. if((inf.m_mipmapCount * faceCount * inf.m_layerCount * 4) < kCommandBufferSmallBatchMaxCommands)
  362. {
  363. cmdbinit.m_flags |= CommandBufferFlag::kSmallBatch;
  364. }
  365. CommandBufferPtr cmdb = GrManager::getSingleton().newCommandBuffer(cmdbinit);
  366. for(U32 mip = 0; mip < inf.m_mipmapCount; ++mip)
  367. {
  368. for(U32 face = 0; face < faceCount; ++face)
  369. {
  370. for(U32 layer = 0; layer < inf.m_layerCount; ++layer)
  371. {
  372. if(!useCompute)
  373. {
  374. RenderTarget rt;
  375. rt.m_clearValue = clearVal;
  376. if(getFormatInfo(inf.m_format).isDepthStencil())
  377. {
  378. DepthStencilAspectBit aspect = DepthStencilAspectBit::kNone;
  379. if(getFormatInfo(inf.m_format).isDepth())
  380. {
  381. aspect |= DepthStencilAspectBit::kDepth;
  382. }
  383. if(getFormatInfo(inf.m_format).isStencil())
  384. {
  385. aspect |= DepthStencilAspectBit::kStencil;
  386. }
  387. rt.m_textureView = TextureView(tex.get(), TextureSubresourceDesc::surface(mip, face, layer, aspect));
  388. }
  389. else
  390. {
  391. rt.m_textureView = TextureView(tex.get(), TextureSubresourceDesc::surface(mip, face, layer));
  392. }
  393. TextureBarrierInfo barrier = {rt.m_textureView, TextureUsageBit::kNone, TextureUsageBit::kRtvDsvWrite};
  394. cmdb->setPipelineBarrier({&barrier, 1}, {}, {});
  395. if(getFormatInfo(inf.m_format).isDepthStencil())
  396. {
  397. cmdb->beginRenderPass({}, &rt);
  398. }
  399. else
  400. {
  401. cmdb->beginRenderPass({rt});
  402. }
  403. cmdb->endRenderPass();
  404. if(!!initialUsage)
  405. {
  406. barrier.m_previousUsage = TextureUsageBit::kRtvDsvWrite;
  407. barrier.m_nextUsage = initialUsage;
  408. cmdb->setPipelineBarrier({&barrier, 1}, {}, {});
  409. }
  410. }
  411. else
  412. {
  413. // Compute
  414. ShaderProgramResourceVariantInitInfo variantInitInfo(m_clearTexComputeProg);
  415. variantInitInfo.addMutation("TEXTURE_DIMENSIONS", I32((inf.m_type == TextureType::k3D) ? 3 : 2));
  416. const FormatInfo formatInfo = getFormatInfo(inf.m_format);
  417. I32 componentType = 0;
  418. if(formatInfo.m_shaderType == 0)
  419. {
  420. componentType = 0;
  421. }
  422. else if(formatInfo.m_shaderType == 1)
  423. {
  424. componentType = 1;
  425. }
  426. else
  427. {
  428. ANKI_ASSERT(!"Not supported");
  429. }
  430. variantInitInfo.addMutation("COMPONENT_TYPE", componentType);
  431. const ShaderProgramResourceVariant* variant;
  432. m_clearTexComputeProg->getOrCreateVariant(variantInitInfo, variant);
  433. cmdb->bindShaderProgram(&variant->getProgram());
  434. cmdb->setFastConstants(&clearVal.m_colorf[0], sizeof(clearVal.m_colorf));
  435. const TextureView view(tex.get(), TextureSubresourceDesc::surface(mip, face, layer));
  436. cmdb->bindUav(0, 0, view);
  437. const TextureBarrierInfo barrier = {view, TextureUsageBit::kNone, TextureUsageBit::kUavCompute};
  438. cmdb->setPipelineBarrier({&barrier, 1}, {}, {});
  439. UVec3 wgSize;
  440. wgSize.x() = (8 - 1 + (tex->getWidth() >> mip)) / 8;
  441. wgSize.y() = (8 - 1 + (tex->getHeight() >> mip)) / 8;
  442. wgSize.z() = (inf.m_type == TextureType::k3D) ? ((8 - 1 + (tex->getDepth() >> mip)) / 8) : 1;
  443. cmdb->dispatchCompute(wgSize.x(), wgSize.y(), wgSize.z());
  444. if(!!initialUsage)
  445. {
  446. const TextureBarrierInfo barrier = {view, TextureUsageBit::kUavCompute, initialUsage};
  447. cmdb->setPipelineBarrier({&barrier, 1}, {}, {});
  448. }
  449. }
  450. }
  451. }
  452. }
  453. cmdb->endRecording();
  454. FencePtr fence;
  455. GrManager::getSingleton().submit(cmdb.get(), {}, &fence);
  456. fence->clientWait(10.0_sec);
  457. return tex;
  458. }
  459. void Renderer::registerDebugRenderTarget(RendererObject* obj, CString rtName)
  460. {
  461. #if ANKI_ASSERTIONS_ENABLED
  462. for(const DebugRtInfo& inf : m_debugRts)
  463. {
  464. ANKI_ASSERT(inf.m_rtName != rtName && "Choose different name");
  465. }
  466. #endif
  467. ANKI_ASSERT(obj);
  468. DebugRtInfo inf;
  469. inf.m_obj = obj;
  470. inf.m_rtName = rtName;
  471. m_debugRts.emplaceBack(std::move(inf));
  472. }
  473. Bool Renderer::getCurrentDebugRenderTarget(Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles, ShaderProgramPtr& optionalShaderProgram)
  474. {
  475. if(m_currentDebugRtName.isEmpty()) [[likely]]
  476. {
  477. return false;
  478. }
  479. RendererObject* obj = nullptr;
  480. for(const DebugRtInfo& inf : m_debugRts)
  481. {
  482. if(inf.m_rtName == m_currentDebugRtName)
  483. {
  484. obj = inf.m_obj;
  485. }
  486. }
  487. if(obj)
  488. {
  489. obj->getDebugRenderTarget(m_currentDebugRtName, handles, optionalShaderProgram);
  490. return true;
  491. }
  492. else
  493. {
  494. ANKI_R_LOGE("Debug rendertarget doesn't exist: %s", m_currentDebugRtName.cstr());
  495. m_currentDebugRtName = {};
  496. return false;
  497. }
  498. }
  499. void Renderer::setCurrentDebugRenderTarget(CString rtName)
  500. {
  501. m_currentDebugRtName.destroy();
  502. if(!rtName.isEmpty() && rtName.getLength() > 0)
  503. {
  504. m_currentDebugRtName = rtName;
  505. }
  506. }
  507. Format Renderer::getHdrFormat() const
  508. {
  509. Format out;
  510. if(!g_highQualityHdrCVar)
  511. {
  512. out = Format::kB10G11R11_Ufloat_Pack32;
  513. }
  514. else if(GrManager::getSingleton().getDeviceCapabilities().m_unalignedBbpTextureFormats)
  515. {
  516. out = Format::kR16G16B16_Sfloat;
  517. }
  518. else
  519. {
  520. out = Format::kR16G16B16A16_Sfloat;
  521. }
  522. return out;
  523. }
  524. Format Renderer::getDepthNoStencilFormat() const
  525. {
  526. if(ANKI_PLATFORM_MOBILE)
  527. {
  528. return Format::kX8D24_Unorm_Pack32;
  529. }
  530. else
  531. {
  532. return Format::kD32_Sfloat;
  533. }
  534. }
  535. void Renderer::gpuSceneCopy(RenderingContext& ctx)
  536. {
  537. RenderGraphBuilder& rgraph = ctx.m_renderGraphDescr;
  538. m_runCtx.m_gpuSceneHandle =
  539. rgraph.importBuffer(GpuSceneBuffer::getSingleton().getBufferView(), GpuSceneBuffer::getSingleton().getBuffer().getBufferUsage());
  540. if(GpuSceneMicroPatcher::getSingleton().patchingIsNeeded())
  541. {
  542. NonGraphicsRenderPass& rpass = rgraph.newNonGraphicsRenderPass("GPU scene patching");
  543. rpass.newBufferDependency(m_runCtx.m_gpuSceneHandle, BufferUsageBit::kUavCompute);
  544. rpass.setWork([](RenderPassWorkContext& rgraphCtx) {
  545. GpuSceneMicroPatcher::getSingleton().patchGpuScene(*rgraphCtx.m_commandBuffer);
  546. });
  547. }
  548. }
  549. #if ANKI_STATS_ENABLED
  550. void Renderer::updatePipelineStats()
  551. {
  552. RendererDynamicArray<PipelineQueryPtr>& arr = m_pipelineQueries[m_frameCount % kMaxFramesInFlight];
  553. U64 sum = 0;
  554. for(PipelineQueryPtr& q : arr)
  555. {
  556. U64 value;
  557. const PipelineQueryResult res = q->getResult(value);
  558. if(res == PipelineQueryResult::kNotAvailable)
  559. {
  560. ANKI_R_LOGW("Pipeline query result is not available");
  561. }
  562. else
  563. {
  564. sum += value;
  565. }
  566. }
  567. arr.destroy();
  568. g_primitivesDrawnStatVar.set(sum);
  569. }
  570. #endif
  571. Error Renderer::render(Texture* presentTex)
  572. {
  573. ANKI_TRACE_SCOPED_EVENT(Render);
  574. const Second startTime = HighRezTimer::getCurrentTime();
  575. // First thing, reset the temp mem pool
  576. m_framePool.reset();
  577. RenderingContext ctx(&m_framePool);
  578. ctx.m_renderGraphDescr.setStatisticsEnabled(ANKI_STATS_ENABLED);
  579. ctx.m_swapchainRenderTarget = ctx.m_renderGraphDescr.importRenderTarget(presentTex, TextureUsageBit::kNone);
  580. #if ANKI_STATS_ENABLED
  581. updatePipelineStats();
  582. #endif
  583. const CameraComponent& cam = SceneGraph::getSingleton().getActiveCameraNode().getFirstComponentOfType<CameraComponent>();
  584. ctx.m_prevMatrices = m_prevMatrices;
  585. ctx.m_matrices.m_cameraTransform = Mat3x4(cam.getFrustum().getWorldTransform());
  586. ctx.m_matrices.m_view = cam.getFrustum().getViewMatrix();
  587. ctx.m_matrices.m_projection = cam.getFrustum().getProjectionMatrix();
  588. ctx.m_matrices.m_viewProjection = cam.getFrustum().getViewProjectionMatrix();
  589. Vec2 jitter = m_jitterOffsets[m_frameCount & (m_jitterOffsets.getSize() - 1)]; // In [-0.5, 0.5]
  590. jitter *= 2.0f; // In [-1, 1]
  591. const Vec2 ndcPixelSize = 1.0f / Vec2(m_internalResolution);
  592. jitter *= ndcPixelSize;
  593. ctx.m_matrices.m_jitter = Mat4::getIdentity();
  594. ctx.m_matrices.m_jitter.setTranslationPart(Vec3(jitter, 0.0f));
  595. ctx.m_matrices.m_jitterOffsetNdc = jitter;
  596. ctx.m_matrices.m_projectionJitter = ctx.m_matrices.m_jitter * ctx.m_matrices.m_projection;
  597. ctx.m_matrices.m_viewProjectionJitter = ctx.m_matrices.m_projectionJitter * Mat4(ctx.m_matrices.m_view, Vec4(0.0f, 0.0f, 0.0f, 1.0f));
  598. ctx.m_matrices.m_invertedViewProjectionJitter = ctx.m_matrices.m_viewProjectionJitter.getInverse();
  599. ctx.m_matrices.m_invertedViewProjection = ctx.m_matrices.m_viewProjection.getInverse();
  600. ctx.m_matrices.m_invertedProjectionJitter = ctx.m_matrices.m_projectionJitter.getInverse();
  601. ctx.m_matrices.m_reprojection = ctx.m_prevMatrices.m_viewProjection * ctx.m_matrices.m_invertedViewProjection;
  602. ctx.m_matrices.m_unprojectionParameters = ctx.m_matrices.m_projection.extractPerspectiveUnprojectionParams();
  603. ctx.m_cameraNear = cam.getNear();
  604. ctx.m_cameraFar = cam.getFar();
  605. // Allocate global constants
  606. GlobalRendererConstants* globalConsts;
  607. {
  608. U32 alignment = (GrManager::getSingleton().getDeviceCapabilities().m_structuredBufferNaturalAlignment)
  609. ? sizeof(*globalConsts)
  610. : GrManager::getSingleton().getDeviceCapabilities().m_structuredBufferBindOffsetAlignment;
  611. alignment = computeCompoundAlignment(alignment, GrManager::getSingleton().getDeviceCapabilities().m_constantBufferBindOffsetAlignment);
  612. ctx.m_globalRenderingConstantsBuffer = RebarTransientMemoryPool::getSingleton().allocate(sizeof(*globalConsts), alignment, globalConsts);
  613. }
  614. ANKI_CHECK(populateRenderGraph(ctx));
  615. // Blit renderer's result to swapchain
  616. const Bool bNeedsBlit = m_postProcessResolution != m_swapchainResolution;
  617. if(bNeedsBlit)
  618. {
  619. GraphicsRenderPass& pass = ctx.m_renderGraphDescr.newGraphicsRenderPass("Final Blit");
  620. pass.setRenderpassInfo({GraphicsRenderPassTargetDesc(ctx.m_swapchainRenderTarget)});
  621. pass.newTextureDependency(ctx.m_swapchainRenderTarget, TextureUsageBit::kRtvDsvWrite);
  622. pass.newTextureDependency(m_finalComposite->getRenderTarget(), TextureUsageBit::kSrvPixel);
  623. pass.setWork([this, &ctx](RenderPassWorkContext& rgraphCtx) {
  624. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  625. cmdb.setViewport(0, 0, m_swapchainResolution.x(), m_swapchainResolution.y());
  626. cmdb.bindShaderProgram(m_blitGrProg.get());
  627. cmdb.bindSampler(0, 0, m_samplers.m_trilinearClamp.get());
  628. rgraphCtx.bindSrv(0, 0, m_finalComposite->getRenderTarget());
  629. cmdb.draw(PrimitiveTopology::kTriangles, 3);
  630. // Draw the UI
  631. m_uiStage->draw(m_swapchainResolution.x(), m_swapchainResolution.y(), cmdb);
  632. });
  633. }
  634. // Create a dummy pass to transition the presentable image to present
  635. {
  636. NonGraphicsRenderPass& pass = ctx.m_renderGraphDescr.newNonGraphicsRenderPass("Present");
  637. pass.setWork([]([[maybe_unused]] RenderPassWorkContext& rgraphCtx) {
  638. // Do nothing. This pass is dummy
  639. });
  640. pass.newTextureDependency(ctx.m_swapchainRenderTarget, TextureUsageBit::kPresent);
  641. }
  642. writeGlobalRendererConstants(ctx, *globalConsts);
  643. // Bake the render graph
  644. m_rgraph->compileNewGraph(ctx.m_renderGraphDescr, m_framePool);
  645. // Flush
  646. FencePtr fence;
  647. m_rgraph->recordAndSubmitCommandBuffers(&fence);
  648. // Misc
  649. m_rgraph->reset();
  650. ++m_frameCount;
  651. m_prevMatrices = ctx.m_matrices;
  652. m_readbackManager->endFrame(fence.get());
  653. // Stats
  654. if(ANKI_STATS_ENABLED || ANKI_TRACING_ENABLED)
  655. {
  656. g_rendererCpuTimeStatVar.set((HighRezTimer::getCurrentTime() - startTime) * 1000.0);
  657. RenderGraphStatistics rgraphStats;
  658. m_rgraph->getStatistics(rgraphStats);
  659. g_rendererGpuTimeStatVar.set(rgraphStats.m_gpuTime * 1000.0);
  660. if(rgraphStats.m_gpuTime > 0.0)
  661. {
  662. // WARNING: The name of the event is somewhat special. Search it to see why
  663. ANKI_TRACE_CUSTOM_EVENT(GpuFrameTime, rgraphStats.m_cpuStartTime, rgraphStats.m_gpuTime);
  664. }
  665. }
  666. return Error::kNone;
  667. }
  668. } // end namespace anki