2 * Just compile ARB vert/frag program from named file(s).
13 static GLuint FragProg
;
14 static GLuint VertProg
;
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
;
27 static void Redisplay( void )
29 glClear( GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
35 static void Reshape( int width
, int height
)
37 glViewport( 0, 0, width
, height
);
38 glMatrixMode( GL_PROJECTION
);
40 glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
41 glMatrixMode( GL_MODELVIEW
);
43 glTranslatef( 0.0, 0.0, -15.0 );
47 static void Key( unsigned char key
, int x
, int y
)
53 glDeleteProgramsARB_func(1, &VertProg
);
54 glDeleteProgramsARB_func(1, &FragProg
);
55 glutDestroyWindow(Win
);
63 /* A helper for finding errors in program strings */
64 static int FindLine( const char *program
, int position
)
67 for (i
= 0; i
< position
; i
++) {
68 if (program
[i
] == '\n')
75 static void Init( const char *vertProgFile
,
76 const char *fragProgFile
)
81 if (!glutExtensionSupported("GL_ARB_vertex_program")) {
82 printf("Sorry, this demo requires GL_ARB_vertex_program\n");
85 if (!glutExtensionSupported("GL_ARB_fragment_program")) {
86 printf("Sorry, this demo requires GL_ARB_fragment_program\n");
90 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER
));
93 * Get extension function pointers.
95 glProgramLocalParameter4fvARB_func
= (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC
) glutGetProcAddress("glProgramLocalParameter4fvARB");
96 assert(glProgramLocalParameter4fvARB_func
);
98 glProgramLocalParameter4dARB_func
= (PFNGLPROGRAMLOCALPARAMETER4DARBPROC
) glutGetProcAddress("glProgramLocalParameter4dARB");
99 assert(glProgramLocalParameter4dARB_func
);
101 glGetProgramLocalParameterdvARB_func
= (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC
) glutGetProcAddress("glGetProgramLocalParameterdvARB");
102 assert(glGetProgramLocalParameterdvARB_func
);
104 glGenProgramsARB_func
= (PFNGLGENPROGRAMSARBPROC
) glutGetProcAddress("glGenProgramsARB");
105 assert(glGenProgramsARB_func
);
107 glProgramStringARB_func
= (PFNGLPROGRAMSTRINGARBPROC
) glutGetProcAddress("glProgramStringARB");
108 assert(glProgramStringARB_func
);
110 glBindProgramARB_func
= (PFNGLBINDPROGRAMARBPROC
) glutGetProcAddress("glBindProgramARB");
111 assert(glBindProgramARB_func
);
113 glIsProgramARB_func
= (PFNGLISPROGRAMARBPROC
) glutGetProcAddress("glIsProgramARB");
114 assert(glIsProgramARB_func
);
116 glDeleteProgramsARB_func
= (PFNGLDELETEPROGRAMSARBPROC
) glutGetProcAddress("glDeleteProgramsARB");
117 assert(glDeleteProgramsARB_func
);
126 glGenProgramsARB_func(1, &VertProg
);
127 assert(VertProg
> 0);
128 glBindProgramARB_func(GL_VERTEX_PROGRAM_ARB
, VertProg
);
130 f
= fopen(vertProgFile
, "r");
132 printf("Unable to open %s\n", fragProgFile
);
136 len
= fread(buf
, 1, 10*1000,f
);
139 glProgramStringARB_func(GL_VERTEX_PROGRAM_ARB
,
140 GL_PROGRAM_FORMAT_ASCII_ARB
,
142 (const GLubyte
*) buf
);
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
));
152 glEnable(GL_VERTEX_PROGRAM_ARB
);
153 printf("Vertex Program OK\n");
164 glGenProgramsARB_func(1, &FragProg
);
165 assert(FragProg
> 0);
166 glBindProgramARB_func(GL_FRAGMENT_PROGRAM_ARB
, FragProg
);
168 f
= fopen(fragProgFile
, "r");
170 printf("Unable to open %s\n", fragProgFile
);
174 len
= fread(buf
, 1, 10*1000,f
);
177 glProgramStringARB_func(GL_FRAGMENT_PROGRAM_ARB
,
178 GL_PROGRAM_FORMAT_ASCII_ARB
,
180 (const GLubyte
*) buf
);
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
));
190 glEnable(GL_FRAGMENT_PROGRAM_ARB
);
191 printf("Fragment Program OK\n");
197 int main( int argc
, char *argv
[] )
199 const char *vertProgFile
= NULL
, *fragProgFile
= NULL
;
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
);
212 printf("arbgpuprog:\n");
213 printf(" Compile GL_ARB_vertex/fragment_programs, report any errors.\n");
215 printf(" arbgpuprog [--vp vertprogfile] [--fp fragprogfile]\n");
219 for (i
= 1; i
< argc
; i
++) {
220 if (strcmp(argv
[i
], "--vp") == 0) {
221 vertProgFile
= argv
[i
+1];
224 else if (strcmp(argv
[i
], "--fp") == 0) {
225 fragProgFile
= argv
[i
+1];
230 Init(vertProgFile
, fragProgFile
);