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 enum class StaticSamplerShaderRegister : UINT {
26 BASIC = 0,
27 COMPARISON = 1,
28 };
29
31 class HlslShader : public Shader {
32 public:
47 std::filesystem::path pathToCompiledShader,
48 const std::string& sShaderName,
49 ShaderType shaderType,
50 const std::optional<VertexFormat>& vertexFormat,
51 const std::string& sSourceFileHash);
52
53 HlslShader() = delete;
54 HlslShader(const HlslShader&) = delete;
55 HlslShader& operator=(const HlslShader&) = delete;
56
57 virtual ~HlslShader() override = default;
58
64 static constexpr std::string_view getVertexShaderModel() { return sVertexShaderModel; }
65
71 static constexpr std::string_view getPixelShaderModel() { return sPixelShaderModel; }
72
78 static constexpr std::string_view getComputeShaderModel() { return sComputeShaderModel; }
79
85 static std::variant<std::string, Error> getShaderCompilerVersion();
86
95 static CD3DX12_STATIC_SAMPLER_DESC
96 getStaticSamplerDescription(TextureFilteringQuality textureFilteringQuality);
97
103 static CD3DX12_STATIC_SAMPLER_DESC getStaticComparisonSamplerDescription();
104
111
123 static std::variant<ComPtr<IDxcResult>, std::string, Error> compileShaderToBytecode(
124 const ShaderDescription& shaderDescription,
125 const std::optional<std::filesystem::path>& pathToPdb);
126
140 static std::variant<std::shared_ptr<Shader>, std::string, Error> compileShader(
142 const std::filesystem::path& cacheDirectory,
143 const std::string& sConfiguration,
144 const ShaderDescription& shaderDescription);
145
153 std::variant<ComPtr<IDxcBlob>, Error> getCompiledBlob();
154
161 std::pair<std::mutex, std::optional<RootSignatureGenerator::CollectedInfo>>* getRootSignatureInfo();
162
168 std::string getShaderSourceFileHash() const;
169
177 virtual bool releaseShaderDataFromMemoryIfLoaded() override;
178
179 protected:
190 [[nodiscard]] virtual std::optional<Error>
191 saveAdditionalCompilationResultsInfo(ConfigManager& cacheMetadataConfigManager) override;
192
204 [[nodiscard]] virtual std::optional<Error> checkCachedAdditionalCompilationResultsInfo(
205 ConfigManager& cacheMetadataConfigManager,
206 std::optional<ShaderCacheInvalidationReason>& cacheInvalidationReason) override;
207
208 private:
216 static std::variant<ComPtr<IDxcBlob>, Error>
217 readBlobFromDisk(const std::filesystem::path& pathToFile);
218
225 std::variant<std::string, Error> calculateReflectionFileHash();
226
232 [[nodiscard]] std::optional<Error> loadShaderDataFromDiskIfNotLoaded();
233
238 std::pair<std::recursive_mutex, ComPtr<IDxcBlob>> mtxCompiledBytecode;
239
246 std::pair<std::mutex, std::optional<RootSignatureGenerator::CollectedInfo>> mtxRootSignatureInfo;
247
249 std::string sSourceFileHash;
250
252 static inline UINT iShaderFileCodepage = DXC_CP_ACP;
253
255 static inline auto sShaderReflectionFileExtension = ".reflection";
256
258 static inline const auto sReflectionFileHashKeyName = "reflection_file_hash";
259
261 static inline const auto sHlslSectionName = "HLSL";
262
264 static inline const UINT iStaticSamplerShaderRegisterSpace = 5; // NOLINT
265
266 // -------------------------------------------------------------------------
267 // ! if adding new shader models add them to cache config in ShaderManager !
268 // -------------------------------------------------------------------------
270 static constexpr std::string_view sVertexShaderModel = "vs_6_0";
272 static constexpr std::string_view sPixelShaderModel = "ps_6_0";
274 static constexpr std::string_view sComputeShaderModel = "cs_6_0";
275 // -------------------------------------------------------------------------
276 // ! if adding new shader models add them to cache config in ShaderManager !
277 // -------------------------------------------------------------------------
278 };
279} // namespace ne
Definition: ConfigManager.h:28
Definition: Error.h:27
Definition: HlslShader.h:31
virtual std::optional< Error > saveAdditionalCompilationResultsInfo(ConfigManager &cacheMetadataConfigManager) override
Definition: HlslShader.cpp:481
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:292
static std::variant< std::string, Error > getShaderCompilerVersion()
Definition: HlslShader.cpp:34
static constexpr std::string_view getPixelShaderModel()
Definition: HlslShader.h:71
static constexpr std::string_view sPixelShaderModel
Definition: HlslShader.h:272
static constexpr std::string_view sComputeShaderModel
Definition: HlslShader.h:274
static CD3DX12_STATIC_SAMPLER_DESC getStaticSamplerDescription(TextureFilteringQuality textureFilteringQuality)
Definition: HlslShader.cpp:59
static UINT iShaderFileCodepage
Definition: HlslShader.h:252
static auto sShaderReflectionFileExtension
Definition: HlslShader.h:255
std::string sSourceFileHash
Definition: HlslShader.h:249
std::string getShaderSourceFileHash() const
Definition: HlslShader.cpp:451
virtual bool releaseShaderDataFromMemoryIfLoaded() override
Definition: HlslShader.cpp:453
static UINT getStaticSamplerShaderRegisterSpace()
Definition: HlslShader.cpp:136
static const UINT iStaticSamplerShaderRegisterSpace
Definition: HlslShader.h:264
std::pair< std::mutex, std::optional< RootSignatureGenerator::CollectedInfo > > * getRootSignatureInfo()
Definition: HlslShader.cpp:447
std::variant< ComPtr< IDxcBlob >, Error > getCompiledBlob()
Definition: HlslShader.cpp:435
static const auto sHlslSectionName
Definition: HlslShader.h:261
static const auto sReflectionFileHashKeyName
Definition: HlslShader.h:258
std::optional< Error > loadShaderDataFromDiskIfNotLoaded()
Definition: HlslShader.cpp:605
static constexpr std::string_view getVertexShaderModel()
Definition: HlslShader.h:64
virtual std::optional< Error > checkCachedAdditionalCompilationResultsInfo(ConfigManager &cacheMetadataConfigManager, std::optional< ShaderCacheInvalidationReason > &cacheInvalidationReason) override
Definition: HlslShader.cpp:498
static std::variant< ComPtr< IDxcBlob >, Error > readBlobFromDisk(const std::filesystem::path &pathToFile)
Definition: HlslShader.cpp:524
std::pair< std::mutex, std::optional< RootSignatureGenerator::CollectedInfo > > mtxRootSignatureInfo
Definition: HlslShader.h:246
static constexpr std::string_view getComputeShaderModel()
Definition: HlslShader.h:78
static std::variant< ComPtr< IDxcResult >, std::string, Error > compileShaderToBytecode(const ShaderDescription &shaderDescription, const std::optional< std::filesystem::path > &pathToPdb)
Definition: HlslShader.cpp:138
std::variant< std::string, Error > calculateReflectionFileHash()
Definition: HlslShader.cpp:567
std::pair< std::recursive_mutex, ComPtr< IDxcBlob > > mtxCompiledBytecode
Definition: HlslShader.h:238
static CD3DX12_STATIC_SAMPLER_DESC getStaticComparisonSamplerDescription()
Definition: HlslShader.cpp:119
static constexpr std::string_view sVertexShaderModel
Definition: HlslShader.h:270
Definition: Renderer.h:39
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