draw: Remove dead code.
[mesa.git] / progs / tests / arbgpuprog.c
1 /**
2 * Just compile ARB vert/frag program from named file(s).
3 */
4
5 #include <assert.h>
6 #include <string.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <math.h>
10 #include <GL/glut.h>
11
12
13 static GLuint FragProg;
14 static GLuint VertProg;
15 static GLint Win;
16
17 static PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glProgramLocalParameter4fvARB_func;
18 static PFNGLPROGRAMLOCALPARAMETER4DARBPROC glProgramLocalParameter4dARB_func;
19 static PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glGetProgramLocalParameterdvARB_func;
20 static PFNGLGENPROGRAMSARBPROC glGenProgramsARB_func;
21 static PFNGLPROGRAMSTRINGARBPROC glProgramStringARB_func;
22 static PFNGLBINDPROGRAMARBPROC glBindProgramARB_func;
23 static PFNGLISPROGRAMARBPROC glIsProgramARB_func;
24 static PFNGLDELETEPROGRAMSARBPROC glDeleteProgramsARB_func;
25
26
27 static void Redisplay( void )
28 {
29 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
30 glutSwapBuffers();
31 exit(0);
32 }
33
34
35 static void Reshape( int width, int height )
36 {
37 glViewport( 0, 0, width, height );
38 glMatrixMode( GL_PROJECTION );
39 glLoadIdentity();
40 glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
41 glMatrixMode( GL_MODELVIEW );
42 glLoadIdentity();
43 glTranslatef( 0.0, 0.0, -15.0 );
44 }
45
46
47 static void Key( unsigned char key, int x, int y )
48 {
49 (void) x;
50 (void) y;
51 switch (key) {
52 case 27:
53 glDeleteProgramsARB_func(1, &VertProg);
54 glDeleteProgramsARB_func(1, &FragProg);
55 glutDestroyWindow(Win);
56 exit(0);
57 break;
58 }
59 glutPostRedisplay();
60 }
61
62
63 /* A helper for finding errors in program strings */
64 static int FindLine( const char *program, int position )
65 {
66 int i, line = 1;
67 for (i = 0; i < position; i++) {
68 if (program[i] == '\n')
69 line++;
70 }
71 return line;
72 }
73
74
75 static void Init( const char *vertProgFile,
76 const char *fragProgFile )
77 {
78 GLint errorPos;
79 char buf[10*1000];
80
81 if (!glutExtensionSupported("GL_ARB_vertex_program")) {
82 printf("Sorry, this demo requires GL_ARB_vertex_program\n");
83 exit(1);
84 }
85 if (!glutExtensionSupported("GL_ARB_fragment_program")) {
86 printf("Sorry, this demo requires GL_ARB_fragment_program\n");
87 exit(1);
88 }
89
90 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
91
92 /*
93 * Get extension function pointers.
94 */
95 glProgramLocalParameter4fvARB_func = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) glutGetProcAddress("glProgramLocalParameter4fvARB");
96 assert(glProgramLocalParameter4fvARB_func);
97
98 glProgramLocalParameter4dARB_func = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) glutGetProcAddress("glProgramLocalParameter4dARB");
99 assert(glProgramLocalParameter4dARB_func);
100
101 glGetProgramLocalParameterdvARB_func = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) glutGetProcAddress("glGetProgramLocalParameterdvARB");
102 assert(glGetProgramLocalParameterdvARB_func);
103
104 glGenProgramsARB_func = (PFNGLGENPROGRAMSARBPROC) glutGetProcAddress("glGenProgramsARB");
105 assert(glGenProgramsARB_func);
106
107 glProgramStringARB_func = (PFNGLPROGRAMSTRINGARBPROC) glutGetProcAddress("glProgramStringARB");
108 assert(glProgramStringARB_func);
109
110 glBindProgramARB_func = (PFNGLBINDPROGRAMARBPROC) glutGetProcAddress("glBindProgramARB");
111 assert(glBindProgramARB_func);
112
113 glIsProgramARB_func = (PFNGLISPROGRAMARBPROC) glutGetProcAddress("glIsProgramARB");
114 assert(glIsProgramARB_func);
115
116 glDeleteProgramsARB_func = (PFNGLDELETEPROGRAMSARBPROC) glutGetProcAddress("glDeleteProgramsARB");
117 assert(glDeleteProgramsARB_func);
118
119 /*
120 * Vertex program
121 */
122 if (vertProgFile) {
123 FILE *f;
124 int len;
125
126 glGenProgramsARB_func(1, &VertProg);
127 assert(VertProg > 0);
128 glBindProgramARB_func(GL_VERTEX_PROGRAM_ARB, VertProg);
129
130 f = fopen(vertProgFile, "r");
131 if (!f) {
132 printf("Unable to open %s\n", fragProgFile);
133 exit(1);
134 }
135
136 len = fread(buf, 1, 10*1000,f);
137 fclose(f);
138
139 glProgramStringARB_func(GL_VERTEX_PROGRAM_ARB,
140 GL_PROGRAM_FORMAT_ASCII_ARB,
141 len,
142 (const GLubyte *) buf);
143
144 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
145 if (glGetError() != GL_NO_ERROR || errorPos != -1) {
146 int l = FindLine(buf, errorPos);
147 printf("Vertex Program Error (pos=%d line=%d): %s\n", errorPos, l,
148 (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
149 exit(0);
150 }
151 else {
152 glEnable(GL_VERTEX_PROGRAM_ARB);
153 printf("Vertex Program OK\n");
154 }
155 }
156
157 /*
158 * Fragment program
159 */
160 if (fragProgFile) {
161 FILE *f;
162 int len;
163
164 glGenProgramsARB_func(1, &FragProg);
165 assert(FragProg > 0);
166 glBindProgramARB_func(GL_FRAGMENT_PROGRAM_ARB, FragProg);
167
168 f = fopen(fragProgFile, "r");
169 if (!f) {
170 printf("Unable to open %s\n", fragProgFile);
171 exit(1);
172 }
173
174 len = fread(buf, 1, 10*1000,f);
175 fclose(f);
176
177 glProgramStringARB_func(GL_FRAGMENT_PROGRAM_ARB,
178 GL_PROGRAM_FORMAT_ASCII_ARB,
179 len,
180 (const GLubyte *) buf);
181
182 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
183 if (glGetError() != GL_NO_ERROR || errorPos != -1) {
184 int l = FindLine(buf, errorPos);
185 printf("Fragment Program Error (pos=%d line=%d): %s\n", errorPos, l,
186 (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
187 exit(0);
188 }
189 else {
190 glEnable(GL_FRAGMENT_PROGRAM_ARB);
191 printf("Fragment Program OK\n");
192 }
193 }
194 }
195
196
197 int main( int argc, char *argv[] )
198 {
199 const char *vertProgFile = NULL, *fragProgFile = NULL;
200 int i;
201
202 glutInit( &argc, argv );
203 glutInitWindowPosition( 0, 0 );
204 glutInitWindowSize( 200, 200 );
205 glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
206 Win = glutCreateWindow(argv[0]);
207 glutReshapeFunc( Reshape );
208 glutKeyboardFunc( Key );
209 glutDisplayFunc( Redisplay );
210
211 if (argc == 1) {
212 printf("arbgpuprog:\n");
213 printf(" Compile GL_ARB_vertex/fragment_programs, report any errors.\n");
214 printf("Usage:\n");
215 printf(" arbgpuprog [--vp vertprogfile] [--fp fragprogfile]\n");
216 exit(1);
217 }
218
219 for (i = 1; i < argc; i++) {
220 if (strcmp(argv[i], "--vp") == 0) {
221 vertProgFile = argv[i+1];
222 i++;
223 }
224 else if (strcmp(argv[i], "--fp") == 0) {
225 fragProgFile = argv[i+1];
226 i++;
227 }
228 }
229
230 Init(vertProgFile, fragProgFile);
231
232 glutMainLoop();
233 return 0;
234 }