RendererObject.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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/Renderer/Renderer.h>
  7. #include <AnKi/Util/StdTypes.h>
  8. #include <AnKi/Gr.h>
  9. #include <AnKi/Resource/ResourceManager.h>
  10. #include <AnKi/Resource/ShaderProgramResource.h>
  11. #include <AnKi/GpuMemory/RebarTransientMemoryPool.h>
  12. namespace anki {
  13. // Forward
  14. class ResourceManager;
  15. /// @addtogroup renderer
  16. /// @{
  17. /// Renderer object.
  18. class RendererObject
  19. {
  20. public:
  21. RendererObject() = default;
  22. virtual ~RendererObject() = default;
  23. virtual void getDebugRenderTarget([[maybe_unused]] CString rtName,
  24. [[maybe_unused]] Array<RenderTargetHandle, U32(DebugRenderTargetRegister::kCount)>& handles,
  25. [[maybe_unused]] DebugRenderTargetDrawStyle& drawStyle) const
  26. {
  27. ANKI_ASSERT(!"Object doesn't support that");
  28. }
  29. protected:
  30. static ANKI_PURE Renderer& getRenderer();
  31. /// Used in fullscreen quad draws.
  32. static void drawQuad(CommandBuffer& cmdb)
  33. {
  34. cmdb.draw(PrimitiveTopology::kTriangles, 3, 1);
  35. }
  36. /// Dispatch a compute job equivelent to drawQuad
  37. static void dispatchPPCompute(CommandBuffer& cmdb, U32 workgroupSizeX, U32 workgroupSizeY, U32 outImageWidth, U32 outImageHeight)
  38. {
  39. const U32 sizeX = (outImageWidth + workgroupSizeX - 1) / workgroupSizeX;
  40. const U32 sizeY = (outImageHeight + workgroupSizeY - 1) / workgroupSizeY;
  41. cmdb.dispatchCompute(sizeX, sizeY, 1);
  42. }
  43. static void dispatchPPCompute(CommandBuffer& cmdb, U32 workgroupSizeX, U32 workgroupSizeY, U32 workgroupSizeZ, U32 outImageWidth,
  44. U32 outImageHeight, U32 outImageDepth)
  45. {
  46. const U32 sizeX = (outImageWidth + workgroupSizeX - 1) / workgroupSizeX;
  47. const U32 sizeY = (outImageHeight + workgroupSizeY - 1) / workgroupSizeY;
  48. const U32 sizeZ = (outImageDepth + workgroupSizeZ - 1) / workgroupSizeZ;
  49. cmdb.dispatchCompute(sizeX, sizeY, sizeZ);
  50. }
  51. template<typename T>
  52. static T* allocateAndBindConstants(CommandBuffer& cmdb, U32 reg, U32 space)
  53. {
  54. T* ptr;
  55. const BufferView alloc = RebarTransientMemoryPool::getSingleton().allocateConstantBuffer<T>(ptr);
  56. ANKI_ASSERT(isAligned(alignof(T), ptrToNumber(ptr)));
  57. cmdb.bindConstantBuffer(reg, space, alloc);
  58. return ptr;
  59. }
  60. template<typename T>
  61. static WeakArray<T> allocateAndBindSrvStructuredBuffer(CommandBuffer& cmdb, U32 reg, U32 space, U32 count = 1)
  62. {
  63. WeakArray<T> out;
  64. const BufferView alloc = RebarTransientMemoryPool::getSingleton().allocateStructuredBuffer<T>(count, out);
  65. ANKI_ASSERT(isAligned(alignof(T), ptrToNumber(out.getBegin())));
  66. cmdb.bindSrv(reg, space, alloc);
  67. return out;
  68. }
  69. template<typename T>
  70. static WeakArray<T> allocateAndBindUavStructuredBuffer(CommandBuffer& cmdb, U32 reg, U32 space, U32 count = 1)
  71. {
  72. WeakArray<T> out;
  73. const BufferView alloc = RebarTransientMemoryPool::getSingleton().allocateStructuredBuffer<T>(count, out);
  74. ANKI_ASSERT(isAligned(alignof(T), ptrToNumber(out.getBegin())));
  75. cmdb.bindUav(reg, space, alloc);
  76. return out;
  77. }
  78. void registerDebugRenderTarget(CString rtName);
  79. static Error loadShaderProgram(CString filename, ShaderProgramResourcePtr& rsrc, ShaderProgramPtr& grProg)
  80. {
  81. ANKI_CHECK(loadShaderProgram(filename, {}, rsrc, grProg));
  82. return Error::kNone;
  83. }
  84. class SubMutation
  85. {
  86. public:
  87. CString m_mutatorName;
  88. MutatorValue m_value;
  89. };
  90. static Error loadShaderProgram(CString filename, std::initializer_list<SubMutation> mutators, ShaderProgramResourcePtr& rsrc,
  91. ShaderProgramPtr& grProg, CString technique = {}, ShaderTypeBit shaderTypes = ShaderTypeBit::kNone)
  92. {
  93. return loadShaderProgram(filename, ConstWeakArray<SubMutation>(mutators.begin(), U32(mutators.size())), rsrc, grProg, technique, shaderTypes);
  94. }
  95. static Error loadShaderProgram(CString filename, ConstWeakArray<SubMutation> mutators, ShaderProgramResourcePtr& rsrc, ShaderProgramPtr& grProg,
  96. CString technique = {}, ShaderTypeBit shaderTypes = ShaderTypeBit::kNone);
  97. static void zeroBuffer(Buffer* buff);
  98. /// Temp pass name.
  99. static CString generateTempPassName(const Char* fmt, ...);
  100. /// Fill some buffers with some value. It's a **COMPUTE** dispatch.
  101. static void fillBuffers(CommandBuffer& cmdb, ConstWeakArray<BufferView> buffers, U32 value);
  102. /// See @fillBuffers
  103. static void fillBuffer(CommandBuffer& cmdb, BufferView buffer, U32 value)
  104. {
  105. fillBuffers(cmdb, ConstWeakArray<BufferView>(&buffer, 1), value);
  106. }
  107. static DummyGpuResources& getDummyGpuResources()
  108. {
  109. return Renderer::getSingleton().m_dummyResources;
  110. }
  111. #define ANKI_RENDERER_OBJECT_DEF(type, name, initCondition) \
  112. ANKI_FORCE_INLINE type& get##type() \
  113. { \
  114. return getRenderer().get##type(); \
  115. } \
  116. ANKI_FORCE_INLINE Bool is##type##Enabled() const \
  117. { \
  118. return getRenderer().is##type##Enabled(); \
  119. }
  120. #include <AnKi/Renderer/RendererObject.def.h>
  121. };
  122. /// Contains common functionality of all passes that use RtMaterialFetch.
  123. class RtMaterialFetchRendererObject : protected RendererObject
  124. {
  125. protected:
  126. Error init();
  127. /// Build a pass that populates the shader binding table.
  128. void buildShaderBindingTablePass(CString passName, ShaderProgram* library, U32 raygenGroupIdx, U32 missGroupIdx, U32 sbtRecordSize,
  129. RenderGraphBuilder& rgraph, BufferHandle& sbtHandle, BufferView& sbtBuffer);
  130. void patchShaderBindingTablePass(CString passName, ShaderProgram* library, U32 raygenGroupIdx, U32 missGroupIdx, U32 sbtRecordSize,
  131. RenderGraphBuilder& rgraph, BufferHandle sbtHandle, BufferView sbtBuffer);
  132. /// Sets the the resources of space 2 in RtMaterialFetch.hlsl as dependencies on the given pass.
  133. void setRgenSpace2Dependencies(RenderPassBase& pass, Bool isComputeDispatch = false);
  134. /// Bind the the resources of space 2 in RtMaterialFetch.hlsl.
  135. void bindRgenSpace2Resources(RenderingContext& ctx, RenderPassWorkContext& rgraphCtx);
  136. private:
  137. ShaderProgramResourcePtr m_sbtBuildProg;
  138. ShaderProgramPtr m_sbtBuildGrProg;
  139. ShaderProgramPtr m_sbtPatchGrProg;
  140. };
  141. /// @}
  142. } // end namespace anki