Renderer.cpp 30 KB

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