BsGpuProgramManager.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. SPtr<GpuProgram> create(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask) override
  49. {
  50. SPtr<NullProgram> ret = bs_shared_ptr_new<NullProgram>();
  51. ret->_setThisPtr(ret);
  52. return ret;
  53. }
  54. SPtr<GpuProgram> create(GpuProgramType type, GpuDeviceFlags deviceMask) override
  55. {
  56. SPtr<NullProgram> ret = bs_shared_ptr_new<NullProgram>();
  57. ret->_setThisPtr(ret);
  58. return ret;
  59. }
  60. };
  61. GpuProgramManager::GpuProgramManager()
  62. {
  63. mNullFactory = bs_new<NullProgramFactory>();
  64. addFactory(sNullLang, mNullFactory);
  65. }
  66. GpuProgramManager::~GpuProgramManager()
  67. {
  68. bs_delete((NullProgramFactory*)mNullFactory);
  69. }
  70. void GpuProgramManager::addFactory(const String& language, GpuProgramFactory* factory)
  71. {
  72. Lock(mMutex);
  73. mFactories[language] = factory;
  74. }
  75. void GpuProgramManager::removeFactory(const String& language)
  76. {
  77. Lock(mMutex);
  78. auto iter = mFactories.find(language);
  79. if (iter != mFactories.end())
  80. mFactories.erase(iter);
  81. }
  82. GpuProgramFactory* GpuProgramManager::getFactory(const String& language)
  83. {
  84. auto iter = mFactories.find(language);
  85. if (iter == mFactories.end())
  86. iter = mFactories.find(sNullLang);
  87. return iter->second;
  88. }
  89. bool GpuProgramManager::isLanguageSupported(const String& lang)
  90. {
  91. Lock(mMutex);
  92. auto iter = mFactories.find(lang);
  93. return iter != mFactories.end();
  94. }
  95. SPtr<GpuProgram> GpuProgramManager::create(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask)
  96. {
  97. SPtr<GpuProgram> ret = createInternal(desc, deviceMask);
  98. ret->initialize();
  99. return ret;
  100. }
  101. SPtr<GpuProgram> GpuProgramManager::createInternal(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask)
  102. {
  103. GpuProgramFactory* factory = getFactory(desc.language);
  104. SPtr<GpuProgram> ret = factory->create(desc, deviceMask);
  105. return ret;
  106. }
  107. }
  108. }