~ubuntu-branches/ubuntu/utopic/kde-workspace/utopic-proposed

« back to all changes in this revision

Viewing changes to kwin/libkwineffects/kwinglutils_funcs.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Michał Zając
  • Date: 2011-07-09 08:31:15 UTC
  • Revision ID: james.westby@ubuntu.com-20110709083115-ohyxn6z93mily9fc
Tags: upstream-4.6.90
Import upstream version 4.6.90

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/********************************************************************
 
2
 KWin - the KDE window manager
 
3
 This file is part of the KDE project.
 
4
 
 
5
Copyright (C) 2007 Rivo Laks <rivolaks@hot.ee>
 
6
 
 
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.
 
11
 
 
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.
 
16
 
 
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
*********************************************************************/
 
20
 
 
21
#include "kwinglutils.h"
 
22
 
 
23
#include <dlfcn.h>
 
24
 
 
25
 
 
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 ); \
 
32
    if ( !function ) \
 
33
        function = (function ## _func)getProcAddress( #backup );
 
34
 
 
35
#ifdef KWIN_HAVE_OPENGL
 
36
#ifndef KWIN_HAVE_OPENGLES
 
37
 
 
38
namespace KWin
 
39
{
 
40
 
 
41
// Function pointers
 
42
glXGetProcAddress_func glXGetProcAddress;
 
43
// GLX 1.3
 
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;
 
53
// GLX_SGIX_fbconfig
 
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;
 
61
 
 
62
// glActiveTexture
 
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;
 
83
// Shader functions
 
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;
 
127
 
 
128
 
 
129
static glXFuncPtr getProcAddress(const char* name)
 
130
{
 
131
    glXFuncPtr ret = NULL;
 
132
    if (glXGetProcAddress != NULL)
 
133
        ret = glXGetProcAddress((const GLubyte*) name);
 
134
    if (ret == NULL)
 
135
        ret = (glXFuncPtr) dlsym(RTLD_DEFAULT, name);
 
136
    return ret;
 
137
}
 
138
 
 
139
void glxResolveFunctions()
 
140
{
 
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");
 
149
    } else {
 
150
        glXBindTexImageEXT = NULL;
 
151
        glXReleaseTexImageEXT = NULL;
 
152
    }
 
153
    if (hasGLExtension("GLX_MESA_copy_sub_buffer"))
 
154
        glXCopySubBuffer = (glXCopySubBuffer_func) getProcAddress("glXCopySubBufferMESA");
 
155
    else
 
156
        glXCopySubBuffer = NULL;
 
157
    if (hasGLExtension("GLX_SGI_video_sync")) {
 
158
        glXGetVideoSync = (glXGetVideoSync_func) getProcAddress("glXGetVideoSyncSGI");
 
159
        glXWaitVideoSync = (glXWaitVideoSync_func) getProcAddress("glXWaitVideoSyncSGI");
 
160
    } else {
 
161
        glXGetVideoSync = NULL;
 
162
        glXWaitVideoSync = NULL;
 
163
    }
 
164
 
 
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);
 
172
}
 
173
 
 
174
void glResolveFunctions()
 
175
{
 
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);
 
180
    } else {
 
181
        glActiveTexture = NULL;
 
182
        glTextureUnitsCount = 0;
 
183
    }
 
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");
 
189
 
 
190
        glRenderbufferStorage = (glRenderbufferStorage_func) getProcAddress("glRenderbufferStorageEXT");
 
191
 
 
192
        glGetRenderbufferParameteriv = (glGetRenderbufferParameteriv_func) getProcAddress("glGetRenderbufferParameterivEXT");
 
193
 
 
194
        glIsFramebuffer = (glIsFramebuffer_func) getProcAddress("glIsFramebufferEXT");
 
195
        glBindFramebuffer = (glBindFramebuffer_func) getProcAddress("glBindFramebufferEXT");
 
196
        glDeleteFramebuffers = (glDeleteFramebuffers_func) getProcAddress("glDeleteFramebuffersEXT");
 
197
        glGenFramebuffers = (glGenFramebuffers_func) getProcAddress("glGenFramebuffersEXT");
 
198
 
 
199
        glCheckFramebufferStatus = (glCheckFramebufferStatus_func) getProcAddress("glCheckFramebufferStatusEXT");
 
200
 
 
201
        glFramebufferTexture1D = (glFramebufferTexture1D_func) getProcAddress("glFramebufferTexture1DEXT");
 
202
        glFramebufferTexture2D = (glFramebufferTexture2D_func) getProcAddress("glFramebufferTexture2DEXT");
 
203
        glFramebufferTexture3D = (glFramebufferTexture3D_func) getProcAddress("glFramebufferTexture3DEXT");
 
204
 
 
205
        glFramebufferRenderbuffer = (glFramebufferRenderbuffer_func) getProcAddress("glFramebufferRenderbufferEXT");
 
206
 
 
207
        glGetFramebufferAttachmentParameteriv = (glGetFramebufferAttachmentParameteriv_func) getProcAddress("glGetFramebufferAttachmentParameterivEXT");
 
208
 
 
209
        glGenerateMipmap = (glGenerateMipmap_func) getProcAddress("glGenerateMipmapEXT");
 
210
    } else {
 
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;
 
228
    }
 
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);
 
259
    }
 
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);
 
267
    }
 
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);
 
277
    } else {
 
278
        glGenBuffers = NULL;
 
279
        glDeleteBuffers = NULL;
 
280
        glBindBuffer = NULL;
 
281
        glBufferData = NULL;
 
282
    }
 
283
}
 
284
 
 
285
} // namespace
 
286
 
 
287
#else
 
288
namespace KWin
 
289
{
 
290
 
 
291
// EGL
 
292
eglCreateImageKHR_func eglCreateImageKHR;
 
293
eglDestroyImageKHR_func eglDestroyImageKHR;
 
294
// GLES
 
295
glEGLImageTargetTexture2DOES_func glEGLImageTargetTexture2DOES;
 
296
 
 
297
void eglResolveFunctions()
 
298
{
 
299
    if (hasGLExtension("EGL_KHR_image_pixmap")) {
 
300
        eglCreateImageKHR = (eglCreateImageKHR_func)eglGetProcAddress("eglCreateImageKHR");
 
301
        eglDestroyImageKHR = (eglDestroyImageKHR_func)eglGetProcAddress("eglDestroyImageKHR");
 
302
    } else {
 
303
        eglCreateImageKHR = NULL;
 
304
        eglDestroyImageKHR = NULL;
 
305
    }
 
306
}
 
307
 
 
308
void glResolveFunctions()
 
309
{
 
310
    if (hasGLExtension("GL_OES_EGL_image")) {
 
311
        glEGLImageTargetTexture2DOES = (glEGLImageTargetTexture2DOES_func)eglGetProcAddress("glEGLImageTargetTexture2DOES");
 
312
    } else {
 
313
        glEGLImageTargetTexture2DOES = NULL;
 
314
    }
 
315
}
 
316
 
 
317
} // namespace
 
318
#endif
 
319
#endif