RenderGraph.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  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. #pragma once
  6. #include <AnKi/Gr/GrObject.h>
  7. #include <AnKi/Gr/Buffer.h>
  8. #include <AnKi/Gr/GrManager.h>
  9. #include <AnKi/Gr/TimestampQuery.h>
  10. #include <AnKi/Gr/CommandBuffer.h>
  11. #include <AnKi/Gr/AccelerationStructure.h>
  12. #include <AnKi/Util/HashMap.h>
  13. #include <AnKi/Util/BitSet.h>
  14. #include <AnKi/Util/WeakArray.h>
  15. #include <AnKi/Util/Function.h>
  16. namespace anki {
  17. // Forward
  18. class RenderGraph;
  19. class RenderGraphBuilder;
  20. /// @addtogroup graphics
  21. /// @{
  22. /// @name RenderGraph constants
  23. /// @{
  24. constexpr U32 kMaxRenderGraphPasses = 512;
  25. constexpr U32 kMaxRenderGraphRenderTargets = 128; ///< Max imported or not render targets in RenderGraph.
  26. constexpr U32 kMaxRenderGraphBuffers = 256;
  27. constexpr U32 kMaxRenderGraphAccelerationStructures = 32;
  28. /// @}
  29. /// Render target handle used in the RenderGraph.
  30. /// @memberof RenderGraphBuilder
  31. class RenderGraphGrObjectHandle
  32. {
  33. friend class RenderPassDependency;
  34. friend class RenderGraphBuilder;
  35. friend class RenderGraph;
  36. friend class RenderPassBase;
  37. public:
  38. Bool operator==(const RenderGraphGrObjectHandle& b) const
  39. {
  40. return m_idx == b.m_idx;
  41. }
  42. Bool operator!=(const RenderGraphGrObjectHandle& b) const
  43. {
  44. return m_idx != b.m_idx;
  45. }
  46. Bool isValid() const
  47. {
  48. return m_idx != kMaxU32;
  49. }
  50. private:
  51. U32 m_idx = kMaxU32;
  52. };
  53. /// Render target (TexturePtr) handle.
  54. /// @memberof RenderGraphBuilder
  55. class RenderTargetHandle : public RenderGraphGrObjectHandle
  56. {
  57. };
  58. /// Buffer handle.
  59. /// @memberof RenderGraphBuilder
  60. class BufferHandle : public RenderGraphGrObjectHandle
  61. {
  62. };
  63. /// AccelerationStructurePtr handle.
  64. /// @memberof RenderGraphBuilder
  65. class AccelerationStructureHandle : public RenderGraphGrObjectHandle
  66. {
  67. };
  68. /// Describes the render target.
  69. /// @memberof RenderGraphBuilder
  70. class RenderTargetDesc : public TextureInitInfo
  71. {
  72. friend class RenderGraphBuilder;
  73. public:
  74. RenderTargetDesc()
  75. {
  76. }
  77. RenderTargetDesc(CString name)
  78. : TextureInitInfo(name)
  79. {
  80. }
  81. /// Create an internal hash.
  82. void bake()
  83. {
  84. ANKI_ASSERT(m_hash == 0);
  85. ANKI_ASSERT(m_usage == TextureUsageBit::kNone && "No need to supply the usage. RenderGraph will find out");
  86. m_hash = computeHash();
  87. // Append the name to the hash because there might be RTs with the same properties and thus the same hash. We can't have different Rt
  88. // descriptors with the same hash
  89. ANKI_ASSERT(getName().getLength() > 0);
  90. m_hash = appendHash(getName().cstr(), getName().getLength(), m_hash);
  91. }
  92. private:
  93. U64 m_hash = 0;
  94. };
  95. /// The only parameter of RenderPassWorkCallback.
  96. /// @memberof RenderGraph
  97. class RenderPassWorkContext
  98. {
  99. friend class RenderGraph;
  100. public:
  101. CommandBuffer* m_commandBuffer = nullptr;
  102. void getBufferState(BufferHandle handle, Buffer*& buff, PtrSize& offset, PtrSize& range) const;
  103. void getRenderTargetState(RenderTargetHandle handle, const TextureSubresourceDesc& subresource, Texture*& tex) const;
  104. TextureView createTextureView(RenderTargetHandle handle, const TextureSubresourceDesc& subresource) const
  105. {
  106. Texture* tex;
  107. getRenderTargetState(handle, subresource, tex);
  108. return TextureView(tex, subresource);
  109. }
  110. void bindSrv(U32 reg, U32 space, RenderTargetHandle handle, const TextureSubresourceDesc& subresource = TextureSubresourceDesc::all())
  111. {
  112. Texture* tex;
  113. getRenderTargetState(handle, subresource, tex);
  114. m_commandBuffer->bindSrv(reg, space, TextureView(tex, subresource));
  115. }
  116. void bindUav(U32 reg, U32 space, RenderTargetHandle handle, const TextureSubresourceDesc& subresource = TextureSubresourceDesc::all())
  117. {
  118. Texture* tex;
  119. getRenderTargetState(handle, subresource, tex);
  120. m_commandBuffer->bindUav(reg, space, TextureView(tex, subresource));
  121. }
  122. void bindSrv(U32 reg, U32 space, BufferHandle handle)
  123. {
  124. Buffer* buff;
  125. PtrSize offset, range;
  126. getBufferState(handle, buff, offset, range);
  127. m_commandBuffer->bindSrv(reg, space, BufferView(buff, offset, range));
  128. }
  129. void bindUav(U32 reg, U32 space, BufferHandle handle)
  130. {
  131. Buffer* buff;
  132. PtrSize offset, range;
  133. getBufferState(handle, buff, offset, range);
  134. m_commandBuffer->bindUav(reg, space, BufferView(buff, offset, range));
  135. }
  136. void bindSrv(U32 reg, U32 space, AccelerationStructureHandle handle);
  137. void bindConstantBuffer(U32 reg, U32 space, BufferHandle handle)
  138. {
  139. Buffer* buff;
  140. PtrSize offset, range;
  141. getBufferState(handle, buff, offset, range);
  142. m_commandBuffer->bindConstantBuffer(reg, space, BufferView(buff, offset, range));
  143. }
  144. private:
  145. const RenderGraph* m_rgraph ANKI_DEBUG_CODE(= nullptr);
  146. U32 m_passIdx ANKI_DEBUG_CODE(= kMaxU32);
  147. U32 m_batchIdx ANKI_DEBUG_CODE(= kMaxU32);
  148. Texture& getTexture(RenderTargetHandle handle) const;
  149. };
  150. /// RenderGraph pass dependency.
  151. /// @memberof RenderGraphBuilder
  152. class RenderPassDependency
  153. {
  154. friend class RenderGraph;
  155. friend class RenderPassBase;
  156. public:
  157. /// Dependency to a texture subresource.
  158. RenderPassDependency(RenderTargetHandle handle, TextureUsageBit usage, const TextureSubresourceDesc& subresource)
  159. : m_texture({handle, usage, subresource})
  160. , m_type(Type::kTexture)
  161. {
  162. ANKI_ASSERT(handle.isValid());
  163. }
  164. RenderPassDependency(BufferHandle handle, BufferUsageBit usage)
  165. : m_buffer({handle, usage})
  166. , m_type(Type::kBuffer)
  167. {
  168. ANKI_ASSERT(handle.isValid());
  169. }
  170. RenderPassDependency(AccelerationStructureHandle handle, AccelerationStructureUsageBit usage)
  171. : m_as({handle, usage})
  172. , m_type(Type::kAccelerationStructure)
  173. {
  174. ANKI_ASSERT(handle.isValid());
  175. }
  176. private:
  177. class TextureInfo
  178. {
  179. public:
  180. RenderTargetHandle m_handle;
  181. TextureUsageBit m_usage;
  182. TextureSubresourceDesc m_subresource = TextureSubresourceDesc::all();
  183. };
  184. class BufferInfo
  185. {
  186. public:
  187. BufferHandle m_handle;
  188. BufferUsageBit m_usage;
  189. };
  190. class ASInfo
  191. {
  192. public:
  193. AccelerationStructureHandle m_handle;
  194. AccelerationStructureUsageBit m_usage;
  195. };
  196. union
  197. {
  198. TextureInfo m_texture;
  199. BufferInfo m_buffer;
  200. ASInfo m_as;
  201. };
  202. enum class Type : U8
  203. {
  204. kBuffer,
  205. kTexture,
  206. kAccelerationStructure
  207. };
  208. Type m_type;
  209. };
  210. /// The base of compute/transfer and graphics renderpasses for RenderGraph.
  211. /// @memberof RenderGraphBuilder
  212. class RenderPassBase
  213. {
  214. friend class RenderGraph;
  215. friend class RenderGraphBuilder;
  216. public:
  217. template<typename TFunc>
  218. void setWork(TFunc func)
  219. {
  220. m_callback = {func, m_rtDeps.getMemoryPool().m_pool};
  221. }
  222. void newTextureDependency(RenderTargetHandle handle, TextureUsageBit usage, const TextureSubresourceDesc& subresource)
  223. {
  224. newDependency<RenderPassDependency::Type::kTexture>(RenderPassDependency(handle, usage, subresource));
  225. }
  226. void newTextureDependency(RenderTargetHandle handle, TextureUsageBit usage, DepthStencilAspectBit aspect = DepthStencilAspectBit::kNone)
  227. {
  228. newDependency<RenderPassDependency::Type::kTexture>(RenderPassDependency(handle, usage, TextureSubresourceDesc::all(aspect)));
  229. }
  230. void newBufferDependency(BufferHandle handle, BufferUsageBit usage)
  231. {
  232. newDependency<RenderPassDependency::Type::kBuffer>(RenderPassDependency(handle, usage));
  233. }
  234. void newAccelerationStructureDependency(AccelerationStructureHandle handle, AccelerationStructureUsageBit usage)
  235. {
  236. newDependency<RenderPassDependency::Type::kAccelerationStructure>(RenderPassDependency(handle, usage));
  237. }
  238. void setWritesToSwapchain()
  239. {
  240. m_writesToSwapchain = true;
  241. }
  242. protected:
  243. enum class Type : U8
  244. {
  245. kGraphics,
  246. kNonGraphics
  247. };
  248. Type m_type;
  249. RenderGraphBuilder* m_descr;
  250. Function<void(RenderPassWorkContext&), MemoryPoolPtrWrapper<StackMemoryPool>> m_callback;
  251. DynamicArray<RenderPassDependency, MemoryPoolPtrWrapper<StackMemoryPool>> m_rtDeps;
  252. DynamicArray<RenderPassDependency, MemoryPoolPtrWrapper<StackMemoryPool>> m_buffDeps;
  253. DynamicArray<RenderPassDependency, MemoryPoolPtrWrapper<StackMemoryPool>> m_asDeps;
  254. BitSet<kMaxRenderGraphRenderTargets, U64> m_readRtMask{false};
  255. BitSet<kMaxRenderGraphRenderTargets, U64> m_writeRtMask{false};
  256. BitSet<kMaxRenderGraphBuffers, U64> m_readBuffMask{false};
  257. BitSet<kMaxRenderGraphBuffers, U64> m_writeBuffMask{false};
  258. BitSet<kMaxRenderGraphAccelerationStructures, U32> m_readAsMask{false};
  259. BitSet<kMaxRenderGraphAccelerationStructures, U32> m_writeAsMask{false};
  260. BaseString<MemoryPoolPtrWrapper<StackMemoryPool>> m_name;
  261. Bool m_writesToSwapchain = false;
  262. RenderPassBase(Type t, RenderGraphBuilder* descr, StackMemoryPool* pool)
  263. : m_type(t)
  264. , m_descr(descr)
  265. , m_rtDeps(pool)
  266. , m_buffDeps(pool)
  267. , m_asDeps(pool)
  268. , m_name(pool)
  269. {
  270. ANKI_ASSERT(descr && pool);
  271. }
  272. void setName(CString name)
  273. {
  274. m_name = (name.isEmpty()) ? "N/A" : name;
  275. }
  276. void fixSubresource(RenderPassDependency& dep) const;
  277. void validateDep(const RenderPassDependency& dep);
  278. /// Add a new consumer or producer dependency.
  279. template<RenderPassDependency::Type kType>
  280. void newDependency(const RenderPassDependency& dep);
  281. };
  282. /// Renderpass attachment info. Used in GraphicsRenderPass::setRenderpassInfo. It mirrors the RenderPass.
  283. /// @memberof GraphicsRenderPass
  284. class GraphicsRenderPassTargetDesc
  285. {
  286. public:
  287. RenderTargetHandle m_handle;
  288. TextureSubresourceDesc m_subresource = TextureSubresourceDesc::firstSurface();
  289. RenderTargetLoadOperation m_loadOperation = RenderTargetLoadOperation::kDontCare;
  290. RenderTargetStoreOperation m_storeOperation = RenderTargetStoreOperation::kStore;
  291. RenderTargetLoadOperation m_stencilLoadOperation = RenderTargetLoadOperation::kDontCare;
  292. RenderTargetStoreOperation m_stencilStoreOperation = RenderTargetStoreOperation::kStore;
  293. ClearValue m_clearValue;
  294. GraphicsRenderPassTargetDesc() = default;
  295. GraphicsRenderPassTargetDesc(RenderTargetHandle handle)
  296. : m_handle(handle)
  297. {
  298. }
  299. };
  300. /// A graphics render pass for RenderGraph.
  301. /// @memberof RenderGraphBuilder
  302. class GraphicsRenderPass : public RenderPassBase
  303. {
  304. friend class RenderGraphBuilder;
  305. friend class RenderGraph;
  306. public:
  307. GraphicsRenderPass(RenderGraphBuilder* descr, StackMemoryPool* pool)
  308. : RenderPassBase(Type::kGraphics, descr, pool)
  309. {
  310. }
  311. void setRenderpassInfo(ConstWeakArray<GraphicsRenderPassTargetDesc> colorRts, const GraphicsRenderPassTargetDesc* depthStencilRt = nullptr,
  312. const RenderTargetHandle* vrsRt = nullptr, U8 vrsRtTexelSizeX = 0, U8 vrsRtTexelSizeY = 0);
  313. void setRenderpassInfo(std::initializer_list<GraphicsRenderPassTargetDesc> colorRts, const GraphicsRenderPassTargetDesc* depthStencilRt = nullptr,
  314. const RenderTargetHandle* vrsRt = nullptr, U8 vrsRtTexelSizeX = 0, U8 vrsRtTexelSizeY = 0)
  315. {
  316. ConstWeakArray<GraphicsRenderPassTargetDesc> colorRtsArr(colorRts.begin(), U32(colorRts.size()));
  317. setRenderpassInfo(colorRtsArr, depthStencilRt, vrsRt, vrsRtTexelSizeX, vrsRtTexelSizeY);
  318. }
  319. private:
  320. Array<GraphicsRenderPassTargetDesc, kMaxColorRenderTargets + 2> m_rts;
  321. U8 m_colorRtCount = 0;
  322. U8 m_vrsRtTexelSizeX = 0;
  323. U8 m_vrsRtTexelSizeY = 0;
  324. Bool m_hasRenderpass = false;
  325. };
  326. /// A compute render pass for RenderGraph.
  327. /// @memberof RenderGraphBuilder
  328. class NonGraphicsRenderPass : public RenderPassBase
  329. {
  330. friend class RenderGraphBuilder;
  331. public:
  332. NonGraphicsRenderPass(RenderGraphBuilder* descr, StackMemoryPool* pool)
  333. : RenderPassBase(Type::kNonGraphics, descr, pool)
  334. {
  335. }
  336. };
  337. /// Builds the description of the frame's render passes and their interactions.
  338. /// @memberof RenderGraph
  339. class RenderGraphBuilder
  340. {
  341. friend class RenderGraph;
  342. friend class RenderPassBase;
  343. public:
  344. RenderGraphBuilder(StackMemoryPool* pool)
  345. : m_pool(pool)
  346. {
  347. }
  348. ~RenderGraphBuilder();
  349. /// Create a new graphics render pass.
  350. GraphicsRenderPass& newGraphicsRenderPass(CString name);
  351. /// Create a new compute render pass.
  352. NonGraphicsRenderPass& newNonGraphicsRenderPass(CString name);
  353. /// Import an existing render target and let the render graph know about it's up-to-date usage.
  354. RenderTargetHandle importRenderTarget(Texture* tex, TextureUsageBit usage);
  355. /// Import an existing render target and let the render graph find it's current usage by looking at the previous frame.
  356. RenderTargetHandle importRenderTarget(Texture* tex);
  357. /// Get or create a new render target.
  358. RenderTargetHandle newRenderTarget(const RenderTargetDesc& initInf);
  359. /// Import a buffer.
  360. BufferHandle importBuffer(const BufferView& buff, BufferUsageBit crntUsage);
  361. /// Import an AS.
  362. AccelerationStructureHandle importAccelerationStructure(AccelerationStructure* as, AccelerationStructureUsageBit crntUsage);
  363. /// Gather statistics.
  364. void setStatisticsEnabled(Bool gather)
  365. {
  366. m_gatherStatistics = gather;
  367. }
  368. private:
  369. class Resource
  370. {
  371. public:
  372. Array<char, kMaxGrObjectNameLength + 1> m_name;
  373. void setName(CString name)
  374. {
  375. const U len = name.getLength();
  376. ANKI_ASSERT(len <= kMaxGrObjectNameLength);
  377. strcpy(&m_name[0], (len) ? &name[0] : "unnamed");
  378. }
  379. };
  380. class RT : public Resource
  381. {
  382. public:
  383. TextureInitInfo m_initInfo;
  384. U64 m_hash = 0;
  385. TextureInternalPtr m_importedTex;
  386. TextureUsageBit m_importedLastKnownUsage = TextureUsageBit::kNone;
  387. /// Derived by the deps of this RT and will be used to set its usage.
  388. TextureUsageBit m_usageDerivedByDeps = TextureUsageBit::kNone;
  389. Bool m_importedAndUndefinedUsage = false;
  390. };
  391. class BufferRsrc : public Resource
  392. {
  393. public:
  394. BufferUsageBit m_usage;
  395. BufferInternalPtr m_importedBuff;
  396. PtrSize m_offset;
  397. PtrSize m_range;
  398. };
  399. class AS : public Resource
  400. {
  401. public:
  402. AccelerationStructurePtr m_importedAs;
  403. AccelerationStructureUsageBit m_usage;
  404. };
  405. StackMemoryPool* m_pool = nullptr;
  406. DynamicArray<RenderPassBase*, MemoryPoolPtrWrapper<StackMemoryPool>> m_passes{m_pool};
  407. DynamicArray<RT, MemoryPoolPtrWrapper<StackMemoryPool>> m_renderTargets{m_pool};
  408. DynamicArray<BufferRsrc, MemoryPoolPtrWrapper<StackMemoryPool>> m_buffers{m_pool};
  409. DynamicArray<AS, MemoryPoolPtrWrapper<StackMemoryPool>> m_as{m_pool};
  410. Bool m_gatherStatistics = false;
  411. };
  412. /// Statistics.
  413. /// @memberof RenderGraph
  414. class RenderGraphStatistics
  415. {
  416. public:
  417. Second m_gpuTime; ///< Time spent in the GPU.
  418. Second m_cpuStartTime; ///< Time the work was submited from the CPU (almost)
  419. };
  420. /// Accepts a descriptor of the frame's render passes and sets the dependencies between them.
  421. ///
  422. /// The idea for the RenderGraph is to automate:
  423. /// - Synchronization (barriers, events etc) between passes.
  424. /// - Command buffer creation .
  425. /// - Render target creation (optional since textures can be imported as well).
  426. ///
  427. /// It accepts a description of the frame's render passes (compute and graphics), compiles that description to calculate
  428. /// dependencies and then populates command buffers with the help of multiple RenderPassWorkCallback.
  429. class RenderGraph final : public GrObject
  430. {
  431. ANKI_GR_OBJECT
  432. friend class RenderPassWorkContext;
  433. public:
  434. static constexpr GrObjectType kClassType = GrObjectType::kRenderGraph;
  435. /// 1st step.
  436. void compileNewGraph(const RenderGraphBuilder& descr, StackMemoryPool& pool);
  437. /// 2nd step. Will call a number of RenderPassWorkCallback that populate command buffers and submit work.
  438. void recordAndSubmitCommandBuffers(FencePtr* optionalFence = nullptr);
  439. /// 3rd step. Reset the graph for a new frame. All previously created RenderGraphHandle are invalid after that call.
  440. void reset();
  441. /// [OPTIONAL] 4th step. Get some statistics.
  442. void getStatistics(RenderGraphStatistics& statistics);
  443. private:
  444. static constexpr U kPeriodicCleanupEvery = 60; ///< How many frames between cleanups.
  445. // Forward declarations of internal classes.
  446. class BakeContext;
  447. class Pass;
  448. class Batch;
  449. class RT;
  450. class BufferRange;
  451. class AS;
  452. class TextureBarrier;
  453. class BufferBarrier;
  454. class ASBarrier;
  455. /// Render targets of the same type+size+format.
  456. class RenderTargetCacheEntry
  457. {
  458. public:
  459. GrDynamicArray<TextureInternalPtr> m_textures;
  460. U32 m_texturesInUse = 0;
  461. };
  462. /// Info on imported render targets that are kept between runs.
  463. class ImportedRenderTargetInfo
  464. {
  465. public:
  466. GrDynamicArray<TextureUsageBit> m_surfOrVolLastUsages; ///< Last TextureUsageBit of the imported RT.
  467. };
  468. GrHashMap<U64, RenderTargetCacheEntry> m_renderTargetCache; ///< Non-imported render targets.
  469. GrHashMap<U64, ImportedRenderTargetInfo> m_importedRenderTargets;
  470. BakeContext* m_ctx = nullptr;
  471. U64 m_version = 0;
  472. static constexpr U kMaxBufferedTimestamps = kMaxFramesInFlight + 1;
  473. class
  474. {
  475. public:
  476. Array2d<TimestampQueryInternalPtr, kMaxBufferedTimestamps, 2> m_timestamps;
  477. Array<Second, kMaxBufferedTimestamps> m_cpuStartTimes;
  478. U8 m_nextTimestamp = 0;
  479. } m_statistics;
  480. RenderGraph(CString name);
  481. ~RenderGraph();
  482. [[nodiscard]] static RenderGraph* newInstance();
  483. BakeContext* newContext(const RenderGraphBuilder& descr, StackMemoryPool& pool);
  484. void initRenderPassesAndSetDeps(const RenderGraphBuilder& descr);
  485. void initBatches();
  486. void initGraphicsPasses(const RenderGraphBuilder& descr);
  487. void setBatchBarriers(const RenderGraphBuilder& descr);
  488. /// Switching from compute to graphics and the opposite in the same queue is not great for some GPUs (nVidia)
  489. void minimizeSubchannelSwitches();
  490. void sortBatchPasses();
  491. TextureInternalPtr getOrCreateRenderTarget(const TextureInitInfo& initInf, U64 hash);
  492. /// Every N number of frames clean unused cached items.
  493. void periodicCleanup();
  494. ANKI_HOT static Bool passADependsOnB(const RenderPassBase& a, const RenderPassBase& b);
  495. static Bool passHasUnmetDependencies(const BakeContext& ctx, U32 passIdx);
  496. void setTextureBarrier(Batch& batch, const RenderPassDependency& consumer);
  497. template<typename TFunc>
  498. static void iterateSurfsOrVolumes(const Texture& tex, const TextureSubresourceDesc& subresource, TFunc func);
  499. void getCrntUsage(RenderTargetHandle handle, U32 batchIdx, const TextureSubresourceDesc& subresource, TextureUsageBit& usage) const;
  500. /// @name Dump the dependency graph into a file.
  501. /// @{
  502. Error dumpDependencyDotFile(const RenderGraphBuilder& descr, const BakeContext& ctx, CString path) const;
  503. static GrString textureUsageToStr(StackMemoryPool& pool, TextureUsageBit usage);
  504. static GrString bufferUsageToStr(StackMemoryPool& pool, BufferUsageBit usage);
  505. static GrString asUsageToStr(StackMemoryPool& pool, AccelerationStructureUsageBit usage);
  506. /// @}
  507. Texture& getTexture(RenderTargetHandle handle) const;
  508. void getCachedBuffer(BufferHandle handle, Buffer*& buff, PtrSize& offset, PtrSize& range) const;
  509. AccelerationStructure* getAs(AccelerationStructureHandle handle) const;
  510. };
  511. /// @}
  512. } // end namespace anki
  513. #include <AnKi/Gr/RenderGraph.inl.h>