BsGpuProgramManager.cpp 3.5 KB

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