Merge commit 'origin/gallium-0.1'
[mesa.git] / progs / fp / fp-tri.c
1
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5
6 #ifndef WIN32
7 #include <unistd.h>
8 #include <signal.h>
9 #endif
10
11 #include <GL/glew.h>
12 #include <GL/glut.h>
13
14 unsigned show_fps = 0;
15 unsigned int frame_cnt = 0;
16 void alarmhandler(int);
17 static const char *filename = NULL;
18
19 static void usage(char *name)
20 {
21 fprintf(stderr, "usage: %s [ options ] shader_filename\n", name);
22 #ifndef WIN32
23 fprintf(stderr, "\n" );
24 fprintf(stderr, "options:\n");
25 fprintf(stderr, " -fps show frames per second\n");
26 #endif
27 }
28
29 #ifndef WIN32
30 void alarmhandler (int sig)
31 {
32 if (sig == SIGALRM) {
33 printf("%d frames in 5.0 seconds = %.3f FPS\n", frame_cnt,
34 frame_cnt / 5.0);
35
36 frame_cnt = 0;
37 }
38 signal(SIGALRM, alarmhandler);
39 alarm(5);
40 }
41 #endif
42
43 static void args(int argc, char *argv[])
44 {
45 GLint i;
46
47 for (i = 1; i < argc; i++) {
48 if (strcmp(argv[i], "-fps") == 0) {
49 show_fps = 1;
50 }
51 else if (i == argc - 1) {
52 filename = argv[i];
53 }
54 else {
55 usage(argv[0]);
56 exit(1);
57 }
58 }
59
60 if (!filename) {
61 usage(argv[0]);
62 exit(1);
63 }
64 }
65
66 static void Init( void )
67 {
68 GLint errno;
69 GLuint prognum;
70 char buf[4096];
71 GLuint sz;
72 FILE *f;
73
74 if ((f = fopen(filename, "r")) == NULL) {
75 fprintf(stderr, "Couldn't open %s\n", filename);
76 exit(1);
77 }
78
79 sz = fread(buf, 1, sizeof(buf), f);
80 if (!feof(f)) {
81 fprintf(stderr, "file too long\n");
82 exit(1);
83 }
84 fprintf(stderr, "%.*s\n", sz, buf);
85
86 if (!glutExtensionSupported("GL_ARB_fragment_program")) {
87 printf("Error: GL_ARB_fragment_program not supported!\n");
88 exit(1);
89 }
90 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
91
92 /* Setup the fragment program */
93 glGenProgramsARB(1, &prognum);
94 glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prognum);
95 glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
96 sz, (const GLubyte *)buf);
97
98 errno = glGetError();
99 printf("glGetError = 0x%x\n", errno);
100 if (errno != GL_NO_ERROR) {
101 GLint errorpos;
102
103 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos);
104 printf("errorpos: %d\n", errorpos);
105 printf("glError(GL_PROGRAM_ERROR_STRING_ARB) = %s\n",
106 (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
107 }
108 glEnable(GL_FRAGMENT_PROGRAM_ARB);
109
110 glClearColor(.3, .3, .3, 0);
111 }
112
113 static void Reshape(int width, int height)
114 {
115
116 glViewport(0, 0, (GLint)width, (GLint)height);
117
118 glMatrixMode(GL_PROJECTION);
119 glLoadIdentity();
120 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
121 glMatrixMode(GL_MODELVIEW);
122 }
123
124 static void Key(unsigned char key, int x, int y)
125 {
126
127 switch (key) {
128 case 27:
129 exit(1);
130 default:
131 return;
132 }
133
134 glutPostRedisplay();
135 }
136
137 static void Display(void)
138 {
139 glClear(GL_COLOR_BUFFER_BIT);
140
141 glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, 1.0, 1.0, 0.0, 0.0);
142 glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, 0.0, 0.0, 1.0, 1.0);
143 glBegin(GL_TRIANGLES);
144 glColor3f(0,0,1);
145 glVertex3f( 0.9, -0.9, -30.0);
146 glColor3f(1,0,0);
147 glVertex3f( 0.9, 0.9, -30.0);
148 glColor3f(0,1,0);
149 glVertex3f(-0.9, 0.0, -30.0);
150 glEnd();
151
152 glFlush();
153 if (show_fps) {
154 ++frame_cnt;
155 glutPostRedisplay();
156 }
157 }
158
159
160 int main(int argc, char **argv)
161 {
162 glutInit(&argc, argv);
163 glutInitWindowPosition(0, 0);
164 glutInitWindowSize(250, 250);
165 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
166 args(argc, argv);
167 glutCreateWindow(filename);
168 glewInit();
169 glutReshapeFunc(Reshape);
170 glutKeyboardFunc(Key);
171 glutDisplayFunc(Display);
172 Init();
173 #ifndef WIN32
174 if (show_fps) {
175 signal(SIGALRM, alarmhandler);
176 alarm(5);
177 }
178 #endif
179 glutMainLoop();
180 return 0;
181 }