Nameless Engine
Loading...
Searching...
No Matches
Pipeline.h
1#pragma once
2
3// Standard.
4#include <set>
5#include <unordered_set>
6
7// Custom.
8#include "shader/general/ShaderUser.h"
9#include "render/general/pipeline/PipelineCreationSettings.h"
10#include "render/general/pipeline/PipelineShaderConstantsManager.hpp"
11
12namespace ne {
13 class Renderer;
14 class PipelineManager;
15 class Material;
16 class ComputeShaderInterface;
17 class Pipeline;
18
20 class Pipeline : public ShaderUser {
21 // Only Pipeline manager should be able to create Pipeline.
22 friend class PipelineManager;
23
24 // Will notify when material is no longer referencing a Pipeline.
25 friend class PipelineSharedPtr;
26
27 public:
28 Pipeline() = delete;
29 Pipeline(const Pipeline&) = delete;
30 Pipeline& operator=(const Pipeline&) = delete;
31
32 virtual ~Pipeline() override = default;
33
52 Pipeline* pPipeline, const char* pConstantName, unsigned int iValueToCopy);
53
55 std::unique_ptr<PipelineShaderConstantsManager> pConstantsManager;
56
61 std::unordered_map<std::string, size_t> uintConstantsOffsets;
62 };
63
76 static std::string
77 combineShaderNames(const std::string& sVertexShaderName, const std::string& sPixelShaderName);
78
84 std::string getVertexShaderName();
85
91 std::string getPixelShaderName();
92
98 std::string getComputeShaderName();
99
108 std::optional<std::set<ShaderMacro>> getCurrentShaderConfiguration(ShaderType shaderType);
109
115 bool isUsingPixelBlending() const;
116
122 bool isDepthBiasEnabled() const;
123
130
137 std::pair<std::mutex, std::unordered_set<Material*>>* getMaterialsThatUseThisPipeline();
138
144 std::string getPipelineIdentifier() const;
145
151 Renderer* getRenderer() const;
152
159 std::set<ShaderMacro> getAdditionalVertexShaderMacros() const;
160
167 std::set<ShaderMacro> getAdditionalPixelShaderMacros() const;
168
176 std::pair<std::mutex, std::optional<ShaderConstantsData>>* getShaderConstants();
177
178 protected:
195 explicit Pipeline(
198 const std::string& sVertexShaderName,
199 const std::set<ShaderMacro>& additionalVertexShaderMacros,
200 const std::string& sPixelShaderName = "",
201 const std::set<ShaderMacro>& additionalPixelShaderMacros = {},
202 const std::string& sComputeShaderName = "",
203 bool bEnableDepthBias = false,
205 bool bUsePixelBlending = false);
206
215 void saveUsedShaderConfiguration(ShaderType shaderType, std::set<ShaderMacro>&& fullConfiguration);
216
230 [[nodiscard]] virtual std::optional<Error> releaseInternalResources() = 0;
231
240 [[nodiscard]] virtual std::optional<Error> restoreInternalResources() = 0;
241
249 void setShaderConstants(const std::unordered_map<std::string, size_t>& uintConstantsOffsets);
250
251 private:
263 static std::variant<std::shared_ptr<Pipeline>, Error> createGraphicsPipeline(
266 std::unique_ptr<PipelineCreationSettings> pPipelineCreationSettings);
267
279 static std::variant<std::shared_ptr<Pipeline>, Error> createComputePipeline(
281
291 void onMaterialUsingPipeline(Material* pMaterial);
292
303
313 void onComputeShaderUsingPipeline(ComputeShaderInterface* pComputeShaderInterface);
314
325
331 std::pair<std::mutex, std::unordered_set<Material*>> mtxMaterialsThatUseThisPipeline;
332
338 std::pair<std::mutex, std::unordered_set<ComputeShaderInterface*>>
340
342 std::pair<std::mutex, std::optional<ShaderConstantsData>> mtxShaderConstantsData;
343
350 std::set<ShaderMacro> additionalVertexShaderMacros;
351
358 std::set<ShaderMacro> additionalPixelShaderMacros;
359
361 std::unordered_map<ShaderType, std::set<ShaderMacro>> usedShaderConfiguration;
362
365
367 Renderer* pRenderer = nullptr;
368
370 const std::string sVertexShaderName;
371
373 const std::string sPixelShaderName;
374
376 const std::string sComputeShaderName;
377
380
382 bool bEnableDepthBias = false;
383
386 };
387} // namespace ne
Definition: ComputeShaderInterface.h:46
Definition: Error.h:27
Definition: Material.h:84
Definition: PipelineManager.h:89
Definition: PipelineSharedPtr.h:15
Definition: Pipeline.h:20
Renderer * pRenderer
Definition: Pipeline.h:367
std::pair< std::mutex, std::optional< ShaderConstantsData > > mtxShaderConstantsData
Definition: Pipeline.h:342
std::set< ShaderMacro > getAdditionalPixelShaderMacros() const
Definition: Pipeline.cpp:194
std::string getPixelShaderName()
Definition: Pipeline.cpp:76
std::pair< std::mutex, std::optional< ShaderConstantsData > > * getShaderConstants()
Definition: Pipeline.cpp:198
void onMaterialUsingPipeline(Material *pMaterial)
Definition: Pipeline.cpp:202
std::string getPipelineIdentifier() const
Definition: Pipeline.cpp:183
std::set< ShaderMacro > getAdditionalVertexShaderMacros() const
Definition: Pipeline.cpp:190
std::set< ShaderMacro > additionalVertexShaderMacros
Definition: Pipeline.h:350
const std::string sVertexShaderName
Definition: Pipeline.h:370
std::pair< std::mutex, std::unordered_set< Material * > > mtxMaterialsThatUseThisPipeline
Definition: Pipeline.h:331
bool isUsingPixelBlending() const
Definition: Pipeline.cpp:89
const std::string sComputeShaderName
Definition: Pipeline.h:376
virtual std::optional< Error > releaseInternalResources()=0
void onMaterialNoLongerUsingPipeline(Material *pMaterial)
Definition: Pipeline.cpp:222
bool bIsUsingPixelBlending
Definition: Pipeline.h:379
bool bEnableDepthBias
Definition: Pipeline.h:382
virtual std::optional< Error > restoreInternalResources()=0
static std::variant< std::shared_ptr< Pipeline >, Error > createComputePipeline(Renderer *pRenderer, PipelineManager *pPipelineManager, const std::string &sComputeShaderName)
Definition: Pipeline.cpp:146
std::unordered_map< ShaderType, std::set< ShaderMacro > > usedShaderConfiguration
Definition: Pipeline.h:361
std::set< ShaderMacro > additionalPixelShaderMacros
Definition: Pipeline.h:358
PipelineManager * pPipelineManager
Definition: Pipeline.h:364
std::pair< std::mutex, std::unordered_set< Material * > > * getMaterialsThatUseThisPipeline()
Definition: Pipeline.cpp:95
void saveUsedShaderConfiguration(ShaderType shaderType, std::set< ShaderMacro > &&fullConfiguration)
Definition: Pipeline.cpp:42
std::string getComputeShaderName()
Definition: Pipeline.cpp:78
void setShaderConstants(const std::unordered_map< std::string, size_t > &uintConstantsOffsets)
Definition: Pipeline.cpp:46
bool isDepthBiasEnabled() const
Definition: Pipeline.cpp:91
void onComputeShaderNoLongerUsingPipeline(ComputeShaderInterface *pComputeShaderInterface)
Definition: Pipeline.cpp:267
std::string getVertexShaderName()
Definition: Pipeline.cpp:74
const std::string sPixelShaderName
Definition: Pipeline.h:373
std::optional< std::set< ShaderMacro > > getCurrentShaderConfiguration(ShaderType shaderType)
Definition: Pipeline.cpp:80
Renderer * getRenderer() const
Definition: Pipeline.cpp:292
bool bIsUsedForPointLightsShadowMapping
Definition: Pipeline.h:385
static std::string combineShaderNames(const std::string &sVertexShaderName, const std::string &sPixelShaderName)
Definition: Pipeline.cpp:66
static std::variant< std::shared_ptr< Pipeline >, Error > createGraphicsPipeline(Renderer *pRenderer, PipelineManager *pPipelineManager, std::unique_ptr< PipelineCreationSettings > pPipelineCreationSettings)
Definition: Pipeline.cpp:99
void onComputeShaderUsingPipeline(ComputeShaderInterface *pComputeShaderInterface)
Definition: Pipeline.cpp:248
bool isUsedForPointLightsShadowMapping() const
Definition: Pipeline.cpp:93
std::pair< std::mutex, std::unordered_set< ComputeShaderInterface * > > mtxComputeShadersThatUseThisPipeline
Definition: Pipeline.h:339
Definition: Renderer.h:39
Definition: ShaderUser.h:20
Definition: Pipeline.h:35
void findOffsetAndCopySpecialValueToConstant(Pipeline *pPipeline, const char *pConstantName, unsigned int iValueToCopy)
Definition: Pipeline.cpp:294
std::unordered_map< std::string, size_t > uintConstantsOffsets
Definition: Pipeline.h:61
std::unique_ptr< PipelineShaderConstantsManager > pConstantsManager
Definition: Pipeline.h:55