Nameless Engine
Loading...
Searching...
No Matches
Renderer.h
1#pragma once
2
3// Standard.
4#include <variant>
5#include <vector>
6#include <string>
7#include <filesystem>
8#include <memory>
9
10// Custom.
11#include "shader/general/resources/cpuwrite/ShaderCpuWriteResourceManager.h"
12#include "shader/general/resources/texture/ShaderTextureResourceManager.h"
13#include "misc/Error.h"
14#include "shader/ShaderManager.h"
15#include "render/general/resources/GpuResourceManager.h"
16#include "render/general/resources/frame/FrameResourcesManager.h"
17#include "render/RenderSettings.h"
18#include "game/camera/CameraProperties.h"
19#include "shader/general/resources/LightingShaderResourceManager.h"
20#include "material/Material.h"
21#include "render/RenderStatistics.h"
22
23namespace ne {
24 class GameManager;
25 class Window;
26 class PipelineManager;
27 class ShaderConfiguration;
28 class RenderSettings;
29 class EnvironmentNode;
30 class MeshNode;
31 class Material;
32 class Pipeline;
33 class ShadowMapHandle;
34 class DirectionalLightNode;
35 class SpotlightNode;
36 class PointLightNode;
37
39 class Renderer {
40 // Only window should be able to request new frames to be drawn.
41 friend class Window;
42
43 // Can update shader configuration.
44 friend class ShaderConfiguration;
45
46 // Settings will modify renderer's state.
47 friend class RenderSettings;
48
49 // This node sets itself to the renderer when spawned so that its parameters will be used
50 // in the rendering (also removes itself when despawned).
51 friend class EnvironmentNode;
52
53 // Notifies when active camera changes.
54 friend class CameraManager;
55
56 public:
57 Renderer() = delete;
58 Renderer(const Renderer&) = delete;
59 Renderer& operator=(const Renderer&) = delete;
60
61 virtual ~Renderer() = default;
62
68 static constexpr float getMinDepth() { return minDepth; }
69
75 static constexpr float getMaxDepth() { return maxDepth; }
76
85 static std::variant<std::unique_ptr<Renderer>, Error>
86 create(GameManager* pGameManager, std::optional<RendererType> preferredRenderer);
87
96 virtual std::vector<std::string> getSupportedGpuNames() const = 0;
97
103 virtual std::variant<std::set<std::pair<unsigned int, unsigned int>>, Error>
105
114 virtual std::variant<std::set<std::pair<unsigned int, unsigned int>>, Error>
116
122 virtual RendererType getType() const = 0;
123
132 virtual std::string getUsedApiVersion() const = 0;
133
141 std::pair<std::recursive_mutex*, RenderSettings*> getRenderSettings();
142
151
157 virtual std::string getCurrentlyUsedGpuName() const = 0;
158
167 size_t getTotalVideoMemoryInMb() const;
168
177 size_t getUsedVideoMemoryInMb() const;
178
186
195 std::pair<std::recursive_mutex, std::unique_ptr<ShaderConfiguration>>* getShaderConfiguration();
196
202 virtual std::pair<unsigned int, unsigned int> getRenderTargetSize() const = 0;
203
211 Window* getWindow() const;
212
221
230
239
248
257
266
275
284
298 std::recursive_mutex* getRenderResourcesMutex();
299
318
319 protected:
325 MeshNode* pMeshNode = nullptr;
326
328 std::vector<MeshIndexBufferInfo> vIndexBuffers;
329 };
330
334 Material* pMaterial = nullptr;
335
337 std::vector<MeshInFrustumInfo> vMeshes;
338 };
339
343 Pipeline* pPipeline = nullptr;
344
346 std::vector<MaterialInFrustumInfo> vMaterials;
347 };
348
350 std::vector<PipelineInFrustumInfo> vOpaquePipelines;
351
353 std::vector<PipelineInFrustumInfo> vTransparentPipelines;
354 };
355
359 std::pair<std::recursive_mutex*, ShaderLightArray::LightsInFrustum*> mtxPointLightsInFrustum;
360
362 std::pair<std::recursive_mutex*, ShaderLightArray::LightsInFrustum*> mtxSpotlightsInFrustum;
363
364 // No directional lights here because directional lights can't be culled.
365 };
366
382 static consteval unsigned int getRecommendedSwapChainBufferCount() {
384 }
385
395 ShadowMapHandle*& pShadowMapHandle,
396 unsigned int& iShadowPassLightInfoArrayIndex);
397
406 SpotlightNode* pNode,
407 ShadowMapHandle*& pShadowMapHandle,
408 unsigned int& iShadowPassLightInfoArrayIndex);
409
418 static unsigned int
419 getPointLightShadowPassLightInfoArrayIndex(PointLightNode* pNode, size_t iCubemapFaceIndex);
420
429
436
445 [[nodiscard]] std::optional<Error> compileEngineShaders() const;
446
457 void
458 updateFrameConstantsBuffer(FrameResource* pCurrentFrameResource, CameraProperties* pCameraProperties);
459
467
475
483
491
501 virtual std::variant<AntialiasingQuality, Error> getMaxSupportedAntialiasingQuality() const = 0;
502
509 void onFramebufferSizeChanged(int iWidth, int iHeight);
510
517 virtual void onFramebufferSizeChangedDerived(int iWidth, int iHeight) {}
518
520 void drawNextFrame();
521
529
542 CameraProperties* pCameraProperties, FrameResource* pCurrentFrameResource) = 0;
543
556 FrameResource* pCurrentFrameResource,
557 size_t iCurrentFrameResourceIndex,
558 PipelineManager::GraphicsPipelineRegistry* pGraphicsPipelines) = 0;
559
568 FrameResource* pCurrentFrameResource,
569 size_t iCurrentFrameResourceIndex,
570 const std::vector<Renderer::MeshesInFrustum::PipelineInFrustumInfo>& vOpaquePipelines) = 0;
571
582 FrameResource* pCurrentFrameResource,
583 size_t iCurrentFrameResourceIndex,
584 ComputeExecutionStage stage) = 0;
585
594 virtual void drawMeshesMainPass(
595 FrameResource* pCurrentFrameResource,
596 size_t iCurrentFrameResourceIndex,
597 const std::vector<Renderer::MeshesInFrustum::PipelineInFrustumInfo>& vOpaquePipelines,
598 const std::vector<Renderer::MeshesInFrustum::PipelineInFrustumInfo>& vTransparentPipelines) = 0;
599
606 virtual void present(FrameResource* pCurrentFrameResource, size_t iCurrentFrameResourceIndex) = 0;
607
616 [[nodiscard]] std::optional<Error> onRenderSettingsChanged(bool bShadowMapSizeChanged = false);
617
624 [[nodiscard]] virtual std::optional<Error> onRenderSettingsChangedDerived() = 0;
625
635 virtual void waitForGpuToFinishUsingFrameResource(FrameResource* pFrameResource) = 0;
636
645 virtual bool isInitialized() const = 0;
646
654 [[nodiscard]] std::optional<Error> initializeRenderer();
655
664 [[nodiscard]] std::optional<Error> initializeResourceManagers();
665
676 [[nodiscard]] std::optional<Error> clampSettingsToMaxSupported();
677
684 [[nodiscard]] std::optional<Error> recalculateLightTileFrustums();
685
700 CameraProperties* pActiveCameraProperties,
702
712 CameraProperties* pActiveCameraProperties, size_t iCurrentFrameResourceIndex);
713
719 inline std::pair<std::mutex, FrameConstants>* getFrameConstants() { return &mtxFrameConstants; }
720
730 inline std::atomic<size_t>* getDrawCallCounter() {
732 }
733
734 private:
746 static std::unique_ptr<Renderer>
747 createRenderer(GameManager* pGameManager, std::optional<RendererType> preferredRenderer);
748
764 static std::variant<std::unique_ptr<Renderer>, std::pair<Error, std::string>> createRenderer(
765 RendererType type,
767 const std::vector<std::string>& vBlacklistedGpuNames);
768
769#if defined(WIN32)
775 static void nanosleep(long long iNanoseconds);
776#endif
783
796 unsigned int iRenderTargetWidth,
797 unsigned int iRenderTargetHeight,
798 CameraProperties* pCameraProperties);
799
802
808
817
819 void setupRenderStats();
820
826 std::optional<Error> initializeRenderSettings();
827
832 std::recursive_mutex mtxRwRenderResources;
833
835 std::unique_ptr<GpuResourceManager> pResourceManager;
836
838 std::unique_ptr<ShaderManager> pShaderManager;
839
841 std::unique_ptr<PipelineManager> pPipelineManager;
842
844 std::unique_ptr<FrameResourcesManager> pFrameResourcesManager;
845
847 std::unique_ptr<ShaderCpuWriteResourceManager> pShaderCpuWriteResourceManager;
848
850 std::unique_ptr<ShaderTextureResourceManager> pShaderTextureResourceManager;
851
853 std::unique_ptr<LightingShaderResourceManager> pLightingShaderResourceManager;
854
859 std::pair<std::recursive_mutex, std::unique_ptr<ShaderConfiguration>> mtxShaderConfiguration;
860
865 std::pair<std::recursive_mutex, std::unique_ptr<RenderSettings>> mtxRenderSettings;
866
869
871 bool bIsWindowMinimized = false;
872
874 std::pair<std::mutex, EnvironmentNode*> mtxSpawnedEnvironmentNode;
875
877 std::pair<std::mutex, FrameConstants> mtxFrameConstants;
878
881
884
886 static constexpr unsigned int iRecommendedSwapChainBufferCount = 2;
887
889 static constexpr float minDepth = 0.0F;
890
892 static constexpr float maxDepth = 1.0F;
893 };
894
897 public:
898 ShaderConfiguration() = delete;
899
906
915
917 std::set<ShaderMacro> currentVertexShaderConfiguration;
918
920 std::set<ShaderMacro> currentPixelShaderConfiguration;
921
922 private:
924 Renderer* pRenderer = nullptr;
925 };
926} // namespace ne
Definition: CameraManager.h:16
Definition: CameraProperties.h:22
Definition: DirectionalLightNode.h:14
Definition: EnvironmentNode.h:11
Definition: Error.h:27
Definition: FrameResourcesManager.h:46
Definition: GameManager.h:34
Definition: GpuResourceManager.h:42
Definition: GpuResource.h:14
Definition: LightingShaderResourceManager.h:50
Definition: Material.h:84
Definition: MeshNode.h:148
Definition: PipelineManager.h:89
Definition: Pipeline.h:20
Definition: PointLightNode.h:15
Definition: RenderSettings.h:45
Definition: RenderStatistics.h:11
FrameTemporaryStatistics frameTemporaryStatistics
Definition: RenderStatistics.h:200
Definition: Renderer.h:39
std::pair< std::recursive_mutex, std::unique_ptr< ShaderConfiguration > > mtxShaderConfiguration
Definition: Renderer.h:859
std::optional< Error > initializeResourceManagers()
Definition: Renderer.cpp:837
std::optional< Error > compileEngineShaders() const
Definition: Renderer.cpp:56
std::recursive_mutex mtxRwRenderResources
Definition: Renderer.h:832
virtual std::string getUsedApiVersion() const =0
LightingShaderResourceManager * getLightingShaderResourceManager() const
Definition: Renderer.cpp:711
void resetLightingShaderResourceManager()
Definition: Renderer.cpp:266
std::unique_ptr< GpuResourceManager > pResourceManager
Definition: Renderer.h:835
virtual void drawShadowMappingPass(FrameResource *pCurrentFrameResource, size_t iCurrentFrameResourceIndex, PipelineManager::GraphicsPipelineRegistry *pGraphicsPipelines)=0
void drawNextFrame()
Definition: Renderer.cpp:289
virtual void prepareRenderTargetForNextFrame()
Definition: Renderer.h:528
std::unique_ptr< ShaderManager > pShaderManager
Definition: Renderer.h:838
std::pair< std::recursive_mutex *, RenderSettings * > getRenderSettings()
Definition: Renderer.cpp:674
size_t getUsedVideoMemoryInMb() const
Definition: Renderer.cpp:684
virtual void executeComputeShadersOnGraphicsQueue(FrameResource *pCurrentFrameResource, size_t iCurrentFrameResourceIndex, ComputeExecutionStage stage)=0
std::pair< std::mutex, FrameConstants > mtxFrameConstants
Definition: Renderer.h:877
virtual RendererType getType() const =0
virtual std::variant< AntialiasingQuality, Error > getMaxSupportedAntialiasingQuality() const =0
static void getDirectionalLightNodeShadowMappingInfo(DirectionalLightNode *pNode, ShadowMapHandle *&pShadowMapHandle, unsigned int &iShadowPassLightInfoArrayIndex)
Definition: Renderer.cpp:1192
GameManager * pGameManager
Definition: Renderer.h:883
virtual std::pair< unsigned int, unsigned int > getRenderTargetSize() const =0
PipelineManager * getPipelineManager() const
Definition: Renderer.cpp:697
std::unique_ptr< ShaderTextureResourceManager > pShaderTextureResourceManager
Definition: Renderer.h:850
static std::variant< std::unique_ptr< Renderer >, Error > create(GameManager *pGameManager, std::optional< RendererType > preferredRenderer)
Definition: Renderer.cpp:601
virtual void present(FrameResource *pCurrentFrameResource, size_t iCurrentFrameResourceIndex)=0
MeshesInFrustum * getMeshesInCameraFrustum(CameraProperties *pActiveCameraProperties, PipelineManager::GraphicsPipelineRegistry *pGraphicsPipelines)
Definition: Renderer.cpp:957
void resetFrameResourcesManager()
Definition: Renderer.cpp:256
virtual std::optional< Error > onRenderSettingsChangedDerived()=0
void setupRenderStats()
Definition: Renderer.cpp:744
std::pair< std::recursive_mutex, std::unique_ptr< ShaderConfiguration > > * getShaderConfiguration()
Definition: Renderer.cpp:687
void updateFrameConstantsBuffer(FrameResource *pCurrentFrameResource, CameraProperties *pCameraProperties)
Definition: Renderer.cpp:146
Window * getWindow() const
Definition: Renderer.cpp:691
void cullLightsOutsideCameraFrustum(CameraProperties *pActiveCameraProperties, size_t iCurrentFrameResourceIndex)
Definition: Renderer.cpp:1071
std::atomic< size_t > * getDrawCallCounter()
Definition: Renderer.h:730
MeshesInFrustum meshesInFrustumLastFrame
Definition: Renderer.h:868
void updateResourcesForNextFrame(unsigned int iRenderTargetWidth, unsigned int iRenderTargetHeight, CameraProperties *pCameraProperties)
Definition: Renderer.cpp:883
void onActiveCameraChanged()
Definition: Renderer.cpp:454
std::optional< Error > initializeRenderer()
Definition: Renderer.cpp:827
virtual void onFramebufferSizeChangedDerived(int iWidth, int iHeight)
Definition: Renderer.h:517
FrameResourcesManager * getFrameResourcesManager() const
Definition: Renderer.cpp:701
virtual void waitForGpuToFinishUsingFrameResource(FrameResource *pFrameResource)=0
std::pair< std::mutex, FrameConstants > * getFrameConstants()
Definition: Renderer.h:719
size_t getTotalVideoMemoryInMb() const
Definition: Renderer.cpp:680
static std::unique_ptr< Renderer > createRenderer(GameManager *pGameManager, std::optional< RendererType > preferredRenderer)
Definition: Renderer.cpp:466
GpuResourceManager * getResourceManager() const
Definition: Renderer.cpp:699
std::recursive_mutex * getRenderResourcesMutex()
Definition: Renderer.cpp:715
void calculateFrameStatistics()
Definition: Renderer.cpp:169
static consteval unsigned int getRecommendedSwapChainBufferCount()
Definition: Renderer.h:382
virtual bool isInitialized() const =0
std::optional< Error > initializeRenderSettings()
Definition: Renderer.cpp:785
void updateTargetTimeToRenderFrame()
Definition: Renderer.cpp:585
std::optional< Error > recalculateLightTileFrustums()
Definition: Renderer.cpp:416
virtual void waitForGpuToFinishWorkUpToThisPoint()=0
static ShadowMapHandle * getPointLightNodeShadowMapHandle(PointLightNode *pNode)
Definition: Renderer.cpp:1213
ShaderTextureResourceManager * getShaderTextureResourceManager() const
Definition: Renderer.cpp:707
ShaderManager * getShaderManager() const
Definition: Renderer.cpp:695
std::pair< std::recursive_mutex, std::unique_ptr< RenderSettings > > mtxRenderSettings
Definition: Renderer.h:865
static constexpr float getMaxDepth()
Definition: Renderer.h:75
virtual std::variant< std::set< std::pair< unsigned int, unsigned int > >, Error > getSupportedRefreshRates() const =0
GameManager * getGameManager() const
Definition: Renderer.cpp:693
void resetGpuResourceManager()
Definition: Renderer.cpp:236
virtual std::vector< std::string > getSupportedGpuNames() const =0
static constexpr float minDepth
Definition: Renderer.h:889
RenderStatistics * getRenderStatistics()
Definition: Renderer.cpp:678
std::optional< Error > onRenderSettingsChanged(bool bShadowMapSizeChanged=false)
Definition: Renderer.cpp:384
virtual std::string getCurrentlyUsedGpuName() const =0
RenderStatistics renderStats
Definition: Renderer.h:880
std::optional< Error > clampSettingsToMaxSupported()
Definition: Renderer.cpp:871
static void getSpotlightNodeShadowMappingInfo(SpotlightNode *pNode, ShadowMapHandle *&pShadowMapHandle, unsigned int &iShadowPassLightInfoArrayIndex)
Definition: Renderer.cpp:1200
virtual GpuResource * getDepthTextureNoMultisampling()=0
void onFramebufferSizeChanged(int iWidth, int iHeight)
Definition: Renderer.cpp:276
std::unique_ptr< PipelineManager > pPipelineManager
Definition: Renderer.h:841
static constexpr float maxDepth
Definition: Renderer.h:892
virtual void prepareForDrawingNextFrame(CameraProperties *pCameraProperties, FrameResource *pCurrentFrameResource)=0
ShaderCpuWriteResourceManager * getShaderCpuWriteResourceManager() const
Definition: Renderer.cpp:703
virtual void drawMeshesDepthPrepass(FrameResource *pCurrentFrameResource, size_t iCurrentFrameResourceIndex, const std::vector< Renderer::MeshesInFrustum::PipelineInFrustumInfo > &vOpaquePipelines)=0
static constexpr unsigned int iRecommendedSwapChainBufferCount
Definition: Renderer.h:886
static unsigned int getPointLightShadowPassLightInfoArrayIndex(PointLightNode *pNode, size_t iCubemapFaceIndex)
Definition: Renderer.cpp:1209
void resetPipelineManager()
Definition: Renderer.cpp:246
virtual std::variant< std::set< std::pair< unsigned int, unsigned int > >, Error > getSupportedRenderResolutions() const =0
virtual void drawMeshesMainPass(FrameResource *pCurrentFrameResource, size_t iCurrentFrameResourceIndex, const std::vector< Renderer::MeshesInFrustum::PipelineInFrustumInfo > &vOpaquePipelines, const std::vector< Renderer::MeshesInFrustum::PipelineInFrustumInfo > &vTransparentPipelines)=0
std::unique_ptr< LightingShaderResourceManager > pLightingShaderResourceManager
Definition: Renderer.h:853
std::unique_ptr< ShaderCpuWriteResourceManager > pShaderCpuWriteResourceManager
Definition: Renderer.h:847
std::unique_ptr< FrameResourcesManager > pFrameResourcesManager
Definition: Renderer.h:844
bool bIsWindowMinimized
Definition: Renderer.h:871
void updateShaderConfiguration()
Definition: Renderer.cpp:717
static constexpr float getMinDepth()
Definition: Renderer.h:68
std::pair< std::mutex, EnvironmentNode * > mtxSpawnedEnvironmentNode
Definition: Renderer.h:874
Definition: Renderer.h:896
Renderer * pRenderer
Definition: Renderer.h:924
std::set< ShaderMacro > currentVertexShaderConfiguration
Definition: Renderer.h:917
void updateShaderConfiguration()
Definition: Renderer.h:914
std::set< ShaderMacro > currentPixelShaderConfiguration
Definition: Renderer.h:920
ShaderConfiguration(Renderer *pRenderer)
Definition: Renderer.h:905
Definition: ShaderCpuWriteResourceManager.h:21
Definition: ShaderManager.h:25
Definition: ShaderTextureResourceManager.h:27
Definition: ShadowMapHandle.h:23
Definition: SpotlightNode.h:15
Definition: Window.h:198
Definition: FrameResource.h:15
Definition: PipelineManager.h:115
std::atomic< size_t > iDrawCallCount
Definition: RenderStatistics.h:178
Definition: Renderer.h:357
std::pair< std::recursive_mutex *, ShaderLightArray::LightsInFrustum * > mtxPointLightsInFrustum
Definition: Renderer.h:359
std::pair< std::recursive_mutex *, ShaderLightArray::LightsInFrustum * > mtxSpotlightsInFrustum
Definition: Renderer.h:362
Material * pMaterial
Definition: Renderer.h:334
std::vector< MeshInFrustumInfo > vMeshes
Definition: Renderer.h:337
std::vector< MeshIndexBufferInfo > vIndexBuffers
Definition: Renderer.h:328
MeshNode * pMeshNode
Definition: Renderer.h:325
Pipeline * pPipeline
Definition: Renderer.h:343
std::vector< MaterialInFrustumInfo > vMaterials
Definition: Renderer.h:346
Definition: Renderer.h:321
std::vector< PipelineInFrustumInfo > vOpaquePipelines
Definition: Renderer.h:350
std::vector< PipelineInFrustumInfo > vTransparentPipelines
Definition: Renderer.h:353