TDME2  1.9.200
GL3Renderer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #if defined (__APPLE__)
4  #include <OpenCL/opencl.h>
5 #endif
6 
7 #include <array>
8 #include <string>
9 #include <unordered_map>
10 #include <vector>
11 
12 #include <tdme/tdme.h>
14 #include <tdme/engine/fwd-tdme.h>
17 
18 using std::array;
19 using std::string;
20 using std::unordered_map;
21 using std::vector;
22 
30 
31 /**
32  * OpenGL 3 renderer
33  * @author Andreas Drewke
34  */
36 {
37 private:
38  uint32_t engineVAO;
39  unordered_map<uint32_t, int32_t> vbosUsage;
41  #if defined (__APPLE__) && !defined(__aarch64__)
42  struct CLSkinningParameters {
43  array<int32_t, 8> boundGLBuffers { -1, -1, -1, -1, -1, -1, -1, -1 };
44  array<bool, 8> boundGLBuffersWrite { false, false, false, false, false, false, false, false };
45  int32_t matrixCount { 0 };
46  int32_t instanceCount { 0 };
47  int32_t vertexCount { 0 };
48  int32_t numGroupsX { 0 };
49  int32_t numGroupsY { 0 };
50  };
51  cl_context clContext;
52  cl_program clSkinningKernelProgram;
53  cl_kernel clSkinningKernel;
54  cl_command_queue clCommandQueue;
55  CLSkinningParameters clSkinningParameters;
56 
57  /**
58  * OpenCL bind GL buffer
59  * @param idx argument index
60  * @param bufferObjectId OpenGL buffer object id
61  * @param write write
62  */
63  void clBindGLBuffer(int32_t idx, int32_t bufferObjectId, bool write);
64 
65  /**
66  * OpenCL error callback
67  * @param errorInfo error info
68  * @param privateInfo private info
69  * @param cb cb?
70  * @param userData user data
71  */
72  static void clErrorCallback(const char* errorInfo, const void* privateInfo, size_t cb, void* userData);
73  #endif
74 
77 
78 public:
79  // forbid class copy
81 
82  /**
83  * Public constructor
84  */
85  GL3Renderer();
86 
87  // overridden methods
88  void initialize() override;
89  void initializeFrame() override;
90  void finishFrame() override;
91  const string getVendor() override;
92  const string getRenderer() override;
93  const string getShaderVersion() override;
94  bool isSupportingMultithreadedRendering() override;
95  bool isTextureCompressionAvailable() override;
96  bool isUsingProgramAttributeLocation() override;
98  bool isSpecularMappingAvailable() override;
99  bool isNormalMappingAvailable() override;
100  bool isInstancedRenderingAvailable() override;
101  bool isPBRAvailable() override;
102  bool isComputeShaderAvailable() override;
103  bool isGLCLAvailable() override;
104  bool isUsingShortIndices() override;
105  bool isDeferredShadingAvailable() override;
106  int32_t getTextureUnits() override;
107  int32_t loadShader(int32_t type, const string& pathName, const string& fileName, const string& definitions = string(), const string& functions = string()) override;
108  void useProgram(int contextIdx, int32_t programId) override;
109  int32_t createProgram(int type) override;
110  void attachShaderToProgram(int32_t programId, int32_t shaderId) override;
111  bool linkProgram(int32_t programId) override;
112  int32_t getProgramUniformLocation(int32_t programId, const string& name) override;
113  void setProgramUniformInteger(int contextIdx, int32_t uniformId, int32_t value) override;
114  void setProgramUniformFloat(int contextIdx, int32_t uniformId, float value) override;
115  void setProgramUniformFloatMatrix3x3(int contextIdx, int32_t uniformId, const array<float, 9>& data) override;
116  void setProgramUniformFloatMatrix4x4(int contextIdx, int32_t uniformId, const array<float, 16>& data) override;
117  void setProgramUniformFloatMatrices4x4(int contextIdx, int32_t uniformId, int32_t count, FloatBuffer* data) override;
118  void setProgramUniformFloatVec4(int contextIdx, int32_t uniformId, const array<float, 4>& data) override;
119  void setProgramUniformFloatVec3(int contextIdx, int32_t uniformId, const array<float, 3>& data) override;
120  void setProgramUniformFloatVec2(int contextIdx, int32_t uniformId, const array<float, 2>& data) override;
121  void setProgramAttributeLocation(int32_t programId, int32_t location, const string& name) override;
122  void setViewPort(int32_t width, int32_t height) override;
123  void updateViewPort() override;
124  void setClearColor(float red, float green, float blue, float alpha) override;
125  void enableCulling(int contextIdx) override;
126  void disableCulling(int contextIdx) override;
127  void setFrontFace(int contextIdx, int32_t frontFace) override;
128  void setCullFace(int32_t cullFace) override;
129  void enableBlending() override;
130  void enableAdditionBlending() override;
131  void disableBlending() override;
132  void enableDepthBufferWriting() override;
133  void disableDepthBufferWriting() override;
134  void disableDepthBufferTest() override;
135  void enableDepthBufferTest() override;
136  void setDepthFunction(int32_t depthFunction) override;
137  void setColorMask(bool red, bool green, bool blue, bool alpha) override;
138  void clear(int32_t mask) override;
139  int32_t createTexture() override;
140  int32_t createDepthBufferTexture(int32_t width, int32_t height, int32_t cubeMapTextureId, int32_t cubeMapTextureIndex) override;
141  int32_t createColorBufferTexture(int32_t width, int32_t height, int32_t cubeMapTextureId, int32_t cubeMapTextureIndex) override;
142  int32_t createGBufferGeometryTexture(int32_t width, int32_t height) override;
143  int32_t createGBufferColorTexture(int32_t width, int32_t height) override;
144  void uploadTexture(int contextIdx, Texture* texture) override;
145  void uploadCubeMapTexture(int contextIdx, Texture* textureLeft, Texture* textureRight, Texture* textureTop, Texture* textureBottom, Texture* textureFront, Texture* textureBack) override;
146  int32_t createCubeMapTexture(int contextIdx, int32_t width, int32_t height) override;
147  void resizeDepthBufferTexture(int32_t textureId, int32_t width, int32_t height) override;
148  void resizeColorBufferTexture(int32_t textureId, int32_t width, int32_t height) override;
149  void resizeGBufferGeometryTexture(int32_t textureId, int32_t width, int32_t height) override;
150  void resizeGBufferColorTexture(int32_t textureId, int32_t width, int32_t height) override;
151  void bindTexture(int contextIdx, int32_t textureId) override;
152  void bindCubeMapTexture(int contextIdx, int32_t textureId) override;
153  void disposeTexture(int32_t textureId) override;
154  int32_t createFramebufferObject(int32_t depthBufferTextureId, int32_t colorBufferTextureId, int32_t cubeMapTextureId = 0, int32_t cubeMapTextureIndex = 0) override;
156  int32_t depthBufferTextureId,
157  int32_t geometryBufferTextureId1,
158  int32_t geometryBufferTextureId2,
159  int32_t geometryBufferTextureId3,
160  int32_t colorBufferTextureId1,
161  int32_t colorBufferTextureId2,
162  int32_t colorBufferTextureId3,
163  int32_t colorBufferTextureId4,
164  int32_t colorBufferTextureId5
165  ) override;
166  void bindFrameBuffer(int32_t frameBufferId) override;
167  void disposeFrameBufferObject(int32_t frameBufferId) override;
168  vector<int32_t> createBufferObjects(int32_t buffers, bool useGPUMemory, bool shared) override;
169  void uploadBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, FloatBuffer* data) override;
170  void uploadBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, ShortBuffer* data) override;
171  void uploadBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, IntBuffer* data) override;
172  void uploadIndicesBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, ShortBuffer* data) override;
173  void uploadIndicesBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, IntBuffer* data) override;
174  void bindIndicesBufferObject(int contextIdx, int32_t bufferObjectId) override;
175  void bindSolidColorsBufferObject(int contextIdx, int32_t bufferObjectId) override;
176  void bindTextureCoordinatesBufferObject(int contextIdx, int32_t bufferObjectId) override;
177  void bindVerticesBufferObject(int contextIdx, int32_t bufferObjectId) override;
178  void bindVertices2BufferObject(int contextIdx, int32_t bufferObjectId) override;
179  void bindNormalsBufferObject(int contextIdx, int32_t bufferObjectId) override;
180  void bindColorsBufferObject(int contextIdx, int32_t bufferObjectId) override;
181  void bindTangentsBufferObject(int contextIdx, int32_t bufferObjectId) override;
182  void bindBitangentsBufferObject(int contextIdx, int32_t bufferObjectId) override;
183  void bindModelMatricesBufferObject(int contextIdx, int32_t bufferObjectId) override;
184  void bindEffectColorMulsBufferObject(int contextIdx, int32_t bufferObjectId, int32_t divisor) override;
185  void bindEffectColorAddsBufferObject(int contextIdx, int32_t bufferObjectId, int32_t divisor) override;
186  void bindOriginsBufferObject(int contextIdx, int32_t bufferObjectId) override;
187  void bindTextureSpriteIndicesBufferObject(int contextIdx, int32_t bufferObjectId) override;
188  void bindPointSizesBufferObject(int contextIdx, int32_t bufferObjectId) override;
189  void bindSpriteSheetDimensionBufferObject(int contextIdx, int32_t bufferObjectId) override;
190  void drawInstancedIndexedTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset, int32_t instances) override;
191  void drawIndexedTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset) override;
192  void drawInstancedTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset, int32_t instances) override;
193  void drawTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset) override;
194  void drawPointsFromBufferObjects(int contextIdx, int32_t points, int32_t pointsOffset) override;
195  void setLineWidth(float lineWidth) override;
196  void drawLinesFromBufferObjects(int contextIdx, int32_t points, int32_t pointsOffset) override;
197  void unbindBufferObjects(int contextIdx) override;
198  void disposeBufferObjects(vector<int32_t>& bufferObjectIds) override;
199  int32_t getTextureUnit(int contextIdx) override;
200  void setTextureUnit(int contextIdx, int32_t textureUnit) override;
201  float readPixelDepth(int32_t x, int32_t y) override;
202  ByteBuffer* readPixels(int32_t x, int32_t y, int32_t width, int32_t height) override;
203  void initGuiMode() override;
204  void doneGuiMode() override;
205  void dispatchCompute(int contextIdx, int32_t numGroupsX, int32_t numGroupsY, int32_t numGroupsZ) override;
206  void memoryBarrier() override;
207  void uploadSkinningBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, FloatBuffer* data) override;
208  void uploadSkinningBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, IntBuffer* data) override;
209  void bindSkinningVerticesBufferObject(int contextIdx, int32_t bufferObjectId) override;
210  void bindSkinningNormalsBufferObject(int contextIdx, int32_t bufferObjectId) override;
211  void bindSkinningVertexJointsBufferObject(int contextIdx, int32_t bufferObjectId) override;
212  void bindSkinningVertexJointIdxsBufferObject(int contextIdx, int32_t bufferObjectId) override;
213  void bindSkinningVertexJointWeightsBufferObject(int contextIdx, int32_t bufferObjectId) override;
214  void bindSkinningVerticesResultBufferObject(int contextIdx, int32_t bufferObjectId) override;
215  void bindSkinningNormalsResultBufferObject(int contextIdx, int32_t bufferObjectId) override;
216  void bindSkinningMatricesBufferObject(int contextIdx, int32_t bufferObjectId) override;
217  void setVSync(bool vSync) override;
218  const Renderer_Statistics getStatistics() override;
219 
220 private:
221 
222  /**
223  * Checks if GL error did occour
224  */
225  void checkGLError(int line);
226 };
Frame buffer class.
Definition: FrameBuffer.h:22
Texture entity.
Definition: Texture.h:24
void setClearColor(float red, float green, float blue, float alpha) override
Set up clear color.
void enableDepthBufferWriting() override
Enable depth buffer writing.
void bindSpriteSheetDimensionBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind sprite sheet dimension buffer object.
void bindTexture(int contextIdx, int32_t textureId) override
Binds a texture with given id or unbinds when using ID_NONE.
void clear(int32_t mask) override
Clear render buffer with given mask.
void bindTangentsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind tangents buffer object.
void disposeBufferObjects(vector< int32_t > &bufferObjectIds) override
Disposes a frame buffer object.
int32_t getTextureUnit(int contextIdx) override
Get texture unit.
void setProgramUniformFloatMatrix3x3(int contextIdx, int32_t uniformId, const array< float, 9 > &data) override
Set up a float matrix 3x3 uniform value.
void doneGuiMode() override
Set up renderer for 3d rendering.
void setColorMask(bool red, bool green, bool blue, bool alpha) override
Set up GL rendering colormask.
void bindTextureCoordinatesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind texture coordinates buffer object.
void bindSkinningVertexJointWeightsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning vertex joint weights buffer object.
void dispatchCompute(int contextIdx, int32_t numGroupsX, int32_t numGroupsY, int32_t numGroupsZ) override
Dispatch compute.
void attachShaderToProgram(int32_t programId, int32_t shaderId) override
Attaches a shader to a program.
void setFrontFace(int contextIdx, int32_t frontFace) override
Set up clock wise or counter clock wise faces as front face.
void setTextureUnit(int contextIdx, int32_t textureUnit) override
Sets up texture unit.
void drawLinesFromBufferObjects(int contextIdx, int32_t points, int32_t pointsOffset) override
Draw lines from buffer objects.
void disableBlending() override
Disables blending.
void setProgramAttributeLocation(int32_t programId, int32_t location, const string &name) override
Bind attribute to a input location.
void setViewPort(int32_t width, int32_t height) override
Set up viewport parameter.
void bindSkinningVerticesResultBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning vertices result buffer object.
void setProgramUniformFloat(int contextIdx, int32_t uniformId, float value) override
Set up a float uniform value.
const Renderer_Statistics getStatistics() override
void initialize() override
Initialize renderer.
void setVSync(bool vSync) override
Enable/Disable v-sync.
int32_t createGBufferColorTexture(int32_t width, int32_t height) override
Creates a geometry buffer color RGBA texture.
void setProgramUniformFloatVec3(int contextIdx, int32_t uniformId, const array< float, 3 > &data) override
Set up a float vec3 uniform value.
void bindEffectColorAddsBufferObject(int contextIdx, int32_t bufferObjectId, int32_t divisor) override
Bind effect color adds buffer object.
void disposeFrameBufferObject(int32_t frameBufferId) override
Disposes a frame buffer object.
void uploadBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, FloatBuffer *data) override
Uploads buffer data to buffer object.
void memoryBarrier() override
Memory barrier.
void setProgramUniformInteger(int contextIdx, int32_t uniformId, int32_t value) override
Set up a integer uniform value.
int32_t getProgramUniformLocation(int32_t programId, const string &name) override
Returns location of given uniform variable.
void disableDepthBufferWriting() override
Disable depth buffer writing.
void bindSkinningVertexJointIdxsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning vertex joint indices buffer object.
void bindNormalsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind normals buffer object.
void drawPointsFromBufferObjects(int contextIdx, int32_t points, int32_t pointsOffset) override
Draw points from buffer objects.
void drawInstancedTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset, int32_t instances) override
Draw instanced triangles from buffer objects.
void disposeTexture(int32_t textureId) override
Dispose a texture.
int32_t createColorBufferTexture(int32_t width, int32_t height, int32_t cubeMapTextureId, int32_t cubeMapTextureIndex) override
Creates a color buffer texture.
void disableCulling(int contextIdx) override
Disable culling.
void bindEffectColorMulsBufferObject(int contextIdx, int32_t bufferObjectId, int32_t divisor) override
Bind effect color muls buffer object.
unordered_map< uint32_t, int32_t > vbosUsage
Definition: GL3Renderer.h:39
int32_t createCubeMapTexture(int contextIdx, int32_t width, int32_t height) override
Create cube map texture from frame buffers.
int32_t createFramebufferObject(int32_t depthBufferTextureId, int32_t colorBufferTextureId, int32_t cubeMapTextureId=0, int32_t cubeMapTextureIndex=0) override
Creates a frame buffer object with depth texture attached.
int32_t createDepthBufferTexture(int32_t width, int32_t height, int32_t cubeMapTextureId, int32_t cubeMapTextureIndex) override
Creates a depth buffer texture.
void bindCubeMapTexture(int contextIdx, int32_t textureId) override
Binds a cube map texture with given id or unbinds when using ID_NONE.
void setProgramUniformFloatVec4(int contextIdx, int32_t uniformId, const array< float, 4 > &data) override
Set up a float vec4 uniform value.
void setDepthFunction(int32_t depthFunction) override
Set up depth function.
void uploadCubeMapTexture(int contextIdx, Texture *textureLeft, Texture *textureRight, Texture *textureTop, Texture *textureBottom, Texture *textureFront, Texture *textureBack) override
Uploads cube map texture data to current bound texture.
void bindFrameBuffer(int32_t frameBufferId) override
Enables a framebuffer to be rendered.
int32_t loadShader(int32_t type, const string &pathName, const string &fileName, const string &definitions=string(), const string &functions=string()) override
Loads a shader.
void resizeDepthBufferTexture(int32_t textureId, int32_t width, int32_t height) override
Resizes a depth texture.
void resizeGBufferGeometryTexture(int32_t textureId, int32_t width, int32_t height) override
Resizes a geometry buffer geometry texture.
bool isInstancedRenderingAvailable() override
Checks if instanced rendering is available.
void drawTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset) override
Draw triangles from buffer objects.
void initGuiMode() override
Set up renderer for GUI rendering.
void bindSkinningVertexJointsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning vertex joints buffer object.
void setCullFace(int32_t cullFace) override
Sets up which face will be culled.
void enableBlending() override
Enables blending.
void uploadIndicesBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, ShortBuffer *data) override
Uploads buffer data to buffer object.
bool linkProgram(int32_t programId) override
Links attached shaders to a program.
void setProgramUniformFloatMatrix4x4(int contextIdx, int32_t uniformId, const array< float, 16 > &data) override
Set up a float matrix 4x4 uniform value.
void enableCulling(int contextIdx) override
Enable culling.
void bindOriginsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind origins buffer object.
int32_t createProgram(int type) override
Creates a shader program.
void bindIndicesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind indices buffer object.
void initializeFrame() override
Pre Frame Initialization.
int32_t createGBufferGeometryTexture(int32_t width, int32_t height) override
Creates a geometry buffer geometry texture.
void uploadSkinningBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, FloatBuffer *data) override
Upload skinning buffer object.
void enableAdditionBlending() override
Enable blending with c = a + b.
void bindVerticesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind vertices buffer object.
void drawInstancedIndexedTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset, int32_t instances) override
Draw instanced indexed triangles from buffer objects.
void bindVertices2BufferObject(int contextIdx, int32_t bufferObjectId) override
Bind vertices 2 buffer object.
void useProgram(int contextIdx, int32_t programId) override
Use shader program.
void bindColorsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind colors buffer object.
void bindPointSizesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind point sizes buffer object.
void bindSkinningVerticesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning vertices buffer object.
void checkGLError(int line)
Checks if GL error did occour.
void bindBitangentsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind bitangents buffer object.
void bindSkinningNormalsResultBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning normals result buffer object.
void setProgramUniformFloatMatrices4x4(int contextIdx, int32_t uniformId, int32_t count, FloatBuffer *data) override
Set up a float matrices 4x4 uniform values.
void resizeGBufferColorTexture(int32_t textureId, int32_t width, int32_t height) override
Resizes a geometry buffer color RGBA texture.
void bindSkinningMatricesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning matrices result buffer object.
int32_t createGeometryBufferObject(int32_t depthBufferTextureId, int32_t geometryBufferTextureId1, int32_t geometryBufferTextureId2, int32_t geometryBufferTextureId3, int32_t colorBufferTextureId1, int32_t colorBufferTextureId2, int32_t colorBufferTextureId3, int32_t colorBufferTextureId4, int32_t colorBufferTextureId5) override
Creates a geometry frame buffer object.
vector< int32_t > createBufferObjects(int32_t buffers, bool useGPUMemory, bool shared) override
Generate buffer objects for vertex data and such.
void updateViewPort() override
Update viewport.
void bindModelMatricesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind model matrices buffer object.
void drawIndexedTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset) override
Draw indexed triangles from buffer objects.
void disableDepthBufferTest() override
Disable depth buffer test.
void bindSkinningNormalsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning normal buffer object.
void unbindBufferObjects(int contextIdx) override
Unbind buffer objects.
int32_t createTexture() override
Creates a texture.
float readPixelDepth(int32_t x, int32_t y) override
Reads a pixel depth.
void uploadTexture(int contextIdx, Texture *texture) override
Uploads texture data to current bound texture.
void setLineWidth(float lineWidth) override
Set line width.
ByteBuffer * readPixels(int32_t x, int32_t y, int32_t width, int32_t height) override
Read pixels.
void enableDepthBufferTest() override
Enable depth buffer test.
void resizeColorBufferTexture(int32_t textureId, int32_t width, int32_t height) override
Resize color buffer texture.
void bindTextureSpriteIndicesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind texture and sprite indices buffer object.
void setProgramUniformFloatVec2(int contextIdx, int32_t uniformId, const array< float, 2 > &data) override
Set up a float vec2 uniform value.
void bindSolidColorsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind solid colors buffer object.
Byte buffer class.
Definition: ByteBuffer.h:27
Float buffer class.
Definition: FloatBuffer.h:18
Integer buffer class.
Definition: IntBuffer.h:14
Short buffer class.
Definition: ShortBuffer.h:14
#define FORBID_CLASS_COPY(CLASS)
Definition: tdme.h:6