• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Mesa 3-D graphics library
3  *
4  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5  * Copyright (c) 2008-2009  VMware, Inc.
6  * Copyright (c) 2012 Intel Corporation
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the "Software"),
10  * to deal in the Software without restriction, including without limitation
11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12  * and/or sell copies of the Software, and to permit persons to whom the
13  * Software is furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included
16  * in all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21  * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25 
26 
27 #include "context.h"
28 #include "glformats.h"
29 
30 
31 /**
32  * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
33  */
34 GLboolean
_mesa_type_is_packed(GLenum type)35 _mesa_type_is_packed(GLenum type)
36 {
37    switch (type) {
38    case GL_UNSIGNED_BYTE_3_3_2:
39    case GL_UNSIGNED_BYTE_2_3_3_REV:
40    case MESA_UNSIGNED_BYTE_4_4:
41    case GL_UNSIGNED_SHORT_5_6_5:
42    case GL_UNSIGNED_SHORT_5_6_5_REV:
43    case GL_UNSIGNED_SHORT_4_4_4_4:
44    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
45    case GL_UNSIGNED_SHORT_5_5_5_1:
46    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
47    case GL_UNSIGNED_INT_8_8_8_8:
48    case GL_UNSIGNED_INT_8_8_8_8_REV:
49    case GL_UNSIGNED_INT_10_10_10_2:
50    case GL_UNSIGNED_INT_2_10_10_10_REV:
51    case GL_UNSIGNED_SHORT_8_8_MESA:
52    case GL_UNSIGNED_SHORT_8_8_REV_MESA:
53    case GL_UNSIGNED_INT_24_8_EXT:
54    case GL_UNSIGNED_INT_5_9_9_9_REV:
55    case GL_UNSIGNED_INT_10F_11F_11F_REV:
56    case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
57       return GL_TRUE;
58    }
59 
60    return GL_FALSE;
61 }
62 
63 
64 /**
65  * Get the size of a GL data type.
66  *
67  * \param type GL data type.
68  *
69  * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
70  * if an invalid type enum.
71  */
72 GLint
_mesa_sizeof_type(GLenum type)73 _mesa_sizeof_type(GLenum type)
74 {
75    switch (type) {
76    case GL_BITMAP:
77       return 0;
78    case GL_UNSIGNED_BYTE:
79       return sizeof(GLubyte);
80    case GL_BYTE:
81       return sizeof(GLbyte);
82    case GL_UNSIGNED_SHORT:
83       return sizeof(GLushort);
84    case GL_SHORT:
85       return sizeof(GLshort);
86    case GL_UNSIGNED_INT:
87       return sizeof(GLuint);
88    case GL_INT:
89       return sizeof(GLint);
90    case GL_FLOAT:
91       return sizeof(GLfloat);
92    case GL_DOUBLE:
93       return sizeof(GLdouble);
94    case GL_HALF_FLOAT_ARB:
95       return sizeof(GLhalfARB);
96    case GL_FIXED:
97       return sizeof(GLfixed);
98    default:
99       return -1;
100    }
101 }
102 
103 
104 /**
105  * Same as _mesa_sizeof_type() but also accepting the packed pixel
106  * format data types.
107  */
108 GLint
_mesa_sizeof_packed_type(GLenum type)109 _mesa_sizeof_packed_type(GLenum type)
110 {
111    switch (type) {
112    case GL_BITMAP:
113       return 0;
114    case GL_UNSIGNED_BYTE:
115       return sizeof(GLubyte);
116    case GL_BYTE:
117       return sizeof(GLbyte);
118    case GL_UNSIGNED_SHORT:
119       return sizeof(GLushort);
120    case GL_SHORT:
121       return sizeof(GLshort);
122    case GL_UNSIGNED_INT:
123       return sizeof(GLuint);
124    case GL_INT:
125       return sizeof(GLint);
126    case GL_HALF_FLOAT_ARB:
127       return sizeof(GLhalfARB);
128    case GL_FLOAT:
129       return sizeof(GLfloat);
130    case GL_UNSIGNED_BYTE_3_3_2:
131    case GL_UNSIGNED_BYTE_2_3_3_REV:
132    case MESA_UNSIGNED_BYTE_4_4:
133       return sizeof(GLubyte);
134    case GL_UNSIGNED_SHORT_5_6_5:
135    case GL_UNSIGNED_SHORT_5_6_5_REV:
136    case GL_UNSIGNED_SHORT_4_4_4_4:
137    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
138    case GL_UNSIGNED_SHORT_5_5_5_1:
139    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
140    case GL_UNSIGNED_SHORT_8_8_MESA:
141    case GL_UNSIGNED_SHORT_8_8_REV_MESA:
142       return sizeof(GLushort);
143    case GL_UNSIGNED_INT_8_8_8_8:
144    case GL_UNSIGNED_INT_8_8_8_8_REV:
145    case GL_UNSIGNED_INT_10_10_10_2:
146    case GL_UNSIGNED_INT_2_10_10_10_REV:
147    case GL_UNSIGNED_INT_24_8_EXT:
148    case GL_UNSIGNED_INT_5_9_9_9_REV:
149    case GL_UNSIGNED_INT_10F_11F_11F_REV:
150       return sizeof(GLuint);
151    case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
152       return 8;
153    default:
154       return -1;
155    }
156 }
157 
158 
159 /**
160  * Get the number of components in a pixel format.
161  *
162  * \param format pixel format.
163  *
164  * \return the number of components in the given format, or -1 if a bad format.
165  */
166 GLint
_mesa_components_in_format(GLenum format)167 _mesa_components_in_format(GLenum format)
168 {
169    switch (format) {
170    case GL_COLOR_INDEX:
171    case GL_STENCIL_INDEX:
172    case GL_DEPTH_COMPONENT:
173    case GL_RED:
174    case GL_RED_INTEGER_EXT:
175    case GL_GREEN:
176    case GL_GREEN_INTEGER_EXT:
177    case GL_BLUE:
178    case GL_BLUE_INTEGER_EXT:
179    case GL_ALPHA:
180    case GL_ALPHA_INTEGER_EXT:
181    case GL_LUMINANCE:
182    case GL_LUMINANCE_INTEGER_EXT:
183    case GL_INTENSITY:
184       return 1;
185 
186    case GL_LUMINANCE_ALPHA:
187    case GL_LUMINANCE_ALPHA_INTEGER_EXT:
188    case GL_RG:
189    case GL_YCBCR_MESA:
190    case GL_DEPTH_STENCIL_EXT:
191    case GL_DUDV_ATI:
192    case GL_DU8DV8_ATI:
193    case GL_RG_INTEGER:
194       return 2;
195 
196    case GL_RGB:
197    case GL_BGR:
198    case GL_RGB_INTEGER_EXT:
199    case GL_BGR_INTEGER_EXT:
200       return 3;
201 
202    case GL_RGBA:
203    case GL_BGRA:
204    case GL_ABGR_EXT:
205    case GL_RGBA_INTEGER_EXT:
206    case GL_BGRA_INTEGER_EXT:
207       return 4;
208 
209    default:
210       return -1;
211    }
212 }
213 
214 
215 /**
216  * Get the bytes per pixel of pixel format type pair.
217  *
218  * \param format pixel format.
219  * \param type pixel type.
220  *
221  * \return bytes per pixel, or -1 if a bad format or type was given.
222  */
223 GLint
_mesa_bytes_per_pixel(GLenum format,GLenum type)224 _mesa_bytes_per_pixel(GLenum format, GLenum type)
225 {
226    GLint comps = _mesa_components_in_format(format);
227    if (comps < 0)
228       return -1;
229 
230    switch (type) {
231    case GL_BITMAP:
232       return 0;  /* special case */
233    case GL_BYTE:
234    case GL_UNSIGNED_BYTE:
235       return comps * sizeof(GLubyte);
236    case GL_SHORT:
237    case GL_UNSIGNED_SHORT:
238       return comps * sizeof(GLshort);
239    case GL_INT:
240    case GL_UNSIGNED_INT:
241       return comps * sizeof(GLint);
242    case GL_FLOAT:
243       return comps * sizeof(GLfloat);
244    case GL_HALF_FLOAT_ARB:
245       return comps * sizeof(GLhalfARB);
246    case GL_UNSIGNED_BYTE_3_3_2:
247    case GL_UNSIGNED_BYTE_2_3_3_REV:
248       if (format == GL_RGB || format == GL_BGR ||
249           format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
250          return sizeof(GLubyte);
251       else
252          return -1;  /* error */
253    case GL_UNSIGNED_SHORT_5_6_5:
254    case GL_UNSIGNED_SHORT_5_6_5_REV:
255       if (format == GL_RGB || format == GL_BGR ||
256           format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
257          return sizeof(GLushort);
258       else
259          return -1;  /* error */
260    case GL_UNSIGNED_SHORT_4_4_4_4:
261    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
262    case GL_UNSIGNED_SHORT_5_5_5_1:
263    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
264       if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
265           format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
266          return sizeof(GLushort);
267       else
268          return -1;
269    case GL_UNSIGNED_INT_8_8_8_8:
270    case GL_UNSIGNED_INT_8_8_8_8_REV:
271    case GL_UNSIGNED_INT_10_10_10_2:
272    case GL_UNSIGNED_INT_2_10_10_10_REV:
273       if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
274           format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
275          return sizeof(GLuint);
276       else
277          return -1;
278    case GL_UNSIGNED_SHORT_8_8_MESA:
279    case GL_UNSIGNED_SHORT_8_8_REV_MESA:
280       if (format == GL_YCBCR_MESA)
281          return sizeof(GLushort);
282       else
283          return -1;
284    case GL_UNSIGNED_INT_24_8_EXT:
285       if (format == GL_DEPTH_STENCIL_EXT)
286          return sizeof(GLuint);
287       else
288          return -1;
289    case GL_UNSIGNED_INT_5_9_9_9_REV:
290       if (format == GL_RGB)
291          return sizeof(GLuint);
292       else
293          return -1;
294    case GL_UNSIGNED_INT_10F_11F_11F_REV:
295       if (format == GL_RGB)
296          return sizeof(GLuint);
297       else
298          return -1;
299    case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
300       if (format == GL_DEPTH_STENCIL)
301          return 8;
302       else
303          return -1;
304    default:
305       return -1;
306    }
307 }
308 
309 
310 /**
311  * Test if the given format is an integer (non-normalized) format.
312  */
313 GLboolean
_mesa_is_enum_format_integer(GLenum format)314 _mesa_is_enum_format_integer(GLenum format)
315 {
316    switch (format) {
317    /* generic integer formats */
318    case GL_RED_INTEGER_EXT:
319    case GL_GREEN_INTEGER_EXT:
320    case GL_BLUE_INTEGER_EXT:
321    case GL_ALPHA_INTEGER_EXT:
322    case GL_RGB_INTEGER_EXT:
323    case GL_RGBA_INTEGER_EXT:
324    case GL_BGR_INTEGER_EXT:
325    case GL_BGRA_INTEGER_EXT:
326    case GL_LUMINANCE_INTEGER_EXT:
327    case GL_LUMINANCE_ALPHA_INTEGER_EXT:
328    case GL_RG_INTEGER:
329    /* specific integer formats */
330    case GL_RGBA32UI_EXT:
331    case GL_RGB32UI_EXT:
332    case GL_RG32UI:
333    case GL_R32UI:
334    case GL_ALPHA32UI_EXT:
335    case GL_INTENSITY32UI_EXT:
336    case GL_LUMINANCE32UI_EXT:
337    case GL_LUMINANCE_ALPHA32UI_EXT:
338    case GL_RGBA16UI_EXT:
339    case GL_RGB16UI_EXT:
340    case GL_RG16UI:
341    case GL_R16UI:
342    case GL_ALPHA16UI_EXT:
343    case GL_INTENSITY16UI_EXT:
344    case GL_LUMINANCE16UI_EXT:
345    case GL_LUMINANCE_ALPHA16UI_EXT:
346    case GL_RGBA8UI_EXT:
347    case GL_RGB8UI_EXT:
348    case GL_RG8UI:
349    case GL_R8UI:
350    case GL_ALPHA8UI_EXT:
351    case GL_INTENSITY8UI_EXT:
352    case GL_LUMINANCE8UI_EXT:
353    case GL_LUMINANCE_ALPHA8UI_EXT:
354    case GL_RGBA32I_EXT:
355    case GL_RGB32I_EXT:
356    case GL_RG32I:
357    case GL_R32I:
358    case GL_ALPHA32I_EXT:
359    case GL_INTENSITY32I_EXT:
360    case GL_LUMINANCE32I_EXT:
361    case GL_LUMINANCE_ALPHA32I_EXT:
362    case GL_RGBA16I_EXT:
363    case GL_RGB16I_EXT:
364    case GL_RG16I:
365    case GL_R16I:
366    case GL_ALPHA16I_EXT:
367    case GL_INTENSITY16I_EXT:
368    case GL_LUMINANCE16I_EXT:
369    case GL_LUMINANCE_ALPHA16I_EXT:
370    case GL_RGBA8I_EXT:
371    case GL_RGB8I_EXT:
372    case GL_RG8I:
373    case GL_R8I:
374    case GL_ALPHA8I_EXT:
375    case GL_INTENSITY8I_EXT:
376    case GL_LUMINANCE8I_EXT:
377    case GL_LUMINANCE_ALPHA8I_EXT:
378    case GL_RGB10_A2UI:
379       return GL_TRUE;
380    default:
381       return GL_FALSE;
382    }
383 }
384 
385 
386 /**
387  * Test if the given type is an integer (non-normalized) format.
388  */
389 GLboolean
_mesa_is_type_integer(GLenum type)390 _mesa_is_type_integer(GLenum type)
391 {
392    switch (type) {
393    case GL_INT:
394    case GL_UNSIGNED_INT:
395    case GL_SHORT:
396    case GL_UNSIGNED_SHORT:
397    case GL_BYTE:
398    case GL_UNSIGNED_BYTE:
399       return GL_TRUE;
400    default:
401       return GL_FALSE;
402    }
403 }
404 
405 
406 /**
407  * Test if the given format or type is an integer (non-normalized) format.
408  */
409 extern GLboolean
_mesa_is_enum_format_or_type_integer(GLenum format,GLenum type)410 _mesa_is_enum_format_or_type_integer(GLenum format, GLenum type)
411 {
412    return _mesa_is_enum_format_integer(format) || _mesa_is_type_integer(type);
413 }
414 
415 
416 GLboolean
_mesa_is_type_unsigned(GLenum type)417 _mesa_is_type_unsigned(GLenum type)
418 {
419    switch (type) {
420    case GL_UNSIGNED_INT:
421    case GL_UNSIGNED_INT_8_8_8_8:
422    case GL_UNSIGNED_INT_8_8_8_8_REV:
423    case GL_UNSIGNED_INT_10_10_10_2:
424    case GL_UNSIGNED_INT_2_10_10_10_REV:
425 
426    case GL_UNSIGNED_SHORT:
427    case GL_UNSIGNED_SHORT_4_4_4_4:
428    case GL_UNSIGNED_SHORT_5_5_5_1:
429    case GL_UNSIGNED_SHORT_5_6_5:
430    case GL_UNSIGNED_SHORT_5_6_5_REV:
431    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
432    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
433    case GL_UNSIGNED_SHORT_8_8_MESA:
434    case GL_UNSIGNED_SHORT_8_8_REV_MESA:
435 
436    case GL_UNSIGNED_BYTE:
437    case GL_UNSIGNED_BYTE_3_3_2:
438    case GL_UNSIGNED_BYTE_2_3_3_REV:
439       return GL_TRUE;
440 
441    default:
442       return GL_FALSE;
443    }
444 }
445 
446 
447 /**
448  * Test if the given image format is a color/RGBA format (i.e., not color
449  * index, depth, stencil, etc).
450  * \param format  the image format value (may by an internal texture format)
451  * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
452  */
453 GLboolean
_mesa_is_color_format(GLenum format)454 _mesa_is_color_format(GLenum format)
455 {
456    switch (format) {
457       case GL_RED:
458       case GL_GREEN:
459       case GL_BLUE:
460       case GL_ALPHA:
461       case GL_ALPHA4:
462       case GL_ALPHA8:
463       case GL_ALPHA12:
464       case GL_ALPHA16:
465       case 1:
466       case GL_LUMINANCE:
467       case GL_LUMINANCE4:
468       case GL_LUMINANCE8:
469       case GL_LUMINANCE12:
470       case GL_LUMINANCE16:
471       case 2:
472       case GL_LUMINANCE_ALPHA:
473       case GL_LUMINANCE4_ALPHA4:
474       case GL_LUMINANCE6_ALPHA2:
475       case GL_LUMINANCE8_ALPHA8:
476       case GL_LUMINANCE12_ALPHA4:
477       case GL_LUMINANCE12_ALPHA12:
478       case GL_LUMINANCE16_ALPHA16:
479       case GL_INTENSITY:
480       case GL_INTENSITY4:
481       case GL_INTENSITY8:
482       case GL_INTENSITY12:
483       case GL_INTENSITY16:
484       case GL_R8:
485       case GL_R16:
486       case GL_RG:
487       case GL_RG8:
488       case GL_RG16:
489       case 3:
490       case GL_RGB:
491       case GL_BGR:
492       case GL_R3_G3_B2:
493       case GL_RGB4:
494       case GL_RGB5:
495       case GL_RGB565:
496       case GL_RGB8:
497       case GL_RGB10:
498       case GL_RGB12:
499       case GL_RGB16:
500       case 4:
501       case GL_ABGR_EXT:
502       case GL_RGBA:
503       case GL_BGRA:
504       case GL_RGBA2:
505       case GL_RGBA4:
506       case GL_RGB5_A1:
507       case GL_RGBA8:
508       case GL_RGB10_A2:
509       case GL_RGBA12:
510       case GL_RGBA16:
511       /* float texture formats */
512       case GL_ALPHA16F_ARB:
513       case GL_ALPHA32F_ARB:
514       case GL_LUMINANCE16F_ARB:
515       case GL_LUMINANCE32F_ARB:
516       case GL_LUMINANCE_ALPHA16F_ARB:
517       case GL_LUMINANCE_ALPHA32F_ARB:
518       case GL_INTENSITY16F_ARB:
519       case GL_INTENSITY32F_ARB:
520       case GL_R16F:
521       case GL_R32F:
522       case GL_RG16F:
523       case GL_RG32F:
524       case GL_RGB16F_ARB:
525       case GL_RGB32F_ARB:
526       case GL_RGBA16F_ARB:
527       case GL_RGBA32F_ARB:
528       /* compressed formats */
529       case GL_COMPRESSED_ALPHA:
530       case GL_COMPRESSED_LUMINANCE:
531       case GL_COMPRESSED_LUMINANCE_ALPHA:
532       case GL_COMPRESSED_INTENSITY:
533       case GL_COMPRESSED_RED:
534       case GL_COMPRESSED_RG:
535       case GL_COMPRESSED_RGB:
536       case GL_COMPRESSED_RGBA:
537       case GL_RGB_S3TC:
538       case GL_RGB4_S3TC:
539       case GL_RGBA_S3TC:
540       case GL_RGBA4_S3TC:
541       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
542       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
543       case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
544       case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
545       case GL_COMPRESSED_RGB_FXT1_3DFX:
546       case GL_COMPRESSED_RGBA_FXT1_3DFX:
547 #if FEATURE_EXT_texture_sRGB
548       case GL_SRGB_EXT:
549       case GL_SRGB8_EXT:
550       case GL_SRGB_ALPHA_EXT:
551       case GL_SRGB8_ALPHA8_EXT:
552       case GL_SLUMINANCE_ALPHA_EXT:
553       case GL_SLUMINANCE8_ALPHA8_EXT:
554       case GL_SLUMINANCE_EXT:
555       case GL_SLUMINANCE8_EXT:
556       case GL_COMPRESSED_SRGB_EXT:
557       case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
558       case GL_COMPRESSED_SRGB_ALPHA_EXT:
559       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
560       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
561       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
562       case GL_COMPRESSED_SLUMINANCE_EXT:
563       case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
564 #endif /* FEATURE_EXT_texture_sRGB */
565       case GL_COMPRESSED_RED_RGTC1:
566       case GL_COMPRESSED_SIGNED_RED_RGTC1:
567       case GL_COMPRESSED_RG_RGTC2:
568       case GL_COMPRESSED_SIGNED_RG_RGTC2:
569       case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
570       case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
571       case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
572       case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
573       case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
574       case GL_ETC1_RGB8_OES:
575       /* generic integer formats */
576       case GL_RED_INTEGER_EXT:
577       case GL_GREEN_INTEGER_EXT:
578       case GL_BLUE_INTEGER_EXT:
579       case GL_ALPHA_INTEGER_EXT:
580       case GL_RGB_INTEGER_EXT:
581       case GL_RGBA_INTEGER_EXT:
582       case GL_BGR_INTEGER_EXT:
583       case GL_BGRA_INTEGER_EXT:
584       case GL_RG_INTEGER:
585       case GL_LUMINANCE_INTEGER_EXT:
586       case GL_LUMINANCE_ALPHA_INTEGER_EXT:
587       /* sized integer formats */
588       case GL_RGBA32UI_EXT:
589       case GL_RGB32UI_EXT:
590       case GL_RG32UI:
591       case GL_R32UI:
592       case GL_ALPHA32UI_EXT:
593       case GL_INTENSITY32UI_EXT:
594       case GL_LUMINANCE32UI_EXT:
595       case GL_LUMINANCE_ALPHA32UI_EXT:
596       case GL_RGBA16UI_EXT:
597       case GL_RGB16UI_EXT:
598       case GL_RG16UI:
599       case GL_R16UI:
600       case GL_ALPHA16UI_EXT:
601       case GL_INTENSITY16UI_EXT:
602       case GL_LUMINANCE16UI_EXT:
603       case GL_LUMINANCE_ALPHA16UI_EXT:
604       case GL_RGBA8UI_EXT:
605       case GL_RGB8UI_EXT:
606       case GL_RG8UI:
607       case GL_R8UI:
608       case GL_ALPHA8UI_EXT:
609       case GL_INTENSITY8UI_EXT:
610       case GL_LUMINANCE8UI_EXT:
611       case GL_LUMINANCE_ALPHA8UI_EXT:
612       case GL_RGBA32I_EXT:
613       case GL_RGB32I_EXT:
614       case GL_RG32I:
615       case GL_R32I:
616       case GL_ALPHA32I_EXT:
617       case GL_INTENSITY32I_EXT:
618       case GL_LUMINANCE32I_EXT:
619       case GL_LUMINANCE_ALPHA32I_EXT:
620       case GL_RGBA16I_EXT:
621       case GL_RGB16I_EXT:
622       case GL_RG16I:
623       case GL_R16I:
624       case GL_ALPHA16I_EXT:
625       case GL_INTENSITY16I_EXT:
626       case GL_LUMINANCE16I_EXT:
627       case GL_LUMINANCE_ALPHA16I_EXT:
628       case GL_RGBA8I_EXT:
629       case GL_RGB8I_EXT:
630       case GL_RG8I:
631       case GL_R8I:
632       case GL_ALPHA8I_EXT:
633       case GL_INTENSITY8I_EXT:
634       case GL_LUMINANCE8I_EXT:
635       case GL_LUMINANCE_ALPHA8I_EXT:
636       /* signed, normalized texture formats */
637       case GL_RED_SNORM:
638       case GL_R8_SNORM:
639       case GL_R16_SNORM:
640       case GL_RG_SNORM:
641       case GL_RG8_SNORM:
642       case GL_RG16_SNORM:
643       case GL_RGB_SNORM:
644       case GL_RGB8_SNORM:
645       case GL_RGB16_SNORM:
646       case GL_RGBA_SNORM:
647       case GL_RGBA8_SNORM:
648       case GL_RGBA16_SNORM:
649       case GL_ALPHA_SNORM:
650       case GL_ALPHA8_SNORM:
651       case GL_ALPHA16_SNORM:
652       case GL_LUMINANCE_SNORM:
653       case GL_LUMINANCE8_SNORM:
654       case GL_LUMINANCE16_SNORM:
655       case GL_LUMINANCE_ALPHA_SNORM:
656       case GL_LUMINANCE8_ALPHA8_SNORM:
657       case GL_LUMINANCE16_ALPHA16_SNORM:
658       case GL_INTENSITY_SNORM:
659       case GL_INTENSITY8_SNORM:
660       case GL_INTENSITY16_SNORM:
661       case GL_RGB9_E5:
662       case GL_R11F_G11F_B10F:
663       case GL_RGB10_A2UI:
664          return GL_TRUE;
665       case GL_YCBCR_MESA:  /* not considered to be RGB */
666          /* fall-through */
667       default:
668          return GL_FALSE;
669    }
670 }
671 
672 
673 /**
674  * Test if the given image format is a depth component format.
675  */
676 GLboolean
_mesa_is_depth_format(GLenum format)677 _mesa_is_depth_format(GLenum format)
678 {
679    switch (format) {
680       case GL_DEPTH_COMPONENT:
681       case GL_DEPTH_COMPONENT16:
682       case GL_DEPTH_COMPONENT24:
683       case GL_DEPTH_COMPONENT32:
684       case GL_DEPTH_COMPONENT32F:
685          return GL_TRUE;
686       default:
687          return GL_FALSE;
688    }
689 }
690 
691 
692 /**
693  * Test if the given image format is a stencil format.
694  */
695 GLboolean
_mesa_is_stencil_format(GLenum format)696 _mesa_is_stencil_format(GLenum format)
697 {
698    switch (format) {
699       case GL_STENCIL_INDEX:
700          return GL_TRUE;
701       default:
702          return GL_FALSE;
703    }
704 }
705 
706 
707 /**
708  * Test if the given image format is a YCbCr format.
709  */
710 GLboolean
_mesa_is_ycbcr_format(GLenum format)711 _mesa_is_ycbcr_format(GLenum format)
712 {
713    switch (format) {
714       case GL_YCBCR_MESA:
715          return GL_TRUE;
716       default:
717          return GL_FALSE;
718    }
719 }
720 
721 
722 /**
723  * Test if the given image format is a depth+stencil format.
724  */
725 GLboolean
_mesa_is_depthstencil_format(GLenum format)726 _mesa_is_depthstencil_format(GLenum format)
727 {
728    switch (format) {
729       case GL_DEPTH24_STENCIL8_EXT:
730       case GL_DEPTH_STENCIL_EXT:
731       case GL_DEPTH32F_STENCIL8:
732          return GL_TRUE;
733       default:
734          return GL_FALSE;
735    }
736 }
737 
738 
739 /**
740  * Test if the given image format is a depth or stencil format.
741  */
742 GLboolean
_mesa_is_depth_or_stencil_format(GLenum format)743 _mesa_is_depth_or_stencil_format(GLenum format)
744 {
745    switch (format) {
746       case GL_DEPTH_COMPONENT:
747       case GL_DEPTH_COMPONENT16:
748       case GL_DEPTH_COMPONENT24:
749       case GL_DEPTH_COMPONENT32:
750       case GL_STENCIL_INDEX:
751       case GL_STENCIL_INDEX1_EXT:
752       case GL_STENCIL_INDEX4_EXT:
753       case GL_STENCIL_INDEX8_EXT:
754       case GL_STENCIL_INDEX16_EXT:
755       case GL_DEPTH_STENCIL_EXT:
756       case GL_DEPTH24_STENCIL8_EXT:
757       case GL_DEPTH_COMPONENT32F:
758       case GL_DEPTH32F_STENCIL8:
759          return GL_TRUE;
760       default:
761          return GL_FALSE;
762    }
763 }
764 
765 
766 /**
767  * Test if the given image format is a dudv format.
768  */
769 GLboolean
_mesa_is_dudv_format(GLenum format)770 _mesa_is_dudv_format(GLenum format)
771 {
772    switch (format) {
773       case GL_DUDV_ATI:
774       case GL_DU8DV8_ATI:
775          return GL_TRUE;
776       default:
777          return GL_FALSE;
778    }
779 }
780 
781 
782 /**
783  * Test if an image format is a supported compressed format.
784  * \param format the internal format token provided by the user.
785  * \return GL_TRUE if compressed, GL_FALSE if uncompressed
786  */
787 GLboolean
_mesa_is_compressed_format(struct gl_context * ctx,GLenum format)788 _mesa_is_compressed_format(struct gl_context *ctx, GLenum format)
789 {
790    switch (format) {
791    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
792    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
793       return ctx->Extensions.EXT_texture_compression_s3tc;
794    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
795    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
796       return _mesa_is_desktop_gl(ctx)
797          && ctx->Extensions.EXT_texture_compression_s3tc;
798    case GL_RGB_S3TC:
799    case GL_RGB4_S3TC:
800    case GL_RGBA_S3TC:
801    case GL_RGBA4_S3TC:
802       return _mesa_is_desktop_gl(ctx) && ctx->Extensions.S3_s3tc;
803    case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
804    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
805    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
806    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
807       return _mesa_is_desktop_gl(ctx)
808          && ctx->Extensions.EXT_texture_sRGB
809          && ctx->Extensions.EXT_texture_compression_s3tc;
810    case GL_COMPRESSED_RGB_FXT1_3DFX:
811    case GL_COMPRESSED_RGBA_FXT1_3DFX:
812       return _mesa_is_desktop_gl(ctx)
813          && ctx->Extensions.TDFX_texture_compression_FXT1;
814    case GL_COMPRESSED_RED_RGTC1:
815    case GL_COMPRESSED_SIGNED_RED_RGTC1:
816    case GL_COMPRESSED_RG_RGTC2:
817    case GL_COMPRESSED_SIGNED_RG_RGTC2:
818       return _mesa_is_desktop_gl(ctx)
819          && ctx->Extensions.ARB_texture_compression_rgtc;
820    case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
821    case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
822    case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
823    case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
824       return ctx->API == API_OPENGL
825          && ctx->Extensions.EXT_texture_compression_latc;
826    case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
827       return ctx->API == API_OPENGL
828          && ctx->Extensions.ATI_texture_compression_3dc;
829    case GL_ETC1_RGB8_OES:
830       return _mesa_is_gles(ctx)
831          && ctx->Extensions.OES_compressed_ETC1_RGB8_texture;
832 #if FEATURE_ES
833    case GL_PALETTE4_RGB8_OES:
834    case GL_PALETTE4_RGBA8_OES:
835    case GL_PALETTE4_R5_G6_B5_OES:
836    case GL_PALETTE4_RGBA4_OES:
837    case GL_PALETTE4_RGB5_A1_OES:
838    case GL_PALETTE8_RGB8_OES:
839    case GL_PALETTE8_RGBA8_OES:
840    case GL_PALETTE8_R5_G6_B5_OES:
841    case GL_PALETTE8_RGBA4_OES:
842    case GL_PALETTE8_RGB5_A1_OES:
843       return ctx->API == API_OPENGLES;
844 #endif
845    default:
846       return GL_FALSE;
847    }
848 }
849 
850 
851 /**
852  * Convert various base formats to the cooresponding integer format.
853  */
854 GLenum
_mesa_base_format_to_integer_format(GLenum format)855 _mesa_base_format_to_integer_format(GLenum format)
856 {
857    switch(format) {
858    case GL_RED:
859       return GL_RED_INTEGER;
860    case GL_GREEN:
861       return GL_GREEN_INTEGER;
862    case GL_BLUE:
863       return GL_BLUE_INTEGER;
864    case GL_RG:
865       return GL_RG_INTEGER;
866    case GL_RGB:
867       return GL_RGB_INTEGER;
868    case GL_RGBA:
869       return GL_RGBA_INTEGER;
870    case GL_BGR:
871       return GL_BGR_INTEGER;
872    case GL_BGRA:
873       return GL_BGRA_INTEGER;
874    case GL_ALPHA:
875       return GL_ALPHA_INTEGER;
876    case GL_LUMINANCE:
877       return GL_LUMINANCE_INTEGER_EXT;
878    case GL_LUMINANCE_ALPHA:
879       return GL_LUMINANCE_ALPHA_INTEGER_EXT;
880    }
881 
882    return format;
883 }
884 
885 
886 /**
887  * Does the given base texture/renderbuffer format have the channel
888  * named by 'pname'?
889  */
890 GLboolean
_mesa_base_format_has_channel(GLenum base_format,GLenum pname)891 _mesa_base_format_has_channel(GLenum base_format, GLenum pname)
892 {
893    switch (pname) {
894    case GL_TEXTURE_RED_SIZE:
895    case GL_TEXTURE_RED_TYPE:
896    case GL_RENDERBUFFER_RED_SIZE_EXT:
897    case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
898       if (base_format == GL_RED ||
899 	  base_format == GL_RG ||
900 	  base_format == GL_RGB ||
901 	  base_format == GL_RGBA) {
902 	 return GL_TRUE;
903       }
904       return GL_FALSE;
905    case GL_TEXTURE_GREEN_SIZE:
906    case GL_TEXTURE_GREEN_TYPE:
907    case GL_RENDERBUFFER_GREEN_SIZE_EXT:
908    case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
909       if (base_format == GL_RG ||
910 	  base_format == GL_RGB ||
911 	  base_format == GL_RGBA) {
912 	 return GL_TRUE;
913       }
914       return GL_FALSE;
915    case GL_TEXTURE_BLUE_SIZE:
916    case GL_TEXTURE_BLUE_TYPE:
917    case GL_RENDERBUFFER_BLUE_SIZE_EXT:
918    case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
919       if (base_format == GL_RGB ||
920 	  base_format == GL_RGBA) {
921 	 return GL_TRUE;
922       }
923       return GL_FALSE;
924    case GL_TEXTURE_ALPHA_SIZE:
925    case GL_TEXTURE_ALPHA_TYPE:
926    case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
927    case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
928       if (base_format == GL_RGBA ||
929 	  base_format == GL_ALPHA ||
930 	  base_format == GL_LUMINANCE_ALPHA) {
931 	 return GL_TRUE;
932       }
933       return GL_FALSE;
934    case GL_TEXTURE_LUMINANCE_SIZE:
935    case GL_TEXTURE_LUMINANCE_TYPE:
936       if (base_format == GL_LUMINANCE ||
937 	  base_format == GL_LUMINANCE_ALPHA) {
938 	 return GL_TRUE;
939       }
940       return GL_FALSE;
941    case GL_TEXTURE_INTENSITY_SIZE:
942    case GL_TEXTURE_INTENSITY_TYPE:
943       if (base_format == GL_INTENSITY) {
944 	 return GL_TRUE;
945       }
946       return GL_FALSE;
947    case GL_TEXTURE_DEPTH_SIZE:
948    case GL_TEXTURE_DEPTH_TYPE:
949    case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
950    case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
951       if (base_format == GL_DEPTH_STENCIL ||
952 	  base_format == GL_DEPTH_COMPONENT) {
953 	 return GL_TRUE;
954       }
955       return GL_FALSE;
956    case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
957    case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
958       if (base_format == GL_DEPTH_STENCIL ||
959 	  base_format == GL_STENCIL_INDEX) {
960 	 return GL_TRUE;
961       }
962       return GL_FALSE;
963    default:
964       _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n",
965 		    __FUNCTION__, pname);
966       return GL_FALSE;
967    }
968 
969    return GL_FALSE;
970 }
971 
972 
973 /**
974  * If format is a generic compressed format, return the corresponding
975  * non-compressed format.  For other formats, return the format as-is.
976  */
977 GLenum
_mesa_generic_compressed_format_to_uncompressed_format(GLenum format)978 _mesa_generic_compressed_format_to_uncompressed_format(GLenum format)
979 {
980    switch (format) {
981    case GL_COMPRESSED_RED:
982       return GL_RED;
983    case GL_COMPRESSED_RG:
984       return GL_RG;
985    case GL_COMPRESSED_RGB:
986       return GL_RGB;
987    case GL_COMPRESSED_RGBA:
988       return GL_RGBA;
989    case GL_COMPRESSED_ALPHA:
990       return GL_ALPHA;
991    case GL_COMPRESSED_LUMINANCE:
992       return GL_LUMINANCE;
993    case GL_COMPRESSED_LUMINANCE_ALPHA:
994       return GL_LUMINANCE_ALPHA;
995    case GL_COMPRESSED_INTENSITY:
996       return GL_INTENSITY;
997    /* sRGB formats */
998    case GL_COMPRESSED_SRGB:
999       return GL_SRGB;
1000    case GL_COMPRESSED_SRGB_ALPHA:
1001       return GL_SRGB_ALPHA;
1002    case GL_COMPRESSED_SLUMINANCE:
1003       return GL_SLUMINANCE;
1004    case GL_COMPRESSED_SLUMINANCE_ALPHA:
1005       return GL_SLUMINANCE_ALPHA;
1006    default:
1007       return format;
1008    }
1009 }
1010 
1011 
1012 /**
1013  * Do error checking of format/type combinations for glReadPixels,
1014  * glDrawPixels and glTex[Sub]Image.  Note that depending on the format
1015  * and type values, we may either generate GL_INVALID_OPERATION or
1016  * GL_INVALID_ENUM.
1017  *
1018  * \param format pixel format.
1019  * \param type pixel type.
1020  *
1021  * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR
1022  */
1023 GLenum
_mesa_error_check_format_and_type(const struct gl_context * ctx,GLenum format,GLenum type)1024 _mesa_error_check_format_and_type(const struct gl_context *ctx,
1025                                   GLenum format, GLenum type)
1026 {
1027    /* special type-based checks (see glReadPixels, glDrawPixels error lists) */
1028    switch (type) {
1029    case GL_BITMAP:
1030       if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) {
1031          return GL_INVALID_ENUM;
1032       }
1033       break;
1034 
1035    case GL_UNSIGNED_BYTE_3_3_2:
1036    case GL_UNSIGNED_BYTE_2_3_3_REV:
1037    case GL_UNSIGNED_SHORT_5_6_5:
1038    case GL_UNSIGNED_SHORT_5_6_5_REV:
1039       if (format == GL_RGB) {
1040          break; /* OK */
1041       }
1042       if (format == GL_RGB_INTEGER_EXT &&
1043           ctx->Extensions.ARB_texture_rgb10_a2ui) {
1044          break; /* OK */
1045       }
1046       return GL_INVALID_OPERATION;
1047 
1048    case GL_UNSIGNED_SHORT_4_4_4_4:
1049    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1050    case GL_UNSIGNED_SHORT_5_5_5_1:
1051    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1052    case GL_UNSIGNED_INT_8_8_8_8:
1053    case GL_UNSIGNED_INT_8_8_8_8_REV:
1054    case GL_UNSIGNED_INT_10_10_10_2:
1055    case GL_UNSIGNED_INT_2_10_10_10_REV:
1056       if (format == GL_RGBA ||
1057           format == GL_BGRA ||
1058           format == GL_ABGR_EXT) {
1059          break; /* OK */
1060       }
1061       if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) &&
1062           ctx->Extensions.ARB_texture_rgb10_a2ui) {
1063          break; /* OK */
1064       }
1065       return GL_INVALID_OPERATION;
1066 
1067    case GL_UNSIGNED_INT_24_8:
1068       if (!ctx->Extensions.EXT_packed_depth_stencil) {
1069          return GL_INVALID_ENUM;
1070       }
1071       if (format != GL_DEPTH_STENCIL) {
1072          return GL_INVALID_OPERATION;
1073       }
1074       return GL_NO_ERROR;
1075 
1076    case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
1077       if (!ctx->Extensions.ARB_depth_buffer_float) {
1078          return GL_INVALID_ENUM;
1079       }
1080       if (format != GL_DEPTH_STENCIL) {
1081          return GL_INVALID_OPERATION;
1082       }
1083       return GL_NO_ERROR;
1084 
1085    case GL_UNSIGNED_INT_10F_11F_11F_REV:
1086       if (!ctx->Extensions.EXT_packed_float) {
1087          return GL_INVALID_ENUM;
1088       }
1089       if (format != GL_RGB) {
1090          return GL_INVALID_OPERATION;
1091       }
1092       return GL_NO_ERROR;
1093 
1094    default:
1095       ; /* fall-through */
1096    }
1097 
1098    /* now, for each format, check the type for compatibility */
1099    switch (format) {
1100       case GL_COLOR_INDEX:
1101       case GL_STENCIL_INDEX:
1102          switch (type) {
1103             case GL_BITMAP:
1104             case GL_BYTE:
1105             case GL_UNSIGNED_BYTE:
1106             case GL_SHORT:
1107             case GL_UNSIGNED_SHORT:
1108             case GL_INT:
1109             case GL_UNSIGNED_INT:
1110             case GL_FLOAT:
1111                return GL_NO_ERROR;
1112             case GL_HALF_FLOAT:
1113                return ctx->Extensions.ARB_half_float_pixel
1114                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1115             default:
1116                return GL_INVALID_ENUM;
1117          }
1118 
1119       case GL_RED:
1120       case GL_GREEN:
1121       case GL_BLUE:
1122       case GL_ALPHA:
1123 #if 0 /* not legal!  see table 3.6 of the 1.5 spec */
1124       case GL_INTENSITY:
1125 #endif
1126       case GL_LUMINANCE:
1127       case GL_LUMINANCE_ALPHA:
1128       case GL_DEPTH_COMPONENT:
1129          switch (type) {
1130             case GL_BYTE:
1131             case GL_UNSIGNED_BYTE:
1132             case GL_SHORT:
1133             case GL_UNSIGNED_SHORT:
1134             case GL_INT:
1135             case GL_UNSIGNED_INT:
1136             case GL_FLOAT:
1137                return GL_NO_ERROR;
1138             case GL_HALF_FLOAT:
1139                return ctx->Extensions.ARB_half_float_pixel
1140                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1141             default:
1142                return GL_INVALID_ENUM;
1143          }
1144 
1145       case GL_RG:
1146 	 if (!ctx->Extensions.ARB_texture_rg)
1147 	    return GL_INVALID_ENUM;
1148          switch (type) {
1149             case GL_BYTE:
1150             case GL_UNSIGNED_BYTE:
1151             case GL_SHORT:
1152             case GL_UNSIGNED_SHORT:
1153             case GL_INT:
1154             case GL_UNSIGNED_INT:
1155             case GL_FLOAT:
1156                return GL_NO_ERROR;
1157             case GL_HALF_FLOAT:
1158                return ctx->Extensions.ARB_half_float_pixel
1159                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1160             default:
1161                return GL_INVALID_ENUM;
1162          }
1163 
1164       case GL_RGB:
1165          switch (type) {
1166             case GL_BYTE:
1167             case GL_UNSIGNED_BYTE:
1168             case GL_SHORT:
1169             case GL_UNSIGNED_SHORT:
1170             case GL_INT:
1171             case GL_UNSIGNED_INT:
1172             case GL_FLOAT:
1173             case GL_UNSIGNED_BYTE_3_3_2:
1174             case GL_UNSIGNED_BYTE_2_3_3_REV:
1175             case GL_UNSIGNED_SHORT_5_6_5:
1176             case GL_UNSIGNED_SHORT_5_6_5_REV:
1177                return GL_NO_ERROR;
1178             case GL_HALF_FLOAT:
1179                return ctx->Extensions.ARB_half_float_pixel
1180                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1181             case GL_UNSIGNED_INT_5_9_9_9_REV:
1182                return ctx->Extensions.EXT_texture_shared_exponent
1183                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1184             case GL_UNSIGNED_INT_10F_11F_11F_REV:
1185                return ctx->Extensions.EXT_packed_float
1186                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1187             default:
1188                return GL_INVALID_ENUM;
1189          }
1190 
1191       case GL_BGR:
1192          switch (type) {
1193             /* NOTE: no packed types are supported with BGR.  That's
1194              * intentional, according to the GL spec.
1195              */
1196             case GL_BYTE:
1197             case GL_UNSIGNED_BYTE:
1198             case GL_SHORT:
1199             case GL_UNSIGNED_SHORT:
1200             case GL_INT:
1201             case GL_UNSIGNED_INT:
1202             case GL_FLOAT:
1203                return GL_NO_ERROR;
1204             case GL_HALF_FLOAT:
1205                return ctx->Extensions.ARB_half_float_pixel
1206                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1207             default:
1208                return GL_INVALID_ENUM;
1209          }
1210 
1211       case GL_RGBA:
1212       case GL_BGRA:
1213       case GL_ABGR_EXT:
1214          switch (type) {
1215             case GL_BYTE:
1216             case GL_UNSIGNED_BYTE:
1217             case GL_SHORT:
1218             case GL_UNSIGNED_SHORT:
1219             case GL_INT:
1220             case GL_UNSIGNED_INT:
1221             case GL_FLOAT:
1222             case GL_UNSIGNED_SHORT_4_4_4_4:
1223             case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1224             case GL_UNSIGNED_SHORT_5_5_5_1:
1225             case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1226             case GL_UNSIGNED_INT_8_8_8_8:
1227             case GL_UNSIGNED_INT_8_8_8_8_REV:
1228             case GL_UNSIGNED_INT_10_10_10_2:
1229             case GL_UNSIGNED_INT_2_10_10_10_REV:
1230                return GL_NO_ERROR;
1231             case GL_HALF_FLOAT:
1232                return ctx->Extensions.ARB_half_float_pixel
1233                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1234             default:
1235                return GL_INVALID_ENUM;
1236          }
1237 
1238       case GL_YCBCR_MESA:
1239          if (!ctx->Extensions.MESA_ycbcr_texture)
1240             return GL_INVALID_ENUM;
1241          if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
1242              type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
1243             return GL_NO_ERROR;
1244          else
1245             return GL_INVALID_OPERATION;
1246 
1247       case GL_DEPTH_STENCIL_EXT:
1248          if (ctx->Extensions.EXT_packed_depth_stencil &&
1249              type == GL_UNSIGNED_INT_24_8)
1250             return GL_NO_ERROR;
1251          else if (ctx->Extensions.ARB_depth_buffer_float &&
1252              type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)
1253             return GL_NO_ERROR;
1254          else
1255             return GL_INVALID_ENUM;
1256 
1257       case GL_DUDV_ATI:
1258       case GL_DU8DV8_ATI:
1259          if (!ctx->Extensions.ATI_envmap_bumpmap)
1260             return GL_INVALID_ENUM;
1261          switch (type) {
1262             case GL_BYTE:
1263             case GL_UNSIGNED_BYTE:
1264             case GL_SHORT:
1265             case GL_UNSIGNED_SHORT:
1266             case GL_INT:
1267             case GL_UNSIGNED_INT:
1268             case GL_FLOAT:
1269                return GL_NO_ERROR;
1270             default:
1271                return GL_INVALID_ENUM;
1272          }
1273 
1274       /* integer-valued formats */
1275       case GL_RED_INTEGER_EXT:
1276       case GL_GREEN_INTEGER_EXT:
1277       case GL_BLUE_INTEGER_EXT:
1278       case GL_ALPHA_INTEGER_EXT:
1279       case GL_RG_INTEGER:
1280          switch (type) {
1281             case GL_BYTE:
1282             case GL_UNSIGNED_BYTE:
1283             case GL_SHORT:
1284             case GL_UNSIGNED_SHORT:
1285             case GL_INT:
1286             case GL_UNSIGNED_INT:
1287                return (ctx->Version >= 30 ||
1288                        ctx->Extensions.EXT_texture_integer)
1289                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1290             default:
1291                return GL_INVALID_ENUM;
1292          }
1293 
1294       case GL_RGB_INTEGER_EXT:
1295          switch (type) {
1296             case GL_BYTE:
1297             case GL_UNSIGNED_BYTE:
1298             case GL_SHORT:
1299             case GL_UNSIGNED_SHORT:
1300             case GL_INT:
1301             case GL_UNSIGNED_INT:
1302                return (ctx->Version >= 30 ||
1303                        ctx->Extensions.EXT_texture_integer)
1304                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1305             case GL_UNSIGNED_BYTE_3_3_2:
1306             case GL_UNSIGNED_BYTE_2_3_3_REV:
1307             case GL_UNSIGNED_SHORT_5_6_5:
1308             case GL_UNSIGNED_SHORT_5_6_5_REV:
1309                return ctx->Extensions.ARB_texture_rgb10_a2ui
1310                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1311             default:
1312                return GL_INVALID_ENUM;
1313          }
1314 
1315       case GL_BGR_INTEGER_EXT:
1316          switch (type) {
1317             case GL_BYTE:
1318             case GL_UNSIGNED_BYTE:
1319             case GL_SHORT:
1320             case GL_UNSIGNED_SHORT:
1321             case GL_INT:
1322             case GL_UNSIGNED_INT:
1323             /* NOTE: no packed formats w/ BGR format */
1324                return (ctx->Version >= 30 ||
1325                        ctx->Extensions.EXT_texture_integer)
1326                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1327             default:
1328                return GL_INVALID_ENUM;
1329          }
1330 
1331       case GL_RGBA_INTEGER_EXT:
1332       case GL_BGRA_INTEGER_EXT:
1333          switch (type) {
1334             case GL_BYTE:
1335             case GL_UNSIGNED_BYTE:
1336             case GL_SHORT:
1337             case GL_UNSIGNED_SHORT:
1338             case GL_INT:
1339             case GL_UNSIGNED_INT:
1340                return (ctx->Version >= 30 ||
1341                        ctx->Extensions.EXT_texture_integer)
1342                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1343             case GL_UNSIGNED_SHORT_4_4_4_4:
1344             case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1345             case GL_UNSIGNED_SHORT_5_5_5_1:
1346             case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1347             case GL_UNSIGNED_INT_8_8_8_8:
1348             case GL_UNSIGNED_INT_8_8_8_8_REV:
1349             case GL_UNSIGNED_INT_10_10_10_2:
1350             case GL_UNSIGNED_INT_2_10_10_10_REV:
1351                return ctx->Extensions.ARB_texture_rgb10_a2ui
1352                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1353             default:
1354                return GL_INVALID_ENUM;
1355          }
1356 
1357       case GL_LUMINANCE_INTEGER_EXT:
1358       case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1359          switch (type) {
1360             case GL_BYTE:
1361             case GL_UNSIGNED_BYTE:
1362             case GL_SHORT:
1363             case GL_UNSIGNED_SHORT:
1364             case GL_INT:
1365             case GL_UNSIGNED_INT:
1366                return ctx->Extensions.EXT_texture_integer
1367                   ? GL_NO_ERROR : GL_INVALID_ENUM;
1368             default:
1369                return GL_INVALID_ENUM;
1370          }
1371 
1372       default:
1373          return GL_INVALID_ENUM;
1374    }
1375    return GL_NO_ERROR;
1376 }
1377