KWinLibraries
kwinglutils_funcs.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kwinglutils.h"
00022
00023 #include <dlfcn.h>
00024
00025
00026
00027 #define GL_RESOLVE( function ) function = (function ## _func)getProcAddress( #function );
00028
00029
00030 #define GL_RESOLVE_WITH_EXT( function, backup ) \
00031 function = (function ## _func)getProcAddress( #function ); \
00032 if( !function ) \
00033 function = (function ## _func)getProcAddress( #backup );
00034
00035 #ifdef KWIN_HAVE_OPENGL
00036
00037 namespace KWin
00038 {
00039
00040
00041 glXGetProcAddress_func glXGetProcAddress;
00042
00043 glXQueryDrawable_func glXQueryDrawable;
00044
00045 glXReleaseTexImageEXT_func glXReleaseTexImageEXT;
00046 glXBindTexImageEXT_func glXBindTexImageEXT;
00047
00048 glXCopySubBuffer_func glXCopySubBuffer;
00049
00050 glXGetVideoSync_func glXGetVideoSync;
00051 glXWaitVideoSync_func glXWaitVideoSync;
00052
00053 glXGetFBConfigAttrib_func glXGetFBConfigAttrib;
00054 glXGetVisualFromFBConfig_func glXGetVisualFromFBConfig;
00055 glXCreateWindow_func glXCreateWindow;
00056 glXDestroyWindow_func glXDestroyWindow;
00057 glXCreatePixmap_func glXCreatePixmap;
00058 glXDestroyPixmap_func glXDestroyPixmap;
00059 glXGetFBConfigs_func glXGetFBConfigs;
00060
00061
00062 glActiveTexture_func glActiveTexture;
00063
00064 glIsRenderbuffer_func glIsRenderbuffer;
00065 glBindRenderbuffer_func glBindRenderbuffer;
00066 glDeleteRenderbuffers_func glDeleteRenderbuffers;
00067 glGenRenderbuffers_func glGenRenderbuffers;
00068 glRenderbufferStorage_func glRenderbufferStorage;
00069 glGetRenderbufferParameteriv_func glGetRenderbufferParameteriv;
00070 glIsFramebuffer_func glIsFramebuffer;
00071 glBindFramebuffer_func glBindFramebuffer;
00072 glDeleteFramebuffers_func glDeleteFramebuffers;
00073 glGenFramebuffers_func glGenFramebuffers;
00074 glCheckFramebufferStatus_func glCheckFramebufferStatus;
00075 glFramebufferTexture1D_func glFramebufferTexture1D;
00076 glFramebufferTexture2D_func glFramebufferTexture2D;
00077 glFramebufferTexture3D_func glFramebufferTexture3D;
00078 glFramebufferRenderbuffer_func glFramebufferRenderbuffer;
00079 glGetFramebufferAttachmentParameteriv_func glGetFramebufferAttachmentParameteriv;
00080 glGenerateMipmap_func glGenerateMipmap;
00081
00082 glCreateShader_func glCreateShader;
00083 glShaderSource_func glShaderSource;
00084 glCompileShader_func glCompileShader;
00085 glDeleteShader_func glDeleteShader;
00086 glCreateProgram_func glCreateProgram;
00087 glAttachShader_func glAttachShader;
00088 glLinkProgram_func glLinkProgram;
00089 glUseProgram_func glUseProgram;
00090 glDeleteProgram_func glDeleteProgram;
00091 glGetShaderInfoLog_func glGetShaderInfoLog;
00092 glGetProgramInfoLog_func glGetProgramInfoLog;
00093 glGetProgramiv_func glGetProgramiv;
00094 glGetShaderiv_func glGetShaderiv;
00095 glUniform1f_func glUniform1f;
00096 glUniform1i_func glUniform1i;
00097 glUniform1fv_func glUniform1fv;
00098 glUniform2fv_func glUniform2fv;
00099 glValidateProgram_func glValidateProgram;
00100 glGetUniformLocation_func glGetUniformLocation;
00101 glVertexAttrib1f_func glVertexAttrib1f;
00102 glGetAttribLocation_func glGetAttribLocation;
00103
00104
00105 static glXFuncPtr getProcAddress( const char* name )
00106 {
00107 glXFuncPtr ret = NULL;
00108 if( glXGetProcAddress != NULL )
00109 ret = glXGetProcAddress( ( const GLubyte* ) name );
00110 if( ret == NULL )
00111 ret = ( glXFuncPtr ) dlsym( RTLD_DEFAULT, name );
00112 return ret;
00113 }
00114
00115 void glxResolveFunctions()
00116 {
00117
00118 glXGetProcAddress = (glXGetProcAddress_func) getProcAddress( "glXGetProcAddress" );
00119 if( glXGetProcAddress == NULL )
00120 glXGetProcAddress = (glXGetProcAddress_func) getProcAddress( "glXGetProcAddressARB" );
00121 glXQueryDrawable = (glXQueryDrawable_func) getProcAddress( "glXQueryDrawable" );
00122 if( hasGLExtension( "GLX_EXT_texture_from_pixmap" ))
00123 {
00124 glXBindTexImageEXT = (glXBindTexImageEXT_func) getProcAddress( "glXBindTexImageEXT" );
00125 glXReleaseTexImageEXT = (glXReleaseTexImageEXT_func) getProcAddress( "glXReleaseTexImageEXT" );
00126 }
00127 else
00128 {
00129 glXBindTexImageEXT = NULL;
00130 glXReleaseTexImageEXT = NULL;
00131 }
00132 if( hasGLExtension( "GLX_MESA_copy_sub_buffer" ))
00133 glXCopySubBuffer = (glXCopySubBuffer_func) getProcAddress( "glXCopySubBufferMESA" );
00134 else
00135 glXCopySubBuffer = NULL;
00136 if( hasGLExtension( "GLX_SGI_video_sync" ))
00137 {
00138 glXGetVideoSync = (glXGetVideoSync_func) getProcAddress( "glXGetVideoSyncSGI" );
00139 glXWaitVideoSync = (glXWaitVideoSync_func) getProcAddress( "glXWaitVideoSyncSGI" );
00140 }
00141 else
00142 {
00143 glXGetVideoSync = NULL;
00144 glXWaitVideoSync = NULL;
00145 }
00146
00147 GL_RESOLVE_WITH_EXT( glXGetFBConfigAttrib, glXGetFBConfigAttribSGIX );
00148 GL_RESOLVE_WITH_EXT( glXGetVisualFromFBConfig, glXGetVisualFromFBConfigSGIX );
00149 GL_RESOLVE( glXGetFBConfigs );
00150 GL_RESOLVE( glXCreateWindow );
00151 GL_RESOLVE( glXDestroyWindow );
00152 GL_RESOLVE( glXCreatePixmap );
00153 GL_RESOLVE( glXDestroyPixmap );
00154 }
00155
00156 void glResolveFunctions()
00157 {
00158 if( hasGLExtension( "GL_ARB_multitexture" ))
00159 {
00160 GL_RESOLVE_WITH_EXT( glActiveTexture, glActiveTextureARB );
00161
00162 glGetIntegerv(GL_MAX_TEXTURE_UNITS, &glTextureUnitsCount);
00163 }
00164 else
00165 {
00166 glActiveTexture = NULL;
00167 glTextureUnitsCount = 0;
00168 }
00169 if( hasGLExtension( "GL_EXT_framebuffer_object" ))
00170 {
00171 glIsRenderbuffer = (glIsRenderbuffer_func) getProcAddress( "glIsRenderbufferEXT" );
00172 glBindRenderbuffer = (glBindRenderbuffer_func) getProcAddress( "glBindRenderbufferEXT" );
00173 glDeleteRenderbuffers = (glDeleteRenderbuffers_func) getProcAddress( "glDeleteRenderbuffersEXT" );
00174 glGenRenderbuffers = (glGenRenderbuffers_func) getProcAddress( "glGenRenderbuffersEXT" );
00175
00176 glRenderbufferStorage = (glRenderbufferStorage_func) getProcAddress( "glRenderbufferStorageEXT" );
00177
00178 glGetRenderbufferParameteriv = (glGetRenderbufferParameteriv_func) getProcAddress( "glGetRenderbufferParameterivEXT" );
00179
00180 glIsFramebuffer = (glIsFramebuffer_func) getProcAddress( "glIsFramebufferEXT" );
00181 glBindFramebuffer = (glBindFramebuffer_func) getProcAddress( "glBindFramebufferEXT" );
00182 glDeleteFramebuffers = (glDeleteFramebuffers_func) getProcAddress( "glDeleteFramebuffersEXT" );
00183 glGenFramebuffers = (glGenFramebuffers_func) getProcAddress( "glGenFramebuffersEXT" );
00184
00185 glCheckFramebufferStatus = (glCheckFramebufferStatus_func) getProcAddress( "glCheckFramebufferStatusEXT" );
00186
00187 glFramebufferTexture1D = (glFramebufferTexture1D_func) getProcAddress( "glFramebufferTexture1DEXT" );
00188 glFramebufferTexture2D = (glFramebufferTexture2D_func) getProcAddress( "glFramebufferTexture2DEXT" );
00189 glFramebufferTexture3D = (glFramebufferTexture3D_func) getProcAddress( "glFramebufferTexture3DEXT" );
00190
00191 glFramebufferRenderbuffer = (glFramebufferRenderbuffer_func) getProcAddress( "glFramebufferRenderbufferEXT" );
00192
00193 glGetFramebufferAttachmentParameteriv = (glGetFramebufferAttachmentParameteriv_func) getProcAddress( "glGetFramebufferAttachmentParameterivEXT" );
00194
00195 glGenerateMipmap = (glGenerateMipmap_func) getProcAddress( "glGenerateMipmapEXT" );
00196 }
00197 else
00198 {
00199 glIsRenderbuffer = NULL;
00200 glBindRenderbuffer = NULL;
00201 glDeleteRenderbuffers = NULL;
00202 glGenRenderbuffers = NULL;
00203 glRenderbufferStorage = NULL;
00204 glGetRenderbufferParameteriv = NULL;
00205 glIsFramebuffer = NULL;
00206 glBindFramebuffer = NULL;
00207 glDeleteFramebuffers = NULL;
00208 glGenFramebuffers = NULL;
00209 glCheckFramebufferStatus = NULL;
00210 glFramebufferTexture1D = NULL;
00211 glFramebufferTexture2D = NULL;
00212 glFramebufferTexture3D = NULL;
00213 glFramebufferRenderbuffer = NULL;
00214 glGetFramebufferAttachmentParameteriv = NULL;
00215 glGenerateMipmap = NULL;
00216 }
00217 if( hasGLExtension( "GL_ARB_shading_language_100" ) && hasGLExtension( "GL_ARB_fragment_shader" ))
00218 {
00219 GL_RESOLVE_WITH_EXT( glCreateShader, glCreateShaderObjectARB );
00220 GL_RESOLVE_WITH_EXT( glShaderSource, glShaderSourceARB );
00221 GL_RESOLVE_WITH_EXT( glCompileShader, glCompileShaderARB );
00222 GL_RESOLVE_WITH_EXT( glDeleteShader, glDeleteObjectARB );
00223 GL_RESOLVE_WITH_EXT( glCreateProgram, glCreateProgramObjectARB );
00224 GL_RESOLVE_WITH_EXT( glAttachShader, glAttachObjectARB );
00225 GL_RESOLVE_WITH_EXT( glLinkProgram, glLinkProgramARB );
00226 GL_RESOLVE_WITH_EXT( glUseProgram, glUseProgramObjectARB );
00227 GL_RESOLVE_WITH_EXT( glDeleteProgram, glDeleteObjectARB );
00228 GL_RESOLVE_WITH_EXT( glGetShaderInfoLog, glGetInfoLogARB );
00229 GL_RESOLVE_WITH_EXT( glGetProgramInfoLog, glGetInfoLogARB );
00230 GL_RESOLVE_WITH_EXT( glGetProgramiv, glGetObjectParameterivARB );
00231 GL_RESOLVE_WITH_EXT( glGetShaderiv, glGetObjectParameterivARB );
00232 GL_RESOLVE_WITH_EXT( glUniform1f, glUniform1fARB );
00233 GL_RESOLVE_WITH_EXT( glUniform1i, glUniform1iARB );
00234 GL_RESOLVE_WITH_EXT( glUniform1fv, glUniform1fvARB );
00235 GL_RESOLVE_WITH_EXT( glUniform2fv, glUniform2fvARB );
00236 GL_RESOLVE_WITH_EXT( glValidateProgram, glValidateProgramARB );
00237 GL_RESOLVE_WITH_EXT( glGetUniformLocation, glGetUniformLocationARB );
00238 GL_RESOLVE_WITH_EXT( glVertexAttrib1f, glVertexAttrib1fARB );
00239 GL_RESOLVE_WITH_EXT( glGetAttribLocation, glGetAttribLocationARB );
00240 }
00241 }
00242
00243 }
00244
00245 #endif