Pioneer
RendererGL.h
Go to the documentation of this file.
1 // Copyright © 2008-2023 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 
6 #include "graphics/RenderState.h"
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 
16 namespace Graphics {
17 
18  class Texture;
19  struct Settings;
20 
21  namespace OGL {
22  class CachedVertexBuffer;
23  class CommandList;
24  class InstanceBuffer;
25  class IndexBuffer;
26  class Material;
27  class MeshObject;
28  class RenderState;
29  class RenderStateCache;
30  class RenderTarget;
31  class Shader;
32  class UniformBuffer;
33  class UniformLinearBuffer;
34  class VertexBuffer;
35  } // namespace OGL
36 
37  class RendererOGL final : public Renderer {
38  public:
39  static void RegisterRenderer();
40 
41  RendererOGL(SDL_Window *window, const Graphics::Settings &vs, SDL_GLContext &glContext);
42  virtual ~RendererOGL() override final;
43 
44  virtual const char *GetName() const override final { return "OpenGL 3.1, with extensions, renderer"; }
45  virtual RendererType GetRendererType() const override final { return RENDERER_OPENGL_3x; }
46 
47  virtual void WriteRendererInfo(std::ostream &out) const override final;
48 
49  virtual void CheckRenderErrors(const char *func = nullptr, const int line = -1) const override final { CheckErrors(func, line); }
50  static void CheckErrors(const char *func = nullptr, const int line = -1);
51 
52  virtual bool SupportsInstancing() override final { return true; }
53 
54  virtual int GetMaximumNumberAASamples() const override final;
55  virtual bool GetNearFarRange(float &near_, float &far_) const override final;
56 
57  virtual bool BeginFrame() override final;
58  virtual bool EndFrame() override final;
59  virtual bool SwapBuffers() override final;
60 
61  virtual bool SetRenderTarget(RenderTarget *) override final;
62  virtual bool SetScissor(ViewportExtents) override final;
63 
64  virtual bool ClearScreen() override final;
65  virtual bool ClearDepthBuffer() override final;
66  virtual bool SetClearColor(const Color &c) override final;
67 
68  virtual bool SetViewport(ViewportExtents v) override final;
69  virtual ViewportExtents GetViewport() const override final { return m_viewport; }
70 
71  virtual bool SetTransform(const matrix4x4f &m) override final;
72  virtual matrix4x4f GetTransform() const override final { return m_modelViewMat; }
73 
74  virtual bool SetPerspectiveProjection(float fov, float aspect, float near_, float far_) override final;
75  virtual bool SetOrthographicProjection(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax) override final;
76  virtual bool SetProjection(const matrix4x4f &m) override final;
77  virtual matrix4x4f GetProjection() const override final { return m_projectionMat; }
78 
79  virtual bool SetWireFrameMode(bool enabled) override final;
80 
81  virtual bool SetLightIntensity(Uint32 numlights, const float *intensity) override final;
82  virtual bool SetLights(Uint32 numlights, const Light *l) override final;
83  virtual Uint32 GetNumLights() const override final { return m_numLights; }
84  virtual bool SetAmbientColor(const Color &c) override final;
85 
86  virtual bool FlushCommandBuffers() override final;
87 
88  virtual bool DrawBuffer(const VertexArray *v, Material *m) override final;
89  virtual bool DrawBufferDynamic(VertexBuffer *v, uint32_t vtxOffset, IndexBuffer *i, uint32_t idxOffset, uint32_t numElems, Material *m) override final;
90  virtual bool DrawMesh(MeshObject *, Material *) override final;
91  virtual bool DrawMeshInstanced(MeshObject *, Material *, InstanceBuffer *) override final;
92 
93  virtual Material *CreateMaterial(const std::string &, const MaterialDescriptor &, const RenderStateDesc &) override final;
94  virtual Material *CloneMaterial(const Material *, const MaterialDescriptor &, const RenderStateDesc &) override final;
95  virtual Texture *CreateTexture(const TextureDescriptor &descriptor) override final;
96  virtual RenderTarget *CreateRenderTarget(const RenderTargetDesc &) override final;
97  virtual VertexBuffer *CreateVertexBuffer(const VertexBufferDesc &) override final;
98  virtual IndexBuffer *CreateIndexBuffer(Uint32 size, BufferUsage, IndexBufferSize) override final;
99  virtual InstanceBuffer *CreateInstanceBuffer(Uint32 size, BufferUsage) override final;
100  virtual UniformBuffer *CreateUniformBuffer(Uint32 size, BufferUsage) override final;
101  virtual MeshObject *CreateMeshObject(VertexBuffer *v, IndexBuffer *i) override final;
102  virtual MeshObject *CreateMeshObjectFromArray(const VertexArray *v, IndexBuffer *i = nullptr, BufferUsage u = BUFFER_USAGE_STATIC) override final;
103 
104  virtual const RenderStateDesc &GetMaterialRenderState(const Graphics::Material *m) override final;
105 
107  OGL::UniformLinearBuffer *GetDrawUniformBuffer(Uint32 size);
108  OGL::RenderStateCache *GetStateCache() { return m_renderStateCache.get(); }
109 
110  virtual bool ReloadShaders() override final;
111 
112  virtual bool Screendump(ScreendumpState &sd) override final;
113  virtual bool FrameGrab(ScreendumpState &sd) override final;
114 
115  bool DrawMeshInternal(OGL::MeshObject *, PrimitiveType type);
118 
119  protected:
120  virtual void PushState() override final{};
121  virtual void PopState() override final{};
122 
123  size_t m_frameNum;
124 
125  Uint32 m_numLights;
127  float m_minZNear;
128  float m_maxZFar;
131 
132  // TODO: iterate shaderdef files on startup and cache by Shader name directive rather than filename fragment
133  std::vector<std::pair<std::string, OGL::Shader *>> m_shaders;
134  std::vector<std::unique_ptr<OGL::UniformLinearBuffer>> m_drawUniformBuffers;
135  std::unique_ptr<OGL::RenderStateCache> m_renderStateCache;
140  std::unique_ptr<OGL::CommandList> m_drawCommandList;
141 
146 
147  private:
148  static bool initted;
149 
150  struct DynamicBufferData {
151  AttributeSet attrs;
152  OGL::CachedVertexBuffer *vtxBuffer;
154  };
155 
156  using DynamicBufferMap = std::vector<DynamicBufferData>;
157  static DynamicBufferMap s_DynamicDrawBufferMap;
158 
159  SDL_GLContext m_glContext;
160  };
161 #define CHECKERRORS() RendererOGL::CheckErrors(__FUNCTION__, __LINE__)
162 
163 } // namespace Graphics
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:21
Definition: RenderTarget.h:38
Definition: RendererGL.h:37
virtual matrix4x4f GetProjection() const override final
Definition: RendererGL.h:77
virtual bool SetAmbientColor(const Color &c) override final
Definition: RendererGL.cpp:765
std::unique_ptr< OGL::RenderStateCache > m_renderStateCache
Definition: RendererGL.h:135
virtual bool BeginFrame() override final
Definition: RendererGL.cpp:483
OGL::RenderTarget * m_windowRenderTarget
Definition: RendererGL.h:139
virtual bool SetWireFrameMode(bool enabled) override final
Definition: RendererGL.cpp:673
virtual RenderTarget * CreateRenderTarget(const RenderTargetDesc &) override final
Definition: RendererGL.cpp:1031
bool DrawMeshDynamicInternal(BufferBinding< OGL::VertexBuffer > vtxBind, BufferBinding< OGL::IndexBuffer > idxBind, PrimitiveType type)
Definition: RendererGL.cpp:944
virtual bool ReloadShaders() override final
Definition: RendererGL.cpp:1012
virtual ~RendererOGL() override final
Definition: RendererGL.cpp:290
virtual bool SetViewport(ViewportExtents v) override final
Definition: RendererGL.cpp:680
virtual int GetMaximumNumberAASamples() const override final
Definition: RendererGL.cpp:469
RefCountedPtr< OGL::UniformBuffer > m_lightUniformBuffer
Definition: RendererGL.h:136
virtual bool SupportsInstancing() override final
Definition: RendererGL.h:52
OGL::UniformBuffer * GetLightUniformBuffer()
Definition: RendererGL.cpp:1124
bool m_useNVDepthRanged
Definition: RendererGL.h:137
virtual bool EndFrame() override final
Definition: RendererGL.cpp:495
virtual bool DrawMeshInstanced(MeshObject *, Material *, InstanceBuffer *) override final
Definition: RendererGL.cpp:834
virtual Material * CloneMaterial(const Material *, const MaterialDescriptor &, const RenderStateDesc &) override final
Definition: RendererGL.cpp:997
static void RegisterRenderer()
Definition: RendererGL.cpp:135
virtual bool SetLights(Uint32 numlights, const Light *l) override final
Definition: RendererGL.cpp:726
RendererOGL(SDL_Window *window, const Graphics::Settings &vs, SDL_GLContext &glContext)
Definition: RendererGL.cpp:148
std::unique_ptr< OGL::CommandList > m_drawCommandList
Definition: RendererGL.h:140
std::vector< std::unique_ptr< OGL::UniformLinearBuffer > > m_drawUniformBuffers
Definition: RendererGL.h:134
virtual InstanceBuffer * CreateInstanceBuffer(Uint32 size, BufferUsage) override final
Definition: RendererGL.cpp:1094
bool m_useAnisotropicFiltering
Definition: RendererGL.h:130
bool DrawMeshInstancedInternal(OGL::MeshObject *, OGL::InstanceBuffer *, PrimitiveType type)
Definition: RendererGL.cpp:923
virtual bool Screendump(ScreendumpState &sd) override final
Definition: RendererGL.cpp:1145
virtual const RenderStateDesc & GetMaterialRenderState(const Graphics::Material *m) override final
Definition: RendererGL.cpp:1140
Uint32 m_numLights
Definition: RendererGL.h:125
virtual bool DrawMesh(MeshObject *, Material *) override final
Definition: RendererGL.cpp:828
virtual bool SetProjection(const matrix4x4f &m) override final
Definition: RendererGL.cpp:710
virtual const char * GetName() const override final
Definition: RendererGL.h:44
Uint32 m_numDirLights
Definition: RendererGL.h:126
OGL::RenderStateCache * GetStateCache()
Definition: RendererGL.h:108
virtual bool SetPerspectiveProjection(float fov, float aspect, float near_, float far_) override final
Definition: RendererGL.cpp:693
matrix4x4f m_projectionMat
Definition: RendererGL.h:143
virtual VertexBuffer * CreateVertexBuffer(const VertexBufferDesc &) override final
Definition: RendererGL.cpp:1081
virtual bool ClearDepthBuffer() override final
Definition: RendererGL.cpp:661
virtual IndexBuffer * CreateIndexBuffer(Uint32 size, BufferUsage, IndexBufferSize) override final
Definition: RendererGL.cpp:1088
virtual bool SwapBuffers() override final
Definition: RendererGL.cpp:612
virtual bool SetClearColor(const Color &c) override final
Definition: RendererGL.cpp:667
bool m_useCompressedTextures
Definition: RendererGL.h:129
virtual bool DrawBuffer(const VertexArray *v, Material *m) override final
Definition: RendererGL.cpp:773
virtual matrix4x4f GetTransform() const override final
Definition: RendererGL.h:72
virtual bool SetOrthographicProjection(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax) override final
Definition: RendererGL.cpp:702
virtual bool ClearScreen() override final
Definition: RendererGL.cpp:655
float m_minZNear
Definition: RendererGL.h:127
virtual bool FrameGrab(ScreendumpState &sd) override final
Definition: RendererGL.cpp:1167
virtual bool SetLightIntensity(Uint32 numlights, const float *intensity) override final
Definition: RendererGL.cpp:716
matrix4x4f m_modelViewMat
Definition: RendererGL.h:142
virtual UniformBuffer * CreateUniformBuffer(Uint32 size, BufferUsage) override final
Definition: RendererGL.cpp:1100
OGL::UniformLinearBuffer * GetDrawUniformBuffer(Uint32 size)
Definition: RendererGL.cpp:1129
Color m_clearColor
Definition: RendererGL.h:145
virtual void PushState() override final
Definition: RendererGL.h:120
static void CheckErrors(const char *func=nullptr, const int line=-1)
Definition: RendererGL.cpp:575
virtual void WriteRendererInfo(std::ostream &out) const override final
Definition: RendererGL.cpp:383
virtual MeshObject * CreateMeshObject(VertexBuffer *v, IndexBuffer *i) override final
Definition: RendererGL.cpp:1106
std::vector< std::pair< std::string, OGL::Shader * > > m_shaders
Definition: RendererGL.h:133
virtual Texture * CreateTexture(const TextureDescriptor &descriptor) override final
Definition: RendererGL.cpp:1025
virtual ViewportExtents GetViewport() const override final
Definition: RendererGL.h:69
virtual bool SetTransform(const matrix4x4f &m) override final
Definition: RendererGL.cpp:687
OGL::RenderTarget * m_activeRenderTarget
Definition: RendererGL.h:138
virtual void CheckRenderErrors(const char *func=nullptr, const int line=-1) const override final
Definition: RendererGL.h:49
float m_maxZFar
Definition: RendererGL.h:128
virtual void PopState() override final
Definition: RendererGL.h:121
ViewportExtents m_viewport
Definition: RendererGL.h:144
virtual RendererType GetRendererType() const override final
Definition: RendererGL.h:45
virtual bool SetRenderTarget(RenderTarget *) override final
Definition: RendererGL.cpp:635
virtual bool FlushCommandBuffers() override final
Definition: RendererGL.cpp:840
virtual bool DrawBufferDynamic(VertexBuffer *v, uint32_t vtxOffset, IndexBuffer *i, uint32_t idxOffset, uint32_t numElems, Material *m) override final
Definition: RendererGL.cpp:814
bool DrawMeshInternal(OGL::MeshObject *, PrimitiveType type)
Definition: RendererGL.cpp:903
size_t m_frameNum
Definition: RendererGL.h:121
virtual bool SetScissor(ViewportExtents) override final
Definition: RendererGL.cpp:649
virtual Uint32 GetNumLights() const override final
Definition: RendererGL.h:83
virtual MeshObject * CreateMeshObjectFromArray(const VertexArray *v, IndexBuffer *i=nullptr, BufferUsage u=BUFFER_USAGE_STATIC) override final
Definition: RendererGL.cpp:1112
virtual Material * CreateMaterial(const std::string &, const MaterialDescriptor &, const RenderStateDesc &) override final
Definition: RendererGL.cpp:963
virtual bool GetNearFarRange(float &near_, float &far_) const override final
Definition: RendererGL.cpp:476
Definition: Renderer.h:44
Definition: Texture.h:54
Definition: Texture.h:106
Definition: UniformBuffer.h:11
Definition: VertexArray.h:19
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