1
/********************************************************************
2
KWin - the KDE window manager
3
This file is part of the KDE project.
5
Copyright (C) 2007 Rivo Laks <rivolaks@hot.ee>
7
This program is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 2 of the License, or
10
(at your option) any later version.
12
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with this program. If not, see <http://www.gnu.org/licenses/>.
19
*********************************************************************/
21
#include "kwinglutils.h"
26
// Resolves given function, using getProcAddress
27
#define GL_RESOLVE( function ) function = (function ## _func)getProcAddress( #function );
28
// Same as above but tries to use function "backup" if "function" doesn't exist
29
// Useful when same functionality is also defined in an extension
30
#define GL_RESOLVE_WITH_EXT( function, backup ) \
31
function = (function ## _func)getProcAddress( #function ); \
33
function = (function ## _func)getProcAddress( #backup );
35
#ifdef KWIN_HAVE_OPENGL
36
#ifndef KWIN_HAVE_OPENGLES
42
glXGetProcAddress_func glXGetProcAddress;
44
glXQueryDrawable_func glXQueryDrawable;
45
// texture_from_pixmap extension functions
46
glXReleaseTexImageEXT_func glXReleaseTexImageEXT;
47
glXBindTexImageEXT_func glXBindTexImageEXT;
48
// glXCopySubBufferMESA
49
glXCopySubBuffer_func glXCopySubBuffer;
50
// video_sync extension functions
51
glXGetVideoSync_func glXGetVideoSync;
52
glXWaitVideoSync_func glXWaitVideoSync;
54
glXGetFBConfigAttrib_func glXGetFBConfigAttrib;
55
glXGetVisualFromFBConfig_func glXGetVisualFromFBConfig;
56
glXCreateWindow_func glXCreateWindow;
57
glXDestroyWindow_func glXDestroyWindow;
58
glXCreatePixmap_func glXCreatePixmap;
59
glXDestroyPixmap_func glXDestroyPixmap;
60
glXGetFBConfigs_func glXGetFBConfigs;
63
glActiveTexture_func glActiveTexture;
64
glBlendColor_func glBlendColor;
65
// framebuffer_object extension functions
66
glIsRenderbuffer_func glIsRenderbuffer;
67
glBindRenderbuffer_func glBindRenderbuffer;
68
glDeleteRenderbuffers_func glDeleteRenderbuffers;
69
glGenRenderbuffers_func glGenRenderbuffers;
70
glRenderbufferStorage_func glRenderbufferStorage;
71
glGetRenderbufferParameteriv_func glGetRenderbufferParameteriv;
72
glIsFramebuffer_func glIsFramebuffer;
73
glBindFramebuffer_func glBindFramebuffer;
74
glDeleteFramebuffers_func glDeleteFramebuffers;
75
glGenFramebuffers_func glGenFramebuffers;
76
glCheckFramebufferStatus_func glCheckFramebufferStatus;
77
glFramebufferTexture1D_func glFramebufferTexture1D;
78
glFramebufferTexture2D_func glFramebufferTexture2D;
79
glFramebufferTexture3D_func glFramebufferTexture3D;
80
glFramebufferRenderbuffer_func glFramebufferRenderbuffer;
81
glGetFramebufferAttachmentParameteriv_func glGetFramebufferAttachmentParameteriv;
82
glGenerateMipmap_func glGenerateMipmap;
84
glCreateShader_func glCreateShader;
85
glShaderSource_func glShaderSource;
86
glCompileShader_func glCompileShader;
87
glDeleteShader_func glDeleteShader;
88
glCreateProgram_func glCreateProgram;
89
glAttachShader_func glAttachShader;
90
glLinkProgram_func glLinkProgram;
91
glUseProgram_func glUseProgram;
92
glDeleteProgram_func glDeleteProgram;
93
glGetShaderInfoLog_func glGetShaderInfoLog;
94
glGetProgramInfoLog_func glGetProgramInfoLog;
95
glGetProgramiv_func glGetProgramiv;
96
glGetShaderiv_func glGetShaderiv;
97
glUniform1f_func glUniform1f;
98
glUniform2f_func glUniform2f;
99
glUniform3f_func glUniform3f;
100
glUniform4f_func glUniform4f;
101
glUniform1i_func glUniform1i;
102
glUniform1fv_func glUniform1fv;
103
glUniform2fv_func glUniform2fv;
104
glUniform3fv_func glUniform3fv;
105
glUniform4fv_func glUniform4fv;
106
glGetUniformfv_func glGetUniformfv;
107
glUniformMatrix4fv_func glUniformMatrix4fv;
108
glValidateProgram_func glValidateProgram;
109
glGetUniformLocation_func glGetUniformLocation;
110
glVertexAttrib1f_func glVertexAttrib1f;
111
glGetAttribLocation_func glGetAttribLocation;
112
glBindAttribLocation_func glBindAttribLocation;
113
glGenProgramsARB_func glGenProgramsARB;
114
glBindProgramARB_func glBindProgramARB;
115
glProgramStringARB_func glProgramStringARB;
116
glProgramLocalParameter4fARB_func glProgramLocalParameter4fARB;
117
glDeleteProgramsARB_func glDeleteProgramsARB;
118
glGetProgramivARB_func glGetProgramivARB;
119
// vertex buffer objects
120
glGenBuffers_func glGenBuffers;
121
glDeleteBuffers_func glDeleteBuffers;
122
glBindBuffer_func glBindBuffer;
123
glBufferData_func glBufferData;
124
glEnableVertexAttribArray_func glEnableVertexAttribArray;
125
glDisableVertexAttribArray_func glDisableVertexAttribArray;
126
glVertexAttribPointer_func glVertexAttribPointer;
129
static glXFuncPtr getProcAddress(const char* name)
131
glXFuncPtr ret = NULL;
132
if (glXGetProcAddress != NULL)
133
ret = glXGetProcAddress((const GLubyte*) name);
135
ret = (glXFuncPtr) dlsym(RTLD_DEFAULT, name);
139
void glxResolveFunctions()
141
// handle OpenGL extensions functions
142
glXGetProcAddress = (glXGetProcAddress_func) getProcAddress("glXGetProcAddress");
143
if (glXGetProcAddress == NULL)
144
glXGetProcAddress = (glXGetProcAddress_func) getProcAddress("glXGetProcAddressARB");
145
glXQueryDrawable = (glXQueryDrawable_func) getProcAddress("glXQueryDrawable");
146
if (hasGLExtension("GLX_EXT_texture_from_pixmap")) {
147
glXBindTexImageEXT = (glXBindTexImageEXT_func) getProcAddress("glXBindTexImageEXT");
148
glXReleaseTexImageEXT = (glXReleaseTexImageEXT_func) getProcAddress("glXReleaseTexImageEXT");
150
glXBindTexImageEXT = NULL;
151
glXReleaseTexImageEXT = NULL;
153
if (hasGLExtension("GLX_MESA_copy_sub_buffer"))
154
glXCopySubBuffer = (glXCopySubBuffer_func) getProcAddress("glXCopySubBufferMESA");
156
glXCopySubBuffer = NULL;
157
if (hasGLExtension("GLX_SGI_video_sync")) {
158
glXGetVideoSync = (glXGetVideoSync_func) getProcAddress("glXGetVideoSyncSGI");
159
glXWaitVideoSync = (glXWaitVideoSync_func) getProcAddress("glXWaitVideoSyncSGI");
161
glXGetVideoSync = NULL;
162
glXWaitVideoSync = NULL;
165
GL_RESOLVE_WITH_EXT(glXGetFBConfigAttrib, glXGetFBConfigAttribSGIX);
166
GL_RESOLVE_WITH_EXT(glXGetVisualFromFBConfig, glXGetVisualFromFBConfigSGIX);
167
GL_RESOLVE(glXGetFBConfigs);
168
GL_RESOLVE(glXCreateWindow);
169
GL_RESOLVE(glXDestroyWindow);
170
GL_RESOLVE(glXCreatePixmap);
171
GL_RESOLVE(glXDestroyPixmap);
174
void glResolveFunctions()
176
if (hasGLExtension("GL_ARB_multitexture")) {
177
GL_RESOLVE_WITH_EXT(glActiveTexture, glActiveTextureARB);
178
// Get number of texture units
179
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &glTextureUnitsCount);
181
glActiveTexture = NULL;
182
glTextureUnitsCount = 0;
184
if (hasGLExtension("GL_EXT_framebuffer_object")) {
185
glIsRenderbuffer = (glIsRenderbuffer_func) getProcAddress("glIsRenderbufferEXT");
186
glBindRenderbuffer = (glBindRenderbuffer_func) getProcAddress("glBindRenderbufferEXT");
187
glDeleteRenderbuffers = (glDeleteRenderbuffers_func) getProcAddress("glDeleteRenderbuffersEXT");
188
glGenRenderbuffers = (glGenRenderbuffers_func) getProcAddress("glGenRenderbuffersEXT");
190
glRenderbufferStorage = (glRenderbufferStorage_func) getProcAddress("glRenderbufferStorageEXT");
192
glGetRenderbufferParameteriv = (glGetRenderbufferParameteriv_func) getProcAddress("glGetRenderbufferParameterivEXT");
194
glIsFramebuffer = (glIsFramebuffer_func) getProcAddress("glIsFramebufferEXT");
195
glBindFramebuffer = (glBindFramebuffer_func) getProcAddress("glBindFramebufferEXT");
196
glDeleteFramebuffers = (glDeleteFramebuffers_func) getProcAddress("glDeleteFramebuffersEXT");
197
glGenFramebuffers = (glGenFramebuffers_func) getProcAddress("glGenFramebuffersEXT");
199
glCheckFramebufferStatus = (glCheckFramebufferStatus_func) getProcAddress("glCheckFramebufferStatusEXT");
201
glFramebufferTexture1D = (glFramebufferTexture1D_func) getProcAddress("glFramebufferTexture1DEXT");
202
glFramebufferTexture2D = (glFramebufferTexture2D_func) getProcAddress("glFramebufferTexture2DEXT");
203
glFramebufferTexture3D = (glFramebufferTexture3D_func) getProcAddress("glFramebufferTexture3DEXT");
205
glFramebufferRenderbuffer = (glFramebufferRenderbuffer_func) getProcAddress("glFramebufferRenderbufferEXT");
207
glGetFramebufferAttachmentParameteriv = (glGetFramebufferAttachmentParameteriv_func) getProcAddress("glGetFramebufferAttachmentParameterivEXT");
209
glGenerateMipmap = (glGenerateMipmap_func) getProcAddress("glGenerateMipmapEXT");
211
glIsRenderbuffer = NULL;
212
glBindRenderbuffer = NULL;
213
glDeleteRenderbuffers = NULL;
214
glGenRenderbuffers = NULL;
215
glRenderbufferStorage = NULL;
216
glGetRenderbufferParameteriv = NULL;
217
glIsFramebuffer = NULL;
218
glBindFramebuffer = NULL;
219
glDeleteFramebuffers = NULL;
220
glGenFramebuffers = NULL;
221
glCheckFramebufferStatus = NULL;
222
glFramebufferTexture1D = NULL;
223
glFramebufferTexture2D = NULL;
224
glFramebufferTexture3D = NULL;
225
glFramebufferRenderbuffer = NULL;
226
glGetFramebufferAttachmentParameteriv = NULL;
227
glGenerateMipmap = NULL;
229
if (hasGLExtension("GL_ARB_shading_language_100") && hasGLExtension("GL_ARB_fragment_shader")) {
230
GL_RESOLVE_WITH_EXT(glCreateShader, glCreateShaderObjectARB);
231
GL_RESOLVE_WITH_EXT(glShaderSource, glShaderSourceARB);
232
GL_RESOLVE_WITH_EXT(glCompileShader, glCompileShaderARB);
233
GL_RESOLVE_WITH_EXT(glDeleteShader, glDeleteObjectARB);
234
GL_RESOLVE_WITH_EXT(glCreateProgram, glCreateProgramObjectARB);
235
GL_RESOLVE_WITH_EXT(glAttachShader, glAttachObjectARB);
236
GL_RESOLVE_WITH_EXT(glLinkProgram, glLinkProgramARB);
237
GL_RESOLVE_WITH_EXT(glUseProgram, glUseProgramObjectARB);
238
GL_RESOLVE_WITH_EXT(glDeleteProgram, glDeleteObjectARB);
239
GL_RESOLVE_WITH_EXT(glGetShaderInfoLog, glGetInfoLogARB);
240
GL_RESOLVE_WITH_EXT(glGetProgramInfoLog, glGetInfoLogARB);
241
GL_RESOLVE_WITH_EXT(glGetProgramiv, glGetObjectParameterivARB);
242
GL_RESOLVE_WITH_EXT(glGetShaderiv, glGetObjectParameterivARB);
243
GL_RESOLVE_WITH_EXT(glUniform1f, glUniform1fARB);
244
GL_RESOLVE_WITH_EXT(glUniform2f, glUniform2fARB);
245
GL_RESOLVE_WITH_EXT(glUniform3f, glUniform3fARB);
246
GL_RESOLVE_WITH_EXT(glUniform4f, glUniform4fARB);
247
GL_RESOLVE_WITH_EXT(glUniform1i, glUniform1iARB);
248
GL_RESOLVE_WITH_EXT(glUniform1fv, glUniform1fvARB);
249
GL_RESOLVE_WITH_EXT(glUniform2fv, glUniform2fvARB);
250
GL_RESOLVE_WITH_EXT(glUniform3fv, glUniform3fvARB);
251
GL_RESOLVE_WITH_EXT(glUniform4fv, glUniform4fvARB);
252
GL_RESOLVE_WITH_EXT(glUniformMatrix4fv, glUniformMatrix4fvARB);
253
GL_RESOLVE_WITH_EXT(glValidateProgram, glValidateProgramARB);
254
GL_RESOLVE_WITH_EXT(glGetUniformLocation, glGetUniformLocationARB);
255
GL_RESOLVE_WITH_EXT(glVertexAttrib1f, glVertexAttrib1fARB);
256
GL_RESOLVE_WITH_EXT(glGetAttribLocation, glGetAttribLocationARB);
257
GL_RESOLVE_WITH_EXT(glBindAttribLocation, glBindAttribLocationARB);
258
GL_RESOLVE_WITH_EXT(glGetUniformfv, glGetUniformfvARB);
260
if (hasGLExtension("GL_ARB_fragment_program") && hasGLExtension("GL_ARB_vertex_program")) {
261
GL_RESOLVE(glProgramStringARB);
262
GL_RESOLVE(glBindProgramARB);
263
GL_RESOLVE(glDeleteProgramsARB);
264
GL_RESOLVE(glGenProgramsARB);
265
GL_RESOLVE(glProgramLocalParameter4fARB);
266
GL_RESOLVE(glGetProgramivARB);
268
GL_RESOLVE_WITH_EXT(glBlendColor, glBlendColorARB);
269
if (hasGLExtension("GL_ARB_vertex_buffer_object")) {
270
GL_RESOLVE_WITH_EXT(glGenBuffers, glGenBuffersARB);
271
GL_RESOLVE_WITH_EXT(glDeleteBuffers, glDeleteBuffersARB);
272
GL_RESOLVE_WITH_EXT(glBindBuffer, glBindBufferARB);
273
GL_RESOLVE_WITH_EXT(glBufferData, glBufferDataARB);
274
GL_RESOLVE_WITH_EXT(glEnableVertexAttribArray, glEnableVertexAttribArrayARB);
275
GL_RESOLVE_WITH_EXT(glDisableVertexAttribArray, glDisableVertexAttribArrayARB);
276
GL_RESOLVE_WITH_EXT(glVertexAttribPointer, glVertexAttribPointerARB);
279
glDeleteBuffers = NULL;
292
eglCreateImageKHR_func eglCreateImageKHR;
293
eglDestroyImageKHR_func eglDestroyImageKHR;
295
glEGLImageTargetTexture2DOES_func glEGLImageTargetTexture2DOES;
297
void eglResolveFunctions()
299
if (hasGLExtension("EGL_KHR_image_pixmap")) {
300
eglCreateImageKHR = (eglCreateImageKHR_func)eglGetProcAddress("eglCreateImageKHR");
301
eglDestroyImageKHR = (eglDestroyImageKHR_func)eglGetProcAddress("eglDestroyImageKHR");
303
eglCreateImageKHR = NULL;
304
eglDestroyImageKHR = NULL;
308
void glResolveFunctions()
310
if (hasGLExtension("GL_OES_EGL_image")) {
311
glEGLImageTargetTexture2DOES = (glEGLImageTargetTexture2DOES_func)eglGetProcAddress("glEGLImageTargetTexture2DOES");
313
glEGLImageTargetTexture2DOES = NULL;