Skip to content

Commit

Permalink
added sdl interception too. added gl function grabbing in case I'd li…
Browse files Browse the repository at this point in the history
…ke to abandon glew.
  • Loading branch information
yours3lf authored and yours3lf committed Jan 9, 2014
1 parent aba81f9 commit a96ff60
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 8 deletions.
8 changes: 6 additions & 2 deletions CMakeLists.txt
Expand Up @@ -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
Expand Down
70 changes: 70 additions & 0 deletions gl_functions.h
@@ -0,0 +1,70 @@
#ifndef gl_functions_h
#define gl_functions_h

#include <GL/gl.h>
#include <GL/glx.h>
#include <GL/glext.h>

#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

51 changes: 45 additions & 6 deletions main.cpp
Expand Up @@ -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 );
Expand All @@ -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;
}
Expand All @@ -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() )
Expand All @@ -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 );

Expand Down Expand Up @@ -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 )
Expand Down Expand Up @@ -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 );
}

0 comments on commit a96ff60

Please sign in to comment.