Merge commit 'origin/master' into gallium-0.2
[mesa.git] / progs / vp / vp-tris.c
1 /* Test glGenProgramsNV(), glIsProgramNV(), glLoadProgramNV() */
2
3 #include <assert.h>
4 #include <string.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <math.h>
8 #include <GL/glut.h>
9
10 #ifndef WIN32
11 #include <unistd.h>
12 #include <signal.h>
13 #define GL_GLEXT_PROTOTYPES
14 #else
15 #include <GL/glext.h>
16 #endif
17
18 #ifdef WIN32
19 static PFNGLBINDPROGRAMARBPROC glBindProgramARB = NULL;
20 static PFNGLGENPROGRAMSARBPROC glGenProgramsARB = NULL;
21 static PFNGLPROGRAMSTRINGARBPROC glProgramStringARB = NULL;
22 static PFNGLISPROGRAMARBPROC glIsProgramARB = NULL;
23
24 static PFNGLBINDPROGRAMNVPROC glBindProgramNV = NULL;
25 static PFNGLGENPROGRAMSNVPROC glGenProgramsNV = NULL;
26 static PFNGLLOADPROGRAMNVPROC glLoadProgramNV = NULL;
27 static PFNGLISPROGRAMNVPROC glIsProgramNV = NULL;
28 #endif
29
30 static const char *filename = NULL;
31 static GLuint nr_steps = 4;
32
33 static void usage( char *name )
34 {
35 fprintf( stderr, "usage: %s [ options ] shader_filename\n", name );
36 fprintf( stderr, "\n" );
37 fprintf( stderr, "options:\n" );
38 fprintf( stderr, " -f flat shaded\n" );
39 fprintf( stderr, " -nNr subdivision steps\n" );
40 fprintf( stderr, " -fps show frames per second\n" );
41 }
42
43 unsigned show_fps = 0;
44 unsigned int frame_cnt = 0;
45
46 #ifndef WIN32
47
48 void alarmhandler(int);
49
50 void alarmhandler (int sig)
51 {
52 if (sig == SIGALRM) {
53 printf("%d frames in 5.0 seconds = %.3f FPS\n", frame_cnt,
54 frame_cnt / 5.0);
55
56 frame_cnt = 0;
57 }
58 signal(SIGALRM, alarmhandler);
59 alarm(5);
60 }
61
62 #endif
63
64 static void args(int argc, char *argv[])
65 {
66 GLint i;
67
68 for (i = 1; i < argc; i++) {
69 if (strncmp(argv[i], "-n", 2) == 0) {
70 nr_steps = atoi((argv[i]) + 2);
71 }
72 else if (strcmp(argv[i], "-f") == 0) {
73 glShadeModel(GL_FLAT);
74 }
75 else if (strcmp(argv[i], "-fps") == 0) {
76 show_fps = 1;
77 }
78 else if (i == argc - 1) {
79 filename = argv[i];
80 }
81 else {
82 usage(argv[0]);
83 exit(1);
84 }
85 }
86
87 if (!filename) {
88 usage(argv[0]);
89 exit(1);
90 }
91 }
92
93
94
95 static void Init( void )
96 {
97 GLint errno;
98 GLuint prognum;
99 char buf[4096];
100 GLuint sz;
101 FILE *f;
102
103 if ((f = fopen(filename, "r")) == NULL) {
104 fprintf(stderr, "couldn't open %s\n", filename);
105 exit(1);
106 }
107
108 sz = (GLuint) fread(buf, 1, sizeof(buf), f);
109 if (!feof(f)) {
110 fprintf(stderr, "file too long\n");
111 exit(1);
112 }
113
114 fprintf(stderr, "%.*s\n", sz, buf);
115
116 if (strncmp( buf, "!!VP", 4 ) == 0) {
117 #ifdef WIN32
118 glBindProgramNV = (PFNGLBINDPROGRAMNVPROC) wglGetProcAddress( "glBindProgramNV" );
119 glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC) wglGetProcAddress( "glGenProgramsNV" );
120 glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC) wglGetProcAddress( "glLoadProgramNV" );
121 glIsProgramNV = (PFNGLISPROGRAMNVPROC) wglGetProcAddress( "glIsProgramNV" );
122 #endif
123
124 glEnable( GL_VERTEX_PROGRAM_NV );
125 glGenProgramsNV( 1, &prognum );
126 glBindProgramNV( GL_VERTEX_PROGRAM_NV, prognum );
127 glLoadProgramNV( GL_VERTEX_PROGRAM_NV, prognum, sz, (const GLubyte *) buf );
128 assert( glIsProgramNV( prognum ) );
129 }
130 else {
131 #ifdef WIN32
132 glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) wglGetProcAddress( "glBindProgramARB" );
133 glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) wglGetProcAddress( "glGenProgramsARB" );
134 glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) wglGetProcAddress( "glProgramStringARB" );
135 glIsProgramARB = (PFNGLISPROGRAMARBPROC) wglGetProcAddress( "glIsProgramARB" );
136 #endif
137
138 glEnable(GL_VERTEX_PROGRAM_ARB);
139
140 glGenProgramsARB(1, &prognum);
141
142 glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum);
143 glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
144 sz, (const GLubyte *) buf);
145 assert(glIsProgramARB(prognum));
146 }
147
148 errno = glGetError();
149 printf("glGetError = %d\n", errno);
150 if (errno != GL_NO_ERROR)
151 {
152 GLint errorpos;
153
154 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos);
155 printf("errorpos: %d\n", errorpos);
156 printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB));
157 }
158 }
159
160
161 union vert {
162 struct {
163 GLfloat color[3];
164 GLfloat pos[3];
165 } v;
166 GLfloat f[6];
167 };
168
169 static void make_midpoint( union vert *out,
170 const union vert *v0,
171 const union vert *v1)
172 {
173 int i;
174 for (i = 0; i < 6; i++)
175 out->f[i] = v0->f[i] + .5 * (v1->f[i] - v0->f[i]);
176 }
177
178 static void subdiv( union vert *v0,
179 union vert *v1,
180 union vert *v2,
181 GLuint depth )
182 {
183 if (depth == 0) {
184 glColor3fv(v0->v.color);
185 glVertex3fv(v0->v.pos);
186 glColor3fv(v1->v.color);
187 glVertex3fv(v1->v.pos);
188 glColor3fv(v2->v.color);
189 glVertex3fv(v2->v.pos);
190 }
191 else {
192 union vert m[3];
193
194 make_midpoint(&m[0], v0, v1);
195 make_midpoint(&m[1], v1, v2);
196 make_midpoint(&m[2], v2, v0);
197
198 subdiv(&m[0], &m[2], v0, depth-1);
199 subdiv(&m[1], &m[0], v1, depth-1);
200 subdiv(&m[2], &m[1], v2, depth-1);
201 subdiv(&m[0], &m[1], &m[2], depth-1);
202 }
203 }
204
205 /** Assignment */
206 #define ASSIGN_3V( V, V0, V1, V2 ) \
207 do { \
208 V[0] = V0; \
209 V[1] = V1; \
210 V[2] = V2; \
211 } while(0)
212
213 static void Display( void )
214 {
215 glClearColor(0.3, 0.3, 0.3, 1);
216 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
217
218 glBegin(GL_TRIANGLES);
219
220
221 {
222 union vert v[3];
223
224 ASSIGN_3V(v[0].v.color, 0,0,1);
225 ASSIGN_3V(v[0].v.pos, 0.9, -0.9, 0.0);
226 ASSIGN_3V(v[1].v.color, 1,0,0);
227 ASSIGN_3V(v[1].v.pos, 0.9, 0.9, 0.0);
228 ASSIGN_3V(v[2].v.color, 0,1,0);
229 ASSIGN_3V(v[2].v.pos, -0.9, 0, 0.0);
230
231 subdiv(&v[0], &v[1], &v[2], nr_steps);
232 }
233
234 glEnd();
235
236
237 glFlush();
238 if (show_fps) {
239 ++frame_cnt;
240 glutPostRedisplay();
241 }
242 }
243
244
245 static void Reshape( int width, int height )
246 {
247 glViewport( 0, 0, width, height );
248 glMatrixMode( GL_PROJECTION );
249 glLoadIdentity();
250 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
251 glMatrixMode( GL_MODELVIEW );
252 glLoadIdentity();
253 /*glTranslatef( 0.0, 0.0, -15.0 );*/
254 }
255
256
257 static void Key( unsigned char key, int x, int y )
258 {
259 (void) x;
260 (void) y;
261 switch (key) {
262 case 27:
263 exit(0);
264 break;
265 }
266 glutPostRedisplay();
267 }
268
269
270
271
272 int main( int argc, char *argv[] )
273 {
274 glutInit( &argc, argv );
275 glutInitWindowPosition( 0, 0 );
276 glutInitWindowSize( 250, 250 );
277 glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH );
278 glutCreateWindow(argv[argc-1]);
279 glutReshapeFunc( Reshape );
280 glutKeyboardFunc( Key );
281 glutDisplayFunc( Display );
282 args( argc, argv );
283 Init();
284 #ifndef WIN32
285 if (show_fps) {
286 signal(SIGALRM, alarmhandler);
287 alarm(5);
288 }
289 #endif
290 glutMainLoop();
291 return 0;
292 }