gallium: fix refcount bug introduced in eb20e2984
[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 const float Ambient[4] = { 0.0, 1.0, 0.0, 0.0 };
161 const float Diffuse[4] = { 1.0, 0.0, 0.0, 0.0 };
162 const float Specular[4] = { 0.0, 0.0, 1.0, 0.0 };
163 const float Emission[4] = { 0.0, 0.0, 0.0, 1.0 };
164 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, Ambient);
165 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Diffuse);
166 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Specular);
167 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, Emission);
168 }
169 }
170
171
172 union vert {
173 struct {
174 GLfloat color[3];
175 GLfloat pos[3];
176 } v;
177 GLfloat f[6];
178 };
179
180 static void make_midpoint( union vert *out,
181 const union vert *v0,
182 const union vert *v1)
183 {
184 int i;
185 for (i = 0; i < 6; i++)
186 out->f[i] = v0->f[i] + .5 * (v1->f[i] - v0->f[i]);
187 }
188
189 static void subdiv( union vert *v0,
190 union vert *v1,
191 union vert *v2,
192 GLuint depth )
193 {
194 if (depth == 0) {
195 glColor3fv(v0->v.color);
196 glVertex3fv(v0->v.pos);
197 glColor3fv(v1->v.color);
198 glVertex3fv(v1->v.pos);
199 glColor3fv(v2->v.color);
200 glVertex3fv(v2->v.pos);
201 }
202 else {
203 union vert m[3];
204
205 make_midpoint(&m[0], v0, v1);
206 make_midpoint(&m[1], v1, v2);
207 make_midpoint(&m[2], v2, v0);
208
209 subdiv(&m[0], &m[2], v0, depth-1);
210 subdiv(&m[1], &m[0], v1, depth-1);
211 subdiv(&m[2], &m[1], v2, depth-1);
212 subdiv(&m[0], &m[1], &m[2], depth-1);
213 }
214 }
215
216 /** Assignment */
217 #define ASSIGN_3V( V, V0, V1, V2 ) \
218 do { \
219 V[0] = V0; \
220 V[1] = V1; \
221 V[2] = V2; \
222 } while(0)
223
224 static void Display( void )
225 {
226 glClearColor(0.3, 0.3, 0.3, 1);
227 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
228
229 glBegin(GL_TRIANGLES);
230
231
232 {
233 union vert v[3];
234
235 ASSIGN_3V(v[0].v.color, 0,0,1);
236 ASSIGN_3V(v[0].v.pos, 0.9, -0.9, 0.0);
237 ASSIGN_3V(v[1].v.color, 1,0,0);
238 ASSIGN_3V(v[1].v.pos, 0.9, 0.9, 0.0);
239 ASSIGN_3V(v[2].v.color, 0,1,0);
240 ASSIGN_3V(v[2].v.pos, -0.9, 0, 0.0);
241
242 subdiv(&v[0], &v[1], &v[2], nr_steps);
243 }
244
245 glEnd();
246
247
248 glFlush();
249 if (show_fps) {
250 ++frame_cnt;
251 glutPostRedisplay();
252 }
253 }
254
255
256 static void Reshape( int width, int height )
257 {
258 glViewport( 0, 0, width, height );
259 glMatrixMode( GL_PROJECTION );
260 glLoadIdentity();
261 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
262 glMatrixMode( GL_MODELVIEW );
263 glLoadIdentity();
264 /*glTranslatef( 0.0, 0.0, -15.0 );*/
265 }
266
267
268 static void Key( unsigned char key, int x, int y )
269 {
270 (void) x;
271 (void) y;
272 switch (key) {
273 case 27:
274 exit(0);
275 break;
276 }
277 glutPostRedisplay();
278 }
279
280
281
282
283 int main( int argc, char *argv[] )
284 {
285 glutInit( &argc, argv );
286 glutInitWindowPosition( 0, 0 );
287 glutInitWindowSize( 250, 250 );
288 glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH );
289 glutCreateWindow(argv[argc-1]);
290 glutReshapeFunc( Reshape );
291 glutKeyboardFunc( Key );
292 glutDisplayFunc( Display );
293 args( argc, argv );
294 Init();
295 #ifndef WIN32
296 if (show_fps) {
297 signal(SIGALRM, alarmhandler);
298 alarm(5);
299 }
300 #endif
301 glutMainLoop();
302 return 0;
303 }