095190a8aefa709cc54a9873cc19028b15ce5ac4
[mesa.git] / progs / tests / fptest1.c
1 /* Test GL_NV_fragment_program */
2
3 #include <assert.h>
4 #include <string.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <math.h>
8 #define GL_GLEXT_PROTOTYPES
9 #include <GL/glut.h>
10
11
12
13 static void Display( void )
14 {
15 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
16
17 glPushMatrix();
18
19 glColor4f(0, 0.5, 0, 1);
20 glColor4f(0, 1, 0, 1);
21 glBegin(GL_POLYGON);
22 glVertex2f(-1, -1);
23 glVertex2f( 1, -1);
24 glVertex2f( 0, 1);
25 glEnd();
26
27 glPopMatrix();
28
29 glutSwapBuffers();
30 }
31
32
33 static void Reshape( int width, int height )
34 {
35 glViewport( 0, 0, width, height );
36 glMatrixMode( GL_PROJECTION );
37 glLoadIdentity();
38 glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
39 glMatrixMode( GL_MODELVIEW );
40 glLoadIdentity();
41 glTranslatef( 0.0, 0.0, -15.0 );
42 }
43
44
45 static void Key( unsigned char key, int x, int y )
46 {
47 (void) x;
48 (void) y;
49 switch (key) {
50 case 27:
51 exit(0);
52 break;
53 }
54 glutPostRedisplay();
55 }
56
57
58 static void Init( void )
59 {
60 static const char *prog0 =
61 "!!FP1.0\n"
62 "MUL o[COLR], R0, f[WPOS]; \n"
63 "ADD o[COLH], H3, f[TEX0]; \n"
64 "ADD_SAT o[COLH], H3, f[TEX0]; \n"
65 "ADDX o[COLH], H3, f[TEX0]; \n"
66 "ADDHC o[COLH], H3, f[TEX0]; \n"
67 "ADDXC o[COLH], H3, f[TEX0]; \n"
68 "ADDXC_SAT o[COLH], H30, f[TEX0]; \n"
69 "MUL o[COLR].xy, R0.wzyx, f[WPOS]; \n"
70 "MUL o[COLR], H0, f[WPOS]; \n"
71 "MUL o[COLR], -H0, f[WPOS]; \n"
72 "MOV RC, H1; \n"
73 "MOV HC, H2; \n"
74 "END \n"
75 ;
76
77 /* masked updates, defines, declarations */
78 static const char *prog1 =
79 "!!FP1.0\n"
80 "DEFINE foo = {1, 2, 3, 4}; \n"
81 "DEFINE foo2 = 5; \n"
82 "DECLARE foo3 = {5, 6, 7, 8}; \n"
83 "DECLARE bar = 3; \n"
84 "DECLARE bar2; \n"
85 "DECLARE bar3 = bar; \n"
86 "#DECLARE bar4 = { a, b, c, d }; \n"
87 "MOV o[COLR].xy, R0; \n"
88 "MOV o[COLR] (NE), R0; \n"
89 "MOV o[COLR] (NE.wzyx), R0; \n"
90 "MOV o[COLR].xy (NE.wzyx), R0; \n"
91 "MOV RC.x (EQ), R1.x; \n"
92 "KIL NE; \n"
93 "KIL EQ.xyxy; \n"
94 "END \n"
95 ;
96
97 /* texture instructions */
98 static const char *prog2 =
99 "!!FP1.0\n"
100 "TEX R0, f[TEX0], TEX0, 2D; \n"
101 "TEX R1, f[TEX1], TEX1, CUBE; \n"
102 "TEX R2, f[TEX2], TEX2, 3D; \n"
103 "TXP R3, f[TEX3], TEX3, RECT; \n"
104 "TXD R3, R2, R1, f[TEX3], TEX3, RECT; \n"
105 "MUL o[COLR], R0, f[COL0]; \n"
106 "END \n"
107 ;
108
109 /* test negation, absolute value */
110 static const char *prog3 =
111 "!!FP1.0\n"
112 "MOV R0, -R1; \n"
113 "MOV R0, +R1; \n"
114 "MOV R0, |-R1|; \n"
115 "MOV R0, |+R1|; \n"
116 "MOV R0, -|R1|; \n"
117 "MOV R0, +|R1|; \n"
118 "MOV R0, -|-R1|; \n"
119 "MOV R0, -|+R1|; \n"
120 "MOV o[COLR], R0; \n"
121 "END \n"
122 ;
123
124 /* literal constant sources */
125 static const char *prog4 =
126 "!!FP1.0\n"
127 "DEFINE Pi = 3.14159; \n"
128 "MOV R0, {1, -2, +3, 4}; \n"
129 "MOV R0, 5; \n"
130 "MOV R0, -5; \n"
131 "MOV R0, +5; \n"
132 "MOV R0, Pi; \n"
133 "MOV o[COLR], R0; \n"
134 "END \n"
135 ;
136
137 /* change the fragment color in a simple way */
138 static const char *prog10 =
139 "!!FP1.0\n"
140 "DEFINE blue = {0, 0, 1, 0};\n"
141 "DECLARE color; \n"
142 "MOV R0, f[COL0]; \n"
143 "#ADD o[COLR], R0, f[COL0]; \n"
144 "#ADD o[COLR], blue, f[COL0]; \n"
145 "#ADD o[COLR], {1, 0, 0, 0}, f[COL0]; \n"
146 "ADD o[COLR], color, f[COL0]; \n"
147 "END \n"
148 ;
149
150 GLuint progs[20];
151
152 if (!glutExtensionSupported ("GL_NV_fragment_program")) {
153 printf("Sorry, this program requires GL_NV_fragment_program\n");
154 exit(1);
155 }
156
157 glGenProgramsNV(20, progs);
158 assert(progs[0]);
159 assert(progs[1]);
160 assert(progs[0] != progs[1]);
161
162 #if 0
163 glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[0],
164 strlen(prog0),
165 (const GLubyte *) prog0);
166 assert(glIsProgramNV(progs[0]));
167 #endif
168
169 glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[1],
170 strlen(prog1),
171 (const GLubyte *) prog1);
172 assert(glIsProgramNV(progs[1]));
173
174 glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[2],
175 strlen(prog2),
176 (const GLubyte *) prog2);
177 assert(glIsProgramNV(progs[2]));
178 glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[2]);
179
180 glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[3],
181 strlen(prog3),
182 (const GLubyte *) prog3);
183 assert(glIsProgramNV(progs[3]));
184 glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[3]);
185
186 glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[4],
187 strlen(prog4),
188 (const GLubyte *) prog4);
189 assert(glIsProgramNV(progs[4]));
190 glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[4]);
191
192
193 /* a real program */
194 glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[10],
195 strlen(prog10),
196 (const GLubyte *) prog10);
197 assert(glIsProgramNV(progs[10]));
198 glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[10]);
199
200 glProgramNamedParameter4fNV(progs[10],
201 strlen("color"), (const GLubyte *) "color",
202 1, 0, 0, 1);
203
204 glEnable(GL_FRAGMENT_PROGRAM_NV);
205 glEnable(GL_ALPHA_TEST);
206 glAlphaFunc(GL_ALWAYS, 0.0);
207
208 printf("glGetError = %d\n", (int) glGetError());
209 }
210
211
212 int main( int argc, char *argv[] )
213 {
214 glutInit( &argc, argv );
215 glutInitWindowPosition( 0, 0 );
216 glutInitWindowSize( 250, 250 );
217 glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
218 glutCreateWindow(argv[0]);
219 glutReshapeFunc( Reshape );
220 glutKeyboardFunc( Key );
221 glutDisplayFunc( Display );
222 Init();
223 glutMainLoop();
224 return 0;
225 }