Nameless Engine
Loading...
Searching...
No Matches
PipelineManager.h
1#pragma once
2
3// Standard.
4#include <array>
5#include <mutex>
6#include <unordered_map>
7#include <memory>
8#include <atomic>
9#include <unordered_set>
10
11// Custom.
12#include "render/general/pipeline/Pipeline.h"
13#include "shader/general/ShaderMacro.h"
14#include "render/general/pipeline/PipelineSharedPtr.h"
15#include "shader/ComputeShaderInterface.h"
16#include "render/general/pipeline/PipelineType.hpp"
17#include "render/general/pipeline/PipelineCreationSettings.h"
18
19namespace ne {
20 class Renderer;
21 class Material;
22 class MeshNode;
23 class ComputeShaderInterface;
24
30 public:
32
35
38 operator=(DelayedPipelineResourcesCreation&& other) noexcept = delete;
39
46 this->pPipelineManager = pPipelineManager;
47 initialize();
48 }
49
51
52 private:
54 void initialize();
55
57 void destroy();
58
61 };
62
80 std::array<
81 std::array<
82 std::unordered_map<Pipeline*, std::unordered_set<ComputeShaderInterface*>>,
83 static_cast<size_t>(ComputeExecutionGroup::SIZE)>,
84 static_cast<size_t>(ComputeExecutionStage::SIZE)>
86 };
87
90 // Pipeline notifies the manager when a material stops referencing it.
91 friend class Pipeline;
92
93 // Releases/restores internal Pipeline's resources.
95
96 // Compute interfaces request compute pipelines and queue for execution.
97 friend class ComputeShaderInterface;
98
99 public:
110 std::unordered_map<std::set<ShaderMacro>, std::shared_ptr<Pipeline>, ShaderMacroSetHash>
112 };
113
117 std::array<
118 std::unordered_map<std::string, ShaderPipelines>,
119 static_cast<size_t>(PipelineType::SIZE)>
121 };
122
129
131 virtual ~PipelineManager();
132
133 PipelineManager() = delete;
134 PipelineManager(const PipelineManager&) = delete;
135 PipelineManager& operator=(const PipelineManager&) = delete;
136
146
161 std::variant<PipelineSharedPtr, Error> getGraphicsPipelineForMaterial(
162 std::unique_ptr<PipelineCreationSettings> pPipelineCreationSettings, Material* pMaterial);
163
171 inline std::pair<std::recursive_mutex*, QueuedForExecutionComputeShaders*>
174 }
175
183 inline std::pair<std::recursive_mutex, GraphicsPipelineRegistry>* getGraphicsPipelines() {
184 return &mtxGraphicsPipelines;
185 }
186
193
200
206 Renderer* getRenderer() const;
207
208 private:
212 struct Resources {
214 std::unordered_map<std::string, std::shared_ptr<Pipeline>> pipelines;
215
218 };
219
220 ComputePipelines() = default;
221
222 ComputePipelines(const ComputePipelines&) = delete;
223 ComputePipelines& operator=(const ComputePipelines&) = delete;
224
238 std::variant<PipelineSharedPtr, Error> getComputePipelineForShader(
239 PipelineManager* pPipelineManager, ComputeShaderInterface* pComputeShaderInterface);
240
254 [[nodiscard]] std::optional<Error> onPipelineNoLongerUsedByComputeShaderInterface(
255 const std::string& sComputeShaderName, ComputeShaderInterface* pComputeShaderInterface);
256
269 [[nodiscard]] std::optional<Error>
271
278
286 inline std::pair<std::recursive_mutex*, QueuedForExecutionComputeShaders*>
288 return std::make_pair(&mtxResources.first, &mtxResources.second.queuedComputeShaders);
289 }
290
291 private:
302 [[nodiscard]] static std::optional<Error> queueComputeShaderInterfaceForExecution(
303 std::unordered_map<Pipeline*, std::unordered_set<ComputeShaderInterface*>>& pipelineShaders,
304 ComputeShaderInterface* pComputeShaderInterface);
305
307 std::pair<std::recursive_mutex, Resources> mtxResources;
308 };
309
326 [[nodiscard]] std::optional<Error> releaseInternalGraphicsPipelinesResources();
327
337 [[nodiscard]] std::optional<Error> restoreInternalGraphicsPipelinesResources();
338
352 std::variant<PipelineSharedPtr, Error> createGraphicsPipelineForMaterial(
353 std::unordered_map<std::string, ShaderPipelines>& pipelines,
354 const std::string& sShaderNames,
355 const std::set<ShaderMacro>& macrosToUse,
356 std::unique_ptr<PipelineCreationSettings> pPipelineCreationSettings,
357 Material* pMaterial);
358
365 void onPipelineNoLongerUsedByMaterial(const std::string& sPipelineIdentifier);
366
374 const std::string& sComputeShaderName, ComputeShaderInterface* pComputeShaderInterface);
375
387 std::variant<PipelineSharedPtr, Error> findOrCreatePipeline(
388 std::unordered_map<std::string, ShaderPipelines>& pipelines,
389 const std::string& sKeyToLookFor,
390 const std::set<ShaderMacro>& macrosToLookFor,
391 std::unique_ptr<PipelineCreationSettings> pPipelineCreationSettings,
392 Material* pMaterial);
393
395 std::pair<std::recursive_mutex, GraphicsPipelineRegistry> mtxGraphicsPipelines;
396
399
401 Renderer* pRenderer = nullptr;
402 };
403} // namespace ne
Definition: ComputeShaderInterface.h:46
Definition: PipelineManager.h:29
PipelineManager * pPipelineManager
Definition: PipelineManager.h:60
void initialize()
Definition: PipelineManager.cpp:372
DelayedPipelineResourcesCreation(PipelineManager *pPipelineManager)
Definition: PipelineManager.h:45
void destroy()
Definition: PipelineManager.cpp:393
Definition: Material.h:84
Definition: PipelineManager.h:89
void onPipelineNoLongerUsedByComputeShaderInterface(const std::string &sComputeShaderName, ComputeShaderInterface *pComputeShaderInterface)
Definition: PipelineManager.cpp:360
void onPipelineNoLongerUsedByMaterial(const std::string &sPipelineIdentifier)
Definition: PipelineManager.cpp:330
std::variant< PipelineSharedPtr, Error > getGraphicsPipelineForMaterial(std::unique_ptr< PipelineCreationSettings > pPipelineCreationSettings, Material *pMaterial)
Definition: PipelineManager.cpp:42
Renderer * getRenderer() const
Definition: PipelineManager.cpp:225
Renderer * pRenderer
Definition: PipelineManager.h:401
std::variant< PipelineSharedPtr, Error > findOrCreatePipeline(std::unordered_map< std::string, ShaderPipelines > &pipelines, const std::string &sKeyToLookFor, const std::set< ShaderMacro > &macrosToLookFor, std::unique_ptr< PipelineCreationSettings > pPipelineCreationSettings, Material *pMaterial)
Definition: PipelineManager.cpp:16
std::variant< PipelineSharedPtr, Error > createGraphicsPipelineForMaterial(std::unordered_map< std::string, ShaderPipelines > &pipelines, const std::string &sShaderNames, const std::set< ShaderMacro > &macrosToUse, std::unique_ptr< PipelineCreationSettings > pPipelineCreationSettings, Material *pMaterial)
Definition: PipelineManager.cpp:145
std::optional< Error > restoreInternalGraphicsPipelinesResources()
Definition: PipelineManager.cpp:251
DelayedPipelineResourcesCreation clearGraphicsPipelinesInternalResourcesAndDelayRestoring()
Definition: PipelineManager.cpp:12
size_t getCurrentGraphicsPipelineCount()
Definition: PipelineManager.cpp:206
ComputePipelines computePipelines
Definition: PipelineManager.h:398
virtual ~PipelineManager()
Definition: PipelineManager.cpp:93
std::optional< Error > releaseInternalGraphicsPipelinesResources()
Definition: PipelineManager.cpp:227
std::pair< std::recursive_mutex, GraphicsPipelineRegistry > * getGraphicsPipelines()
Definition: PipelineManager.h:183
size_t getCurrentComputePipelineCount()
Definition: PipelineManager.cpp:221
std::pair< std::recursive_mutex, GraphicsPipelineRegistry > mtxGraphicsPipelines
Definition: PipelineManager.h:395
std::pair< std::recursive_mutex *, QueuedForExecutionComputeShaders * > getComputeShadersForGraphicsQueueExecution()
Definition: PipelineManager.h:172
Definition: Pipeline.h:20
Definition: Renderer.h:39
Definition: PipelineManager.h:212
QueuedForExecutionComputeShaders queuedComputeShaders
Definition: PipelineManager.h:217
std::unordered_map< std::string, std::shared_ptr< Pipeline > > pipelines
Definition: PipelineManager.h:214
Definition: PipelineManager.h:210
size_t getComputePipelineCount()
Definition: PipelineManager.cpp:404
std::variant< PipelineSharedPtr, Error > getComputePipelineForShader(PipelineManager *pPipelineManager, ComputeShaderInterface *pComputeShaderInterface)
Definition: PipelineManager.cpp:409
std::optional< Error > onPipelineNoLongerUsedByComputeShaderInterface(const std::string &sComputeShaderName, ComputeShaderInterface *pComputeShaderInterface)
Definition: PipelineManager.cpp:440
static std::optional< Error > queueComputeShaderInterfaceForExecution(std::unordered_map< Pipeline *, std::unordered_set< ComputeShaderInterface * > > &pipelineShaders, ComputeShaderInterface *pComputeShaderInterface)
Definition: PipelineManager.cpp:502
std::optional< Error > queueShaderExecutionOnGraphicsQueue(ComputeShaderInterface *pComputeShaderInterface)
Definition: PipelineManager.cpp:478
std::pair< std::recursive_mutex, Resources > mtxResources
Definition: PipelineManager.h:307
std::pair< std::recursive_mutex *, QueuedForExecutionComputeShaders * > getComputeShadersForGraphicsQueueExecution()
Definition: PipelineManager.h:287
Definition: PipelineManager.h:115
std::array< std::unordered_map< std::string, ShaderPipelines >, static_cast< size_t >(PipelineType::SIZE)> vPipelineTypes
Definition: PipelineManager.h:120
Definition: PipelineManager.h:101
std::unordered_map< std::set< ShaderMacro >, std::shared_ptr< Pipeline >, ShaderMacroSetHash > shaderPipelines
Definition: PipelineManager.h:111
Definition: PipelineManager.h:71
std::array< std::array< std::unordered_map< Pipeline *, std::unordered_set< ComputeShaderInterface * > >, static_cast< size_t >(ComputeExecutionGroup::SIZE)>, static_cast< size_t >(ComputeExecutionStage::SIZE)> vGraphicsQueueStagesGroups
Definition: PipelineManager.h:85
Definition: ShaderMacro.h:196