BsGpuProgramManager.cpp 4.2 KB

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