From a96ff60cbb110659257a5c353898a832765ba7cd Mon Sep 17 00:00:00 2001 From: yours3lf Date: Thu, 9 Jan 2014 05:23:20 +0100 Subject: [PATCH] added sdl interception too. added gl function grabbing in case I'd like to abandon glew. --- CMakeLists.txt | 8 ++++-- gl_functions.h | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ main.cpp | 51 +++++++++++++++++++++++++++++++----- 3 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 gl_functions.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9612631..2848722 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,12 +43,16 @@ include_directories(${CMAKE_SOURCE_DIR}) link_directories(${CMAKE_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/external/include/) -link_directories(${CMAKE_SOURCE_DIR}/external/lib/) +if( use_32_bit ) + link_directories(${CMAKE_SOURCE_DIR}/external/lib/32bit) +else() + link_directories(${CMAKE_SOURCE_DIR}/external/lib/64bit) +endif() include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) if(UNIX) - set(${project_name}_external_libs sfml-system GL GLEW freetype) + set(${project_name}_external_libs GLEW sfml-system GL freetype) endif() #adding the project's exe diff --git a/gl_functions.h b/gl_functions.h new file mode 100644 index 0000000..afb3a53 --- /dev/null +++ b/gl_functions.h @@ -0,0 +1,70 @@ +#ifndef gl_functions_h +#define gl_functions_h + +#include +#include +#include + +#define TOUBYTE(x) (const GLubyte*)(x) + +static PFNGLUSEPROGRAMPROC glUseProgram; +static PFNGLBINDVERTEXARRAYPROC glBindVertexArray; +static PFNGLBINDBUFFERPROC glBindBuffer; +static PFNGLCREATESHADERPROC glCreateShader; +static PFNGLSHADERSOURCEPROC glShaderSource; +static PFNGLCOMPILESHADERPROC glCompileShader; +static PFNGLGETSHADERIVPROC glGetShaderiv; +static PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog; +static PFNGLATTACHSHADERPROC glAttachShader; +static PFNGLDELETESHADERPROC glDeleteShader; +static PFNGLLINKPROGRAMPROC glLinkProgram; +static PFNGLGETPROGRAMIVPROC glGetProgramiv; +static PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; +static PFNGLVALIDATEPROGRAMPROC glValidateProgram; +static PFNGLCREATEPROGRAMPROC glCreateProgram; +static PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; +static PFNGLDELETEBUFFERSPROC glDeleteBuffers; +static PFNGLDELETEPROGRAMPROC glDeleteProgram; +static PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; +static PFNGLGENBUFFERSPROC glGenBuffers; +static PFNGLBUFFERDATAPROC glBufferData; +static PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; +static PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; +static PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor; +static PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv; +static PFNGLUNIFORM3FVPROC glUniform3fv; +static PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced; + +static void load_gl_functions() +{ + glUseProgram = ( PFNGLUSEPROGRAMPROC )( glXGetProcAddress( TOUBYTE( "glUseProgram" ) ) ); + glBindVertexArray = ( PFNGLBINDVERTEXARRAYPROC )( glXGetProcAddress( TOUBYTE( "glBindVertexArray" ) ) ); + glBindBuffer = ( PFNGLBINDBUFFERPROC )( glXGetProcAddress( TOUBYTE( "glBindBuffer" ) ) ); + glCreateShader = ( PFNGLCREATESHADERPROC )( glXGetProcAddress( TOUBYTE( "glCreateShader" ) ) ); + glShaderSource = ( PFNGLSHADERSOURCEPROC )( glXGetProcAddress( TOUBYTE( "glShaderSource" ) ) ); + glCompileShader = ( PFNGLCOMPILESHADERPROC )( glXGetProcAddress( TOUBYTE( "glCompileShader" ) ) ); + glGetShaderiv = ( PFNGLGETSHADERIVPROC )( glXGetProcAddress( TOUBYTE( "glGetShaderiv" ) ) ); + glGetShaderInfoLog = ( PFNGLGETSHADERINFOLOGPROC )( glXGetProcAddress( TOUBYTE( "glGetShaderInfoLog" ) ) ); + glAttachShader = ( PFNGLATTACHSHADERPROC )( glXGetProcAddress( TOUBYTE( "glAttachShader" ) ) ); + glDeleteShader = ( PFNGLDELETESHADERPROC )( glXGetProcAddress( TOUBYTE( "glDeleteShader" ) ) ); + glLinkProgram = ( PFNGLLINKPROGRAMPROC )( glXGetProcAddress( TOUBYTE( "glLinkProgram" ) ) ); + glGetProgramiv = ( PFNGLGETPROGRAMIVPROC )( glXGetProcAddress( TOUBYTE( "glGetProgramiv" ) ) ); + glGetProgramInfoLog = ( PFNGLGETPROGRAMINFOLOGPROC )( glXGetProcAddress( TOUBYTE( "glGetProgramInfoLog" ) ) ); + glValidateProgram = ( PFNGLVALIDATEPROGRAMPROC )( glXGetProcAddress( TOUBYTE( "glValidateProgram" ) ) ); + glCreateProgram = ( PFNGLCREATEPROGRAMPROC )( glXGetProcAddress( TOUBYTE( "glCreateProgram" ) ) ); + glDeleteVertexArrays = ( PFNGLDELETEVERTEXARRAYSPROC )( glXGetProcAddress( TOUBYTE( "glDeleteVertexArrays" ) ) ); + glDeleteBuffers = ( PFNGLDELETEBUFFERSPROC )( glXGetProcAddress( TOUBYTE( "glDeleteBuffers" ) ) ); + glDeleteProgram = ( PFNGLDELETEPROGRAMPROC )( glXGetProcAddress( TOUBYTE( "glDeleteProgram" ) ) ); + glGenVertexArrays = ( PFNGLGENVERTEXARRAYSPROC )( glXGetProcAddress( TOUBYTE( "glGenVertexArrays" ) ) ); + glGenBuffers = ( PFNGLGENBUFFERSPROC )( glXGetProcAddress( TOUBYTE( "glGenBuffers" ) ) ); + glBufferData = ( PFNGLBUFFERDATAPROC )( glXGetProcAddress( TOUBYTE( "glBufferData" ) ) ); + glEnableVertexAttribArray = ( PFNGLENABLEVERTEXATTRIBARRAYPROC )( glXGetProcAddress( TOUBYTE( "glEnableVertexAttribArray" ) ) ); + glVertexAttribPointer = ( PFNGLVERTEXATTRIBPOINTERPROC )( glXGetProcAddress( TOUBYTE( "glVertexAttribPointer" ) ) ); + glVertexAttribDivisor = ( PFNGLVERTEXATTRIBDIVISORPROC )( glXGetProcAddress( TOUBYTE( "glVertexAttribDivisor" ) ) ); + glUniformMatrix4fv = ( PFNGLUNIFORMMATRIX4FVPROC )( glXGetProcAddress( TOUBYTE( "glUniformMatrix4fv" ) ) ); + glUniform3fv = ( PFNGLUNIFORM3FVPROC )( glXGetProcAddress( TOUBYTE( "glUniform3fv" ) ) ); + glDrawElementsInstanced = ( PFNGLDRAWELEMENTSINSTANCEDPROC )( glXGetProcAddress( TOUBYTE( "glDrawElementsInstanced" ) ) ); +} + +#endif + diff --git a/main.cpp b/main.cpp index c548c30..9f40b5f 100644 --- a/main.cpp +++ b/main.cpp @@ -28,10 +28,12 @@ using namespace std; using namespace mymath; typedef void( *swap_func )( Display*, GLXDrawable ); +typedef void( *sdl_swap_func )( void ); LINUX_GL_FPS_API void init( void ) __attribute__( ( constructor ) ); -static void ( *old_glXSwapBuffers )( Display* display, GLXDrawable drawable ); +static void ( *old_glXSwapBuffers )( Display* display, GLXDrawable drawable ) = 0; +static void ( *old_SDL_GL_SwapBuffers )( void ) = 0; void compile_shader( const char* text, const GLuint& program, const GLenum& type ); void link_shader( const GLuint& shader_program ); @@ -54,8 +56,14 @@ string homepath = ""; LINUX_GL_FPS_API void init( void ) { old_glXSwapBuffers = ( swap_func )dlsym( RTLD_NEXT, "glXSwapBuffers" ); + old_SDL_GL_SwapBuffers = ( sdl_swap_func )dlsym( RTLD_NEXT, "SDL_GL_SwapBuffers" ); + + if( !old_glXSwapBuffers ) + cerr << " -- linux_gl_fps: couldn't get glXSwapBuffers func" << endl; + + if( !old_SDL_GL_SwapBuffers ) + cerr << " -- linux_gl_fps: couldn't get SDL_GL_SwapBuffers func" << endl; - cerr << " -- linux_gl_fps: functions registered" << endl; homepath = string( getenv( "HOME" ) ) + "/"; cerr << " -- linux_gl_fps: home at --> " << homepath << endl; } @@ -67,8 +75,26 @@ void get_screen_size() screen = uvec2( viewport[2], viewport[3] ); } -LINUX_GL_FPS_API void glXSwapBuffers( Display* display, GLXDrawable drawable ) +void display_fps() { + /*if( !old_glXSwapBuffers ) + { + void* libhandle = dlopen( "libGL.so", RTLD_LAZY ); + + if( libhandle ) + { + old_glXSwapBuffers = ( swap_func )dlsym( libhandle, "glXSwapBuffers" ); + + char* error = dlerror(); + + if( error ) + cerr << " -- linux_gl_fps: " << error << endl; + } + else cerr << " -- linux_gl_fps: error loading libGL.so" << endl; + + cerr << " -- linux_gl_fps: functions registered" << endl; + }*/ + //glXGetFBConfigAttrib(); //load shader if not loaded yet if( !font::get().get_shader() && glXGetCurrentContext() ) @@ -88,7 +114,7 @@ LINUX_GL_FPS_API void glXSwapBuffers( Display* display, GLXDrawable drawable ) get_screen_size(); font::get().resize( screen ); - cerr << " -- linux_gl_fps: screen size: " << screen << endl; + cerr << " -- linux_gl_fps: screen size: " << screen; font::get().load_font( homepath + ".linux_gl_fps/resources/font.ttf", instance, size ); @@ -119,8 +145,22 @@ LINUX_GL_FPS_API void glXSwapBuffers( Display* display, GLXDrawable drawable ) font::get().add_to_text( instance, fpstext.c_str() ); font::get().render( instance, vec3( 1 ), uvec2( 10 ) ); } +} + +LINUX_GL_FPS_API void SDL_GL_SwapBuffers( void ) +{ + display_fps(); + + if( old_SDL_GL_SwapBuffers ) + ( *old_SDL_GL_SwapBuffers )(); +} - ( *old_glXSwapBuffers )( display, drawable ); //call original function +LINUX_GL_FPS_API void glXSwapBuffers( Display* display, GLXDrawable drawable ) +{ + display_fps(); + + if( old_glXSwapBuffers ) + ( *old_glXSwapBuffers )( display, drawable ); //call original function } void compile_shader( const char* text, const GLuint& program, const GLenum& type ) @@ -186,4 +226,3 @@ void load_shader( GLuint& program, const GLenum& type, const string& filename ) compile_shader( str.c_str(), program, type ); link_shader( program ); } -