Pioneer
Loading...
Searching...
No Matches
RendererGL.h
Go to the documentation of this file.
1// Copyright © 2008-2024 Pioneer Developers. See AUTHORS.txt for details
2// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3
4#pragma once
5
7#include "graphics/Renderer.h"
8#include "graphics/Types.h"
10
11#include "OpenGLLibs.h"
12#include "RefCounted.h"
13#include <stack>
14#include <unordered_map>
15
16typedef void *SDL_GLContext;
17
18namespace Graphics {
19
20 class Texture;
21 struct Settings;
22
23 namespace OGL {
24 class CachedVertexBuffer;
25 class CommandList;
26 class InstanceBuffer;
27 class IndexBuffer;
28 class Material;
29 class MeshObject;
30 class RenderState;
31 class RenderStateCache;
32 class RenderTarget;
33 class Shader;
34 class UniformBuffer;
35 class UniformLinearBuffer;
36 class VertexBuffer;
37 } // namespace OGL
38
39 class RendererOGL final : public Renderer {
40 public:
41 static void RegisterRenderer();
42
43 RendererOGL(SDL_Window *window, const Graphics::Settings &vs, SDL_GLContext &glContext);
44 virtual ~RendererOGL() override final;
45
46 virtual const char *GetName() const override final { return "OpenGL 3.1, with extensions, renderer"; }
47 virtual RendererType GetRendererType() const override final { return RENDERER_OPENGL_3x; }
48
49 virtual void WriteRendererInfo(std::ostream &out) const override final;
50
51 virtual void CheckRenderErrors(const char *func = nullptr, const int line = -1) const override final { CheckErrors(func, line); }
52 static void CheckErrors(const char *func = nullptr, const int line = -1);
53
54 virtual bool SupportsInstancing() override final { return true; }
55
56 virtual int GetMaximumNumberAASamples() const override final;
57 virtual bool GetNearFarRange(float &near_, float &far_) const override final;
58
59 virtual void SetVSyncEnabled(bool) override;
60
61 virtual bool BeginFrame() override final;
62 virtual bool EndFrame() override final;
63 virtual bool SwapBuffers() override final;
64
65 virtual RenderTarget *GetRenderTarget() override final;
66 virtual bool SetRenderTarget(RenderTarget *) override final;
67 virtual bool SetScissor(ViewportExtents) override final;
68
69 virtual void CopyRenderTarget(RenderTarget *, RenderTarget *, ViewportExtents, ViewportExtents, bool) override final;
70 virtual void ResolveRenderTarget(RenderTarget *, RenderTarget *, ViewportExtents) override final;
71
72 virtual bool ClearScreen(const Color &c, bool) override final;
73 virtual bool ClearDepthBuffer() override final;
74
75 virtual bool SetViewport(ViewportExtents v) override final;
76 virtual ViewportExtents GetViewport() const override final { return m_viewport; }
77
78 virtual bool SetTransform(const matrix4x4f &m) override final;
79 virtual matrix4x4f GetTransform() const override final { return m_modelViewMat; }
80
81 virtual bool SetPerspectiveProjection(float fov, float aspect, float near_, float far_) override final;
82 virtual bool SetOrthographicProjection(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax) override final;
83 virtual bool SetProjection(const matrix4x4f &m) override final;
84 virtual matrix4x4f GetProjection() const override final { return m_projectionMat; }
85
86 virtual bool SetWireFrameMode(bool enabled) override final;
87
88 virtual bool SetLightIntensity(Uint32 numlights, const float *intensity) override final;
89 virtual bool SetLights(Uint32 numlights, const Light *l) override final;
90 virtual Uint32 GetNumLights() const override final { return m_numLights; }
91 virtual bool SetAmbientColor(const Color &c) override final;
92
93 virtual bool FlushCommandBuffers() override final;
94
95 virtual bool DrawBuffer(const VertexArray *v, Material *m) override final;
96 virtual bool DrawBufferDynamic(VertexBuffer *v, uint32_t vtxOffset, IndexBuffer *i, uint32_t idxOffset, uint32_t numElems, Material *m) override final;
97 virtual bool DrawMesh(MeshObject *, Material *) override final;
98 virtual bool DrawMeshInstanced(MeshObject *, Material *, InstanceBuffer *) override final;
99
100 virtual Material *CreateMaterial(const std::string &, const MaterialDescriptor &, const RenderStateDesc &) override final;
101 virtual Material *CloneMaterial(const Material *, const MaterialDescriptor &, const RenderStateDesc &) override final;
102 virtual Texture *CreateTexture(const TextureDescriptor &descriptor) override final;
103 virtual RenderTarget *CreateRenderTarget(const RenderTargetDesc &) override final;
104 virtual VertexBuffer *CreateVertexBuffer(const VertexBufferDesc &) override final;
105 virtual IndexBuffer *CreateIndexBuffer(Uint32 size, BufferUsage, IndexBufferSize) override final;
106 virtual InstanceBuffer *CreateInstanceBuffer(Uint32 size, BufferUsage) override final;
107 virtual UniformBuffer *CreateUniformBuffer(Uint32 size, BufferUsage) override final;
108 virtual MeshObject *CreateMeshObject(VertexBuffer *v, IndexBuffer *i) override final;
109 virtual MeshObject *CreateMeshObjectFromArray(const VertexArray *v, IndexBuffer *i = nullptr, BufferUsage u = BUFFER_USAGE_STATIC) override final;
110
111 virtual const RenderStateDesc &GetMaterialRenderState(const Graphics::Material *m) override final;
112
114 OGL::UniformLinearBuffer *GetDrawUniformBuffer(Uint32 size);
115 OGL::RenderStateCache *GetStateCache() { return m_renderStateCache.get(); }
116
117 virtual bool ReloadShaders() override final;
118
119 virtual bool Screendump(ScreendumpState &sd) override final;
120
121 bool DrawMeshInternal(OGL::MeshObject *, PrimitiveType type);
124
125 protected:
126 virtual void PushState() override final{};
127 virtual void PopState() override final{};
128
130
137
138 // TODO: iterate shaderdef files on startup and cache by Shader name directive rather than filename fragment
139 std::vector<std::pair<std::string, OGL::Shader *>> m_shaders;
140 std::vector<std::unique_ptr<OGL::UniformLinearBuffer>> m_drawUniformBuffers;
141 std::unique_ptr<OGL::RenderStateCache> m_renderStateCache;
145 std::unique_ptr<OGL::CommandList> m_drawCommandList;
146
150
151 private:
152 static bool initted;
153
154 struct DynamicBufferData {
155 AttributeSet attrs;
156 OGL::CachedVertexBuffer *vtxBuffer;
158 };
159
160 using DynamicBufferMap = std::vector<DynamicBufferData>;
161 static DynamicBufferMap s_DynamicDrawBufferMap;
162
163 SDL_GLContext m_glContext;
164 };
165#define CHECKERRORS() RendererOGL::CheckErrors(__FUNCTION__, __LINE__)
166
167} // namespace Graphics
void * SDL_GLContext
Definition: RendererGL.h:16
Definition: VertexBuffer.h:102
Definition: VertexBuffer.h:127
Definition: Light.h:14
Definition: Material.h:60
Definition: Material.h:148
Definition: VertexBuffer.h:156
Definition: VertexBufferGL.h:41
Definition: RenderTargetGL.h:22
Definition: RenderTarget.h:38
Definition: RendererGL.h:39
virtual matrix4x4f GetProjection() const override final
Definition: RendererGL.h:84
virtual bool SetAmbientColor(const Color &c) override final
Definition: RendererGL.cpp:779
std::unique_ptr< OGL::RenderStateCache > m_renderStateCache
Definition: RendererGL.h:141
virtual bool BeginFrame() override final
Definition: RendererGL.cpp:473
virtual void SetVSyncEnabled(bool) override
Definition: RendererGL.cpp:468
virtual bool SetWireFrameMode(bool enabled) override final
Definition: RendererGL.cpp:687
OGL::RenderStateCache * GetStateCache()
Definition: RendererGL.h:115
virtual RenderTarget * CreateRenderTarget(const RenderTargetDesc &) override final
Definition: RendererGL.cpp:1047
bool DrawMeshDynamicInternal(BufferBinding< OGL::VertexBuffer > vtxBind, BufferBinding< OGL::IndexBuffer > idxBind, PrimitiveType type)
Definition: RendererGL.cpp:960
virtual bool ReloadShaders() override final
Definition: RendererGL.cpp:1028
virtual ~RendererOGL() override final
Definition: RendererGL.cpp:279
virtual bool SetViewport(ViewportExtents v) override final
Definition: RendererGL.cpp:694
virtual int GetMaximumNumberAASamples() const override final
Definition: RendererGL.cpp:454
RefCountedPtr< OGL::UniformBuffer > m_lightUniformBuffer
Definition: RendererGL.h:142
virtual bool SupportsInstancing() override final
Definition: RendererGL.h:54
OGL::UniformBuffer * GetLightUniformBuffer()
Definition: RendererGL.cpp:1146
bool m_useNVDepthRanged
Definition: RendererGL.h:143
virtual bool EndFrame() override final
Definition: RendererGL.cpp:483
virtual bool DrawMeshInstanced(MeshObject *, Material *, InstanceBuffer *) override final
Definition: RendererGL.cpp:848
virtual Material * CloneMaterial(const Material *, const MaterialDescriptor &, const RenderStateDesc &) override final
Definition: RendererGL.cpp:1013
static void RegisterRenderer()
Definition: RendererGL.cpp:143
virtual bool SetLights(Uint32 numlights, const Light *l) override final
Definition: RendererGL.cpp:740
std::unique_ptr< OGL::CommandList > m_drawCommandList
Definition: RendererGL.h:145
virtual const char * GetName() const override final
Definition: RendererGL.h:46
std::vector< std::unique_ptr< OGL::UniformLinearBuffer > > m_drawUniformBuffers
Definition: RendererGL.h:140
virtual InstanceBuffer * CreateInstanceBuffer(Uint32 size, BufferUsage) override final
Definition: RendererGL.cpp:1116
bool m_useAnisotropicFiltering
Definition: RendererGL.h:136
bool DrawMeshInstancedInternal(OGL::MeshObject *, OGL::InstanceBuffer *, PrimitiveType type)
Definition: RendererGL.cpp:939
virtual bool Screendump(ScreendumpState &sd) override final
Definition: RendererGL.cpp:1167
virtual const RenderStateDesc & GetMaterialRenderState(const Graphics::Material *m) override final
Definition: RendererGL.cpp:1162
Uint32 m_numLights
Definition: RendererGL.h:131
virtual bool DrawMesh(MeshObject *, Material *) override final
Definition: RendererGL.cpp:842
virtual RenderTarget * GetRenderTarget() override final
Definition: RendererGL.cpp:624
virtual bool SetProjection(const matrix4x4f &m) override final
Definition: RendererGL.cpp:724
Uint32 m_numDirLights
Definition: RendererGL.h:132
virtual bool SetPerspectiveProjection(float fov, float aspect, float near_, float far_) override final
Definition: RendererGL.cpp:707
matrix4x4f m_projectionMat
Definition: RendererGL.h:148
virtual VertexBuffer * CreateVertexBuffer(const VertexBufferDesc &) override final
Definition: RendererGL.cpp:1103
virtual bool ClearDepthBuffer() override final
Definition: RendererGL.cpp:681
virtual IndexBuffer * CreateIndexBuffer(Uint32 size, BufferUsage, IndexBufferSize) override final
Definition: RendererGL.cpp:1110
virtual bool SwapBuffers() override final
Definition: RendererGL.cpp:600
bool m_useCompressedTextures
Definition: RendererGL.h:135
virtual bool DrawBuffer(const VertexArray *v, Material *m) override final
Definition: RendererGL.cpp:787
virtual matrix4x4f GetTransform() const override final
Definition: RendererGL.h:79
virtual bool SetOrthographicProjection(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax) override final
Definition: RendererGL.cpp:716
float m_minZNear
Definition: RendererGL.h:133
virtual bool SetLightIntensity(Uint32 numlights, const float *intensity) override final
Definition: RendererGL.cpp:730
matrix4x4f m_modelViewMat
Definition: RendererGL.h:147
virtual UniformBuffer * CreateUniformBuffer(Uint32 size, BufferUsage) override final
Definition: RendererGL.cpp:1122
OGL::UniformLinearBuffer * GetDrawUniformBuffer(Uint32 size)
Definition: RendererGL.cpp:1151
virtual void PushState() override final
Definition: RendererGL.h:126
static void CheckErrors(const char *func=nullptr, const int line=-1)
Definition: RendererGL.cpp:563
virtual void WriteRendererInfo(std::ostream &out) const override final
Definition: RendererGL.cpp:368
virtual MeshObject * CreateMeshObject(VertexBuffer *v, IndexBuffer *i) override final
Definition: RendererGL.cpp:1128
std::vector< std::pair< std::string, OGL::Shader * > > m_shaders
Definition: RendererGL.h:139
virtual Texture * CreateTexture(const TextureDescriptor &descriptor) override final
Definition: RendererGL.cpp:1041
virtual bool ClearScreen(const Color &c, bool) override final
Definition: RendererGL.cpp:675
virtual ViewportExtents GetViewport() const override final
Definition: RendererGL.h:76
virtual void CopyRenderTarget(RenderTarget *, RenderTarget *, ViewportExtents, ViewportExtents, bool) override final
Definition: RendererGL.cpp:641
virtual bool SetTransform(const matrix4x4f &m) override final
Definition: RendererGL.cpp:701
OGL::RenderTarget * m_activeRenderTarget
Definition: RendererGL.h:144
virtual void CheckRenderErrors(const char *func=nullptr, const int line=-1) const override final
Definition: RendererGL.h:51
float m_maxZFar
Definition: RendererGL.h:134
virtual void PopState() override final
Definition: RendererGL.h:127
ViewportExtents m_viewport
Definition: RendererGL.h:149
virtual RendererType GetRendererType() const override final
Definition: RendererGL.h:47
virtual bool SetRenderTarget(RenderTarget *) override final
Definition: RendererGL.cpp:629
virtual bool FlushCommandBuffers() override final
Definition: RendererGL.cpp:854
virtual bool DrawBufferDynamic(VertexBuffer *v, uint32_t vtxOffset, IndexBuffer *i, uint32_t idxOffset, uint32_t numElems, Material *m) override final
Definition: RendererGL.cpp:828
bool DrawMeshInternal(OGL::MeshObject *, PrimitiveType type)
Definition: RendererGL.cpp:919
size_t m_frameNum
Definition: RendererGL.h:129
virtual bool SetScissor(ViewportExtents) override final
Definition: RendererGL.cpp:669
virtual Uint32 GetNumLights() const override final
Definition: RendererGL.h:90
virtual MeshObject * CreateMeshObjectFromArray(const VertexArray *v, IndexBuffer *i=nullptr, BufferUsage u=BUFFER_USAGE_STATIC) override final
Definition: RendererGL.cpp:1134
virtual void ResolveRenderTarget(RenderTarget *, RenderTarget *, ViewportExtents) override final
Definition: RendererGL.cpp:647
virtual Material * CreateMaterial(const std::string &, const MaterialDescriptor &, const RenderStateDesc &) override final
Definition: RendererGL.cpp:979
virtual bool GetNearFarRange(float &near_, float &far_) const override final
Definition: RendererGL.cpp:461
Definition: Renderer.h:45
Definition: Texture.h:51
Definition: Texture.h:103
Definition: UniformBuffer.h:11
Definition: VertexArray.h:22
Definition: VertexBuffer.h:65
Definition: RefCounted.h:36
Definition: Background.h:14
RendererType
Definition: Graphics.h:18
@ RENDERER_OPENGL_3x
Definition: Graphics.h:20
IndexBufferSize
Definition: Types.h:76
PrimitiveType
Definition: Types.h:82
BufferUsage
Definition: Types.h:65
@ BUFFER_USAGE_STATIC
Definition: Types.h:66
Definition: Color.h:66
Definition: Types.h:27
Definition: BufferCommon.h:63
Definition: RenderState.h:10
Definition: RenderTarget.h:20
Definition: Graphics.h:134
Definition: Graphics.h:27
Definition: VertexBuffer.h:43
Definition: Graphics.h:59