RendererObject.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // Copyright (C) 2009-2023, 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/Common.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/Core/GpuMemoryPools.h>
  12. namespace anki {
  13. // Forward
  14. class Renderer;
  15. class ResourceManager;
  16. /// @addtogroup renderer
  17. /// @{
  18. /// Renderer object.
  19. class RendererObject
  20. {
  21. public:
  22. RendererObject(Renderer* r)
  23. : m_r(r)
  24. {
  25. }
  26. virtual ~RendererObject()
  27. {
  28. }
  29. HeapMemoryPool& getMemoryPool() const;
  30. virtual void getDebugRenderTarget([[maybe_unused]] CString rtName,
  31. [[maybe_unused]] Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
  32. [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const
  33. {
  34. ANKI_ASSERT(!"Object doesn't support that");
  35. }
  36. protected:
  37. Renderer* m_r; ///< Know your father
  38. ANKI_PURE RendererExternalSubsystems& getExternalSubsystems();
  39. ANKI_PURE const RendererExternalSubsystems& getExternalSubsystems() const;
  40. void* allocateRebarStagingMemory(PtrSize size, RebarGpuMemoryToken& token);
  41. U32 computeNumberOfSecondLevelCommandBuffers(U32 drawcallCount) const;
  42. /// Used in fullscreen quad draws.
  43. static void drawQuad(CommandBufferPtr& cmdb)
  44. {
  45. cmdb->drawArrays(PrimitiveTopology::kTriangles, 3, 1);
  46. }
  47. /// Dispatch a compute job equivelent to drawQuad
  48. static void dispatchPPCompute(CommandBufferPtr& cmdb, U32 workgroupSizeX, U32 workgroupSizeY, U32 outImageWidth,
  49. U32 outImageHeight)
  50. {
  51. const U32 sizeX = (outImageWidth + workgroupSizeX - 1) / workgroupSizeX;
  52. const U32 sizeY = (outImageHeight + workgroupSizeY - 1) / workgroupSizeY;
  53. cmdb->dispatchCompute(sizeX, sizeY, 1);
  54. }
  55. static void dispatchPPCompute(CommandBufferPtr& cmdb, U32 workgroupSizeX, U32 workgroupSizeY, U32 workgroupSizeZ,
  56. U32 outImageWidth, U32 outImageHeight, U32 outImageDepth)
  57. {
  58. const U32 sizeX = (outImageWidth + workgroupSizeX - 1) / workgroupSizeX;
  59. const U32 sizeY = (outImageHeight + workgroupSizeY - 1) / workgroupSizeY;
  60. const U32 sizeZ = (outImageDepth + workgroupSizeZ - 1) / workgroupSizeZ;
  61. cmdb->dispatchCompute(sizeX, sizeY, sizeZ);
  62. }
  63. template<typename TPtr>
  64. TPtr allocateUniforms(PtrSize size, RebarGpuMemoryToken& token)
  65. {
  66. return static_cast<TPtr>(allocateRebarStagingMemory(size, token));
  67. }
  68. void bindUniforms(CommandBufferPtr& cmdb, U32 set, U32 binding, const RebarGpuMemoryToken& token) const;
  69. template<typename TPtr>
  70. TPtr allocateAndBindUniforms(PtrSize size, CommandBufferPtr& cmdb, U32 set, U32 binding)
  71. {
  72. RebarGpuMemoryToken token;
  73. TPtr ptr = allocateUniforms<TPtr>(size, token);
  74. bindUniforms(cmdb, set, binding, token);
  75. return ptr;
  76. }
  77. template<typename TPtr>
  78. TPtr allocateStorage(PtrSize size, RebarGpuMemoryToken& token)
  79. {
  80. return static_cast<TPtr>(allocateRebarStagingMemory(size, token));
  81. }
  82. void bindStorage(CommandBufferPtr& cmdb, U32 set, U32 binding, const RebarGpuMemoryToken& token) const;
  83. template<typename TPtr>
  84. TPtr allocateAndBindStorage(PtrSize size, CommandBufferPtr& cmdb, U32 set, U32 binding)
  85. {
  86. RebarGpuMemoryToken token;
  87. TPtr ptr = allocateStorage<TPtr>(size, token);
  88. bindStorage(cmdb, set, binding, token);
  89. return ptr;
  90. }
  91. void registerDebugRenderTarget(CString rtName);
  92. };
  93. /// @}
  94. } // end namespace anki