RendererObject.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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/GpuMemory/RebarTransientMemoryPool.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() = default;
  23. virtual ~RendererObject() = default;
  24. virtual void getDebugRenderTarget([[maybe_unused]] CString rtName, [[maybe_unused]] Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
  25. [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) 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 set, U32 binding)
  53. {
  54. T* ptr;
  55. const RebarAllocation alloc = RebarTransientMemoryPool::getSingleton().allocateFrame(1, ptr);
  56. ANKI_ASSERT(isAligned(alignof(T), ptrToNumber(ptr)));
  57. cmdb.bindConstantBuffer(set, binding, alloc);
  58. return ptr;
  59. }
  60. template<typename T>
  61. static T* allocateAndBindUav(CommandBuffer& cmdb, U32 set, U32 binding, U32 count = 1)
  62. {
  63. T* ptr;
  64. const RebarAllocation alloc = RebarTransientMemoryPool::getSingleton().allocateFrame(count, ptr);
  65. ANKI_ASSERT(isAligned(alignof(T), ptrToNumber(ptr)));
  66. cmdb.bindUavBuffer(set, binding, alloc);
  67. return ptr;
  68. }
  69. void registerDebugRenderTarget(CString rtName);
  70. static Error loadShaderProgram(CString filename, ShaderProgramResourcePtr& rsrc, ShaderProgramPtr& grProg)
  71. {
  72. ANKI_CHECK(loadShaderProgram(filename, {}, rsrc, grProg));
  73. return Error::kNone;
  74. }
  75. class SubMutation
  76. {
  77. public:
  78. CString m_mutatorName;
  79. MutatorValue m_value;
  80. };
  81. static Error loadShaderProgram(CString filename, std::initializer_list<SubMutation> mutators, ShaderProgramResourcePtr& rsrc,
  82. ShaderProgramPtr& grProg, CString technique = {}, ShaderTypeBit shaderTypes = ShaderTypeBit::kNone);
  83. static void zeroBuffer(Buffer* buff);
  84. /// Temp pass name.
  85. static CString generateTempPassName(CString name, U32 index);
  86. static CString generateTempPassName(CString name, U32 index, CString name2, U32 index2);
  87. };
  88. /// @}
  89. } // end namespace anki