BsGpuProgramManager.cpp 4.2 KB

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