RendererObject.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. #include <AnKi/Renderer/RendererObject.h>
  6. #include <AnKi/Renderer/Renderer.h>
  7. #include <AnKi/Util/Enum.h>
  8. #include <AnKi/Util/ThreadHive.h>
  9. namespace anki {
  10. RendererExternalSubsystems& RendererObject::getExternalSubsystems()
  11. {
  12. return m_r->getExternalSubsystems();
  13. }
  14. const RendererExternalSubsystems& RendererObject::getExternalSubsystems() const
  15. {
  16. return m_r->getExternalSubsystems();
  17. }
  18. HeapMemoryPool& RendererObject::getMemoryPool() const
  19. {
  20. return m_r->getMemoryPool();
  21. }
  22. void* RendererObject::allocateRebarStagingMemory(PtrSize size, RebarGpuMemoryToken& token)
  23. {
  24. return RebarStagingGpuMemoryPool::getSingleton().allocateFrame(size, token);
  25. }
  26. void RendererObject::bindUniforms(CommandBufferPtr& cmdb, U32 set, U32 binding, const RebarGpuMemoryToken& token) const
  27. {
  28. if(!token.isUnused())
  29. {
  30. cmdb->bindUniformBuffer(set, binding, RebarStagingGpuMemoryPool::getSingleton().getBuffer(), token.m_offset,
  31. token.m_range);
  32. }
  33. else
  34. {
  35. cmdb->bindUniformBuffer(set, binding, m_r->getDummyBuffer(), 0, m_r->getDummyBuffer()->getSize());
  36. }
  37. }
  38. void RendererObject::bindStorage(CommandBufferPtr& cmdb, U32 set, U32 binding, const RebarGpuMemoryToken& token) const
  39. {
  40. if(!token.isUnused())
  41. {
  42. cmdb->bindStorageBuffer(set, binding, RebarStagingGpuMemoryPool::getSingleton().getBuffer(), token.m_offset,
  43. token.m_range);
  44. }
  45. else
  46. {
  47. cmdb->bindStorageBuffer(set, binding, m_r->getDummyBuffer(), 0, m_r->getDummyBuffer()->getSize());
  48. }
  49. }
  50. U32 RendererObject::computeNumberOfSecondLevelCommandBuffers(U32 drawcallCount) const
  51. {
  52. const U32 drawcallsPerThread = drawcallCount / CoreThreadHive::getSingleton().getThreadCount();
  53. U32 secondLevelCmdbCount;
  54. if(drawcallsPerThread < kMinDrawcallsPerSecondaryCommandBuffer)
  55. {
  56. secondLevelCmdbCount = max(1u, drawcallCount / kMinDrawcallsPerSecondaryCommandBuffer);
  57. }
  58. else
  59. {
  60. secondLevelCmdbCount = CoreThreadHive::getSingleton().getThreadCount();
  61. }
  62. return secondLevelCmdbCount;
  63. }
  64. void RendererObject::registerDebugRenderTarget(CString rtName)
  65. {
  66. m_r->registerDebugRenderTarget(this, rtName);
  67. }
  68. } // end namespace anki