RendererObject.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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, [[maybe_unused]] Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
  24. [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const
  25. {
  26. ANKI_ASSERT(!"Object doesn't support that");
  27. }
  28. protected:
  29. static ANKI_PURE Renderer& getRenderer();
  30. /// Used in fullscreen quad draws.
  31. static void drawQuad(CommandBuffer& cmdb)
  32. {
  33. cmdb.draw(PrimitiveTopology::kTriangles, 3, 1);
  34. }
  35. /// Dispatch a compute job equivelent to drawQuad
  36. static void dispatchPPCompute(CommandBuffer& cmdb, U32 workgroupSizeX, U32 workgroupSizeY, U32 outImageWidth, U32 outImageHeight)
  37. {
  38. const U32 sizeX = (outImageWidth + workgroupSizeX - 1) / workgroupSizeX;
  39. const U32 sizeY = (outImageHeight + workgroupSizeY - 1) / workgroupSizeY;
  40. cmdb.dispatchCompute(sizeX, sizeY, 1);
  41. }
  42. static void dispatchPPCompute(CommandBuffer& cmdb, U32 workgroupSizeX, U32 workgroupSizeY, U32 workgroupSizeZ, U32 outImageWidth,
  43. U32 outImageHeight, U32 outImageDepth)
  44. {
  45. const U32 sizeX = (outImageWidth + workgroupSizeX - 1) / workgroupSizeX;
  46. const U32 sizeY = (outImageHeight + workgroupSizeY - 1) / workgroupSizeY;
  47. const U32 sizeZ = (outImageDepth + workgroupSizeZ - 1) / workgroupSizeZ;
  48. cmdb.dispatchCompute(sizeX, sizeY, sizeZ);
  49. }
  50. template<typename T>
  51. static T* allocateAndBindConstants(CommandBuffer& cmdb, U32 reg, U32 space)
  52. {
  53. T* ptr;
  54. const BufferView alloc = RebarTransientMemoryPool::getSingleton().allocateConstantBuffer<T>(ptr);
  55. ANKI_ASSERT(isAligned(alignof(T), ptrToNumber(ptr)));
  56. cmdb.bindConstantBuffer(reg, space, alloc);
  57. return ptr;
  58. }
  59. template<typename T>
  60. static WeakArray<T> allocateAndBindSrvStructuredBuffer(CommandBuffer& cmdb, U32 reg, U32 space, U32 count = 1)
  61. {
  62. WeakArray<T> out;
  63. const BufferView alloc = RebarTransientMemoryPool::getSingleton().allocateStructuredBuffer<T>(count, out);
  64. ANKI_ASSERT(isAligned(alignof(T), ptrToNumber(out.getBegin())));
  65. cmdb.bindSrv(reg, space, alloc);
  66. return out;
  67. }
  68. template<typename T>
  69. static WeakArray<T> allocateAndBindUavStructuredBuffer(CommandBuffer& cmdb, U32 reg, U32 space, U32 count = 1)
  70. {
  71. WeakArray<T> out;
  72. const BufferView alloc = RebarTransientMemoryPool::getSingleton().allocateStructuredBuffer<T>(count, out);
  73. ANKI_ASSERT(isAligned(alignof(T), ptrToNumber(out.getBegin())));
  74. cmdb.bindUav(reg, space, alloc);
  75. return out;
  76. }
  77. void registerDebugRenderTarget(CString rtName);
  78. static Error loadShaderProgram(CString filename, ShaderProgramResourcePtr& rsrc, ShaderProgramPtr& grProg)
  79. {
  80. ANKI_CHECK(loadShaderProgram(filename, {}, rsrc, grProg));
  81. return Error::kNone;
  82. }
  83. class SubMutation
  84. {
  85. public:
  86. CString m_mutatorName;
  87. MutatorValue m_value;
  88. };
  89. static Error loadShaderProgram(CString filename, std::initializer_list<SubMutation> mutators, ShaderProgramResourcePtr& rsrc,
  90. ShaderProgramPtr& grProg, CString technique = {}, ShaderTypeBit shaderTypes = ShaderTypeBit::kNone);
  91. static void zeroBuffer(Buffer* buff);
  92. /// Temp pass name.
  93. static CString generateTempPassName(const Char* fmt, ...);
  94. /// Fill some buffers with some value. It's a **COMPUTE** dispatch.
  95. static void fillBuffers(CommandBuffer& cmdb, ConstWeakArray<BufferView> buffers, U32 value);
  96. /// See @fillBuffers
  97. static void fillBuffer(CommandBuffer& cmdb, BufferView buffer, U32 value)
  98. {
  99. fillBuffers(cmdb, ConstWeakArray<BufferView>(&buffer, 1), value);
  100. }
  101. static DummyGpuResources& getDummyGpuResources()
  102. {
  103. return Renderer::getSingleton().m_dummyResources;
  104. }
  105. };
  106. /// @}
  107. } // end namespace anki