~ubuntu-branches/ubuntu/gutsy/kdebase-workspace/gutsy-backports

« back to all changes in this revision

Viewing changes to kwin/lib/kwinglutils_funcs.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2007-09-05 20:45:14 UTC
  • Revision ID: james.westby@ubuntu.com-20070905204514-632hhspl0nvrc84i
Tags: upstream-3.93.0
ImportĀ upstreamĀ versionĀ 3.93.0

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
You can Freely distribute this program under the GNU General Public
 
8
License. See the file "COPYING" for the exact licensing terms.
 
9
******************************************************************/
 
10
 
 
11
#include "kwinglutils.h"
 
12
 
 
13
#include <dlfcn.h>
 
14
 
 
15
 
 
16
// Resolves given function, using getProcAddress
 
17
#define GL_RESOLVE( function )  function = (function ## _func)getProcAddress( #function );
 
18
// Same as above but tries to use function "backup" if "function" doesn't exist
 
19
// Useful when same functionality is also defined in an extension
 
20
#define GL_RESOLVE_WITH_EXT( function, backup ) \
 
21
  function = (function ## _func)getProcAddress( #function ); \
 
22
  if( !function ) \
 
23
    function = (function ## _func)getProcAddress( #backup );
 
24
 
 
25
#ifdef HAVE_OPENGL
 
26
 
 
27
namespace KWin
 
28
{
 
29
 
 
30
// Function pointers
 
31
glXGetProcAddress_func glXGetProcAddress;
 
32
// GLX 1.3
 
33
glXQueryDrawable_func glXQueryDrawable;
 
34
// texture_from_pixmap extension functions
 
35
glXReleaseTexImageEXT_func glXReleaseTexImageEXT;
 
36
glXBindTexImageEXT_func glXBindTexImageEXT;
 
37
// glXCopySubBufferMESA
 
38
glXCopySubBuffer_func glXCopySubBuffer;
 
39
// video_sync extension functions
 
40
glXGetVideoSync_func glXGetVideoSync;
 
41
glXWaitVideoSync_func glXWaitVideoSync;
 
42
// glActiveTexture
 
43
glActiveTexture_func glActiveTexture;
 
44
// framebuffer_object extension functions
 
45
glIsRenderbuffer_func glIsRenderbuffer;
 
46
glBindRenderbuffer_func glBindRenderbuffer;
 
47
glDeleteRenderbuffers_func glDeleteRenderbuffers;
 
48
glGenRenderbuffers_func glGenRenderbuffers;
 
49
glRenderbufferStorage_func glRenderbufferStorage;
 
50
glGetRenderbufferParameteriv_func glGetRenderbufferParameteriv;
 
51
glIsFramebuffer_func glIsFramebuffer;
 
52
glBindFramebuffer_func glBindFramebuffer;
 
53
glDeleteFramebuffers_func glDeleteFramebuffers;
 
54
glGenFramebuffers_func glGenFramebuffers;
 
55
glCheckFramebufferStatus_func glCheckFramebufferStatus;
 
56
glFramebufferTexture1D_func glFramebufferTexture1D;
 
57
glFramebufferTexture2D_func glFramebufferTexture2D;
 
58
glFramebufferTexture3D_func glFramebufferTexture3D;
 
59
glFramebufferRenderbuffer_func glFramebufferRenderbuffer;
 
60
glGetFramebufferAttachmentParameteriv_func glGetFramebufferAttachmentParameteriv;
 
61
glGenerateMipmap_func glGenerateMipmap;
 
62
// Shader functions
 
63
glCreateShader_func glCreateShader;
 
64
glShaderSource_func glShaderSource;
 
65
glCompileShader_func glCompileShader;
 
66
glDeleteShader_func glDeleteShader;
 
67
glCreateProgram_func glCreateProgram;
 
68
glAttachShader_func glAttachShader;
 
69
glLinkProgram_func glLinkProgram;
 
70
glUseProgram_func glUseProgram;
 
71
glDeleteProgram_func glDeleteProgram;
 
72
glGetShaderInfoLog_func glGetShaderInfoLog;
 
73
glGetProgramInfoLog_func glGetProgramInfoLog;
 
74
glGetProgramiv_func glGetProgramiv;
 
75
glGetShaderiv_func glGetShaderiv;
 
76
glUniform1f_func glUniform1f;
 
77
glUniform1i_func glUniform1i;
 
78
glUniform1fv_func glUniform1fv;
 
79
glUniform2fv_func glUniform2fv;
 
80
glValidateProgram_func glValidateProgram;
 
81
glGetUniformLocation_func glGetUniformLocation;
 
82
glVertexAttrib1f_func glVertexAttrib1f;
 
83
glGetAttribLocation_func glGetAttribLocation;
 
84
 
 
85
 
 
86
static glXFuncPtr getProcAddress( const char* name )
 
87
    {
 
88
    glXFuncPtr ret = NULL;
 
89
    if( glXGetProcAddress != NULL )
 
90
        ret = glXGetProcAddress( ( const GLubyte* ) name );
 
91
    if( ret == NULL )
 
92
        ret = ( glXFuncPtr ) dlsym( RTLD_DEFAULT, name );
 
93
    return ret;
 
94
    }
 
95
 
 
96
void glxResolveFunctions()
 
97
    {
 
98
    // handle OpenGL extensions functions
 
99
    glXGetProcAddress = (glXGetProcAddress_func) getProcAddress( "glXGetProcAddress" );
 
100
    if( glXGetProcAddress == NULL )
 
101
        glXGetProcAddress = (glXGetProcAddress_func) getProcAddress( "glXGetProcAddressARB" );
 
102
    glXQueryDrawable = (glXQueryDrawable_func) getProcAddress( "glXQueryDrawable" );
 
103
    if( hasGLExtension( "GLX_EXT_texture_from_pixmap" ))
 
104
        {
 
105
        glXBindTexImageEXT = (glXBindTexImageEXT_func) getProcAddress( "glXBindTexImageEXT" );
 
106
        glXReleaseTexImageEXT = (glXReleaseTexImageEXT_func) getProcAddress( "glXReleaseTexImageEXT" );
 
107
        }
 
108
    else
 
109
        {
 
110
        glXBindTexImageEXT = NULL;
 
111
        glXReleaseTexImageEXT = NULL;
 
112
        }
 
113
    if( hasGLExtension( "GLX_MESA_copy_sub_buffer" ))
 
114
        glXCopySubBuffer = (glXCopySubBuffer_func) getProcAddress( "glXCopySubBufferMESA" );
 
115
    else
 
116
        glXCopySubBuffer = NULL;
 
117
    if( hasGLExtension( "GLX_SGI_video_sync" ))
 
118
        {
 
119
        glXGetVideoSync = (glXGetVideoSync_func) getProcAddress( "glXGetVideoSyncSGI" );
 
120
        glXWaitVideoSync = (glXWaitVideoSync_func) getProcAddress( "glXWaitVideoSyncSGI" );
 
121
        }
 
122
    else
 
123
        {
 
124
        glXGetVideoSync = NULL;
 
125
        glXWaitVideoSync = NULL;
 
126
        }
 
127
    }
 
128
 
 
129
void glResolveFunctions()
 
130
    {
 
131
    if( hasGLExtension( "GL_ARB_multitexture" ))
 
132
        {
 
133
        GL_RESOLVE_WITH_EXT( glActiveTexture, glActiveTextureARB );
 
134
        // Get number of texture units
 
135
        glGetIntegerv(GL_MAX_TEXTURE_UNITS, &glTextureUnitsCount);
 
136
        }
 
137
    else
 
138
        {
 
139
        glActiveTexture = NULL;
 
140
        glTextureUnitsCount = 0;
 
141
        }
 
142
    if( hasGLExtension( "GL_EXT_framebuffer_object" ))
 
143
        {
 
144
        glIsRenderbuffer = (glIsRenderbuffer_func) getProcAddress( "glIsRenderbufferEXT" );
 
145
        glBindRenderbuffer = (glBindRenderbuffer_func) getProcAddress( "glBindRenderbufferEXT" );
 
146
        glDeleteRenderbuffers = (glDeleteRenderbuffers_func) getProcAddress( "glDeleteRenderbuffersEXT" );
 
147
        glGenRenderbuffers = (glGenRenderbuffers_func) getProcAddress( "glGenRenderbuffersEXT" );
 
148
 
 
149
        glRenderbufferStorage = (glRenderbufferStorage_func) getProcAddress( "glRenderbufferStorageEXT" );
 
150
 
 
151
        glGetRenderbufferParameteriv = (glGetRenderbufferParameteriv_func) getProcAddress( "glGetRenderbufferParameterivEXT" );
 
152
 
 
153
        glIsFramebuffer = (glIsFramebuffer_func) getProcAddress( "glIsFramebufferEXT" );
 
154
        glBindFramebuffer = (glBindFramebuffer_func) getProcAddress( "glBindFramebufferEXT" );
 
155
        glDeleteFramebuffers = (glDeleteFramebuffers_func) getProcAddress( "glDeleteFramebuffersEXT" );
 
156
        glGenFramebuffers = (glGenFramebuffers_func) getProcAddress( "glGenFramebuffersEXT" );
 
157
 
 
158
        glCheckFramebufferStatus = (glCheckFramebufferStatus_func) getProcAddress( "glCheckFramebufferStatusEXT" );
 
159
 
 
160
        glFramebufferTexture1D = (glFramebufferTexture1D_func) getProcAddress( "glFramebufferTexture1DEXT" );
 
161
        glFramebufferTexture2D = (glFramebufferTexture2D_func) getProcAddress( "glFramebufferTexture2DEXT" );
 
162
        glFramebufferTexture3D = (glFramebufferTexture3D_func) getProcAddress( "glFramebufferTexture3DEXT" );
 
163
 
 
164
        glFramebufferRenderbuffer = (glFramebufferRenderbuffer_func) getProcAddress( "glFramebufferRenderbufferEXT" );
 
165
 
 
166
        glGetFramebufferAttachmentParameteriv = (glGetFramebufferAttachmentParameteriv_func) getProcAddress( "glGetFramebufferAttachmentParameterivEXT" );
 
167
 
 
168
        glGenerateMipmap = (glGenerateMipmap_func) getProcAddress( "glGenerateMipmapEXT" );
 
169
        }
 
170
    else
 
171
        {
 
172
        glIsRenderbuffer = NULL;
 
173
        glBindRenderbuffer = NULL;
 
174
        glDeleteRenderbuffers = NULL;
 
175
        glGenRenderbuffers = NULL;
 
176
        glRenderbufferStorage = NULL;
 
177
        glGetRenderbufferParameteriv = NULL;
 
178
        glIsFramebuffer = NULL;
 
179
        glBindFramebuffer = NULL;
 
180
        glDeleteFramebuffers = NULL;
 
181
        glGenFramebuffers = NULL;
 
182
        glCheckFramebufferStatus = NULL;
 
183
        glFramebufferTexture1D = NULL;
 
184
        glFramebufferTexture2D = NULL;
 
185
        glFramebufferTexture3D = NULL;
 
186
        glFramebufferRenderbuffer = NULL;
 
187
        glGetFramebufferAttachmentParameteriv = NULL;
 
188
        glGenerateMipmap = NULL;
 
189
        }
 
190
    if( hasGLExtension( "GL_ARB_shading_language_100" ) && hasGLExtension( "GL_ARB_fragment_shader" ))
 
191
        {
 
192
        GL_RESOLVE_WITH_EXT( glCreateShader, glCreateShaderObjectARB );
 
193
        GL_RESOLVE_WITH_EXT( glShaderSource, glShaderSourceARB );
 
194
        GL_RESOLVE_WITH_EXT( glCompileShader, glCompileShaderARB );
 
195
        GL_RESOLVE_WITH_EXT( glDeleteShader, glDeleteObjectARB );
 
196
        GL_RESOLVE_WITH_EXT( glCreateProgram, glCreateProgramObjectARB );
 
197
        GL_RESOLVE_WITH_EXT( glAttachShader, glAttachObjectARB );
 
198
        GL_RESOLVE_WITH_EXT( glLinkProgram, glLinkProgramARB );
 
199
        GL_RESOLVE_WITH_EXT( glUseProgram, glUseProgramObjectARB );
 
200
        GL_RESOLVE_WITH_EXT( glDeleteProgram, glDeleteObjectARB );
 
201
        GL_RESOLVE_WITH_EXT( glGetShaderInfoLog, glGetInfoLogARB );
 
202
        GL_RESOLVE_WITH_EXT( glGetProgramInfoLog, glGetInfoLogARB );
 
203
        GL_RESOLVE_WITH_EXT( glGetProgramiv, glGetObjectParameterivARB );
 
204
        GL_RESOLVE_WITH_EXT( glGetShaderiv, glGetObjectParameterivARB );
 
205
        GL_RESOLVE_WITH_EXT( glUniform1f, glUniform1fARB );
 
206
        GL_RESOLVE_WITH_EXT( glUniform1i, glUniform1iARB );
 
207
        GL_RESOLVE_WITH_EXT( glUniform1fv, glUniform1fvARB );
 
208
        GL_RESOLVE_WITH_EXT( glUniform2fv, glUniform2fvARB );
 
209
        GL_RESOLVE_WITH_EXT( glValidateProgram, glValidateProgramARB );
 
210
        GL_RESOLVE_WITH_EXT( glGetUniformLocation, glGetUniformLocationARB );
 
211
        GL_RESOLVE_WITH_EXT( glVertexAttrib1f, glVertexAttrib1fARB );
 
212
        GL_RESOLVE_WITH_EXT( glGetAttribLocation, glGetAttribLocationARB );
 
213
        }
 
214
    }
 
215
 
 
216
} // namespace
 
217
 
 
218
#endif