test/testdyngl.c
author Sam Lantinga <slouken@libsdl.org>
Fri, 30 Apr 2004 18:33:30 +0000
changeset 885 9f6ad2286011
parent 847 0afe0e38e02c
child 910 4ab6d1fd028f
permissions -rw-r--r--
Date: Wed, 28 Apr 2004 16:52:41 -0400
From: "Damien A"
Subject: testdyngl fix

The test program you included in the latest version of SDL crashes on startup in Window (XP). The reason for this is that OpenGL functions on Windows use the __stdcall calling convention, not the C convention. Placing APIENTRY infront of the * operator solves this problem.
     1 /*
     2  * Small SDL example to demonstrate dynamically loading 
     3  * OpenGL lib and functions
     4  *
     5  * (FYI it was supposed to look like snow in the wind or something...)
     6  *
     7  * Compile with :
     8  * gcc testdyngl.c `sdl-config --libs --cflags` -o testdyngl -DHAVE_OPENGL
     9  *
    10  * You can specify a different OpenGL lib on the command line, i.e. :
    11  * ./testdyngl  /usr/X11R6/lib/libGL.so.1.2
    12  * or
    13  * ./testdyngl  /usr/lib/libGL.so.1.0.4496
    14  *
    15  */
    16 
    17 #include <stdio.h>
    18 #include <stdlib.h>
    19 
    20 #include "SDL.h"
    21 
    22 #ifdef HAVE_OPENGL
    23 
    24 #include "SDL_opengl.h"
    25 
    26 void* get_funcaddr(const char* p)
    27 {
    28 	void* f=SDL_GL_GetProcAddress(p);
    29 	if (f)
    30 	{
    31 		return f;
    32 	}
    33 	else
    34 	{
    35 		printf("Unable to get function pointer for %s\n",p);
    36 		exit(1);
    37 	}
    38 }
    39 
    40 typedef struct
    41 {
    42 	void(APIENTRY*glBegin)(GLenum);
    43 	void(APIENTRY*glEnd)();
    44 	void(APIENTRY*glVertex3f)(GLfloat, GLfloat, GLfloat);
    45 	void(APIENTRY*glClearColor)(GLfloat, GLfloat, GLfloat, GLfloat);
    46 	void(APIENTRY*glClear)(GLbitfield);
    47 	void(APIENTRY*glDisable)(GLenum);
    48 	void(APIENTRY*glEnable)(GLenum);
    49 	void(APIENTRY*glColor4ub)(GLubyte,GLubyte,GLubyte,GLubyte);
    50 	void(APIENTRY*glPointSize)(GLfloat);
    51 	void(APIENTRY*glHint)(GLenum,GLenum);
    52 	void(APIENTRY*glBlendFunc)(GLenum,GLenum);
    53 	void(APIENTRY*glMatrixMode)(GLenum);
    54 	void(APIENTRY*glLoadIdentity)();
    55 	void(APIENTRY*glOrtho)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble);
    56 	void(APIENTRY*glRotatef)(GLfloat,GLfloat,GLfloat,GLfloat);
    57 	void(APIENTRY*glViewport)(GLint,GLint,GLsizei,GLsizei);
    58 	void(APIENTRY*glFogf)(GLenum,GLfloat);
    59 }
    60 glfuncs;
    61 
    62 void init_glfuncs(glfuncs* f)
    63 {
    64 	f->glBegin=get_funcaddr("glBegin");
    65 	f->glEnd=get_funcaddr("glEnd");
    66 	f->glVertex3f=get_funcaddr("glVertex3f");
    67 	f->glClearColor=get_funcaddr("glClearColor");
    68 	f->glClear=get_funcaddr("glClear");
    69 	f->glDisable=get_funcaddr("glDisable");
    70 	f->glEnable=get_funcaddr("glEnable");
    71 	f->glColor4ub=get_funcaddr("glColor4ub");
    72 	f->glPointSize=get_funcaddr("glPointSize");
    73 	f->glHint=get_funcaddr("glHint");
    74 	f->glBlendFunc=get_funcaddr("glBlendFunc");
    75 	f->glMatrixMode=get_funcaddr("glMatrixMode");
    76 	f->glLoadIdentity=get_funcaddr("glLoadIdentity");
    77 	f->glOrtho=get_funcaddr("glOrtho");
    78 	f->glRotatef=get_funcaddr("glRotatef");
    79 	f->glViewport=get_funcaddr("glViewport");
    80 	f->glFogf=get_funcaddr("glFogf");
    81 }
    82 
    83 #define NB_PIXELS 1000
    84 
    85 int main(int argc,char *argv[])
    86 {
    87 	glfuncs f;
    88 	int i;
    89 	SDL_Event event;
    90 	int done=0;
    91 	GLfloat pixels[NB_PIXELS*3];
    92 #ifdef _WIN32
    93 	char *gl_library = "OpenGL32.DLL";
    94 #else
    95 	char *gl_library = "libGL.so.1";
    96 #endif
    97 	
    98 	if (argv[1]) {
    99 		gl_library = argv[1];
   100 	}
   101 	
   102 	if (SDL_Init(SDL_INIT_VIDEO)<0)
   103 	{
   104 		printf("Unable to init SDL : %s\n",SDL_GetError());
   105 		exit(1);
   106 	}
   107 	
   108 	if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)<0)
   109 	{
   110 		printf("Unable to set GL attribute : %s\n",SDL_GetError());
   111 		exit(1);
   112 	}
   113 	
   114 	if (SDL_GL_LoadLibrary(gl_library)<0)
   115 	{
   116 		printf("Unable to dynamically open GL lib : %s\n",SDL_GetError());
   117 		exit(1);
   118 	}
   119 
   120 	if (SDL_SetVideoMode(640,480,0,SDL_OPENGL)==NULL)
   121 	{
   122 		printf("Unable to open video mode : %s\n",SDL_GetError());
   123 		exit(1);
   124 	}
   125 
   126 	init_glfuncs(&f);
   127 
   128 	for(i=0;i<NB_PIXELS;i++)
   129 	{
   130 		pixels[3*i]=rand()%250-125;
   131 		pixels[3*i+1]=rand()%250-125;
   132 		pixels[3*i+2]=rand()%250-125;
   133 	}
   134 	
   135 	f.glViewport(0,0,640,480);
   136 	
   137 	f.glMatrixMode(GL_PROJECTION);
   138 	f.glLoadIdentity();
   139 	f.glOrtho(-100,100,-100,100,-500,500);
   140 	
   141 	f.glMatrixMode(GL_MODELVIEW);
   142 	f.glLoadIdentity();
   143 	
   144 	f.glEnable(GL_DEPTH_TEST);
   145 	f.glDisable(GL_TEXTURE_2D);
   146 	f.glEnable(GL_BLEND);
   147 	f.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   148 	
   149 	f.glClearColor(0.0f,0.0f,0.0f,0.0f);
   150 	f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
   151 	
   152 	f.glEnable(GL_POINT_SMOOTH);
   153 	f.glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
   154 	f.glPointSize(5.0f);
   155 	f.glEnable(GL_FOG);
   156 	f.glFogf(GL_FOG_START,-500);
   157 	f.glFogf(GL_FOG_END,500);
   158 	f.glFogf(GL_FOG_DENSITY,0.005);
   159 	
   160 	do
   161 	{
   162 		f.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
   163 		
   164 		f.glRotatef(2.0,1.0,1.0,1.0);
   165 		f.glRotatef(1.0,0.0,1.0,1.0);
   166 		
   167 		f.glColor4ub(255,255,255,255);
   168 		f.glBegin(GL_POINTS);
   169 		for(i=0;i<NB_PIXELS;i++)
   170 		{
   171 			f.glVertex3f(pixels[3*i],pixels[3*i+1],pixels[3*i+2]);
   172 		}
   173 		f.glEnd();
   174 		SDL_GL_SwapBuffers();
   175 
   176 		while(SDL_PollEvent(&event))
   177 		{
   178 			if(event.type & SDL_KEYDOWN)
   179 				done=1;
   180 		}
   181 
   182 		SDL_Delay(20);
   183 	}
   184 	while(!done);
   185 	
   186 	SDL_Quit();
   187 	return 0;
   188 }
   189 
   190 #else /* HAVE_OPENGL */
   191 
   192 int main(int argc, char *argv[])
   193 {
   194 	printf("No OpenGL support on this system\n");
   195 	return 1;
   196 }
   197 
   198 #endif /* HAVE_OPENGL */