/* * Small SDL example to demonstrate dynamically loading * OpenGL lib and functions * * (FYI it was supposed to look like snow in the wind or something...) * * Compile with : * gcc testdyngl.c `sdl-config --libs --cflags` -o testdyngl * * You can specify a different OpenGL lib on the command line, i.e. : * ./testdyngl /usr/X11R6/lib/libGL.so.1.2 * or * ./testdyngl /usr/lib/libGL.so.1.0.4496 * */ #include #include #include "SDL.h" #ifdef HAVE_OPENGL #include "SDL_opengl.h" void* get_funcaddr(const char* p) { void* f=SDL_GL_GetProcAddress(p); if (f) { return f; } else { printf("Unable to get function pointer for %s\n",p); exit(1); } } typedef struct { void(*glBegin)(GLenum); void(*glEnd)(); void(*glVertex3f)(GLfloat, GLfloat, GLfloat); void(*glClearColor)(GLfloat, GLfloat, GLfloat, GLfloat); void(*glClear)(GLbitfield); void(*glDisable)(GLenum); void(*glEnable)(GLenum); void(*glColor4ub)(GLubyte,GLubyte,GLubyte,GLubyte); void(*glPointSize)(GLfloat); void(*glHint)(GLenum,GLenum); void(*glBlendFunc)(GLenum,GLenum); void(*glMatrixMode)(GLenum); void(*glLoadIdentity)(); void(*glOrtho)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble); void(*glRotatef)(GLfloat,GLfloat,GLfloat,GLfloat); void(*glViewport)(GLint,GLint,GLsizei,GLsizei); void(*glFogf)(GLenum,GLfloat); } glfuncs; void init_glfuncs(glfuncs* f) { f->glBegin=get_funcaddr("glBegin"); f->glEnd=get_funcaddr("glEnd"); f->glVertex3f=get_funcaddr("glVertex3f"); f->glClearColor=get_funcaddr("glClearColor"); f->glClear=get_funcaddr("glClear"); f->glDisable=get_funcaddr("glDisable"); f->glEnable=get_funcaddr("glEnable"); f->glColor4ub=get_funcaddr("glColor4ub"); f->glPointSize=get_funcaddr("glPointSize"); f->glHint=get_funcaddr("glHint"); f->glBlendFunc=get_funcaddr("glBlendFunc"); f->glMatrixMode=get_funcaddr("glMatrixMode"); f->glLoadIdentity=get_funcaddr("glLoadIdentity"); f->glOrtho=get_funcaddr("glOrtho"); f->glRotatef=get_funcaddr("glRotatef"); f->glViewport=get_funcaddr("glViewport"); f->glFogf=get_funcaddr("glFogf"); } #define NB_PIXELS 1000 int main(int argc,char *argv[]) { glfuncs f; int i; SDL_Event event; int done=0; GLfloat pixels[NB_PIXELS*3]; char default_gl_lib[]="/usr/lib/libGL.so"; char* current_gl_lib=default_gl_lib; if (argc==2) { current_gl_lib=argv[1]; } if (SDL_Init(SDL_INIT_EVERYTHING)<0) { printf("Unable to init SDL : %s\n",SDL_GetError()); exit(1); } if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)<0) { printf("Unable to set GL attribute : %s\n",SDL_GetError()); exit(1); } if (SDL_GL_LoadLibrary(current_gl_lib)<0) { printf("Unable to dynamically open GL lib : %s\n",SDL_GetError()); exit(1); } if (SDL_SetVideoMode(640,480,0,SDL_OPENGL)==NULL) { printf("Unable to open video mode : %s\n",SDL_GetError()); exit(1); } init_glfuncs(&f); for(i=0;i