Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
221 lines (184 loc) · 5.98 KB

testdyngl.c

File metadata and controls

221 lines (184 loc) · 5.98 KB
 
Apr 8, 2011
Apr 8, 2011
1
2
3
4
5
6
7
8
9
10
11
/*
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely.
*/
12
13
14
15
16
17
18
/*
* 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 :
Feb 21, 2004
Feb 21, 2004
19
* gcc testdyngl.c `sdl-config --libs --cflags` -o testdyngl -DHAVE_OPENGL
20
21
22
23
24
25
26
27
28
29
30
31
32
*
* 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 <stdio.h>
#include <stdlib.h>
#include "SDL.h"
May 11, 2006
May 11, 2006
33
34
35
36
#ifdef __MACOS__
#define HAVE_OPENGL
#endif
37
38
39
40
#ifdef HAVE_OPENGL
#include "SDL_opengl.h"
Sep 28, 2005
Sep 28, 2005
41
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
Jul 10, 2006
Jul 10, 2006
42
43
static void
quit(int rc)
Sep 28, 2005
Sep 28, 2005
44
{
Jul 10, 2006
Jul 10, 2006
45
46
SDL_Quit();
exit(rc);
Sep 28, 2005
Sep 28, 2005
47
48
}
Jul 10, 2006
Jul 10, 2006
49
50
void *
get_funcaddr(const char *p)
Jul 10, 2006
Jul 10, 2006
52
53
54
55
56
57
58
59
void *f = SDL_GL_GetProcAddress(p);
if (f) {
return f;
} else {
printf("Unable to get function pointer for %s\n", p);
quit(1);
}
return NULL;
60
61
62
63
}
typedef struct
{
Jul 10, 2006
Jul 10, 2006
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
void (APIENTRY * glBegin) (GLenum);
void (APIENTRY * glEnd) ();
void (APIENTRY * glVertex3f) (GLfloat, GLfloat, GLfloat);
void (APIENTRY * glClearColor) (GLfloat, GLfloat, GLfloat, GLfloat);
void (APIENTRY * glClear) (GLbitfield);
void (APIENTRY * glDisable) (GLenum);
void (APIENTRY * glEnable) (GLenum);
void (APIENTRY * glColor4ub) (GLubyte, GLubyte, GLubyte, GLubyte);
void (APIENTRY * glPointSize) (GLfloat);
void (APIENTRY * glHint) (GLenum, GLenum);
void (APIENTRY * glBlendFunc) (GLenum, GLenum);
void (APIENTRY * glMatrixMode) (GLenum);
void (APIENTRY * glLoadIdentity) ();
void (APIENTRY * glOrtho) (GLdouble, GLdouble, GLdouble, GLdouble,
GLdouble, GLdouble);
void (APIENTRY * glRotatef) (GLfloat, GLfloat, GLfloat, GLfloat);
void (APIENTRY * glViewport) (GLint, GLint, GLsizei, GLsizei);
void (APIENTRY * glFogf) (GLenum, GLfloat);
Sep 28, 2009
Sep 28, 2009
82
const GLubyte* (APIENTRY * glGetString) (GLenum);
83
84
85
}
glfuncs;
Jul 10, 2006
Jul 10, 2006
86
87
void
init_glfuncs(glfuncs * f)
Jul 10, 2006
Jul 10, 2006
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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");
Sep 28, 2009
Sep 28, 2009
106
107
108
109
110
111
f->glGetString = get_funcaddr("glGetString");
printf("Vendor : %s\n", f->glGetString(GL_VENDOR));
printf("Renderer : %s\n", f->glGetString(GL_RENDERER));
printf("Version : %s\n", f->glGetString(GL_VERSION));
printf("Extensions : %s\n", f->glGetString(GL_EXTENSIONS));
112
113
114
115
}
#define NB_PIXELS 1000
Jul 10, 2006
Jul 10, 2006
116
117
int
main(int argc, char *argv[])
Jul 10, 2006
Jul 10, 2006
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
glfuncs f;
int i;
SDL_Event event;
int done = 0;
GLfloat pixels[NB_PIXELS * 3];
const char *gl_library = NULL; /* Use the default GL library */
if (argv[1]) {
gl_library = argv[1];
}
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("Unable to init SDL : %s\n", SDL_GetError());
return (1);
}
if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1) < 0) {
printf("Unable to set GL attribute : %s\n", SDL_GetError());
quit(1);
}
if (SDL_GL_LoadLibrary(gl_library) < 0) {
printf("Unable to dynamically open GL lib : %s\n", SDL_GetError());
quit(1);
}
if (SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL) {
printf("Unable to open video mode : %s\n", SDL_GetError());
quit(1);
}
/* Set the window manager title bar */
SDL_WM_SetCaption("SDL Dynamic OpenGL Loading Test", "testdyngl");
init_glfuncs(&f);
for (i = 0; i < NB_PIXELS; i++) {
pixels[3 * i] = rand() % 250 - 125;
pixels[3 * i + 1] = rand() % 250 - 125;
pixels[3 * i + 2] = rand() % 250 - 125;
}
f.glViewport(0, 0, 640, 480);
f.glMatrixMode(GL_PROJECTION);
f.glLoadIdentity();
f.glOrtho(-100, 100, -100, 100, -500, 500);
f.glMatrixMode(GL_MODELVIEW);
f.glLoadIdentity();
f.glEnable(GL_DEPTH_TEST);
f.glDisable(GL_TEXTURE_2D);
f.glEnable(GL_BLEND);
f.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
f.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
f.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
f.glEnable(GL_POINT_SMOOTH);
f.glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
f.glPointSize(5.0f);
f.glEnable(GL_FOG);
f.glFogf(GL_FOG_START, -500);
f.glFogf(GL_FOG_END, 500);
f.glFogf(GL_FOG_DENSITY, 0.005);
do {
f.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
f.glRotatef(2.0, 1.0, 1.0, 1.0);
f.glRotatef(1.0, 0.0, 1.0, 1.0);
f.glColor4ub(255, 255, 255, 255);
f.glBegin(GL_POINTS);
for (i = 0; i < NB_PIXELS; i++) {
f.glVertex3f(pixels[3 * i], pixels[3 * i + 1], pixels[3 * i + 2]);
}
f.glEnd();
SDL_GL_SwapBuffers();
while (SDL_PollEvent(&event)) {
Mar 7, 2008
Mar 7, 2008
201
if (event.type == SDL_KEYDOWN)
Jul 10, 2006
Jul 10, 2006
202
203
204
205
done = 1;
}
SDL_Delay(20);
Aug 27, 2008
Aug 27, 2008
206
} while (!done);
Jul 10, 2006
Jul 10, 2006
207
208
209
SDL_Quit();
return 0;
210
211
212
213
}
#else /* HAVE_OPENGL */
Jul 10, 2006
Jul 10, 2006
214
215
int
main(int argc, char *argv[])
Jul 10, 2006
Jul 10, 2006
217
218
printf("No OpenGL support on this system\n");
return 1;
219
220
221
}
#endif /* HAVE_OPENGL */