//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// #include "Managers/BsGpuProgramManager.h" #include "RenderAPI/BsRenderAPI.h" namespace bs { SPtr GpuProgramManager::create(const GPU_PROGRAM_DESC& desc) { GpuProgram* program = new (bs_alloc()) GpuProgram(desc); SPtr ret = bs_core_ptr(program); ret->_setThisPtr(ret); ret->initialize(); return ret; } SPtr GpuProgramManager::createEmpty(const String& language, GpuProgramType type) { GPU_PROGRAM_DESC desc; desc.language = language; desc.type = type; GpuProgram* program = new (bs_alloc()) GpuProgram(desc); SPtr ret = bs_core_ptr(program); ret->_setThisPtr(ret); return ret; } namespace ct { String sNullLang = "null"; /** Null GPU program used in place of GPU programs we cannot create. Null programs don't do anything. */ class NullProgram : public GpuProgram { public: NullProgram() :GpuProgram(GPU_PROGRAM_DESC(), GDF_DEFAULT) { } ~NullProgram() { } bool isSupported() const { return false; } const String& getLanguage() const { return sNullLang; } protected: void loadFromSource() {} void buildConstantDefinitions() const { } }; /** Factory that creates null GPU programs. */ class NullProgramFactory : public GpuProgramFactory { public: NullProgramFactory() {} ~NullProgramFactory() {} SPtr create(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask) override { SPtr ret = bs_shared_ptr_new(); ret->_setThisPtr(ret); return ret; } SPtr create(GpuProgramType type, GpuDeviceFlags deviceMask) override { SPtr ret = bs_shared_ptr_new(); ret->_setThisPtr(ret); return ret; } }; GpuProgramManager::GpuProgramManager() { mNullFactory = bs_new(); addFactory(sNullLang, mNullFactory); } GpuProgramManager::~GpuProgramManager() { bs_delete((NullProgramFactory*)mNullFactory); } void GpuProgramManager::addFactory(const String& language, GpuProgramFactory* factory) { Lock(mMutex); mFactories[language] = factory; } void GpuProgramManager::removeFactory(const String& language) { Lock(mMutex); auto iter = mFactories.find(language); if (iter != mFactories.end()) mFactories.erase(iter); } GpuProgramFactory* GpuProgramManager::getFactory(const String& language) { auto iter = mFactories.find(language); if (iter == mFactories.end()) iter = mFactories.find(sNullLang); return iter->second; } bool GpuProgramManager::isLanguageSupported(const String& lang) { Lock(mMutex); auto iter = mFactories.find(lang); return iter != mFactories.end(); } SPtr GpuProgramManager::create(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask) { SPtr ret = createInternal(desc, deviceMask); ret->initialize(); return ret; } SPtr GpuProgramManager::createInternal(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask) { GpuProgramFactory* factory = getFactory(desc.language); SPtr ret = factory->create(desc, deviceMask); return ret; } } }