BsGpuProgramManager.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "BsGpuProgramManager.h"
  2. #include "BsRenderSystem.h"
  3. namespace BansheeEngine
  4. {
  5. String sNullLang = "null";
  6. /**
  7. * @brief Null GPU program used in place of GPU programs we cannot create.
  8. * Null programs don't do anything.
  9. */
  10. class NullProgramCore : public GpuProgramCore
  11. {
  12. public:
  13. NullProgramCore()
  14. :GpuProgramCore("", "", GPT_VERTEX_PROGRAM, GPP_NONE, nullptr)
  15. { }
  16. ~NullProgramCore() { }
  17. bool isSupported() const { return false; }
  18. const String& getLanguage() const { return sNullLang; }
  19. protected:
  20. void loadFromSource() {}
  21. void buildConstantDefinitions() const { }
  22. };
  23. /**
  24. * @brief Factory that creates null GPU programs.
  25. */
  26. class NullProgramFactory : public GpuProgramFactory
  27. {
  28. public:
  29. NullProgramFactory() {}
  30. ~NullProgramFactory() {}
  31. const String& getLanguage() const
  32. {
  33. return sNullLang;
  34. }
  35. SPtr<GpuProgramCore> create(const String& source, const String& entryPoint, GpuProgramType gptype,
  36. GpuProgramProfile profile, bool requiresAdjacencyInformation)
  37. {
  38. return bs_shared_ptr<NullProgramCore>();
  39. }
  40. SPtr<GpuProgramCore> create(GpuProgramType type)
  41. {
  42. return bs_shared_ptr<NullProgramCore>();
  43. }
  44. };
  45. GpuProgramPtr GpuProgramManager::create(const String& source, const String& entryPoint, const String& language,
  46. GpuProgramType gptype, GpuProgramProfile profile, const Vector<HGpuProgInclude>* includes,
  47. bool requiresAdjacencyInformation)
  48. {
  49. GpuProgram* program = new (bs_alloc<GpuProgram>()) GpuProgram(source, entryPoint, language, gptype, profile, includes, requiresAdjacencyInformation);
  50. GpuProgramPtr ret = bs_core_ptr<GpuProgram, GenAlloc>(program);
  51. ret->_setThisPtr(ret);
  52. ret->initialize();
  53. return ret;
  54. }
  55. GpuProgramPtr GpuProgramManager::createEmpty(const String& language, GpuProgramType type)
  56. {
  57. GpuProgram* program = new (bs_alloc<GpuProgram>()) GpuProgram("", "", language, GPT_VERTEX_PROGRAM, GPP_VS_1_1, nullptr, false);
  58. GpuProgramPtr ret = bs_core_ptr<GpuProgram, GenAlloc>(program);
  59. ret->_setThisPtr(ret);
  60. return ret;
  61. }
  62. GpuProgramCoreManager::GpuProgramCoreManager()
  63. {
  64. mNullFactory = bs_new<NullProgramFactory>();
  65. addFactory(mNullFactory);
  66. }
  67. GpuProgramCoreManager::~GpuProgramCoreManager()
  68. {
  69. bs_delete((NullProgramFactory*)mNullFactory);
  70. }
  71. void GpuProgramCoreManager::addFactory(GpuProgramFactory* factory)
  72. {
  73. mFactories[factory->getLanguage()] = factory;
  74. }
  75. void GpuProgramCoreManager::removeFactory(GpuProgramFactory* factory)
  76. {
  77. FactoryMap::iterator it = mFactories.find(factory->getLanguage());
  78. if (it != mFactories.end() && it->second == factory)
  79. {
  80. mFactories.erase(it);
  81. }
  82. }
  83. GpuProgramFactory* GpuProgramCoreManager::getFactory(const String& language)
  84. {
  85. FactoryMap::iterator i = mFactories.find(language);
  86. if (i == mFactories.end())
  87. i = mFactories.find(sNullLang);
  88. return i->second;
  89. }
  90. bool GpuProgramCoreManager::isLanguageSupported(const String& lang)
  91. {
  92. FactoryMap::iterator i = mFactories.find(lang);
  93. return i != mFactories.end();
  94. }
  95. SPtr<GpuProgramCore> GpuProgramCoreManager::create(const String& source, const String& entryPoint, const String& language,
  96. GpuProgramType gptype, GpuProgramProfile profile, bool requiresAdjacencyInformation)
  97. {
  98. SPtr<GpuProgramCore> ret = createInternal(source, entryPoint, language, gptype, profile, requiresAdjacencyInformation);
  99. ret->initialize();
  100. return ret;
  101. }
  102. SPtr<GpuProgramCore> GpuProgramCoreManager::createInternal(const String& source, const String& entryPoint, const String& language,
  103. GpuProgramType gptype, GpuProgramProfile profile, bool requiresAdjacencyInformation)
  104. {
  105. GpuProgramFactory* factory = getFactory(language);
  106. SPtr<GpuProgramCore> ret = factory->create(source, entryPoint, gptype, profile, requiresAdjacencyInformation);
  107. return ret;
  108. }
  109. }