CmGpuProgramManager.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include "CmGpuProgramManager.h"
  2. #include "CmRenderSystem.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 NullProgram : public GpuProgram
  11. {
  12. public:
  13. NullProgram()
  14. :GpuProgram("", "", GPT_VERTEX_PROGRAM, GPP_NONE, nullptr)
  15. { }
  16. ~NullProgram() { }
  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. /**
  25. * @brief Factory that creates null GPU programs.
  26. */
  27. class NullProgramFactory : public GpuProgramFactory
  28. {
  29. public:
  30. NullProgramFactory() {}
  31. ~NullProgramFactory() {}
  32. const String& getLanguage() const
  33. {
  34. return sNullLang;
  35. }
  36. GpuProgramPtr create(const String& source, const String& entryPoint, GpuProgramType gptype,
  37. GpuProgramProfile profile, const Vector<HGpuProgInclude>* includes, bool requiresAdjacencyInformation)
  38. {
  39. return bs_core_ptr<NullProgram, PoolAlloc>();
  40. }
  41. GpuProgramPtr create(GpuProgramType type)
  42. {
  43. return bs_core_ptr<NullProgram, PoolAlloc>();
  44. }
  45. };
  46. GpuProgramManager::GpuProgramManager()
  47. {
  48. mNullFactory = bs_new<NullProgramFactory>();
  49. addFactory(mNullFactory);
  50. }
  51. GpuProgramManager::~GpuProgramManager()
  52. {
  53. bs_delete((NullProgramFactory*)mNullFactory);
  54. }
  55. void GpuProgramManager::addFactory(GpuProgramFactory* factory)
  56. {
  57. mFactories[factory->getLanguage()] = factory;
  58. }
  59. void GpuProgramManager::removeFactory(GpuProgramFactory* factory)
  60. {
  61. FactoryMap::iterator it = mFactories.find(factory->getLanguage());
  62. if (it != mFactories.end() && it->second == factory)
  63. {
  64. mFactories.erase(it);
  65. }
  66. }
  67. GpuProgramFactory* GpuProgramManager::getFactory(const String& language)
  68. {
  69. FactoryMap::iterator i = mFactories.find(language);
  70. if (i == mFactories.end())
  71. i = mFactories.find(sNullLang);
  72. return i->second;
  73. }
  74. bool GpuProgramManager::isLanguageSupported(const String& lang)
  75. {
  76. FactoryMap::iterator i = mFactories.find(lang);
  77. return i != mFactories.end();
  78. }
  79. GpuProgramPtr GpuProgramManager::create(const String& source, const String& entryPoint, const String& language,
  80. GpuProgramType gptype, GpuProgramProfile profile, const Vector<HGpuProgInclude>* includes,
  81. bool requiresAdjacencyInformation)
  82. {
  83. GpuProgramFactory* factory = getFactory(language);
  84. GpuProgramPtr ret = factory->create(source, entryPoint, gptype, profile, includes, requiresAdjacencyInformation);
  85. ret->_setThisPtr(ret);
  86. ret->initialize();
  87. return ret;
  88. }
  89. GpuProgramPtr GpuProgramManager::createEmpty(const String& language, GpuProgramType type)
  90. {
  91. GpuProgramFactory* factory = getFactory(language);
  92. GpuProgramPtr ret = factory->create(type);
  93. ret->_setThisPtr(ret);
  94. return ret;
  95. }
  96. GpuProgramFactory::~GpuProgramFactory()
  97. {
  98. }
  99. }