| 1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
| 2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
| 3 | #pragma once |
| 4 | |
| 5 | #include "BsCorePrerequisites.h" |
| 6 | #include "Utility/BsModule.h" |
| 7 | #include "Error/BsException.h" |
| 8 | #include "RenderAPI/BsGpuProgram.h" |
| 9 | |
| 10 | namespace bs |
| 11 | { |
| 12 | /** @addtogroup RenderAPI-Internal |
| 13 | * @{ |
| 14 | */ |
| 15 | |
| 16 | /** |
| 17 | * Manager responsible for creating GPU programs. It will automatically try to find the appropriate handler for a |
| 18 | * specific GPU program language and create the program if possible. |
| 19 | * |
| 20 | * @note Sim thread only. |
| 21 | */ |
| 22 | class BS_CORE_EXPORT GpuProgramManager : public Module<GpuProgramManager> |
| 23 | { |
| 24 | public: |
| 25 | /** @copydoc GpuProgram::create */ |
| 26 | SPtr<GpuProgram> create(const GPU_PROGRAM_DESC& desc); |
| 27 | |
| 28 | /** |
| 29 | * Creates a completely empty and uninitialized GpuProgram. Should only be used for specific purposes, like |
| 30 | * deserialization, as it requires additional manual initialization that is not required normally. |
| 31 | */ |
| 32 | SPtr<GpuProgram> createEmpty(const String& language, GpuProgramType type); |
| 33 | }; |
| 34 | |
| 35 | namespace ct |
| 36 | { |
| 37 | /** Factory responsible for creating GPU programs of a certain type. */ |
| 38 | class BS_CORE_EXPORT GpuProgramFactory |
| 39 | { |
| 40 | public: |
| 41 | GpuProgramFactory() = default; |
| 42 | virtual ~GpuProgramFactory() = default; |
| 43 | |
| 44 | /** @copydoc GpuProgram::create */ |
| 45 | virtual SPtr<GpuProgram> create(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT) = 0; |
| 46 | |
| 47 | /** @copydoc bs::GpuProgramManager::createEmpty */ |
| 48 | virtual SPtr<GpuProgram> create(GpuProgramType type, GpuDeviceFlags deviceMask = GDF_DEFAULT) = 0; |
| 49 | |
| 50 | /** @copydoc GpuProgram::compileBytecode */ |
| 51 | virtual SPtr<GpuProgramBytecode> compileBytecode(const GPU_PROGRAM_DESC& desc) = 0; |
| 52 | }; |
| 53 | |
| 54 | /** |
| 55 | * Manager responsible for creating GPU programs. It will automatically try to find the appropriate handler for a |
| 56 | * specific GPU program language and create the program if possible. |
| 57 | * |
| 58 | * @note Core thread only unless otherwise specified. |
| 59 | */ |
| 60 | class BS_CORE_EXPORT GpuProgramManager : public Module<GpuProgramManager> |
| 61 | { |
| 62 | public: |
| 63 | GpuProgramManager(); |
| 64 | virtual ~GpuProgramManager(); |
| 65 | |
| 66 | /** |
| 67 | * Registers a new factory that is able to create GPU programs for a certain language. If any other factory for the |
| 68 | * same language exists, it will overwrite it. |
| 69 | */ |
| 70 | void addFactory(const String& language, GpuProgramFactory* factory); |
| 71 | |
| 72 | /** |
| 73 | * Unregisters a GPU program factory, essentially making it not possible to create GPU programs using the language |
| 74 | * the factory supported. |
| 75 | */ |
| 76 | void removeFactory(const String& language); |
| 77 | |
| 78 | /** Query if a GPU program language is supported (for example "hlsl", "glsl"). Thread safe. */ |
| 79 | bool isLanguageSupported(const String& language); |
| 80 | |
| 81 | /** @copydoc GpuProgram::create */ |
| 82 | SPtr<GpuProgram> create(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT); |
| 83 | |
| 84 | /** @copydoc GpuProgram::compileBytecode */ |
| 85 | SPtr<GpuProgramBytecode> compileBytecode(const GPU_PROGRAM_DESC& desc); |
| 86 | |
| 87 | protected: |
| 88 | friend class bs::GpuProgram; |
| 89 | |
| 90 | /** |
| 91 | * Creates a GPU program without initializing it. |
| 92 | * |
| 93 | * @see create |
| 94 | */ |
| 95 | SPtr<GpuProgram> createInternal(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT); |
| 96 | |
| 97 | /** Attempts to find a factory for the specified language. Returns null if it cannot find one. */ |
| 98 | GpuProgramFactory* getFactory(const String& language); |
| 99 | |
| 100 | protected: |
| 101 | Mutex mMutex; |
| 102 | |
| 103 | UnorderedMap<String, GpuProgramFactory*> mFactories; |
| 104 | GpuProgramFactory* mNullFactory; /**< Factory for dealing with GPU programs that can't be created. */ |
| 105 | }; |
| 106 | |
| 107 | /** Factory that creates null GPU programs. */ |
| 108 | class BS_CORE_EXPORT NullProgramFactory : public GpuProgramFactory |
| 109 | { |
| 110 | public: |
| 111 | NullProgramFactory() = default; |
| 112 | ~NullProgramFactory() = default; |
| 113 | |
| 114 | SPtr<GpuProgram> create(const GPU_PROGRAM_DESC& desc, GpuDeviceFlags deviceMask) override; |
| 115 | SPtr<GpuProgram> create(GpuProgramType type, GpuDeviceFlags deviceMask) override; |
| 116 | SPtr<GpuProgramBytecode> compileBytecode(const GPU_PROGRAM_DESC& desc) override; |
| 117 | }; |
| 118 | } |
| 119 | /** @} */ |
| 120 | } |