RendererObject.cpp 2.1 KB

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