Renderer.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  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/Renderer.h>
  6. #include <AnKi/Renderer/RenderQueue.h>
  7. #include <AnKi/Util/Tracer.h>
  8. #include <AnKi/Util/ThreadHive.h>
  9. #include <AnKi/Core/ConfigSet.h>
  10. #include <AnKi/Util/HighRezTimer.h>
  11. #include <AnKi/Collision/Aabb.h>
  12. #include <AnKi/Collision/Plane.h>
  13. #include <AnKi/Collision/Functions.h>
  14. #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
  15. #include <AnKi/Core/GpuMemory/GpuSceneBuffer.h>
  16. #include <AnKi/Renderer/ProbeReflections.h>
  17. #include <AnKi/Renderer/GBuffer.h>
  18. #include <AnKi/Renderer/GBufferPost.h>
  19. #include <AnKi/Renderer/LightShading.h>
  20. #include <AnKi/Renderer/ShadowMapping.h>
  21. #include <AnKi/Renderer/FinalComposite.h>
  22. #include <AnKi/Renderer/Bloom.h>
  23. #include <AnKi/Renderer/Tonemapping.h>
  24. #include <AnKi/Renderer/ForwardShading.h>
  25. #include <AnKi/Renderer/LensFlare.h>
  26. #include <AnKi/Renderer/Dbg.h>
  27. #include <AnKi/Renderer/DownscaleBlur.h>
  28. #include <AnKi/Renderer/VolumetricFog.h>
  29. #include <AnKi/Renderer/DepthDownscale.h>
  30. #include <AnKi/Renderer/TemporalAA.h>
  31. #include <AnKi/Renderer/UiStage.h>
  32. #include <AnKi/Renderer/IndirectSpecular.h>
  33. #include <AnKi/Renderer/VolumetricLightingAccumulation.h>
  34. #include <AnKi/Renderer/IndirectDiffuseProbes.h>
  35. #include <AnKi/Renderer/GenericCompute.h>
  36. #include <AnKi/Renderer/ShadowmapsResolve.h>
  37. #include <AnKi/Renderer/RtShadows.h>
  38. #include <AnKi/Renderer/AccelerationStructureBuilder.h>
  39. #include <AnKi/Renderer/MotionVectors.h>
  40. #include <AnKi/Renderer/ClusterBinning.h>
  41. #include <AnKi/Renderer/Scale.h>
  42. #include <AnKi/Renderer/IndirectDiffuse.h>
  43. #include <AnKi/Renderer/VrsSriGeneration.h>
  44. #include <AnKi/Renderer/PackVisibleClusteredObjects.h>
  45. #include <AnKi/Renderer/HiZ.h>
  46. #include <AnKi/Renderer/GpuVisibility.h>
  47. namespace anki {
  48. /// Generate a Halton jitter in [-0.5, 0.5]
  49. static Vec2 generateJitter(U32 frame)
  50. {
  51. // Halton jitter
  52. Vec2 result(0.0f);
  53. constexpr U32 baseX = 2;
  54. U32 index = frame + 1;
  55. F32 invBase = 1.0f / baseX;
  56. F32 fraction = invBase;
  57. while(index > 0)
  58. {
  59. result.x() += F32(index % baseX) * fraction;
  60. index /= baseX;
  61. fraction *= invBase;
  62. }
  63. constexpr U32 baseY = 3;
  64. index = frame + 1;
  65. invBase = 1.0f / baseY;
  66. fraction = invBase;
  67. while(index > 0)
  68. {
  69. result.y() += F32(index % baseY) * fraction;
  70. index /= baseY;
  71. fraction *= invBase;
  72. }
  73. result.x() -= 0.5f;
  74. result.y() -= 0.5f;
  75. return result;
  76. }
  77. Renderer::Renderer()
  78. {
  79. }
  80. Renderer::~Renderer()
  81. {
  82. }
  83. Error Renderer::init(UVec2 swapchainSize)
  84. {
  85. ANKI_TRACE_SCOPED_EVENT(RInit);
  86. const Error err = initInternal(swapchainSize);
  87. if(err)
  88. {
  89. ANKI_R_LOGE("Failed to initialize the renderer");
  90. }
  91. return err;
  92. }
  93. Error Renderer::initInternal(UVec2 swapchainResolution)
  94. {
  95. m_frameCount = 0;
  96. // Set from the config
  97. m_postProcessResolution = UVec2(Vec2(swapchainResolution) * ConfigSet::getSingleton().getRRenderScaling());
  98. alignRoundDown(2, m_postProcessResolution.x());
  99. alignRoundDown(2, m_postProcessResolution.y());
  100. m_internalResolution = UVec2(Vec2(m_postProcessResolution) * ConfigSet::getSingleton().getRInternalRenderScaling());
  101. alignRoundDown(2, m_internalResolution.x());
  102. alignRoundDown(2, m_internalResolution.y());
  103. ANKI_R_LOGI("Initializing offscreen renderer. Resolution %ux%u. Internal resolution %ux%u",
  104. m_postProcessResolution.x(), m_postProcessResolution.y(), m_internalResolution.x(),
  105. m_internalResolution.y());
  106. m_tileSize = ConfigSet::getSingleton().getRTileSize();
  107. m_tileCounts.x() = (m_internalResolution.x() + m_tileSize - 1) / m_tileSize;
  108. m_tileCounts.y() = (m_internalResolution.y() + m_tileSize - 1) / m_tileSize;
  109. m_zSplitCount = ConfigSet::getSingleton().getRZSplitCount();
  110. // A few sanity checks
  111. if(m_internalResolution.x() < 64 || m_internalResolution.y() < 64)
  112. {
  113. ANKI_R_LOGE("Incorrect sizes");
  114. return Error::kUserData;
  115. }
  116. ANKI_CHECK(ResourceManager::getSingleton().loadResource("ShaderBinaries/ClearTextureCompute.ankiprogbin",
  117. m_clearTexComputeProg));
  118. // Dummy resources
  119. {
  120. TextureInitInfo texinit("RendererDummy");
  121. texinit.m_width = texinit.m_height = 4;
  122. texinit.m_usage = TextureUsageBit::kAllSampled | TextureUsageBit::kImageComputeWrite;
  123. texinit.m_format = Format::kR8G8B8A8_Unorm;
  124. TexturePtr tex = createAndClearRenderTarget(texinit, TextureUsageBit::kAllSampled);
  125. TextureViewInitInfo viewinit(tex);
  126. m_dummyTexView2d = GrManager::getSingleton().newTextureView(viewinit);
  127. texinit.m_depth = 4;
  128. texinit.m_type = TextureType::k3D;
  129. tex = createAndClearRenderTarget(texinit, TextureUsageBit::kAllSampled);
  130. viewinit = TextureViewInitInfo(tex);
  131. m_dummyTexView3d = GrManager::getSingleton().newTextureView(viewinit);
  132. m_dummyBuff = GrManager::getSingleton().newBuffer(BufferInitInfo(
  133. 1024, BufferUsageBit::kAllUniform | BufferUsageBit::kAllStorage, BufferMapAccessBit::kNone, "Dummy"));
  134. }
  135. // Init the stages. Careful with the order!!!!!!!!!!
  136. m_genericCompute.reset(newInstance<GenericCompute>(RendererMemoryPool::getSingleton()));
  137. ANKI_CHECK(m_genericCompute->init());
  138. m_volumetricLightingAccumulation.reset(
  139. newInstance<VolumetricLightingAccumulation>(RendererMemoryPool::getSingleton()));
  140. ANKI_CHECK(m_volumetricLightingAccumulation->init());
  141. m_indirectDiffuseProbes.reset(newInstance<IndirectDiffuseProbes>(RendererMemoryPool::getSingleton()));
  142. ANKI_CHECK(m_indirectDiffuseProbes->init());
  143. m_probeReflections.reset(newInstance<ProbeReflections>(RendererMemoryPool::getSingleton()));
  144. ANKI_CHECK(m_probeReflections->init());
  145. m_vrsSriGeneration.reset(newInstance<VrsSriGeneration>(RendererMemoryPool::getSingleton()));
  146. ANKI_CHECK(m_vrsSriGeneration->init());
  147. m_scale.reset(newInstance<Scale>(RendererMemoryPool::getSingleton()));
  148. ANKI_CHECK(m_scale->init());
  149. m_gbuffer.reset(newInstance<GBuffer>(RendererMemoryPool::getSingleton()));
  150. ANKI_CHECK(m_gbuffer->init());
  151. m_gbufferPost.reset(newInstance<GBufferPost>(RendererMemoryPool::getSingleton()));
  152. ANKI_CHECK(m_gbufferPost->init());
  153. m_shadowMapping.reset(newInstance<ShadowMapping>(RendererMemoryPool::getSingleton()));
  154. ANKI_CHECK(m_shadowMapping->init());
  155. m_volumetricFog.reset(newInstance<VolumetricFog>(RendererMemoryPool::getSingleton()));
  156. ANKI_CHECK(m_volumetricFog->init());
  157. m_lightShading.reset(newInstance<LightShading>(RendererMemoryPool::getSingleton()));
  158. ANKI_CHECK(m_lightShading->init());
  159. m_depthDownscale.reset(newInstance<DepthDownscale>(RendererMemoryPool::getSingleton()));
  160. ANKI_CHECK(m_depthDownscale->init());
  161. m_forwardShading.reset(newInstance<ForwardShading>(RendererMemoryPool::getSingleton()));
  162. ANKI_CHECK(m_forwardShading->init());
  163. m_lensFlare.reset(newInstance<LensFlare>(RendererMemoryPool::getSingleton()));
  164. ANKI_CHECK(m_lensFlare->init());
  165. m_downscaleBlur.reset(newInstance<DownscaleBlur>(RendererMemoryPool::getSingleton()));
  166. ANKI_CHECK(m_downscaleBlur->init());
  167. m_indirectSpecular.reset(newInstance<IndirectSpecular>(RendererMemoryPool::getSingleton()));
  168. ANKI_CHECK(m_indirectSpecular->init());
  169. m_tonemapping.reset(newInstance<Tonemapping>(RendererMemoryPool::getSingleton()));
  170. ANKI_CHECK(m_tonemapping->init());
  171. m_temporalAA.reset(newInstance<TemporalAA>(RendererMemoryPool::getSingleton()));
  172. ANKI_CHECK(m_temporalAA->init());
  173. m_bloom.reset(newInstance<Bloom>(RendererMemoryPool::getSingleton()));
  174. ANKI_CHECK(m_bloom->init());
  175. m_finalComposite.reset(newInstance<FinalComposite>(RendererMemoryPool::getSingleton()));
  176. ANKI_CHECK(m_finalComposite->init());
  177. m_dbg.reset(newInstance<Dbg>(RendererMemoryPool::getSingleton()));
  178. ANKI_CHECK(m_dbg->init());
  179. m_uiStage.reset(newInstance<UiStage>(RendererMemoryPool::getSingleton()));
  180. ANKI_CHECK(m_uiStage->init());
  181. m_indirectDiffuse.reset(newInstance<IndirectDiffuse>(RendererMemoryPool::getSingleton()));
  182. ANKI_CHECK(m_indirectDiffuse->init());
  183. if(GrManager::getSingleton().getDeviceCapabilities().m_rayTracingEnabled
  184. && ConfigSet::getSingleton().getSceneRayTracedShadows())
  185. {
  186. m_accelerationStructureBuilder.reset(
  187. newInstance<AccelerationStructureBuilder>(RendererMemoryPool::getSingleton()));
  188. ANKI_CHECK(m_accelerationStructureBuilder->init());
  189. m_rtShadows.reset(newInstance<RtShadows>(RendererMemoryPool::getSingleton()));
  190. ANKI_CHECK(m_rtShadows->init());
  191. }
  192. else
  193. {
  194. m_shadowmapsResolve.reset(newInstance<ShadowmapsResolve>(RendererMemoryPool::getSingleton()));
  195. ANKI_CHECK(m_shadowmapsResolve->init());
  196. }
  197. m_motionVectors.reset(newInstance<MotionVectors>(RendererMemoryPool::getSingleton()));
  198. ANKI_CHECK(m_motionVectors->init());
  199. m_clusterBinning.reset(newInstance<ClusterBinning>(RendererMemoryPool::getSingleton()));
  200. ANKI_CHECK(m_clusterBinning->init());
  201. m_packVisibleClustererObjects.reset(newInstance<PackVisibleClusteredObjects>(RendererMemoryPool::getSingleton()));
  202. ANKI_CHECK(m_packVisibleClustererObjects->init());
  203. m_hiZ.reset(newInstance<HiZ>(RendererMemoryPool::getSingleton()));
  204. ANKI_CHECK(m_hiZ->init());
  205. m_gpuVisibility.reset(newInstance<GpuVisibility>(RendererMemoryPool::getSingleton()));
  206. ANKI_CHECK(m_gpuVisibility->init());
  207. // Init samplers
  208. {
  209. SamplerInitInfo sinit("NearestNearestClamp");
  210. sinit.m_addressing = SamplingAddressing::kClamp;
  211. sinit.m_mipmapFilter = SamplingFilter::kNearest;
  212. sinit.m_minMagFilter = SamplingFilter::kNearest;
  213. m_samplers.m_nearestNearestClamp = GrManager::getSingleton().newSampler(sinit);
  214. sinit.setName("TrilinearClamp");
  215. sinit.m_minMagFilter = SamplingFilter::kLinear;
  216. sinit.m_mipmapFilter = SamplingFilter::kLinear;
  217. m_samplers.m_trilinearClamp = GrManager::getSingleton().newSampler(sinit);
  218. sinit.setName("TrilinearRepeat");
  219. sinit.m_addressing = SamplingAddressing::kRepeat;
  220. m_samplers.m_trilinearRepeat = GrManager::getSingleton().newSampler(sinit);
  221. sinit.setName("TrilinearRepeatAniso");
  222. sinit.m_anisotropyLevel = ConfigSet::getSingleton().getRTextureAnisotropy();
  223. m_samplers.m_trilinearRepeatAniso = GrManager::getSingleton().newSampler(sinit);
  224. sinit.setName("TrilinearRepeatAnisoRezScalingBias");
  225. F32 scalingMipBias = log2(F32(m_internalResolution.x()) / F32(m_postProcessResolution.x()));
  226. if(getScale().getUsingGrUpscaler())
  227. {
  228. // DLSS wants more bias
  229. scalingMipBias -= 1.0f;
  230. }
  231. sinit.m_lodBias = scalingMipBias;
  232. m_samplers.m_trilinearRepeatAnisoResolutionScalingBias = GrManager::getSingleton().newSampler(sinit);
  233. sinit = {};
  234. sinit.setName("TrilinearClampShadow");
  235. sinit.m_minMagFilter = SamplingFilter::kLinear;
  236. sinit.m_mipmapFilter = SamplingFilter::kLinear;
  237. sinit.m_compareOperation = CompareOperation::kLessEqual;
  238. m_samplers.m_trilinearClampShadow = GrManager::getSingleton().newSampler(sinit);
  239. }
  240. for(U32 i = 0; i < m_jitterOffsets.getSize(); ++i)
  241. {
  242. m_jitterOffsets[i] = generateJitter(i);
  243. }
  244. return Error::kNone;
  245. }
  246. Error Renderer::populateRenderGraph(RenderingContext& ctx)
  247. {
  248. ctx.m_prevMatrices = m_prevMatrices;
  249. ctx.m_matrices.m_cameraTransform = ctx.m_renderQueue->m_cameraTransform;
  250. ctx.m_matrices.m_view = ctx.m_renderQueue->m_viewMatrix;
  251. ctx.m_matrices.m_projection = ctx.m_renderQueue->m_projectionMatrix;
  252. ctx.m_matrices.m_viewProjection = ctx.m_renderQueue->m_viewProjectionMatrix;
  253. Vec2 jitter = m_jitterOffsets[m_frameCount & (m_jitterOffsets.getSize() - 1)]; // In [-0.5, 0.5]
  254. const Vec2 ndcPixelSize = 2.0f / Vec2(m_internalResolution);
  255. jitter *= ndcPixelSize;
  256. ctx.m_matrices.m_jitter = Mat4::getIdentity();
  257. ctx.m_matrices.m_jitter.setTranslationPart(Vec4(jitter, 0.0f, 1.0f));
  258. ctx.m_matrices.m_projectionJitter = ctx.m_matrices.m_jitter * ctx.m_matrices.m_projection;
  259. ctx.m_matrices.m_viewProjectionJitter =
  260. ctx.m_matrices.m_projectionJitter * Mat4(ctx.m_matrices.m_view, Vec4(0.0f, 0.0f, 0.0f, 1.0f));
  261. ctx.m_matrices.m_invertedViewProjectionJitter = ctx.m_matrices.m_viewProjectionJitter.getInverse();
  262. ctx.m_matrices.m_invertedViewProjection = ctx.m_matrices.m_viewProjection.getInverse();
  263. ctx.m_matrices.m_invertedProjectionJitter = ctx.m_matrices.m_projectionJitter.getInverse();
  264. ctx.m_matrices.m_reprojection =
  265. ctx.m_matrices.m_jitter * ctx.m_prevMatrices.m_viewProjection * ctx.m_matrices.m_invertedViewProjectionJitter;
  266. ctx.m_matrices.m_unprojectionParameters = ctx.m_matrices.m_projection.extractPerspectiveUnprojectionParams();
  267. // Check if resources got loaded
  268. if(m_prevLoadRequestCount != ResourceManager::getSingleton().getLoadingRequestCount()
  269. || m_prevAsyncTasksCompleted != ResourceManager::getSingleton().getAsyncTaskCompletedCount())
  270. {
  271. m_prevLoadRequestCount = ResourceManager::getSingleton().getLoadingRequestCount();
  272. m_prevAsyncTasksCompleted = ResourceManager::getSingleton().getAsyncTaskCompletedCount();
  273. m_resourcesDirty = true;
  274. }
  275. else
  276. {
  277. m_resourcesDirty = false;
  278. }
  279. // Import RTs first
  280. m_downscaleBlur->importRenderTargets(ctx);
  281. m_tonemapping->importRenderTargets(ctx);
  282. m_depthDownscale->importRenderTargets(ctx);
  283. m_vrsSriGeneration->importRenderTargets(ctx);
  284. m_gbuffer->importRenderTargets(ctx);
  285. // Populate render graph. WARNING Watch the order
  286. m_hiZ->populateRenderGraph(ctx);
  287. gpuSceneCopy(ctx);
  288. m_gpuVisibility->populateRenderGraph(ctx);
  289. m_packVisibleClustererObjects->populateRenderGraph(ctx);
  290. m_genericCompute->populateRenderGraph(ctx);
  291. m_clusterBinning->populateRenderGraph(ctx);
  292. if(m_accelerationStructureBuilder)
  293. {
  294. m_accelerationStructureBuilder->populateRenderGraph(ctx);
  295. }
  296. m_gbuffer->populateRenderGraph(ctx);
  297. m_shadowMapping->populateRenderGraph(ctx);
  298. m_indirectDiffuseProbes->populateRenderGraph(ctx);
  299. m_probeReflections->populateRenderGraph(ctx);
  300. m_volumetricLightingAccumulation->populateRenderGraph(ctx);
  301. m_motionVectors->populateRenderGraph(ctx);
  302. m_gbufferPost->populateRenderGraph(ctx);
  303. m_depthDownscale->populateRenderGraph(ctx);
  304. if(m_rtShadows)
  305. {
  306. m_rtShadows->populateRenderGraph(ctx);
  307. }
  308. else
  309. {
  310. m_shadowmapsResolve->populateRenderGraph(ctx);
  311. }
  312. m_volumetricFog->populateRenderGraph(ctx);
  313. m_lensFlare->populateRenderGraph(ctx);
  314. m_indirectSpecular->populateRenderGraph(ctx);
  315. m_indirectDiffuse->populateRenderGraph(ctx);
  316. m_lightShading->populateRenderGraph(ctx);
  317. if(!getScale().getUsingGrUpscaler())
  318. {
  319. m_temporalAA->populateRenderGraph(ctx);
  320. }
  321. m_vrsSriGeneration->populateRenderGraph(ctx);
  322. m_scale->populateRenderGraph(ctx);
  323. m_downscaleBlur->populateRenderGraph(ctx);
  324. m_tonemapping->populateRenderGraph(ctx);
  325. m_bloom->populateRenderGraph(ctx);
  326. m_dbg->populateRenderGraph(ctx);
  327. m_finalComposite->populateRenderGraph(ctx);
  328. // Populate the uniforms
  329. m_clusterBinning->writeClusterBuffersAsync();
  330. return Error::kNone;
  331. }
  332. void Renderer::finalize(const RenderingContext& ctx)
  333. {
  334. ++m_frameCount;
  335. m_prevMatrices = ctx.m_matrices;
  336. // Inform about the HiZ map. Do it as late as possible
  337. if(ctx.m_renderQueue->m_fillCoverageBufferCallback)
  338. {
  339. F32* depthValues;
  340. U32 width;
  341. U32 height;
  342. m_depthDownscale->getClientDepthMapInfo(depthValues, width, height);
  343. ctx.m_renderQueue->m_fillCoverageBufferCallback(ctx.m_renderQueue->m_fillCoverageBufferCallbackUserData,
  344. depthValues, width, height);
  345. }
  346. }
  347. TextureInitInfo Renderer::create2DRenderTargetInitInfo(U32 w, U32 h, Format format, TextureUsageBit usage, CString name)
  348. {
  349. ANKI_ASSERT(!!(usage & TextureUsageBit::kFramebufferWrite) || !!(usage & TextureUsageBit::kImageComputeWrite));
  350. TextureInitInfo init(name);
  351. init.m_width = w;
  352. init.m_height = h;
  353. init.m_depth = 1;
  354. init.m_layerCount = 1;
  355. init.m_type = TextureType::k2D;
  356. init.m_format = format;
  357. init.m_mipmapCount = 1;
  358. init.m_samples = 1;
  359. init.m_usage = usage;
  360. return init;
  361. }
  362. RenderTargetDescription Renderer::create2DRenderTargetDescription(U32 w, U32 h, Format format, CString name)
  363. {
  364. RenderTargetDescription init(name);
  365. init.m_width = w;
  366. init.m_height = h;
  367. init.m_depth = 1;
  368. init.m_layerCount = 1;
  369. init.m_type = TextureType::k2D;
  370. init.m_format = format;
  371. init.m_mipmapCount = 1;
  372. init.m_samples = 1;
  373. init.m_usage = TextureUsageBit::kNone;
  374. return init;
  375. }
  376. TexturePtr Renderer::createAndClearRenderTarget(const TextureInitInfo& inf, TextureUsageBit initialUsage,
  377. const ClearValue& clearVal)
  378. {
  379. ANKI_ASSERT(!!(inf.m_usage & TextureUsageBit::kFramebufferWrite)
  380. || !!(inf.m_usage & TextureUsageBit::kImageComputeWrite));
  381. const U faceCount = (inf.m_type == TextureType::kCube || inf.m_type == TextureType::kCubeArray) ? 6 : 1;
  382. Bool useCompute = false;
  383. if(!!(inf.m_usage & TextureUsageBit::kFramebufferWrite))
  384. {
  385. useCompute = false;
  386. }
  387. else if(!!(inf.m_usage & TextureUsageBit::kImageComputeWrite))
  388. {
  389. useCompute = true;
  390. }
  391. else
  392. {
  393. ANKI_ASSERT(!"Can't handle that");
  394. }
  395. // Create tex
  396. TexturePtr tex = GrManager::getSingleton().newTexture(inf);
  397. // Clear all surfaces
  398. CommandBufferInitInfo cmdbinit;
  399. cmdbinit.m_flags = CommandBufferFlag::kGeneralWork;
  400. if((inf.m_mipmapCount * faceCount * inf.m_layerCount * 4) < kCommandBufferSmallBatchMaxCommands)
  401. {
  402. cmdbinit.m_flags |= CommandBufferFlag::kSmallBatch;
  403. }
  404. CommandBufferPtr cmdb = GrManager::getSingleton().newCommandBuffer(cmdbinit);
  405. for(U32 mip = 0; mip < inf.m_mipmapCount; ++mip)
  406. {
  407. for(U32 face = 0; face < faceCount; ++face)
  408. {
  409. for(U32 layer = 0; layer < inf.m_layerCount; ++layer)
  410. {
  411. TextureSurfaceInfo surf(mip, 0, face, layer);
  412. if(!useCompute)
  413. {
  414. FramebufferInitInfo fbInit("RendererClearRT");
  415. Array<TextureUsageBit, kMaxColorRenderTargets> colUsage = {};
  416. TextureUsageBit dsUsage = TextureUsageBit::kNone;
  417. if(getFormatInfo(inf.m_format).isDepthStencil())
  418. {
  419. DepthStencilAspectBit aspect = DepthStencilAspectBit::kNone;
  420. if(getFormatInfo(inf.m_format).isDepth())
  421. {
  422. aspect |= DepthStencilAspectBit::kDepth;
  423. }
  424. if(getFormatInfo(inf.m_format).isStencil())
  425. {
  426. aspect |= DepthStencilAspectBit::kStencil;
  427. }
  428. TextureViewPtr view =
  429. GrManager::getSingleton().newTextureView(TextureViewInitInfo(tex, surf, aspect));
  430. fbInit.m_depthStencilAttachment.m_textureView = std::move(view);
  431. fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::kClear;
  432. fbInit.m_depthStencilAttachment.m_stencilLoadOperation = AttachmentLoadOperation::kClear;
  433. fbInit.m_depthStencilAttachment.m_clearValue = clearVal;
  434. dsUsage = TextureUsageBit::kFramebufferWrite;
  435. }
  436. else
  437. {
  438. TextureViewPtr view = GrManager::getSingleton().newTextureView(TextureViewInitInfo(tex, surf));
  439. fbInit.m_colorAttachmentCount = 1;
  440. fbInit.m_colorAttachments[0].m_textureView = view;
  441. fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::kClear;
  442. fbInit.m_colorAttachments[0].m_clearValue = clearVal;
  443. colUsage[0] = TextureUsageBit::kFramebufferWrite;
  444. }
  445. FramebufferPtr fb = GrManager::getSingleton().newFramebuffer(fbInit);
  446. TextureBarrierInfo barrier = {tex.get(), TextureUsageBit::kNone, TextureUsageBit::kFramebufferWrite,
  447. surf};
  448. barrier.m_subresource.m_depthStencilAspect = tex->getDepthStencilAspect();
  449. cmdb->setPipelineBarrier({&barrier, 1}, {}, {});
  450. cmdb->beginRenderPass(fb, colUsage, dsUsage);
  451. cmdb->endRenderPass();
  452. if(!!initialUsage)
  453. {
  454. barrier.m_previousUsage = TextureUsageBit::kFramebufferWrite;
  455. barrier.m_nextUsage = initialUsage;
  456. cmdb->setPipelineBarrier({&barrier, 1}, {}, {});
  457. }
  458. }
  459. else
  460. {
  461. // Compute
  462. ShaderProgramResourceVariantInitInfo variantInitInfo(m_clearTexComputeProg);
  463. variantInitInfo.addMutation("TEXTURE_DIMENSIONS", I32((inf.m_type == TextureType::k3D) ? 3 : 2));
  464. const FormatInfo formatInfo = getFormatInfo(inf.m_format);
  465. I32 componentType = 0;
  466. if(formatInfo.m_shaderType == 0)
  467. {
  468. componentType = 0;
  469. }
  470. else if(formatInfo.m_shaderType == 1)
  471. {
  472. componentType = 1;
  473. }
  474. else
  475. {
  476. ANKI_ASSERT(!"Not supported");
  477. }
  478. variantInitInfo.addMutation("COMPONENT_TYPE", componentType);
  479. const ShaderProgramResourceVariant* variant;
  480. m_clearTexComputeProg->getOrCreateVariant(variantInitInfo, variant);
  481. cmdb->bindShaderProgram(variant->getProgram());
  482. cmdb->setPushConstants(&clearVal.m_colorf[0], sizeof(clearVal.m_colorf));
  483. TextureViewPtr view = GrManager::getSingleton().newTextureView(TextureViewInitInfo(tex, surf));
  484. cmdb->bindImage(0, 0, view);
  485. const TextureBarrierInfo barrier = {tex.get(), TextureUsageBit::kNone,
  486. TextureUsageBit::kImageComputeWrite, surf};
  487. cmdb->setPipelineBarrier({&barrier, 1}, {}, {});
  488. UVec3 wgSize;
  489. wgSize.x() = (8 - 1 + (tex->getWidth() >> mip)) / 8;
  490. wgSize.y() = (8 - 1 + (tex->getHeight() >> mip)) / 8;
  491. wgSize.z() = (inf.m_type == TextureType::k3D) ? ((8 - 1 + (tex->getDepth() >> mip)) / 8) : 1;
  492. cmdb->dispatchCompute(wgSize.x(), wgSize.y(), wgSize.z());
  493. if(!!initialUsage)
  494. {
  495. const TextureBarrierInfo barrier = {tex.get(), TextureUsageBit::kImageComputeWrite,
  496. initialUsage, surf};
  497. cmdb->setPipelineBarrier({&barrier, 1}, {}, {});
  498. }
  499. }
  500. }
  501. }
  502. }
  503. cmdb->flush();
  504. return tex;
  505. }
  506. void Renderer::registerDebugRenderTarget(RendererObject* obj, CString rtName)
  507. {
  508. #if ANKI_ENABLE_ASSERTIONS
  509. for(const DebugRtInfo& inf : m_debugRts)
  510. {
  511. ANKI_ASSERT(inf.m_rtName != rtName && "Choose different name");
  512. }
  513. #endif
  514. ANKI_ASSERT(obj);
  515. DebugRtInfo inf;
  516. inf.m_obj = obj;
  517. inf.m_rtName = rtName;
  518. m_debugRts.emplaceBack(std::move(inf));
  519. }
  520. Bool Renderer::getCurrentDebugRenderTarget(Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
  521. ShaderProgramPtr& optionalShaderProgram)
  522. {
  523. if(m_currentDebugRtName.isEmpty()) [[likely]]
  524. {
  525. return false;
  526. }
  527. RendererObject* obj = nullptr;
  528. for(const DebugRtInfo& inf : m_debugRts)
  529. {
  530. if(inf.m_rtName == m_currentDebugRtName)
  531. {
  532. obj = inf.m_obj;
  533. }
  534. }
  535. ANKI_ASSERT(obj);
  536. obj->getDebugRenderTarget(m_currentDebugRtName, handles, optionalShaderProgram);
  537. return true;
  538. }
  539. void Renderer::setCurrentDebugRenderTarget(CString rtName)
  540. {
  541. m_currentDebugRtName.destroy();
  542. if(!rtName.isEmpty() && rtName.getLength() > 0)
  543. {
  544. m_currentDebugRtName = rtName;
  545. }
  546. }
  547. Format Renderer::getHdrFormat() const
  548. {
  549. Format out;
  550. if(!ConfigSet::getSingleton().getRHighQualityHdr())
  551. {
  552. out = Format::kB10G11R11_Ufloat_Pack32;
  553. }
  554. else if(GrManager::getSingleton().getDeviceCapabilities().m_unalignedBbpTextureFormats)
  555. {
  556. out = Format::kR16G16B16_Sfloat;
  557. }
  558. else
  559. {
  560. out = Format::kR16G16B16A16_Sfloat;
  561. }
  562. return out;
  563. }
  564. Format Renderer::getDepthNoStencilFormat() const
  565. {
  566. if(ANKI_PLATFORM_MOBILE)
  567. {
  568. return Format::kX8D24_Unorm_Pack32;
  569. }
  570. else
  571. {
  572. return Format::kD32_Sfloat;
  573. }
  574. }
  575. void Renderer::gpuSceneCopy(RenderingContext& ctx)
  576. {
  577. RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
  578. m_runCtx.m_gpuSceneHandle = rgraph.importBuffer(GpuSceneBuffer::getSingleton().getBuffer(),
  579. GpuSceneBuffer::getSingleton().getBuffer()->getBufferUsage());
  580. if(GpuSceneMicroPatcher::getSingleton().patchingIsNeeded())
  581. {
  582. ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("GPU scene patching");
  583. rpass.newBufferDependency(m_runCtx.m_gpuSceneHandle, BufferUsageBit::kStorageComputeWrite);
  584. rpass.setWork([](RenderPassWorkContext& rgraphCtx) {
  585. GpuSceneMicroPatcher::getSingleton().patchGpuScene(*rgraphCtx.m_commandBuffer.get());
  586. });
  587. }
  588. }
  589. } // end namespace anki