Renderer.cpp 20 KB

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