RendererObject.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. U32 RendererObject::computeNumberOfSecondLevelCommandBuffers(U32 drawcallCount) const
  16. {
  17. const U32 drawcallsPerThread = drawcallCount / CoreThreadHive::getSingleton().getThreadCount();
  18. U32 secondLevelCmdbCount;
  19. if(drawcallsPerThread < kMinDrawcallsPerSecondaryCommandBuffer)
  20. {
  21. secondLevelCmdbCount = max(1u, drawcallCount / kMinDrawcallsPerSecondaryCommandBuffer);
  22. }
  23. else
  24. {
  25. secondLevelCmdbCount = CoreThreadHive::getSingleton().getThreadCount();
  26. }
  27. return secondLevelCmdbCount;
  28. }
  29. void RendererObject::registerDebugRenderTarget(CString rtName)
  30. {
  31. getRenderer().registerDebugRenderTarget(this, rtName);
  32. }
  33. Error RendererObject::loadShaderProgram(CString filename, ShaderProgramResourcePtr& rsrc, ShaderProgramPtr& grProg)
  34. {
  35. ANKI_CHECK(ResourceManager::getSingleton().loadResource(filename, rsrc));
  36. const ShaderProgramResourceVariant* variant;
  37. rsrc->getOrCreateVariant(variant);
  38. grProg.reset(&variant->getProgram());
  39. return Error::kNone;
  40. }
  41. Error RendererObject::loadShaderProgram(CString filename, ConstWeakArray<SubMutation> mutators, ShaderProgramResourcePtr& rsrc,
  42. ShaderProgramPtr& grProg)
  43. {
  44. if(!rsrc.isCreated())
  45. {
  46. ANKI_CHECK(ResourceManager::getSingleton().loadResource(filename, rsrc));
  47. }
  48. ShaderProgramResourceVariantInitInfo initInf(rsrc);
  49. for(SubMutation pair : mutators)
  50. {
  51. initInf.addMutation(pair.m_mutatorName, pair.m_value);
  52. }
  53. const ShaderProgramResourceVariant* variant;
  54. rsrc->getOrCreateVariant(initInf, variant);
  55. grProg.reset(&variant->getProgram());
  56. return Error::kNone;
  57. }
  58. void RendererObject::zeroBuffer(Buffer* buff)
  59. {
  60. CommandBufferInitInfo cmdbInit("Zero buffer");
  61. cmdbInit.m_flags |= CommandBufferFlag::kSmallBatch;
  62. CommandBufferPtr cmdb = GrManager::getSingleton().newCommandBuffer(cmdbInit);
  63. cmdb->fillBuffer(buff, 0, kMaxPtrSize, 0);
  64. FencePtr fence;
  65. cmdb->flush({}, &fence);
  66. fence->clientWait(16.0_sec);
  67. }
  68. } // end namespace anki