BsGpuProgramManager.cpp 3.7 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(GPU_PROGRAM_DESC(), GDF_DEFAULT)
  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 GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask) override
  33. {
  34. SPtr<NullProgramCore> ret = bs_shared_ptr_new<NullProgramCore>();
  35. ret->_setThisPtr(ret);
  36. return ret;
  37. }
  38. SPtr<GpuProgramCore> create(GpuProgramType type, GpuDeviceFlags deviceMask) override
  39. {
  40. SPtr<NullProgramCore> ret = bs_shared_ptr_new<NullProgramCore>();
  41. ret->_setThisPtr(ret);
  42. return ret;
  43. }
  44. };
  45. SPtr<GpuProgram> GpuProgramManager::create(const GPU_PROGRAM_DESC& desc)
  46. {
  47. GpuProgram* program = new (bs_alloc<GpuProgram>()) GpuProgram(desc);
  48. SPtr<GpuProgram> ret = bs_core_ptr<GpuProgram>(program);
  49. ret->_setThisPtr(ret);
  50. ret->initialize();
  51. return ret;
  52. }
  53. SPtr<GpuProgram> GpuProgramManager::createEmpty(const String& language, GpuProgramType type)
  54. {
  55. GPU_PROGRAM_DESC desc;
  56. desc.language = language;
  57. desc.type = type;
  58. desc.profile = GPP_VS_1_1;
  59. GpuProgram* program = new (bs_alloc<GpuProgram>()) GpuProgram(desc);
  60. SPtr<GpuProgram> ret = bs_core_ptr<GpuProgram>(program);
  61. ret->_setThisPtr(ret);
  62. return ret;
  63. }
  64. GpuProgramCoreManager::GpuProgramCoreManager()
  65. {
  66. mNullFactory = bs_new<NullProgramFactory>();
  67. addFactory(mNullFactory);
  68. }
  69. GpuProgramCoreManager::~GpuProgramCoreManager()
  70. {
  71. bs_delete((NullProgramFactory*)mNullFactory);
  72. }
  73. void GpuProgramCoreManager::addFactory(GpuProgramFactory* factory)
  74. {
  75. mFactories[factory->getLanguage()] = factory;
  76. }
  77. void GpuProgramCoreManager::removeFactory(GpuProgramFactory* factory)
  78. {
  79. FactoryMap::iterator it = mFactories.find(factory->getLanguage());
  80. if (it != mFactories.end() && it->second == factory)
  81. {
  82. mFactories.erase(it);
  83. }
  84. }
  85. GpuProgramFactory* GpuProgramCoreManager::getFactory(const String& language)
  86. {
  87. FactoryMap::iterator i = mFactories.find(language);
  88. if (i == mFactories.end())
  89. i = mFactories.find(sNullLang);
  90. return i->second;
  91. }
  92. bool GpuProgramCoreManager::isLanguageSupported(const String& lang)
  93. {
  94. FactoryMap::iterator i = mFactories.find(lang);
  95. return i != mFactories.end();
  96. }
  97. SPtr<GpuProgramCore> GpuProgramCoreManager::create(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask)
  98. {
  99. SPtr<GpuProgramCore> ret = createInternal(desc, deviceMask);
  100. ret->initialize();
  101. return ret;
  102. }
  103. SPtr<GpuProgramCore> GpuProgramCoreManager::createInternal(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask)
  104. {
  105. GpuProgramFactory* factory = getFactory(desc.language);
  106. SPtr<GpuProgramCore> ret = factory->create(desc, deviceMask);
  107. return ret;
  108. }
  109. }