2 * Test packed pixel formats for textures.
20 GLuint redTexel
, greenTexel
;
23 static const struct pixel_format Formats
[] = {
25 { "GL_RGBA/GL_UNSIGNED_INT_8_8_8_8",
26 GL_RGBA
, GL_UNSIGNED_INT_8_8_8_8
, 4, 0xff000000, 0x00ff0000 },
27 { "GL_RGBA/GL_UNSIGNED_INT_8_8_8_8_REV",
28 GL_RGBA
, GL_UNSIGNED_INT_8_8_8_8_REV
, 4, 0x000000ff, 0x0000ff00 },
29 { "GL_RGBA/GL_UNSIGNED_INT_10_10_10_2",
30 GL_RGBA
, GL_UNSIGNED_INT_10_10_10_2
, 4, 0xffc00000, 0x3ff000 },
31 { "GL_RGBA/GL_UNSIGNED_INT_2_10_10_10_REV",
32 GL_RGBA
, GL_UNSIGNED_INT_2_10_10_10_REV
, 4, 0x3ff, 0xffc00 },
33 { "GL_RGBA/GL_UNSIGNED_SHORT_4_4_4_4",
34 GL_RGBA
, GL_UNSIGNED_SHORT_4_4_4_4
, 2, 0xf000, 0x0f00 },
35 { "GL_RGBA/GL_UNSIGNED_SHORT_4_4_4_4_REV",
36 GL_RGBA
, GL_UNSIGNED_SHORT_4_4_4_4_REV
, 2, 0x000f, 0x00f0 },
37 { "GL_RGBA/GL_UNSIGNED_SHORT_5_5_5_1",
38 GL_RGBA
, GL_UNSIGNED_SHORT_5_5_5_1
, 2, 0xf800, 0x7c0 },
39 { "GL_RGBA/GL_UNSIGNED_SHORT_1_5_5_5_REV",
40 GL_RGBA
, GL_UNSIGNED_SHORT_1_5_5_5_REV
, 2, 0x1f, 0x3e0 },
42 { "GL_BGRA/GL_UNSIGNED_INT_8_8_8_8",
43 GL_BGRA
, GL_UNSIGNED_INT_8_8_8_8
, 4, 0x0000ff00, 0x00ff0000 },
44 { "GL_BGRA/GL_UNSIGNED_INT_8_8_8_8_REV",
45 GL_BGRA
, GL_UNSIGNED_INT_8_8_8_8_REV
, 4, 0x00ff0000, 0x0000ff00 },
46 { "GL_BGRA/GL_UNSIGNED_SHORT_4_4_4_4",
47 GL_BGRA
, GL_UNSIGNED_SHORT_4_4_4_4
, 2, 0x00f0, 0x0f00 },
48 { "GL_BGRA/GL_UNSIGNED_SHORT_4_4_4_4_REV",
49 GL_BGRA
, GL_UNSIGNED_SHORT_4_4_4_4_REV
, 2, 0x0f00, 0x00f0 },
50 { "GL_BGRA/GL_UNSIGNED_SHORT_5_5_5_1",
51 GL_BGRA
, GL_UNSIGNED_SHORT_5_5_5_1
, 2, 0x3e, 0x7c0 },
52 { "GL_BGRA/GL_UNSIGNED_SHORT_1_5_5_5_REV",
53 GL_BGRA
, GL_UNSIGNED_SHORT_1_5_5_5_REV
, 2, 0x7c00, 0x3e0 },
55 { "GL_ABGR_EXT/GL_UNSIGNED_INT_8_8_8_8",
56 GL_ABGR_EXT
, GL_UNSIGNED_INT_8_8_8_8
, 4, 0x000000ff, 0x0000ff00 },
57 { "GL_ABGR_EXT/GL_UNSIGNED_INT_8_8_8_8_REV",
58 GL_ABGR_EXT
, GL_UNSIGNED_INT_8_8_8_8_REV
, 4, 0xff000000, 0x00ff0000 },
59 { "GL_ABGR_EXT/GL_UNSIGNED_SHORT_4_4_4_4",
60 GL_ABGR_EXT
, GL_UNSIGNED_SHORT_4_4_4_4
, 2, 0x000f, 0x00f0 },
61 { "GL_ABGR_EXT/GL_UNSIGNED_SHORT_4_4_4_4_REV",
62 GL_ABGR_EXT
, GL_UNSIGNED_SHORT_4_4_4_4_REV
, 2, 0xf000, 0x0f00 },
63 { "GL_ABGR_EXT/GL_UNSIGNED_SHORT_5_5_5_1",
64 GL_ABGR_EXT
, GL_UNSIGNED_SHORT_5_5_5_1
, 2, 0x1, 0x3e },
65 { "GL_ABGR_EXT/GL_UNSIGNED_SHORT_1_5_5_5_REV",
66 GL_ABGR_EXT
, GL_UNSIGNED_SHORT_1_5_5_5_REV
, 2, 0x8000, 0x7c00 },
68 { "GL_RGB/GL_UNSIGNED_SHORT_5_6_5",
69 GL_RGB
, GL_UNSIGNED_SHORT_5_6_5
, 2, 0xf800, 0x7e0 },
70 { "GL_RGB/GL_UNSIGNED_SHORT_5_6_5_REV",
71 GL_RGB
, GL_UNSIGNED_SHORT_5_6_5_REV
, 2, 0x1f, 0x7e0 },
72 { "GL_RGB/GL_UNSIGNED_BYTE_3_3_2",
73 GL_RGB
, GL_UNSIGNED_BYTE_3_3_2
, 1, 0xe0, 0x1c },
74 { "GL_RGB/GL_UNSIGNED_BYTE_2_3_3_REV",
75 GL_RGB
, GL_UNSIGNED_BYTE_2_3_3_REV
, 1, 0x7, 0x38 },
77 { NULL
, 0, 0, 0, 0, 0 }
86 static const struct name_format IntFormats
[] = {
87 { "GL_RGBA", GL_RGBA
},
88 { "GL_RGBA2", GL_RGBA2
},
89 { "GL_RGBA4", GL_RGBA4
},
90 { "GL_RGB5_A1", GL_RGB5_A1
},
91 { "GL_RGBA8", GL_RGBA8
},
92 { "GL_RGBA12", GL_RGBA12
},
93 { "GL_RGBA16", GL_RGBA16
},
94 { "GL_RGB10_A2", GL_RGB10_A2
},
97 { "GL_R3_G3_B2", GL_R3_G3_B2
},
98 { "GL_RGB4", GL_RGB4
},
99 { "GL_RGB5", GL_RGB5
},
100 { "GL_RGB8", GL_RGB8
},
101 { "GL_RGB10", GL_RGB10
},
102 { "GL_RGB12", GL_RGB12
},
103 { "GL_RGB16", GL_RGB16
},
107 #define NUM_INT_FORMATS (sizeof(IntFormats) / sizeof(IntFormats[0]))
108 static GLuint CurFormat
= 0;
110 static GLboolean Test3D
= GL_FALSE
;
115 PrintString(const char *s
)
118 glutBitmapCharacter(GLUT_BITMAP_8_BY_13
, (int) *s
);
125 MakeTexture(const struct pixel_format
*format
, GLenum intFormat
, GLboolean swap
)
127 GLubyte texBuffer
[1000];
130 glPixelStorei(GL_UNPACK_SWAP_BYTES
, swap
);
132 if (format
->bytes
== 1) {
133 for (i
= 0; i
< 8; i
++) {
134 texBuffer
[i
] = format
->redTexel
;
136 for (i
= 8; i
< 16; i
++) {
137 texBuffer
[i
] = format
->greenTexel
;
140 else if (format
->bytes
== 2) {
141 GLushort
*us
= (GLushort
*) texBuffer
;
142 for (i
= 0; i
< 8; i
++) {
143 us
[i
] = format
->redTexel
;
145 for (i
= 8; i
< 16; i
++) {
146 us
[i
] = format
->greenTexel
;
149 for (i
= 0; i
< 16; i
++)
150 us
[i
] = (us
[i
] << 8) | (us
[i
] >> 8);
153 else if (format
->bytes
== 4) {
154 GLuint
*ui
= (GLuint
*) texBuffer
;
155 for (i
= 0; i
< 8; i
++) {
156 ui
[i
] = format
->redTexel
;
158 for (i
= 8; i
< 16; i
++) {
159 ui
[i
] = format
->greenTexel
;
162 for (i
= 0; i
< 16; i
++) {
165 | ((b
>> 8) & 0xff00)
166 | ((b
<< 8) & 0xff0000)
167 | ((b
<< 24) & 0xff000000);
176 /* 4 x 4 x 4 texture, undefined data */
177 glTexImage3D(GL_TEXTURE_3D
, 0, intFormat
, 4, 4, 4, 0,
178 format
->format
, format
->type
, NULL
);
179 /* fill in Z=1 and Z=2 slices with the real texture data */
180 glTexSubImage3D(GL_TEXTURE_3D
, 0,
181 0, 0, 1, /* offset */
183 format
->format
, format
->type
, texBuffer
);
184 glTexSubImage3D(GL_TEXTURE_3D
, 0,
185 0, 0, 2, /* offset */
187 format
->format
, format
->type
, texBuffer
);
190 glTexImage2D(GL_TEXTURE_2D
, 0, intFormat
, 4, 4, 0,
191 format
->format
, format
->type
, texBuffer
);
196 glGetTexLevelParameteriv(GL_TEXTURE_2D
, 0, GL_TEXTURE_RED_SIZE
, &r
);
197 glGetTexLevelParameteriv(GL_TEXTURE_2D
, 0, GL_TEXTURE_GREEN_SIZE
, &g
);
198 glGetTexLevelParameteriv(GL_TEXTURE_2D
, 0, GL_TEXTURE_BLUE_SIZE
, &b
);
199 glGetTexLevelParameteriv(GL_TEXTURE_2D
, 0, GL_TEXTURE_ALPHA_SIZE
, &a
);
200 printf("sizes: %d %d %d %d\n", r
, g
, b
, a
);
205 printf("GL Error for %s\n", format
->name
);
206 memset(texBuffer
, 255, 1000);
207 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGB
, 4, 4, 0,
208 GL_RGB
, GL_UNSIGNED_BYTE
, texBuffer
);
221 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
223 for (swap
= 0; swap
< 2; swap
++) {
224 for (i
= 0; Formats
[i
].name
; i
++) {
226 glTranslatef(swap
* (w
+ 2), i
* (h
+ 2), 0);
228 MakeTexture(Formats
+ i
, IntFormats
[CurFormat
].format
, swap
);
231 glEnable(GL_TEXTURE_3D
);
233 glEnable(GL_TEXTURE_2D
);
235 glTexCoord3f(0, 0, 0.5); glVertex2f(0, 0);
236 glTexCoord3f(1, 0, 0.5); glVertex2f(w
, 0);
237 glTexCoord3f(1, 1, 0.5); glVertex2f(w
, h
);
238 glTexCoord3f(0, 1, 0.5); glVertex2f(0, h
);
242 glDisable(GL_TEXTURE_3D
);
244 glDisable(GL_TEXTURE_2D
);
247 PrintString(Formats
[i
].name
);
254 glTranslatef(2, i
* (h
+ 2), 0);
257 PrintString("Normal");
258 glRasterPos2i(w
+ 2, 6);
259 PrintString("Byte Swapped");
263 glTranslatef(2, (i
+ 1) * (h
+ 2), 0);
265 sprintf(s
, "Internal Texture Format [f/F]: %s (%d of %d)",
266 IntFormats
[CurFormat
].name
, CurFormat
+ 1, NUM_INT_FORMATS
);
271 glTranslatef(2, (i
+ 2) * (h
+ 2), 0);
274 PrintString("Target [2/3]: GL_TEXTURE_3D");
276 PrintString("Target [2/3]: GL_TEXTURE_2D");
284 Reshape(int width
, int height
)
286 glViewport(0, 0, width
, height
);
287 glMatrixMode(GL_PROJECTION
);
289 glOrtho(0, width
, 0, height
, -1, 1);
290 glMatrixMode(GL_MODELVIEW
);
296 Key(unsigned char key
, int x
, int y
)
303 CurFormat
= NUM_INT_FORMATS
- 1;
309 if (CurFormat
== NUM_INT_FORMATS
)
329 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER
));
330 printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION
));
331 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
332 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
333 glTexParameteri(GL_TEXTURE_3D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
334 glTexParameteri(GL_TEXTURE_3D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
335 glTexEnvi(GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_REPLACE
);
340 main(int argc
, char *argv
[])
342 glutInit(&argc
, argv
);
343 glutInitWindowPosition(0, 0);
344 glutInitWindowSize(700, 800);
345 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
346 glutCreateWindow(argv
[0]);
348 glutReshapeFunc(Reshape
);
349 glutKeyboardFunc(Key
);
350 glutDisplayFunc(Draw
);