Renderer.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. // Copyright (C) 2009-2021, 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/Core/ConfigSet.h>
  9. #include <AnKi/Util/HighRezTimer.h>
  10. #include <AnKi/Collision/Aabb.h>
  11. #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
  12. #include <AnKi/Renderer/ProbeReflections.h>
  13. #include <AnKi/Renderer/GBuffer.h>
  14. #include <AnKi/Renderer/GBufferPost.h>
  15. #include <AnKi/Renderer/LightShading.h>
  16. #include <AnKi/Renderer/ShadowMapping.h>
  17. #include <AnKi/Renderer/FinalComposite.h>
  18. #include <AnKi/Renderer/Ssao.h>
  19. #include <AnKi/Renderer/Bloom.h>
  20. #include <AnKi/Renderer/Tonemapping.h>
  21. #include <AnKi/Renderer/ForwardShading.h>
  22. #include <AnKi/Renderer/LensFlare.h>
  23. #include <AnKi/Renderer/Dbg.h>
  24. #include <AnKi/Renderer/DownscaleBlur.h>
  25. #include <AnKi/Renderer/VolumetricFog.h>
  26. #include <AnKi/Renderer/DepthDownscale.h>
  27. #include <AnKi/Renderer/TemporalAA.h>
  28. #include <AnKi/Renderer/UiStage.h>
  29. #include <AnKi/Renderer/Ssr.h>
  30. #include <AnKi/Renderer/Ssgi.h>
  31. #include <AnKi/Renderer/VolumetricLightingAccumulation.h>
  32. #include <AnKi/Renderer/GlobalIllumination.h>
  33. #include <AnKi/Renderer/GenericCompute.h>
  34. #include <AnKi/Renderer/ShadowmapsResolve.h>
  35. #include <AnKi/Renderer/RtShadows.h>
  36. #include <AnKi/Renderer/AccelerationStructureBuilder.h>
  37. #include <AnKi/Renderer/MotionVectors.h>
  38. namespace anki
  39. {
  40. Renderer::Renderer()
  41. : m_sceneDrawer(this)
  42. {
  43. }
  44. Renderer::~Renderer()
  45. {
  46. for(DebugRtInfo& info : m_debugRts)
  47. {
  48. info.m_rtName.destroy(getAllocator());
  49. }
  50. m_debugRts.destroy(getAllocator());
  51. m_currentDebugRtName.destroy(getAllocator());
  52. }
  53. Error Renderer::init(ThreadHive* hive, ResourceManager* resources, GrManager* gl, StagingGpuMemoryManager* stagingMem,
  54. UiManager* ui, HeapAllocator<U8> alloc, const ConfigSet& config, Timestamp* globTimestamp)
  55. {
  56. ANKI_TRACE_SCOPED_EVENT(R_INIT);
  57. m_globTimestamp = globTimestamp;
  58. m_threadHive = hive;
  59. m_resources = resources;
  60. m_gr = gl;
  61. m_stagingMem = stagingMem;
  62. m_ui = ui;
  63. m_alloc = alloc;
  64. Error err = initInternal(config);
  65. if(err)
  66. {
  67. ANKI_R_LOGE("Failed to initialize the renderer");
  68. }
  69. return err;
  70. }
  71. Error Renderer::initInternal(const ConfigSet& config)
  72. {
  73. // Set from the config
  74. m_width = config.getNumberU32("width");
  75. m_height = config.getNumberU32("height");
  76. ANKI_R_LOGI("Initializing offscreen renderer. Size %ux%u", m_width, m_height);
  77. m_frameCount = 0;
  78. m_clusterCount[0] = config.getNumberU32("r_clusterSizeX");
  79. m_clusterCount[1] = config.getNumberU32("r_clusterSizeY");
  80. m_clusterCount[2] = config.getNumberU32("r_clusterSizeZ");
  81. m_clusterCount[3] = m_clusterCount[0] * m_clusterCount[1] * m_clusterCount[2];
  82. m_clusterBin.init(m_alloc, m_clusterCount[0], m_clusterCount[1], m_clusterCount[2], config);
  83. // A few sanity checks
  84. if(m_width < 10 || m_height < 10)
  85. {
  86. ANKI_R_LOGE("Incorrect sizes");
  87. return Error::USER_DATA;
  88. }
  89. {
  90. TextureInitInfo texinit;
  91. texinit.m_width = texinit.m_height = 4;
  92. texinit.m_usage = TextureUsageBit::ALL_SAMPLED;
  93. texinit.m_format = Format::R8G8B8A8_UNORM;
  94. texinit.m_initialUsage = TextureUsageBit::ALL_SAMPLED;
  95. TexturePtr tex = getGrManager().newTexture(texinit);
  96. TextureViewInitInfo viewinit(tex);
  97. m_dummyTexView2d = getGrManager().newTextureView(viewinit);
  98. texinit.m_depth = 4;
  99. texinit.m_type = TextureType::_3D;
  100. tex = getGrManager().newTexture(texinit);
  101. viewinit = TextureViewInitInfo(tex);
  102. m_dummyTexView3d = getGrManager().newTextureView(viewinit);
  103. }
  104. m_dummyBuff = getGrManager().newBuffer(BufferInitInfo(
  105. 1024, BufferUsageBit::ALL_UNIFORM | BufferUsageBit::ALL_STORAGE, BufferMapAccessBit::NONE, "Dummy"));
  106. ANKI_CHECK(m_resources->loadResource("Shaders/ClearTextureCompute.ankiprog", m_clearTexComputeProg));
  107. // Init the stages. Careful with the order!!!!!!!!!!
  108. m_genericCompute.reset(m_alloc.newInstance<GenericCompute>(this));
  109. ANKI_CHECK(m_genericCompute->init(config));
  110. m_volLighting.reset(m_alloc.newInstance<VolumetricLightingAccumulation>(this));
  111. ANKI_CHECK(m_volLighting->init(config));
  112. m_gi.reset(m_alloc.newInstance<GlobalIllumination>(this));
  113. ANKI_CHECK(m_gi->init(config));
  114. m_probeReflections.reset(m_alloc.newInstance<ProbeReflections>(this));
  115. ANKI_CHECK(m_probeReflections->init(config));
  116. m_gbuffer.reset(m_alloc.newInstance<GBuffer>(this));
  117. ANKI_CHECK(m_gbuffer->init(config));
  118. m_gbufferPost.reset(m_alloc.newInstance<GBufferPost>(this));
  119. ANKI_CHECK(m_gbufferPost->init(config));
  120. m_shadowMapping.reset(m_alloc.newInstance<ShadowMapping>(this));
  121. ANKI_CHECK(m_shadowMapping->init(config));
  122. m_volFog.reset(m_alloc.newInstance<VolumetricFog>(this));
  123. ANKI_CHECK(m_volFog->init(config));
  124. m_lightShading.reset(m_alloc.newInstance<LightShading>(this));
  125. ANKI_CHECK(m_lightShading->init(config));
  126. m_depth.reset(m_alloc.newInstance<DepthDownscale>(this));
  127. ANKI_CHECK(m_depth->init(config));
  128. m_forwardShading.reset(m_alloc.newInstance<ForwardShading>(this));
  129. ANKI_CHECK(m_forwardShading->init(config));
  130. m_lensFlare.reset(m_alloc.newInstance<LensFlare>(this));
  131. ANKI_CHECK(m_lensFlare->init(config));
  132. m_ssao.reset(m_alloc.newInstance<Ssao>(this));
  133. ANKI_CHECK(m_ssao->init(config));
  134. m_downscale.reset(getAllocator().newInstance<DownscaleBlur>(this));
  135. ANKI_CHECK(m_downscale->init(config));
  136. m_ssr.reset(m_alloc.newInstance<Ssr>(this));
  137. ANKI_CHECK(m_ssr->init(config));
  138. m_ssgi.reset(m_alloc.newInstance<Ssgi>(this));
  139. ANKI_CHECK(m_ssgi->init(config));
  140. m_tonemapping.reset(getAllocator().newInstance<Tonemapping>(this));
  141. ANKI_CHECK(m_tonemapping->init(config));
  142. m_temporalAA.reset(getAllocator().newInstance<TemporalAA>(this));
  143. ANKI_CHECK(m_temporalAA->init(config));
  144. m_bloom.reset(m_alloc.newInstance<Bloom>(this));
  145. ANKI_CHECK(m_bloom->init(config));
  146. m_finalComposite.reset(m_alloc.newInstance<FinalComposite>(this));
  147. ANKI_CHECK(m_finalComposite->init(config));
  148. m_dbg.reset(m_alloc.newInstance<Dbg>(this));
  149. ANKI_CHECK(m_dbg->init(config));
  150. m_uiStage.reset(m_alloc.newInstance<UiStage>(this));
  151. ANKI_CHECK(m_uiStage->init(config));
  152. if(getGrManager().getDeviceCapabilities().m_rayTracingEnabled && config.getBool("scene_rayTracedShadows"))
  153. {
  154. m_accelerationStructureBuilder.reset(m_alloc.newInstance<AccelerationStructureBuilder>(this));
  155. ANKI_CHECK(m_accelerationStructureBuilder->init(config));
  156. m_rtShadows.reset(m_alloc.newInstance<RtShadows>(this));
  157. ANKI_CHECK(m_rtShadows->init(config));
  158. }
  159. else
  160. {
  161. m_smResolve.reset(m_alloc.newInstance<ShadowmapsResolve>(this));
  162. ANKI_CHECK(m_smResolve->init(config));
  163. }
  164. m_motionVectors.reset(m_alloc.newInstance<MotionVectors>(this));
  165. ANKI_CHECK(m_motionVectors->init(config));
  166. // Init samplers
  167. {
  168. SamplerInitInfo sinit("Renderer");
  169. sinit.m_addressing = SamplingAddressing::CLAMP;
  170. sinit.m_mipmapFilter = SamplingFilter::NEAREST;
  171. sinit.m_minMagFilter = SamplingFilter::NEAREST;
  172. m_samplers.m_nearestNearestClamp = m_gr->newSampler(sinit);
  173. sinit.m_minMagFilter = SamplingFilter::LINEAR;
  174. sinit.m_mipmapFilter = SamplingFilter::LINEAR;
  175. m_samplers.m_trilinearClamp = m_gr->newSampler(sinit);
  176. sinit.m_addressing = SamplingAddressing::REPEAT;
  177. m_samplers.m_trilinearRepeat = m_gr->newSampler(sinit);
  178. sinit.m_anisotropyLevel = U8(config.getNumberU32("r_textureAnisotropy"));
  179. m_samplers.m_trilinearRepeatAniso = m_gr->newSampler(sinit);
  180. }
  181. initJitteredMats();
  182. return Error::NONE;
  183. }
  184. void Renderer::initJitteredMats()
  185. {
  186. static const Array<Vec2, 16> SAMPLE_LOCS_16 = {
  187. {Vec2(-8.0, 0.0), Vec2(-6.0, -4.0), Vec2(-3.0, -2.0), Vec2(-2.0, -6.0), Vec2(1.0, -1.0), Vec2(2.0, -5.0),
  188. Vec2(6.0, -7.0), Vec2(5.0, -3.0), Vec2(4.0, 1.0), Vec2(7.0, 4.0), Vec2(3.0, 5.0), Vec2(0.0, 7.0),
  189. Vec2(-1.0, 3.0), Vec2(-4.0, 6.0), Vec2(-7.0, 8.0), Vec2(-5.0, 2.0)}};
  190. for(U i = 0; i < 16; ++i)
  191. {
  192. Vec2 texSize(1.0f / Vec2(F32(m_width), F32(m_height))); // Texel size
  193. texSize *= 2.0f; // Move it to NDC
  194. Vec2 S = SAMPLE_LOCS_16[i] / 8.0f; // In [-1, 1]
  195. Vec2 subSample = S * texSize; // In [-texSize, texSize]
  196. subSample *= 0.5f; // In [-texSize / 2, texSize / 2]
  197. m_jitteredMats16x[i] = Mat4::getIdentity();
  198. m_jitteredMats16x[i].setTranslationPart(Vec4(subSample, 0.0, 1.0));
  199. }
  200. static const Array<Vec2, 8> SAMPLE_LOCS_8 = {Vec2(-7.0, 1.0), Vec2(-5.0, -5.0), Vec2(-1.0, -3.0), Vec2(3.0, -7.0),
  201. Vec2(5.0, -1.0), Vec2(7.0, 7.0), Vec2(1.0, 3.0), Vec2(-3.0, 5.0)};
  202. for(U i = 0; i < 8; ++i)
  203. {
  204. Vec2 texSize(1.0f / Vec2(F32(m_width), F32(m_height))); // Texel size
  205. texSize *= 2.0f; // Move it to NDC
  206. Vec2 S = SAMPLE_LOCS_8[i] / 8.0f; // In [-1, 1]
  207. Vec2 subSample = S * texSize; // In [-texSize, texSize]
  208. subSample *= 0.5f; // In [-texSize / 2, texSize / 2]
  209. m_jitteredMats8x[i] = Mat4::getIdentity();
  210. m_jitteredMats8x[i].setTranslationPart(Vec4(subSample, 0.0, 1.0));
  211. }
  212. }
  213. Error Renderer::populateRenderGraph(RenderingContext& ctx)
  214. {
  215. ctx.m_matrices.m_cameraTransform = ctx.m_renderQueue->m_cameraTransform;
  216. ctx.m_matrices.m_view = ctx.m_renderQueue->m_viewMatrix;
  217. ctx.m_matrices.m_projection = ctx.m_renderQueue->m_projectionMatrix;
  218. ctx.m_matrices.m_viewProjection = ctx.m_renderQueue->m_viewProjectionMatrix;
  219. ctx.m_matrices.m_jitter = m_jitteredMats8x[m_frameCount & (m_jitteredMats8x.getSize() - 1)];
  220. ctx.m_matrices.m_projectionJitter = ctx.m_matrices.m_jitter * ctx.m_matrices.m_projection;
  221. ctx.m_matrices.m_viewProjectionJitter = ctx.m_matrices.m_projectionJitter * ctx.m_matrices.m_view;
  222. ctx.m_prevMatrices = m_prevMatrices;
  223. ctx.m_unprojParams = ctx.m_renderQueue->m_projectionMatrix.extractPerspectiveUnprojectionParams();
  224. // Check if resources got loaded
  225. if(m_prevLoadRequestCount != m_resources->getLoadingRequestCount()
  226. || m_prevAsyncTasksCompleted != m_resources->getAsyncTaskCompletedCount())
  227. {
  228. m_prevLoadRequestCount = m_resources->getLoadingRequestCount();
  229. m_prevAsyncTasksCompleted = m_resources->getAsyncTaskCompletedCount();
  230. m_resourcesDirty = true;
  231. }
  232. else
  233. {
  234. m_resourcesDirty = false;
  235. }
  236. // Import RTs first
  237. m_downscale->importRenderTargets(ctx);
  238. m_tonemapping->importRenderTargets(ctx);
  239. m_depth->importRenderTargets(ctx);
  240. // Populate render graph. WARNING Watch the order
  241. m_genericCompute->populateRenderGraph(ctx);
  242. if(m_accelerationStructureBuilder)
  243. {
  244. m_accelerationStructureBuilder->populateRenderGraph(ctx);
  245. }
  246. m_shadowMapping->populateRenderGraph(ctx);
  247. m_gi->populateRenderGraph(ctx);
  248. m_probeReflections->populateRenderGraph(ctx);
  249. m_volLighting->populateRenderGraph(ctx);
  250. m_gbuffer->populateRenderGraph(ctx);
  251. m_motionVectors->populateRenderGraph(ctx);
  252. m_gbufferPost->populateRenderGraph(ctx);
  253. m_depth->populateRenderGraph(ctx);
  254. if(m_rtShadows)
  255. {
  256. m_rtShadows->populateRenderGraph(ctx);
  257. }
  258. else
  259. {
  260. m_smResolve->populateRenderGraph(ctx);
  261. }
  262. m_volFog->populateRenderGraph(ctx);
  263. m_ssao->populateRenderGraph(ctx);
  264. m_lensFlare->populateRenderGraph(ctx);
  265. m_ssr->populateRenderGraph(ctx);
  266. m_ssgi->populateRenderGraph(ctx);
  267. m_lightShading->populateRenderGraph(ctx);
  268. m_temporalAA->populateRenderGraph(ctx);
  269. m_downscale->populateRenderGraph(ctx);
  270. m_tonemapping->populateRenderGraph(ctx);
  271. m_bloom->populateRenderGraph(ctx);
  272. if(m_dbg->getEnabled())
  273. {
  274. m_dbg->populateRenderGraph(ctx);
  275. }
  276. m_finalComposite->populateRenderGraph(ctx);
  277. // Bin lights and update uniforms
  278. m_stats.m_lightBinTime = (m_statsEnabled) ? HighRezTimer::getCurrentTime() : -1.0;
  279. ClusterBinIn cin;
  280. cin.m_renderQueue = ctx.m_renderQueue;
  281. cin.m_tempAlloc = ctx.m_tempAllocator;
  282. cin.m_shadowsEnabled = true; // TODO
  283. cin.m_stagingMem = m_stagingMem;
  284. cin.m_threadHive = m_threadHive;
  285. m_clusterBin.bin(cin, ctx.m_clusterBinOut);
  286. ctx.m_prevClustererMagicValues =
  287. (m_frameCount > 0) ? m_prevClustererMagicValues : ctx.m_clusterBinOut.m_shaderMagicValues;
  288. m_prevClustererMagicValues = ctx.m_clusterBinOut.m_shaderMagicValues;
  289. updateLightShadingUniforms(ctx);
  290. m_stats.m_lightBinTime = (m_statsEnabled) ? (HighRezTimer::getCurrentTime() - m_stats.m_lightBinTime) : -1.0;
  291. return Error::NONE;
  292. }
  293. void Renderer::finalize(const RenderingContext& ctx)
  294. {
  295. ++m_frameCount;
  296. m_prevMatrices = ctx.m_matrices;
  297. // Inform about the HiZ map. Do it as late as possible
  298. if(ctx.m_renderQueue->m_fillCoverageBufferCallback)
  299. {
  300. F32* depthValues;
  301. U32 width;
  302. U32 height;
  303. m_depth->getClientDepthMapInfo(depthValues, width, height);
  304. ctx.m_renderQueue->m_fillCoverageBufferCallback(ctx.m_renderQueue->m_fillCoverageBufferCallbackUserData,
  305. depthValues, width, height);
  306. }
  307. }
  308. TextureInitInfo Renderer::create2DRenderTargetInitInfo(U32 w, U32 h, Format format, TextureUsageBit usage, CString name)
  309. {
  310. ANKI_ASSERT(!!(usage & TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE)
  311. || !!(usage & TextureUsageBit::IMAGE_COMPUTE_WRITE));
  312. TextureInitInfo init(name);
  313. init.m_width = w;
  314. init.m_height = h;
  315. init.m_depth = 1;
  316. init.m_layerCount = 1;
  317. init.m_type = TextureType::_2D;
  318. init.m_format = format;
  319. init.m_mipmapCount = 1;
  320. init.m_samples = 1;
  321. init.m_usage = usage;
  322. return init;
  323. }
  324. RenderTargetDescription Renderer::create2DRenderTargetDescription(U32 w, U32 h, Format format, CString name)
  325. {
  326. RenderTargetDescription init(name);
  327. init.m_width = w;
  328. init.m_height = h;
  329. init.m_depth = 1;
  330. init.m_layerCount = 1;
  331. init.m_type = TextureType::_2D;
  332. init.m_format = format;
  333. init.m_mipmapCount = 1;
  334. init.m_samples = 1;
  335. init.m_usage = TextureUsageBit::NONE;
  336. return init;
  337. }
  338. TexturePtr Renderer::createAndClearRenderTarget(const TextureInitInfo& inf, const ClearValue& clearVal)
  339. {
  340. ANKI_ASSERT(!!(inf.m_usage & TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE)
  341. || !!(inf.m_usage & TextureUsageBit::IMAGE_COMPUTE_WRITE));
  342. const U faceCount = (inf.m_type == TextureType::CUBE || inf.m_type == TextureType::CUBE_ARRAY) ? 6 : 1;
  343. Bool useCompute = false;
  344. if(!!(inf.m_usage & TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE))
  345. {
  346. useCompute = false;
  347. }
  348. else if(!!(inf.m_usage & TextureUsageBit::IMAGE_COMPUTE_WRITE))
  349. {
  350. useCompute = true;
  351. }
  352. else
  353. {
  354. ANKI_ASSERT(!"Can't handle that");
  355. }
  356. // Create tex
  357. TexturePtr tex = m_gr->newTexture(inf);
  358. // Clear all surfaces
  359. CommandBufferInitInfo cmdbinit;
  360. cmdbinit.m_flags = (useCompute) ? CommandBufferFlag::COMPUTE_WORK : CommandBufferFlag::GRAPHICS_WORK;
  361. if((inf.m_mipmapCount * faceCount * inf.m_layerCount * 4) < COMMAND_BUFFER_SMALL_BATCH_MAX_COMMANDS)
  362. {
  363. cmdbinit.m_flags |= CommandBufferFlag::SMALL_BATCH;
  364. }
  365. CommandBufferPtr cmdb = m_gr->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. TextureSurfaceInfo surf(mip, 0, face, layer);
  373. if(!useCompute)
  374. {
  375. FramebufferInitInfo fbInit("RendererClearRT");
  376. Array<TextureUsageBit, MAX_COLOR_ATTACHMENTS> colUsage = {};
  377. TextureUsageBit dsUsage = TextureUsageBit::NONE;
  378. if(formatIsDepthStencil(inf.m_format))
  379. {
  380. DepthStencilAspectBit aspect = DepthStencilAspectBit::NONE;
  381. if(formatIsDepth(inf.m_format))
  382. {
  383. aspect |= DepthStencilAspectBit::DEPTH;
  384. }
  385. if(formatIsStencil(inf.m_format))
  386. {
  387. aspect |= DepthStencilAspectBit::STENCIL;
  388. }
  389. TextureViewPtr view = getGrManager().newTextureView(TextureViewInitInfo(tex, surf, aspect));
  390. fbInit.m_depthStencilAttachment.m_textureView = view;
  391. fbInit.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::CLEAR;
  392. fbInit.m_depthStencilAttachment.m_stencilLoadOperation = AttachmentLoadOperation::CLEAR;
  393. fbInit.m_depthStencilAttachment.m_clearValue = clearVal;
  394. dsUsage = TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE;
  395. }
  396. else
  397. {
  398. TextureViewPtr view = getGrManager().newTextureView(TextureViewInitInfo(tex, surf));
  399. fbInit.m_colorAttachmentCount = 1;
  400. fbInit.m_colorAttachments[0].m_textureView = view;
  401. fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::CLEAR;
  402. fbInit.m_colorAttachments[0].m_clearValue = clearVal;
  403. colUsage[0] = TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE;
  404. }
  405. FramebufferPtr fb = m_gr->newFramebuffer(fbInit);
  406. cmdb->setTextureSurfaceBarrier(tex, TextureUsageBit::NONE,
  407. TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, surf);
  408. cmdb->beginRenderPass(fb, colUsage, dsUsage);
  409. cmdb->endRenderPass();
  410. if(!!inf.m_initialUsage)
  411. {
  412. cmdb->setTextureSurfaceBarrier(tex, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
  413. inf.m_initialUsage, surf);
  414. }
  415. }
  416. else
  417. {
  418. // Compute
  419. ShaderProgramResourceVariantInitInfo variantInitInfo(m_clearTexComputeProg);
  420. variantInitInfo.addMutation("IS_2D", I32((inf.m_type != TextureType::_3D) ? 1 : 0));
  421. const ShaderProgramResourceVariant* variant;
  422. m_clearTexComputeProg->getOrCreateVariant(variantInitInfo, variant);
  423. cmdb->bindShaderProgram(variant->getProgram());
  424. cmdb->setPushConstants(&clearVal.m_colorf[0], sizeof(clearVal.m_colorf));
  425. TextureViewPtr view = getGrManager().newTextureView(TextureViewInitInfo(tex, surf));
  426. cmdb->bindImage(0, 0, view);
  427. cmdb->setTextureSurfaceBarrier(tex, TextureUsageBit::NONE, TextureUsageBit::IMAGE_COMPUTE_WRITE,
  428. surf);
  429. UVec3 wgSize;
  430. wgSize.x() = (8 - 1 + (tex->getWidth() >> mip)) / 8;
  431. wgSize.y() = (8 - 1 + (tex->getHeight() >> mip)) / 8;
  432. wgSize.z() = (inf.m_type == TextureType::_3D) ? ((8 - 1 + (tex->getDepth() >> mip)) / 8) : 1;
  433. cmdb->dispatchCompute(wgSize.x(), wgSize.y(), wgSize.z());
  434. if(!!inf.m_initialUsage)
  435. {
  436. cmdb->setTextureSurfaceBarrier(tex, TextureUsageBit::IMAGE_COMPUTE_WRITE, inf.m_initialUsage,
  437. surf);
  438. }
  439. }
  440. }
  441. }
  442. }
  443. cmdb->flush();
  444. return tex;
  445. }
  446. void Renderer::updateLightShadingUniforms(RenderingContext& ctx) const
  447. {
  448. LightingUniforms* blk = static_cast<LightingUniforms*>(m_stagingMem->allocateFrame(
  449. sizeof(LightingUniforms), StagingGpuMemoryType::UNIFORM, ctx.m_lightShadingUniformsToken));
  450. // Start writing
  451. blk->m_unprojectionParams = ctx.m_unprojParams;
  452. blk->m_rendererSize = Vec2(F32(m_width), F32(m_height));
  453. blk->m_time = F32(HighRezTimer::getCurrentTime());
  454. blk->m_near = ctx.m_renderQueue->m_cameraNear;
  455. blk->m_clusterCount = UVec4(m_clusterCount[0], m_clusterCount[1], m_clusterCount[2], m_clusterCount[3]);
  456. blk->m_cameraPos = ctx.m_renderQueue->m_cameraTransform.getTranslationPart().xyz();
  457. blk->m_far = ctx.m_renderQueue->m_cameraFar;
  458. blk->m_clustererMagicValues = ctx.m_clusterBinOut.m_shaderMagicValues;
  459. blk->m_prevClustererMagicValues = ctx.m_prevClustererMagicValues;
  460. blk->m_lightVolumeLastCluster = m_volLighting->getFinalClusterInZ();
  461. blk->m_frameCount = m_frameCount & MAX_U32;
  462. // Matrices
  463. blk->m_viewMat = ctx.m_renderQueue->m_viewMatrix;
  464. blk->m_invViewMat = ctx.m_renderQueue->m_viewMatrix.getInverse();
  465. blk->m_projMat = ctx.m_matrices.m_projectionJitter;
  466. blk->m_invProjMat = ctx.m_matrices.m_projectionJitter.getInverse();
  467. blk->m_viewProjMat = ctx.m_matrices.m_viewProjectionJitter;
  468. blk->m_invViewProjMat = ctx.m_matrices.m_viewProjectionJitter.getInverse();
  469. blk->m_prevViewProjMat = ctx.m_prevMatrices.m_viewProjectionJitter;
  470. blk->m_prevViewProjMatMulInvViewProjMat =
  471. ctx.m_prevMatrices.m_viewProjection * ctx.m_matrices.m_viewProjectionJitter.getInverse();
  472. // Directional light
  473. if(ctx.m_renderQueue->m_directionalLight.m_uuid != 0)
  474. {
  475. DirectionalLight& out = blk->m_dirLight;
  476. const DirectionalLightQueueElement& in = ctx.m_renderQueue->m_directionalLight;
  477. out.m_diffuseColor = in.m_diffuseColor;
  478. out.m_cascadeCount = in.m_shadowCascadeCount;
  479. out.m_dir = in.m_direction;
  480. out.m_active = 1;
  481. out.m_effectiveShadowDistance = in.m_effectiveShadowDistance;
  482. out.m_shadowCascadesDistancePower = in.m_shadowCascadesDistancePower;
  483. out.m_shadowLayer = in.m_shadowLayer;
  484. for(U cascade = 0; cascade < in.m_shadowCascadeCount; ++cascade)
  485. {
  486. out.m_textureMatrices[cascade] = in.m_textureMatrices[cascade];
  487. }
  488. }
  489. else
  490. {
  491. blk->m_dirLight.m_active = 0;
  492. }
  493. }
  494. void Renderer::registerDebugRenderTarget(RendererObject* obj, CString rtName)
  495. {
  496. #if ANKI_ENABLE_ASSERTS
  497. for(const DebugRtInfo& inf : m_debugRts)
  498. {
  499. ANKI_ASSERT(inf.m_rtName != rtName && "Choose different name");
  500. }
  501. #endif
  502. ANKI_ASSERT(obj);
  503. DebugRtInfo inf;
  504. inf.m_obj = obj;
  505. inf.m_rtName.create(getAllocator(), rtName);
  506. m_debugRts.emplaceBack(getAllocator(), std::move(inf));
  507. }
  508. void Renderer::getCurrentDebugRenderTarget(RenderTargetHandle& handle, Bool& handleValid,
  509. ShaderProgramPtr& optionalShaderProgram)
  510. {
  511. if(ANKI_LIKELY(m_currentDebugRtName.isEmpty()))
  512. {
  513. handleValid = false;
  514. return;
  515. }
  516. RendererObject* obj = nullptr;
  517. for(const DebugRtInfo& inf : m_debugRts)
  518. {
  519. if(inf.m_rtName == m_currentDebugRtName)
  520. {
  521. obj = inf.m_obj;
  522. }
  523. }
  524. ANKI_ASSERT(obj);
  525. obj->getDebugRenderTarget(m_currentDebugRtName, handle, optionalShaderProgram);
  526. handleValid = true;
  527. }
  528. void Renderer::setCurrentDebugRenderTarget(CString rtName)
  529. {
  530. m_currentDebugRtName.destroy(getAllocator());
  531. if(!rtName.isEmpty() && rtName.getLength() > 0)
  532. {
  533. m_currentDebugRtName.create(getAllocator(), rtName);
  534. }
  535. }
  536. } // end namespace anki