Renderer.cpp 24 KB

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