Merge branch '7.8'
[mesa.git] / progs / tests / mipmap_comp.c
1 /* Copyright (c) Mark J. Kilgard, 1994. */
2 /*
3 * (c) Copyright 1993, Silicon Graphics, Inc.
4 * ALL RIGHTS RESERVED
5 * Permission to use, copy, modify, and distribute this software for
6 * any purpose and without fee is hereby granted, provided that the above
7 * copyright notice appear in all copies and that both the copyright notice
8 * and this permission notice appear in supporting documentation, and that
9 * the name of Silicon Graphics, Inc. not be used in advertising
10 * or publicity pertaining to distribution of the software without specific,
11 * written prior permission.
12 *
13 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
14 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
16 * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
17 * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
18 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
19 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
20 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
21 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
22 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
23 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
24 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
25 *
26 * US Government Users Restricted Rights
27 * Use, duplication, or disclosure by the Government is subject to
28 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
29 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
30 * clause at DFARS 252.227-7013 and/or in similar or successor
31 * clauses in the FAR or the DOD or NASA FAR Supplement.
32 * Unpublished-- rights reserved under the copyright laws of the
33 * United States. Contractor/manufacturer is Silicon Graphics,
34 * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
35 *
36 * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
37 */
38
39 /* mipmap_comp
40 * Test compressed texture mipmaps
41 *
42 * Based on mipmap_limits
43 */
44
45 #include <string.h>
46 #include <stdlib.h>
47 #include <stdio.h>
48 #include <GL/glew.h>
49 #include <GL/glut.h>
50
51 #define SIZE 16 /* not larger then 16 */
52
53 static GLint BaseLevel = 0, MaxLevel = 9;
54 static GLfloat MinLod = -1, MaxLod = 9;
55 static GLfloat LodBias = 0.0;
56 static GLboolean NearestFilter = GL_TRUE;
57 static GLuint texImage;
58
59
60 static void
61 initValues(void)
62 {
63 BaseLevel = 0;
64 MaxLevel = 9;
65 MinLod = -1;
66 MaxLod = 2;
67 LodBias = 5.0;
68 NearestFilter = GL_TRUE;
69 }
70
71
72 static void
73 makeImage(int level, int width, int height)
74 {
75 #if 0
76 GLubyte img[SIZE*SIZE*3];
77 int i, j;
78
79 (void)size;
80 for (i = 0; i < height; i++) {
81 for (j = 0; j < width; j++) {
82 int k = (i * width + j) * 3;
83 img[k + 0] = 255 * ((level + 1) % 2);
84 img[k + 1] = 255 * ((level + 1) % 2);
85 img[k + 2] = 255 * ((level + 1) % 2);
86 }
87 }
88
89 glTexImage2D(GL_TEXTURE_2D, level, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, width, height, 0,
90 GL_RGB, GL_UNSIGNED_BYTE, img);
91 #else
92 GLubyte img[128];
93 GLint size[] = {
94 128, /* 16x16 */
95 32, /* 8x8 */
96 8, /* 4x4 */
97 8, /* 2x2 */
98 8, /* 1x1 */
99 };
100 int i;
101 int value = ((level + 1) % 2) * 0xffffffff;
102 memset(img, 0, 128);
103
104 /* generate black and white mipmap levels */
105 if (value)
106 for (i = 0; i < size[level] / 4; i += 2)
107 ((int*)img)[i] = value;
108
109 glCompressedTexImage2D(GL_TEXTURE_2D, level,
110 GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
111 width, height, 0,
112 size[level], img);
113 #endif
114 }
115
116
117 static void
118 makeImages(void)
119 {
120 int i, sz;
121
122 for (i = 0, sz = SIZE; sz >= 1; i++, sz /= 2) {
123 makeImage(i, sz, sz);
124 printf("Level %d size: %d x %d\n", i, sz, sz);
125 }
126 }
127
128
129 static void
130 myInit(void)
131 {
132
133 initValues();
134
135 glEnable(GL_DEPTH_TEST);
136 glDepthFunc(GL_LESS);
137 glShadeModel(GL_FLAT);
138
139 glTranslatef(0.0, 0.0, -3.6);
140
141 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
142 glGenTextures(1, &texImage);
143 glBindTexture(GL_TEXTURE_2D, texImage);
144 makeImages();
145
146 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
147 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
148 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
149 glEnable(GL_TEXTURE_2D);
150 }
151
152
153 static void
154 display(void)
155 {
156 GLfloat tcm = 1.0;
157 glBindTexture(GL_TEXTURE_2D, texImage);
158
159 printf("BASE_LEVEL=%d MAX_LEVEL=%d MIN_LOD=%.2g MAX_LOD=%.2g Bias=%.2g Filter=%s\n",
160 BaseLevel, MaxLevel, MinLod, MaxLod, LodBias,
161 NearestFilter ? "NEAREST" : "LINEAR");
162 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, BaseLevel);
163 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, MaxLevel);
164
165 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, MinLod);
166 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, MaxLod);
167
168 if (NearestFilter) {
169 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
170 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
171 GL_NEAREST_MIPMAP_NEAREST);
172 }
173 else {
174 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
175 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
176 GL_LINEAR_MIPMAP_LINEAR);
177 }
178
179 glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, LodBias);
180
181 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
182 glBegin(GL_QUADS);
183 glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
184 glTexCoord2f(0.0, tcm); glVertex3f(-2.0, 1.0, 0.0);
185 glTexCoord2f(tcm * 3000.0, tcm); glVertex3f(3000.0, 1.0, -6000.0);
186 glTexCoord2f(tcm * 3000.0, 0.0); glVertex3f(3000.0, -1.0, -6000.0);
187 glEnd();
188 glFlush();
189 }
190
191
192 static void
193 myReshape(int w, int h)
194 {
195 glViewport(0, 0, w, h);
196 glMatrixMode(GL_PROJECTION);
197 glLoadIdentity();
198 gluPerspective(60.0, 1.0*(GLfloat)w/(GLfloat)h, 1.0, 30000.0);
199 glMatrixMode(GL_MODELVIEW);
200 glLoadIdentity();
201 }
202
203
204 static void
205 key(unsigned char k, int x, int y)
206 {
207 (void) x;
208 (void) y;
209 switch (k) {
210 case 'b':
211 BaseLevel--;
212 if (BaseLevel < 0)
213 BaseLevel = 0;
214 break;
215 case 'B':
216 BaseLevel++;
217 if (BaseLevel > 10)
218 BaseLevel = 10;
219 break;
220 case 'm':
221 MaxLevel--;
222 if (MaxLevel < 0)
223 MaxLevel = 0;
224 break;
225 case 'M':
226 MaxLevel++;
227 if (MaxLevel > 10)
228 MaxLevel = 10;
229 break;
230 case 'l':
231 LodBias -= 0.25;
232 break;
233 case 'L':
234 LodBias += 0.25;
235 break;
236 case 'n':
237 MinLod -= 0.25;
238 break;
239 case 'N':
240 MinLod += 0.25;
241 break;
242 case 'x':
243 MaxLod -= 0.25;
244 break;
245 case 'X':
246 MaxLod += 0.25;
247 break;
248 case 'f':
249 NearestFilter = !NearestFilter;
250 break;
251 case ' ':
252 initValues();
253 break;
254 case 27: /* Escape */
255 exit(0);
256 break;
257 default:
258 return;
259 }
260 glutPostRedisplay();
261 }
262
263
264 static void
265 usage(void)
266 {
267 printf("usage:\n");
268 printf(" b/B decrease/increase GL_TEXTURE_BASE_LEVEL\n");
269 printf(" m/M decrease/increase GL_TEXTURE_MAX_LEVEL\n");
270 printf(" n/N decrease/increase GL_TEXTURE_MIN_LOD\n");
271 printf(" x/X decrease/increase GL_TEXTURE_MAX_LOD\n");
272 printf(" l/L decrease/increase GL_TEXTURE_LOD_BIAS\n");
273 printf(" f toggle nearest/linear filtering\n");
274 printf(" SPACE reset values\n");
275 }
276
277
278 int
279 main(int argc, char** argv)
280 {
281 glutInit(&argc, argv);
282 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
283 glutInitWindowSize (600, 600);
284 glutCreateWindow (argv[0]);
285 glewInit();
286
287 if (!glutExtensionSupported("GL_EXT_texture_compression_s3tc")) {
288 fprintf(stderr, "This test requires GL_EXT_texture_compression_s3tc.\n");
289 exit(1);
290 }
291
292 myInit();
293 glutReshapeFunc (myReshape);
294 glutDisplayFunc(display);
295 glutKeyboardFunc(key);
296 usage();
297 glutMainLoop();
298 return 0; /* ANSI C requires main to return int. */
299 }