Merge branch 'mesa_7_5_branch'
[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 glProgramStringARB_func(GL_VERTEX_PROGRAM_ARB,
138 GL_PROGRAM_FORMAT_ASCII_ARB,
139 len,
140 (const GLubyte *) buf);
141
142 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
143 if (glGetError() != GL_NO_ERROR || errorPos != -1) {
144 int l = FindLine(buf, errorPos);
145 printf("Vertex Program Error (pos=%d line=%d): %s\n", errorPos, l,
146 (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
147 exit(0);
148 }
149 else {
150 glEnable(GL_VERTEX_PROGRAM_ARB);
151 printf("Vertex Program OK\n");
152 }
153 }
154
155 /*
156 * Fragment program
157 */
158 if (fragProgFile) {
159 FILE *f;
160 int len;
161
162 glGenProgramsARB_func(1, &FragProg);
163 assert(FragProg > 0);
164 glBindProgramARB_func(GL_FRAGMENT_PROGRAM_ARB, FragProg);
165
166 f = fopen(fragProgFile, "r");
167 if (!f) {
168 printf("Unable to open %s\n", fragProgFile);
169 exit(1);
170 }
171
172 len = fread(buf, 1, 10*1000,f);
173 glProgramStringARB_func(GL_FRAGMENT_PROGRAM_ARB,
174 GL_PROGRAM_FORMAT_ASCII_ARB,
175 len,
176 (const GLubyte *) buf);
177
178 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
179 if (glGetError() != GL_NO_ERROR || errorPos != -1) {
180 int l = FindLine(buf, errorPos);
181 printf("Fragment Program Error (pos=%d line=%d): %s\n", errorPos, l,
182 (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
183 exit(0);
184 }
185 else {
186 glEnable(GL_FRAGMENT_PROGRAM_ARB);
187 printf("Fragment Program OK\n");
188 }
189 }
190 }
191
192
193 int main( int argc, char *argv[] )
194 {
195 const char *vertProgFile = NULL, *fragProgFile = NULL;
196 int i;
197
198 glutInit( &argc, argv );
199 glutInitWindowPosition( 0, 0 );
200 glutInitWindowSize( 200, 200 );
201 glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
202 Win = glutCreateWindow(argv[0]);
203 glutReshapeFunc( Reshape );
204 glutKeyboardFunc( Key );
205 glutDisplayFunc( Redisplay );
206
207 if (argc == 1) {
208 printf("arbgpuprog:\n");
209 printf(" Compile GL_ARB_vertex/fragment_programs, report any errors.\n");
210 printf("Usage:\n");
211 printf(" arbgpuprog [--vp vertprogfile] [--fp fragprogfile]\n");
212 exit(1);
213 }
214
215 for (i = 1; i < argc; i++) {
216 if (strcmp(argv[i], "--vp") == 0) {
217 vertProgFile = argv[i+1];
218 i++;
219 }
220 else if (strcmp(argv[i], "--fp") == 0) {
221 fragProgFile = argv[i+1];
222 i++;
223 }
224 }
225
226 Init(vertProgFile, fragProgFile);
227
228 glutMainLoop();
229 return 0;
230 }