summaryrefslogtreecommitdiff
path: root/src/graphics/OGLHelper.h
blob: 25531d64016df90f4020ba3e2153d678bb28fa72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
//
//  libavg - Media Playback Engine. 
//  Copyright (C) 2003-2014 Ulrich von Zadow
//
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2 of the License, or (at your option) any later version.
//
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public
//  License along with this library; if not, write to the Free Software
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
//  Current versions can be found at www.libavg.de
//

#ifndef _OGLHelper_H_
#define _OGLHelper_H_

#include "../api.h"
#include "../avgconfigwrapper.h"

#ifdef _WIN32
    #include <windows.h>
    #undef ERROR
    #undef WARNING
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include "GL/glext.h"
    #include "GL/wglext.h"
#else
    #ifdef AVG_ENABLE_EGL
        #define EGL_EGLEXT_PROTOTYPES
        #include <EGL/egl.h>
        #include <GLES2/gl2.h>
        #include <GLES2/gl2ext.h>
    #else
        #include "GL/gl.h"
        #include "GL/glu.h"
        #include "GL/glext.h"
    #endif
#endif
#if defined(linux) && !defined(AVG_ENABLE_EGL)
        #define GLX_GLXEXT_PROTOTYPES
        #ifndef __GLXextFuncPtr
            typedef void (*__GLXextFuncPtr)(void);
        #endif
        #include "GL/glx.h"
#endif

#ifdef linux
    #ifndef GLX_CONTEXT_ES2_PROFILE_BIT_EXT
        #define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
    #endif
#endif

// For NVX_gpu_memory_info
#ifndef GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX
    #define GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX          0x9047
    #define GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX    0x9048
    #define GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX  0x9049
    #define GPU_MEMORY_INFO_EVICTION_COUNT_NVX            0x904A
    #define GPU_MEMORY_INFO_EVICTED_MEMORY_NVX            0x904B
#endif

#include <string>

#ifndef APIENTRY
#define APIENTRY
#endif

namespace avg {

bool AVG_API queryOGLExtension(const char* extName);
bool AVG_API queryGLXExtension(const char* extName);
std::string AVG_API oglModeToString(int mode);

enum OGLMemoryMode { 
    MM_OGL,  // Standard OpenGL
    MM_PBO   // pixel buffer objects
};

std::string oglMemoryMode2String(OGLMemoryMode mode);

void AVG_API clearGLBuffers(GLbitfield mask, bool bOpaque);

typedef void (*GLfunction)();
GLfunction AVG_API getFuzzyProcAddress(const char * psz);
#ifdef linux
GLfunction getglXProcAddress(const char * psz);
#endif

#ifdef AVG_ENABLE_EGL
#define GL_WRITE_ONLY GL_WRITE_ONLY_OES
#define GL_DYNAMIC_READ 0x88E9
#define GL_BGRA 0x80E1

typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, 
        const GLvoid* data, GLenum usage);
typedef void (APIENTRY* DEBUGCALLBACKPROC) (GLenum source, GLenum type, GLuint id,
        GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam);
typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (DEBUGCALLBACKPROC callback,
        void* userParam);
typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers);
typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
typedef void* (GL_APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access);
typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target);
typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, 
        const GLchar** string, const GLint* length);
typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, 
        GLint* params);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, 
        GLint* params);
typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufsize, 
        GLsizei* length, GLchar* infolog);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint shader, GLsizei bufsize, 
        GLsizei* length, GLchar* infolog);
typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
typedef int (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, 
        const GLchar* name);
typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint x);
typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat x);
typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat x, GLfloat y);
typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat x, GLfloat y,
        GLfloat z);
typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat x, GLfloat y,
        GLfloat z, GLfloat w);
typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, 
        const GLfloat* v);
typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, 
        GLboolean transpose, const GLfloat* value);
typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum srcRGB, GLenum dstRGB, 
        GLenum srcAlpha, GLenum dstAlpha);
typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) ( GLenum mode );
typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, 
        GLclampf blue, GLclampf alpha);
typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);
typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers);
typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, 
        GLenum attachment, GLenum textarget, GLuint texture, GLint level);
typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, 
        const GLuint* framebuffers);
typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers);
typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, 
        GLuint renderbuffer);
typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, 
        GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, 
        GLsizei samples,  GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, 
        GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
//TODO: BLITFRAMEBUFFER
typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, 
        const GLuint* renderbuffers);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint indx, GLint size, 
        GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr);
typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, 
        const GLchar* name);
#else
#define PFNGLDEBUGMESSAGECALLBACKPROC PFNGLDEBUGMESSAGECALLBACKARBPROC
#endif

namespace glproc {
    extern AVG_API PFNGLGENBUFFERSPROC GenBuffers;
    extern AVG_API PFNGLBUFFERDATAPROC BufferData;
#ifndef AVG_ENABLE_EGL
    extern AVG_API PFNGLBUFFERSUBDATAPROC BufferSubData;
    extern AVG_API PFNGLGETBUFFERSUBDATAPROC GetBufferSubData;
    extern AVG_API PFNGLDRAWBUFFERSPROC DrawBuffers;
    extern AVG_API PFNGLDRAWRANGEELEMENTSPROC DrawRangeElements;
    extern AVG_API PFNGLBLITFRAMEBUFFERPROC BlitFramebuffer;
    extern AVG_API PFNGLGETOBJECTPARAMETERIVARBPROC GetObjectParameteriv;
#endif
    extern AVG_API PFNGLDEBUGMESSAGECALLBACKPROC DebugMessageCallback;
    extern AVG_API PFNGLDELETEBUFFERSPROC DeleteBuffers;
    extern AVG_API PFNGLBINDBUFFERPROC BindBuffer;
    extern AVG_API PFNGLMAPBUFFERPROC MapBuffer;
    extern AVG_API PFNGLUNMAPBUFFERPROC UnmapBuffer;

    extern AVG_API PFNGLCREATESHADERPROC CreateShader;
    extern AVG_API PFNGLSHADERSOURCEPROC ShaderSource;
    extern AVG_API PFNGLCOMPILESHADERPROC CompileShader;
    extern AVG_API PFNGLCREATEPROGRAMPROC CreateProgram;
    extern AVG_API PFNGLATTACHSHADERPROC AttachShader;
    extern AVG_API PFNGLLINKPROGRAMPROC LinkProgram;
    extern AVG_API PFNGLGETSHADERIVPROC GetShaderiv;
    extern AVG_API PFNGLGETPROGRAMIVPROC GetProgramiv;
    extern AVG_API PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog;
    extern AVG_API PFNGLGETPROGRAMINFOLOGPROC GetProgramInfoLog;
    extern AVG_API PFNGLUSEPROGRAMPROC UseProgram;
    extern AVG_API PFNGLGETUNIFORMLOCATIONPROC GetUniformLocation;
    extern AVG_API PFNGLUNIFORM1IPROC Uniform1i;
    extern AVG_API PFNGLUNIFORM1FPROC Uniform1f;
    extern AVG_API PFNGLUNIFORM2FPROC Uniform2f;
    extern AVG_API PFNGLUNIFORM3FPROC Uniform3f;
    extern AVG_API PFNGLUNIFORM4FPROC Uniform4f;
    extern AVG_API PFNGLUNIFORM1FVPROC Uniform1fv;
    extern AVG_API PFNGLUNIFORMMATRIX4FVPROC UniformMatrix4fv;

    extern AVG_API PFNGLBLENDFUNCSEPARATEPROC BlendFuncSeparate;
    extern AVG_API PFNGLBLENDEQUATIONPROC BlendEquation;
    extern AVG_API PFNGLBLENDCOLORPROC BlendColor;
    extern AVG_API PFNGLACTIVETEXTUREPROC ActiveTexture;
    extern AVG_API PFNGLGENERATEMIPMAPPROC GenerateMipmap;

    extern AVG_API PFNGLCHECKFRAMEBUFFERSTATUSPROC CheckFramebufferStatus;
    extern AVG_API PFNGLGENFRAMEBUFFERSPROC GenFramebuffers;
    extern AVG_API PFNGLBINDFRAMEBUFFERPROC BindFramebuffer;
    extern AVG_API PFNGLFRAMEBUFFERTEXTURE2DPROC FramebufferTexture2D;
    extern AVG_API PFNGLDELETEFRAMEBUFFERSPROC DeleteFramebuffers;
    extern AVG_API PFNGLGENRENDERBUFFERSPROC GenRenderbuffers;
    extern AVG_API PFNGLBINDRENDERBUFFERPROC BindRenderbuffer;
    extern AVG_API PFNGLRENDERBUFFERSTORAGEPROC RenderbufferStorage;
    extern AVG_API PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC
            RenderbufferStorageMultisample;
    extern AVG_API PFNGLFRAMEBUFFERRENDERBUFFERPROC FramebufferRenderbuffer;
    extern AVG_API PFNGLDELETERENDERBUFFERSPROC DeleteRenderbuffers;

    extern AVG_API PFNGLVERTEXATTRIBPOINTERPROC VertexAttribPointer;
    extern AVG_API PFNGLENABLEVERTEXATTRIBARRAYPROC EnableVertexAttribArray;
    extern AVG_API PFNGLBINDATTRIBLOCATIONPROC BindAttribLocation;
#if defined(linux) && !defined(AVG_ENABLE_EGL)
    extern PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT;
#endif
#ifdef _WIN32
    extern AVG_API PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB;
    extern AVG_API PFNWGLGETSWAPINTERVALEXTPROC GetSwapIntervalEXT;
    extern AVG_API PFNWGLSWAPINTERVALEXTPROC SwapIntervalEXT;
#endif
    void init();

    extern void * s_hGLLib;
}

}

#endif