Use glad instead of GLEW.
[mesa-demos.git] / src / tests / arbgpuprog.c
blobfa37ad4a09287c2d91da1fb9a731c1e46e0eb595
1 /**
2 * Just compile ARB vert/frag program from named file(s).
3 */
5 #include <assert.h>
6 #include <string.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <math.h>
10 #include <glad/glad.h>
11 #include "glut_wrap.h"
14 static GLuint FragProg;
15 static GLuint VertProg;
16 static GLint Win;
19 static void Redisplay( void )
21 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
22 glutSwapBuffers();
23 exit(0);
27 static void Reshape( int width, int height )
29 glViewport( 0, 0, width, height );
30 glMatrixMode( GL_PROJECTION );
31 glLoadIdentity();
32 glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
33 glMatrixMode( GL_MODELVIEW );
34 glLoadIdentity();
35 glTranslatef( 0.0, 0.0, -15.0 );
39 static void Key( unsigned char key, int x, int y )
41 (void) x;
42 (void) y;
43 switch (key) {
44 case 27:
45 glDeleteProgramsARB(1, &VertProg);
46 glDeleteProgramsARB(1, &FragProg);
47 glutDestroyWindow(Win);
48 exit(0);
49 break;
51 glutPostRedisplay();
55 /* A helper for finding errors in program strings */
56 static int FindLine( const char *program, int position )
58 int i, line = 1;
59 for (i = 0; i < position; i++) {
60 if (program[i] == '\n')
61 line++;
63 return line;
67 static void Init( const char *vertProgFile,
68 const char *fragProgFile )
70 GLint errorPos;
71 char buf[10*1000];
73 if (!glutExtensionSupported("GL_ARB_vertex_program")) {
74 printf("Sorry, this demo requires GL_ARB_vertex_program\n");
75 exit(1);
77 if (!glutExtensionSupported("GL_ARB_fragment_program")) {
78 printf("Sorry, this demo requires GL_ARB_fragment_program\n");
79 exit(1);
82 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
85 * Vertex program
87 if (vertProgFile) {
88 FILE *f;
89 int len;
91 glGenProgramsARB(1, &VertProg);
92 assert(VertProg > 0);
93 glBindProgramARB(GL_VERTEX_PROGRAM_ARB, VertProg);
95 f = fopen(vertProgFile, "r");
96 if (!f) {
97 printf("Unable to open %s\n", fragProgFile);
98 exit(1);
101 len = fread(buf, 1, 10*1000,f);
102 fclose(f);
104 glProgramStringARB(GL_VERTEX_PROGRAM_ARB,
105 GL_PROGRAM_FORMAT_ASCII_ARB,
106 len,
107 (const GLubyte *) buf);
109 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
110 if (glGetError() != GL_NO_ERROR || errorPos != -1) {
111 int l = FindLine(buf, errorPos);
112 printf("Vertex Program Error (pos=%d line=%d): %s\n", errorPos, l,
113 (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
114 exit(0);
116 else {
117 glEnable(GL_VERTEX_PROGRAM_ARB);
118 printf("Vertex Program OK\n");
123 * Fragment program
125 if (fragProgFile) {
126 FILE *f;
127 int len;
129 glGenProgramsARB(1, &FragProg);
130 assert(FragProg > 0);
131 glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, FragProg);
133 f = fopen(fragProgFile, "r");
134 if (!f) {
135 printf("Unable to open %s\n", fragProgFile);
136 exit(1);
139 len = fread(buf, 1, 10*1000,f);
140 fclose(f);
142 glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB,
143 GL_PROGRAM_FORMAT_ASCII_ARB,
144 len,
145 (const GLubyte *) buf);
147 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
148 if (glGetError() != GL_NO_ERROR || errorPos != -1) {
149 int l = FindLine(buf, errorPos);
150 printf("Fragment Program Error (pos=%d line=%d): %s\n", errorPos, l,
151 (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
152 exit(0);
154 else {
155 glEnable(GL_FRAGMENT_PROGRAM_ARB);
156 printf("Fragment Program OK\n");
162 int main( int argc, char *argv[] )
164 const char *vertProgFile = NULL, *fragProgFile = NULL;
165 int i;
167 glutInit( &argc, argv );
168 glutInitWindowPosition( 0, 0 );
169 glutInitWindowSize( 200, 200 );
170 glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
171 Win = glutCreateWindow(argv[0]);
172 gladLoadGL();
173 glutReshapeFunc( Reshape );
174 glutKeyboardFunc( Key );
175 glutDisplayFunc( Redisplay );
177 if (argc == 1) {
178 printf("arbgpuprog:\n");
179 printf(" Compile GL_ARB_vertex/fragment_programs, report any errors.\n");
180 printf("Usage:\n");
181 printf(" arbgpuprog [--vp vertprogfile] [--fp fragprogfile]\n");
182 exit(1);
185 for (i = 1; i < argc; i++) {
186 if (strcmp(argv[i], "--vp") == 0) {
187 vertProgFile = argv[i+1];
188 i++;
190 else if (strcmp(argv[i], "--fp") == 0) {
191 fragProgFile = argv[i+1];
192 i++;
196 Init(vertProgFile, fragProgFile);
198 glutMainLoop();
199 return 0;