Drawer.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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/Renderer/Utils/GpuVisibility.h>
  8. #include <AnKi/Gr.h>
  9. namespace anki {
  10. /// @addtogroup renderer
  11. /// @{
  12. /// @memberof RenderableDrawer.
  13. class RenderableDrawerArguments
  14. {
  15. public:
  16. // The matrices are whatever the drawing needs. Sometimes they contain jittering and sometimes they don't.
  17. Mat3x4 m_viewMatrix;
  18. Mat3x4 m_cameraTransform;
  19. Mat4 m_viewProjectionMatrix;
  20. Mat4 m_previousViewProjectionMatrix;
  21. UVec4 m_viewport; ///< Only used for information purposes.
  22. Sampler* m_sampler = nullptr;
  23. // For MDI
  24. RenderingTechnique m_renderingTechinuqe = RenderingTechnique::kCount;
  25. BufferOffsetRange m_mdiDrawCountsBuffer;
  26. BufferOffsetRange m_drawIndexedIndirectArgsBuffer;
  27. BufferOffsetRange m_instanceRateRenderablesBuffer;
  28. BufferOffsetRange m_taskShaderIndirectArgsBuffer;
  29. BufferOffsetRange m_taskShaderPayloadsBuffer;
  30. void fillMdi(const GpuVisibilityOutput& visOut)
  31. {
  32. m_mdiDrawCountsBuffer = visOut.m_mdiDrawCountsBuffer;
  33. m_drawIndexedIndirectArgsBuffer = visOut.m_drawIndexedIndirectArgsBuffer;
  34. m_instanceRateRenderablesBuffer = visOut.m_instanceRateRenderablesBuffer;
  35. m_taskShaderIndirectArgsBuffer = visOut.m_taskShaderIndirectArgsBuffer;
  36. m_taskShaderPayloadsBuffer = visOut.m_taskShaderPayloadBuffer;
  37. }
  38. };
  39. /// It uses visibility data to issue drawcalls.
  40. class RenderableDrawer : public RendererObject
  41. {
  42. public:
  43. RenderableDrawer() = default;
  44. ~RenderableDrawer();
  45. Error init();
  46. /// Draw using multidraw indirect.
  47. /// @note It's thread-safe.
  48. void drawMdi(const RenderableDrawerArguments& args, CommandBuffer& cmdb);
  49. private:
  50. #if ANKI_STATS_ENABLED
  51. class
  52. {
  53. public:
  54. MultiframeReadbackToken m_readback;
  55. ShaderProgramResourcePtr m_statsProg;
  56. Array<ShaderProgramPtr, 3> m_updateStatsGrProgs;
  57. U64 m_frameIdx = kMaxU64;
  58. SpinLock m_mtx;
  59. Buffer* m_statsBuffer = nullptr;
  60. PtrSize m_statsBufferOffset = 0;
  61. BufferOffsetRange m_threadCountBuffer;
  62. } m_stats;
  63. #endif
  64. void setState(const RenderableDrawerArguments& args, CommandBuffer& cmdb);
  65. };
  66. /// @}
  67. } // end namespace anki