Pioneer
Loading...
Searching...
No Matches
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
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
16namespace 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
124
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
OGL::RenderStateCache * GetStateCache()
Definition RendererGL.h:108
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
std::unique_ptr< OGL::CommandList > m_drawCommandList
Definition RendererGL.h:140
virtual const char * GetName() const override final
Definition RendererGL.h:44
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
Uint32 m_numDirLights
Definition RendererGL.h:126
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:123
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