BsGpuProgramManager.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "BsGpuProgramManager.h"
  2. #include "BsRenderAPI.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. SPtr<NullProgramCore> ret = bs_shared_ptr<NullProgramCore>();
  39. ret->_setThisPtr(ret);
  40. return ret;
  41. }
  42. SPtr<GpuProgramCore> create(GpuProgramType type)
  43. {
  44. SPtr<NullProgramCore> ret = bs_shared_ptr<NullProgramCore>();
  45. ret->_setThisPtr(ret);
  46. return ret;
  47. }
  48. };
  49. GpuProgramPtr GpuProgramManager::create(const String& source, const String& entryPoint, const String& language,
  50. GpuProgramType gptype, GpuProgramProfile profile,
  51. bool requiresAdjacencyInformation)
  52. {
  53. GpuProgram* program = new (bs_alloc<GpuProgram>()) GpuProgram(source, entryPoint, language, gptype, profile, requiresAdjacencyInformation);
  54. GpuProgramPtr ret = bs_core_ptr<GpuProgram, GenAlloc>(program);
  55. ret->_setThisPtr(ret);
  56. ret->initialize();
  57. return ret;
  58. }
  59. GpuProgramPtr GpuProgramManager::createEmpty(const String& language, GpuProgramType type)
  60. {
  61. GpuProgram* program = new (bs_alloc<GpuProgram>()) GpuProgram("", "", language, GPT_VERTEX_PROGRAM, GPP_VS_1_1, false);
  62. GpuProgramPtr ret = bs_core_ptr<GpuProgram, GenAlloc>(program);
  63. ret->_setThisPtr(ret);
  64. return ret;
  65. }
  66. GpuProgramCoreManager::GpuProgramCoreManager()
  67. {
  68. mNullFactory = bs_new<NullProgramFactory>();
  69. addFactory(mNullFactory);
  70. }
  71. GpuProgramCoreManager::~GpuProgramCoreManager()
  72. {
  73. bs_delete((NullProgramFactory*)mNullFactory);
  74. }
  75. void GpuProgramCoreManager::addFactory(GpuProgramFactory* factory)
  76. {
  77. mFactories[factory->getLanguage()] = factory;
  78. }
  79. void GpuProgramCoreManager::removeFactory(GpuProgramFactory* factory)
  80. {
  81. FactoryMap::iterator it = mFactories.find(factory->getLanguage());
  82. if (it != mFactories.end() && it->second == factory)
  83. {
  84. mFactories.erase(it);
  85. }
  86. }
  87. GpuProgramFactory* GpuProgramCoreManager::getFactory(const String& language)
  88. {
  89. FactoryMap::iterator i = mFactories.find(language);
  90. if (i == mFactories.end())
  91. i = mFactories.find(sNullLang);
  92. return i->second;
  93. }
  94. bool GpuProgramCoreManager::isLanguageSupported(const String& lang)
  95. {
  96. FactoryMap::iterator i = mFactories.find(lang);
  97. return i != mFactories.end();
  98. }
  99. SPtr<GpuProgramCore> GpuProgramCoreManager::create(const String& source, const String& entryPoint, const String& language,
  100. GpuProgramType gptype, GpuProgramProfile profile, bool requiresAdjacencyInformation)
  101. {
  102. SPtr<GpuProgramCore> ret = createInternal(source, entryPoint, language, gptype, profile, requiresAdjacencyInformation);
  103. ret->initialize();
  104. return ret;
  105. }
  106. SPtr<GpuProgramCore> GpuProgramCoreManager::createInternal(const String& source, const String& entryPoint, const String& language,
  107. GpuProgramType gptype, GpuProgramProfile profile, bool requiresAdjacencyInformation)
  108. {
  109. GpuProgramFactory* factory = getFactory(language);
  110. SPtr<GpuProgramCore> ret = factory->create(source, entryPoint, gptype, profile, requiresAdjacencyInformation);
  111. return ret;
  112. }
  113. }