RendererObject.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. namespace anki {
  10. Renderer& RendererObject::getRenderer()
  11. {
  12. return MainRenderer::getSingleton().getOffscreenRenderer();
  13. }
  14. void RendererObject::registerDebugRenderTarget(CString rtName)
  15. {
  16. getRenderer().registerDebugRenderTarget(this, rtName);
  17. }
  18. Error RendererObject::loadShaderProgram(CString filename, std::initializer_list<SubMutation> mutators, ShaderProgramResourcePtr& rsrc,
  19. ShaderProgramPtr& grProg, CString technique, ShaderTypeBit shaderTypes)
  20. {
  21. if(!rsrc.isCreated())
  22. {
  23. ANKI_CHECK(ResourceManager::getSingleton().loadResource(filename, rsrc));
  24. }
  25. ShaderProgramResourceVariantInitInfo initInf(rsrc);
  26. for(SubMutation pair : mutators)
  27. {
  28. initInf.addMutation(pair.m_mutatorName, pair.m_value);
  29. }
  30. if(technique.isEmpty())
  31. {
  32. technique = "Unnamed";
  33. }
  34. if(!shaderTypes)
  35. {
  36. U32 techniqueIdx = kMaxU32;
  37. for(U32 i = 0; i < rsrc->getBinary().m_techniques.getSize(); ++i)
  38. {
  39. if(technique == rsrc->getBinary().m_techniques[i].m_name.getBegin())
  40. {
  41. techniqueIdx = i;
  42. break;
  43. }
  44. }
  45. ANKI_ASSERT(techniqueIdx != kMaxU32);
  46. const ShaderTypeBit techniqueShaderTypes = rsrc->getBinary().m_techniques[techniqueIdx].m_shaderTypes;
  47. if(techniqueShaderTypes == (ShaderTypeBit::kCompute | ShaderTypeBit::kFragment | ShaderTypeBit::kVertex))
  48. {
  49. if(g_preferComputeCVar.get())
  50. {
  51. shaderTypes = ShaderTypeBit::kCompute;
  52. }
  53. else
  54. {
  55. shaderTypes = ShaderTypeBit::kFragment | ShaderTypeBit::kVertex;
  56. }
  57. }
  58. else if(techniqueShaderTypes == ShaderTypeBit::kCompute)
  59. {
  60. shaderTypes = techniqueShaderTypes;
  61. }
  62. else if(techniqueShaderTypes == (ShaderTypeBit::kFragment | ShaderTypeBit::kVertex))
  63. {
  64. shaderTypes = techniqueShaderTypes;
  65. }
  66. else
  67. {
  68. ANKI_ASSERT(!"Can't figure out a sensible default");
  69. }
  70. }
  71. initInf.requestTechniqueAndTypes(shaderTypes, technique);
  72. const ShaderProgramResourceVariant* variant;
  73. rsrc->getOrCreateVariant(initInf, variant);
  74. if(variant)
  75. {
  76. grProg.reset(&variant->getProgram());
  77. }
  78. else
  79. {
  80. grProg.reset(nullptr);
  81. }
  82. return Error::kNone;
  83. }
  84. void RendererObject::zeroBuffer(Buffer* buff)
  85. {
  86. CommandBufferInitInfo cmdbInit("Zero buffer");
  87. cmdbInit.m_flags |= CommandBufferFlag::kSmallBatch;
  88. CommandBufferPtr cmdb = GrManager::getSingleton().newCommandBuffer(cmdbInit);
  89. cmdb->fillBuffer(buff, 0, kMaxPtrSize, 0);
  90. FencePtr fence;
  91. cmdb->endRecording();
  92. GrManager::getSingleton().submit(cmdb.get(), {}, &fence);
  93. fence->clientWait(16.0_sec);
  94. }
  95. CString RendererObject::generateTempPassName(CString name, U32 index)
  96. {
  97. Char* str = static_cast<Char*>(getRenderer().getFrameMemoryPool().allocate(128, 1));
  98. snprintf(str, 128, "%s #%u", name.cstr(), index);
  99. return str;
  100. }
  101. CString RendererObject::generateTempPassName(CString name, U32 index, CString name2, U32 index2)
  102. {
  103. Char* str = static_cast<Char*>(getRenderer().getFrameMemoryPool().allocate(128, 1));
  104. snprintf(str, 128, "%s #%u %s #%u", name.cstr(), index, name2.cstr(), index2);
  105. return str;
  106. }
  107. } // end namespace anki