Nameless Engine
Loading...
Searching...
No Matches
ShaderManager.h
1#pragma once
2
3// Standard.
4#include <string>
5#include <unordered_map>
6#include <memory>
7#include <functional>
8#include <mutex>
9#include <optional>
10#include <atomic>
11#include <variant>
12#include <array>
13
14// Custom.
15#include "misc/Error.h"
16#include "shader/ShaderDescription.h"
17#include "shader/general/cache/ShaderCacheManager.h"
18#include "shader/general/ShaderPack.h"
19
20namespace ne {
21 class Shader;
22 class Renderer;
23
26 // Only ShaderUser should be able to work with shaders.
27 friend class ShaderUser;
28
29 // Renderer sets shaders' configuration.
30 friend class Renderer;
31
32 public:
39
40 ShaderManager() = delete;
41 ShaderManager(const ShaderManager&) = delete;
42 ShaderManager& operator=(const ShaderManager&) = delete;
43
44 virtual ~ShaderManager() = default;
45
84 [[nodiscard]] std::optional<Error> compileShaders(
85 std::vector<ShaderDescription> vShadersToCompile,
86 const std::function<void(size_t iCompiledShaderCount, size_t iTotalShadersToCompile)>& onProgress,
87 const std::function<
88 void(ShaderDescription shaderDescription, std::variant<std::string, Error> error)>& onError,
89 const std::function<void()>& onCompleted);
90
99 bool isShaderNameCanBeUsed(const std::string& sShaderName);
100
127 bool markShaderToBeRemoved(const std::string& sShaderName);
128
134
135 protected:
147 void
148 setRendererConfigurationForShaders(const std::set<ShaderMacro>& configuration, ShaderType shaderType);
149
172 size_t iQueryId,
173 const std::shared_ptr<std::atomic<size_t>>& pCompiledShaderCount,
174 size_t iTotalShaderCount,
175 ShaderDescription shaderDescription,
176 const std::function<void(size_t iCompiledShaderCount, size_t iTotalShadersToCompile)>& onProgress,
177 const std::function<
178 void(ShaderDescription shaderDescription, std::variant<std::string, Error> error)>& onError,
179 const std::function<void()>& onCompleted);
180
191 std::optional<std::shared_ptr<ShaderPack>> getShader(const std::string& sShaderName);
192
199 void releaseShaderBytecodeIfNotUsed(const std::string& sShaderName);
200
207 void removeShaderIfMarkedToBeRemoved(const std::string& sShaderName);
208
218 [[nodiscard]] std::optional<Error> refreshShaderCache();
219
220 private:
222 struct ShaderData {
230 std::unordered_map<std::string, std::shared_ptr<ShaderPack>> compiledShaders;
231
236 std::vector<std::string> vShadersToBeRemoved;
237 };
238
240 std::unique_ptr<ShaderCacheManager> pShaderCacheManager;
241
243 std::pair<std::recursive_mutex, ShaderData> mtxShaderData;
244
249 std::atomic<size_t> iTotalCompileShadersQueries = 0;
250
252 Renderer* const pRenderer = nullptr;
253
259 static inline const std::array<char, 65> vValidCharactersForShaderName = {
260 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
261 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
262 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
263 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '_', '-'};
264
266 static inline const size_t iMaximumShaderNameLength = 40;
267 };
268} // namespace ne
Definition: Renderer.h:39
Definition: ShaderManager.h:25
bool markShaderToBeRemoved(const std::string &sShaderName)
Definition: ShaderManager.cpp:106
void performSelfValidation()
Definition: ShaderManager.cpp:136
std::unique_ptr< ShaderCacheManager > pShaderCacheManager
Definition: ShaderManager.h:240
void compileShaderTask(size_t iQueryId, const std::shared_ptr< std::atomic< size_t > > &pCompiledShaderCount, size_t iTotalShaderCount, ShaderDescription shaderDescription, const std::function< void(size_t iCompiledShaderCount, size_t iTotalShadersToCompile)> &onProgress, const std::function< void(ShaderDescription shaderDescription, std::variant< std::string, Error > error)> &onError, const std::function< void()> &onCompleted)
Definition: ShaderManager.cpp:329
static const size_t iMaximumShaderNameLength
Definition: ShaderManager.h:266
static const std::array< char, 65 > vValidCharactersForShaderName
Definition: ShaderManager.h:259
std::atomic< size_t > iTotalCompileShadersQueries
Definition: ShaderManager.h:249
void setRendererConfigurationForShaders(const std::set< ShaderMacro > &configuration, ShaderType shaderType)
Definition: ShaderManager.cpp:232
Renderer *const pRenderer
Definition: ShaderManager.h:252
bool isShaderNameCanBeUsed(const std::string &sShaderName)
Definition: ShaderManager.cpp:98
std::optional< Error > compileShaders(std::vector< ShaderDescription > vShadersToCompile, const std::function< void(size_t iCompiledShaderCount, size_t iTotalShadersToCompile)> &onProgress, const std::function< void(ShaderDescription shaderDescription, std::variant< std::string, Error > error)> &onError, const std::function< void()> &onCompleted)
Definition: ShaderManager.cpp:243
void removeShaderIfMarkedToBeRemoved(const std::string &sShaderName)
Definition: ShaderManager.cpp:56
std::pair< std::recursive_mutex, ShaderData > mtxShaderData
Definition: ShaderManager.h:243
void releaseShaderBytecodeIfNotUsed(const std::string &sShaderName)
Definition: ShaderManager.cpp:36
std::optional< std::shared_ptr< ShaderPack > > getShader(const std::string &sShaderName)
Definition: ShaderManager.cpp:24
std::optional< Error > refreshShaderCache()
Definition: ShaderManager.cpp:86
Definition: ShaderUser.h:20
Definition: ShaderDescription.h:74
Definition: ShaderManager.h:222
std::unordered_map< std::string, std::shared_ptr< ShaderPack > > compiledShaders
Definition: ShaderManager.h:230
std::vector< std::string > vShadersToBeRemoved
Definition: ShaderManager.h:236