Nameless Engine
Loading...
Searching...
No Matches
HlslShader.h
1#pragma once
2
3// Standard.
4#include <mutex>
5#include <set>
6
7// Custom.
8#include "shader/general/Shader.h"
9#include "render/RenderSettings.h"
10#include "shader/hlsl/RootSignatureGenerator.h"
11
12// External.
13#include "directx/d3dx12.h"
14#include "DirectXShaderCompiler/inc/dxcapi.h"
15
16// OS.
17#include <wrl.h>
18
19namespace ne {
20 using namespace Microsoft::WRL;
21
22 class Renderer;
23
25 class HlslShader : public Shader {
26 public:
41 std::filesystem::path pathToCompiledShader,
42 const std::string& sShaderName,
43 ShaderType shaderType,
44 const std::optional<VertexFormat>& vertexFormat,
45 const std::string& sSourceFileHash);
46
47 HlslShader() = delete;
48 HlslShader(const HlslShader&) = delete;
49 HlslShader& operator=(const HlslShader&) = delete;
50
51 virtual ~HlslShader() override = default;
52
58 static constexpr std::string_view getVertexShaderModel() { return sVertexShaderModel; }
59
65 static constexpr std::string_view getPixelShaderModel() { return sPixelShaderModel; }
66
72 static constexpr std::string_view getComputeShaderModel() { return sComputeShaderModel; }
73
79 static std::variant<std::string, Error> getShaderCompilerVersion();
80
92 static std::variant<ComPtr<IDxcResult>, std::string, Error> compileShaderToBytecode(
93 const ShaderDescription& shaderDescription,
94 const std::optional<std::filesystem::path>& pathToPdb);
95
109 static std::variant<std::shared_ptr<Shader>, std::string, Error> compileShader(
111 const std::filesystem::path& cacheDirectory,
112 const std::string& sConfiguration,
113 const ShaderDescription& shaderDescription);
114
122 std::variant<ComPtr<IDxcBlob>, Error> getCompiledBlob();
123
130 std::pair<std::mutex, std::optional<RootSignatureGenerator::CollectedInfo>>* getRootSignatureInfo();
131
137 std::string getShaderSourceFileHash() const;
138
146 virtual bool releaseShaderDataFromMemoryIfLoaded() override;
147
148 protected:
159 [[nodiscard]] virtual std::optional<Error>
160 saveAdditionalCompilationResultsInfo(ConfigManager& cacheMetadataConfigManager) override;
161
173 [[nodiscard]] virtual std::optional<Error> checkCachedAdditionalCompilationResultsInfo(
174 ConfigManager& cacheMetadataConfigManager,
175 std::optional<ShaderCacheInvalidationReason>& cacheInvalidationReason) override;
176
177 private:
185 static std::variant<ComPtr<IDxcBlob>, Error>
186 readBlobFromDisk(const std::filesystem::path& pathToFile);
187
194 std::variant<std::string, Error> calculateReflectionFileHash();
195
201 [[nodiscard]] std::optional<Error> loadShaderDataFromDiskIfNotLoaded();
202
207 std::pair<std::recursive_mutex, ComPtr<IDxcBlob>> mtxCompiledBytecode;
208
215 std::pair<std::mutex, std::optional<RootSignatureGenerator::CollectedInfo>> mtxRootSignatureInfo;
216
218 std::string sSourceFileHash;
219
221 static inline UINT iShaderFileCodepage = DXC_CP_ACP;
222
224 static inline auto sShaderReflectionFileExtension = ".reflection";
225
227 static inline const auto sReflectionFileHashKeyName = "reflection_file_hash";
228
230 static inline const auto sHlslSectionName = "HLSL";
231
232 // -------------------------------------------------------------------------
233 // ! if adding new shader models add them to cache config in ShaderManager !
234 // -------------------------------------------------------------------------
236 static constexpr std::string_view sVertexShaderModel = "vs_6_0";
238 static constexpr std::string_view sPixelShaderModel = "ps_6_0";
240 static constexpr std::string_view sComputeShaderModel = "cs_6_0";
241 // -------------------------------------------------------------------------
242 // ! if adding new shader models add them to cache config in ShaderManager !
243 // -------------------------------------------------------------------------
244 };
245} // namespace ne
Definition: ConfigManager.h:27
Definition: Error.h:27
Definition: HlslShader.h:25
virtual std::optional< Error > saveAdditionalCompilationResultsInfo(ConfigManager &cacheMetadataConfigManager) override
Definition: HlslShader.cpp:401
static std::variant< std::shared_ptr< Shader >, std::string, Error > compileShader(Renderer *pRenderer, const std::filesystem::path &cacheDirectory, const std::string &sConfiguration, const ShaderDescription &shaderDescription)
Definition: HlslShader.cpp:212
static std::variant< std::string, Error > getShaderCompilerVersion()
Definition: HlslShader.cpp:34
static constexpr std::string_view getPixelShaderModel()
Definition: HlslShader.h:65
static constexpr std::string_view sPixelShaderModel
Definition: HlslShader.h:238
static constexpr std::string_view sComputeShaderModel
Definition: HlslShader.h:240
static UINT iShaderFileCodepage
Definition: HlslShader.h:221
static auto sShaderReflectionFileExtension
Definition: HlslShader.h:224
std::string sSourceFileHash
Definition: HlslShader.h:218
std::string getShaderSourceFileHash() const
Definition: HlslShader.cpp:371
virtual bool releaseShaderDataFromMemoryIfLoaded() override
Definition: HlslShader.cpp:373
std::pair< std::mutex, std::optional< RootSignatureGenerator::CollectedInfo > > * getRootSignatureInfo()
Definition: HlslShader.cpp:367
std::variant< ComPtr< IDxcBlob >, Error > getCompiledBlob()
Definition: HlslShader.cpp:355
static const auto sHlslSectionName
Definition: HlslShader.h:230
static const auto sReflectionFileHashKeyName
Definition: HlslShader.h:227
std::optional< Error > loadShaderDataFromDiskIfNotLoaded()
Definition: HlslShader.cpp:525
static constexpr std::string_view getVertexShaderModel()
Definition: HlslShader.h:58
virtual std::optional< Error > checkCachedAdditionalCompilationResultsInfo(ConfigManager &cacheMetadataConfigManager, std::optional< ShaderCacheInvalidationReason > &cacheInvalidationReason) override
Definition: HlslShader.cpp:418
static std::variant< ComPtr< IDxcBlob >, Error > readBlobFromDisk(const std::filesystem::path &pathToFile)
Definition: HlslShader.cpp:444
std::pair< std::mutex, std::optional< RootSignatureGenerator::CollectedInfo > > mtxRootSignatureInfo
Definition: HlslShader.h:215
static constexpr std::string_view getComputeShaderModel()
Definition: HlslShader.h:72
static std::variant< ComPtr< IDxcResult >, std::string, Error > compileShaderToBytecode(const ShaderDescription &shaderDescription, const std::optional< std::filesystem::path > &pathToPdb)
Definition: HlslShader.cpp:58
std::variant< std::string, Error > calculateReflectionFileHash()
Definition: HlslShader.cpp:487
std::pair< std::recursive_mutex, ComPtr< IDxcBlob > > mtxCompiledBytecode
Definition: HlslShader.h:207
static constexpr std::string_view sVertexShaderModel
Definition: HlslShader.h:236
Definition: Renderer.h:43
Definition: Shader.h:23
const ShaderType shaderType
Definition: Shader.h:254
const std::filesystem::path pathToCompiledShader
Definition: Shader.h:257
const std::string sShaderName
Definition: Shader.h:251
Renderer *const pRenderer
Definition: Shader.h:241
Definition: ShaderDescription.h:74