glformats.c revision dd0eb004874645135b9aaac3ebbd0aaf274079ea
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 */
34GLboolean
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 */
72GLint
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 */
108GLint
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 */
166GLint
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 */
223GLint
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 */
313GLboolean
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 */
389GLboolean
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 */
409extern GLboolean
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
416GLboolean
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 */
453GLboolean
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 */
676GLboolean
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 */
695GLboolean
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 */
710GLboolean
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 */
725GLboolean
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 */
742GLboolean
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 */
769GLboolean
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 */
787GLboolean
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 */
854GLenum
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 */
890GLboolean
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 * Do error checking of format/type combinations for glReadPixels,
975 * glDrawPixels and glTex[Sub]Image.  Note that depending on the format
976 * and type values, we may either generate GL_INVALID_OPERATION or
977 * GL_INVALID_ENUM.
978 *
979 * \param format pixel format.
980 * \param type pixel type.
981 *
982 * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR
983 */
984GLenum
985_mesa_error_check_format_and_type(const struct gl_context *ctx,
986                                  GLenum format, GLenum type)
987{
988   /* special type-based checks (see glReadPixels, glDrawPixels error lists) */
989   switch (type) {
990   case GL_BITMAP:
991      if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) {
992         return GL_INVALID_ENUM;
993      }
994      break;
995
996   case GL_UNSIGNED_BYTE_3_3_2:
997   case GL_UNSIGNED_BYTE_2_3_3_REV:
998   case GL_UNSIGNED_SHORT_5_6_5:
999   case GL_UNSIGNED_SHORT_5_6_5_REV:
1000      if (format == GL_RGB) {
1001         break; /* OK */
1002      }
1003      if (format == GL_RGB_INTEGER_EXT &&
1004          ctx->Extensions.ARB_texture_rgb10_a2ui) {
1005         break; /* OK */
1006      }
1007      return GL_INVALID_OPERATION;
1008
1009   case GL_UNSIGNED_SHORT_4_4_4_4:
1010   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1011   case GL_UNSIGNED_SHORT_5_5_5_1:
1012   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1013   case GL_UNSIGNED_INT_8_8_8_8:
1014   case GL_UNSIGNED_INT_8_8_8_8_REV:
1015   case GL_UNSIGNED_INT_10_10_10_2:
1016   case GL_UNSIGNED_INT_2_10_10_10_REV:
1017      if (format == GL_RGBA ||
1018          format == GL_BGRA ||
1019          format == GL_ABGR_EXT) {
1020         break; /* OK */
1021      }
1022      if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) &&
1023          ctx->Extensions.ARB_texture_rgb10_a2ui) {
1024         break; /* OK */
1025      }
1026      return GL_INVALID_OPERATION;
1027
1028   case GL_UNSIGNED_INT_24_8:
1029      if (!ctx->Extensions.EXT_packed_depth_stencil) {
1030         return GL_INVALID_ENUM;
1031      }
1032      if (format != GL_DEPTH_STENCIL) {
1033         return GL_INVALID_OPERATION;
1034      }
1035      return GL_NO_ERROR;
1036
1037   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
1038      if (!ctx->Extensions.ARB_depth_buffer_float) {
1039         return GL_INVALID_ENUM;
1040      }
1041      if (format != GL_DEPTH_STENCIL) {
1042         return GL_INVALID_OPERATION;
1043      }
1044      return GL_NO_ERROR;
1045
1046   case GL_UNSIGNED_INT_10F_11F_11F_REV:
1047      if (!ctx->Extensions.EXT_packed_float) {
1048         return GL_INVALID_ENUM;
1049      }
1050      if (format != GL_RGB) {
1051         return GL_INVALID_OPERATION;
1052      }
1053      return GL_NO_ERROR;
1054
1055   default:
1056      ; /* fall-through */
1057   }
1058
1059   /* now, for each format, check the type for compatibility */
1060   switch (format) {
1061      case GL_COLOR_INDEX:
1062      case GL_STENCIL_INDEX:
1063         switch (type) {
1064            case GL_BITMAP:
1065            case GL_BYTE:
1066            case GL_UNSIGNED_BYTE:
1067            case GL_SHORT:
1068            case GL_UNSIGNED_SHORT:
1069            case GL_INT:
1070            case GL_UNSIGNED_INT:
1071            case GL_FLOAT:
1072               return GL_NO_ERROR;
1073            case GL_HALF_FLOAT:
1074               return ctx->Extensions.ARB_half_float_pixel
1075                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1076            default:
1077               return GL_INVALID_ENUM;
1078         }
1079
1080      case GL_RED:
1081      case GL_GREEN:
1082      case GL_BLUE:
1083      case GL_ALPHA:
1084#if 0 /* not legal!  see table 3.6 of the 1.5 spec */
1085      case GL_INTENSITY:
1086#endif
1087      case GL_LUMINANCE:
1088      case GL_LUMINANCE_ALPHA:
1089      case GL_DEPTH_COMPONENT:
1090         switch (type) {
1091            case GL_BYTE:
1092            case GL_UNSIGNED_BYTE:
1093            case GL_SHORT:
1094            case GL_UNSIGNED_SHORT:
1095            case GL_INT:
1096            case GL_UNSIGNED_INT:
1097            case GL_FLOAT:
1098               return GL_NO_ERROR;
1099            case GL_HALF_FLOAT:
1100               return ctx->Extensions.ARB_half_float_pixel
1101                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1102            default:
1103               return GL_INVALID_ENUM;
1104         }
1105
1106      case GL_RG:
1107	 if (!ctx->Extensions.ARB_texture_rg)
1108	    return GL_INVALID_ENUM;
1109         switch (type) {
1110            case GL_BYTE:
1111            case GL_UNSIGNED_BYTE:
1112            case GL_SHORT:
1113            case GL_UNSIGNED_SHORT:
1114            case GL_INT:
1115            case GL_UNSIGNED_INT:
1116            case GL_FLOAT:
1117               return GL_NO_ERROR;
1118            case GL_HALF_FLOAT:
1119               return ctx->Extensions.ARB_half_float_pixel
1120                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1121            default:
1122               return GL_INVALID_ENUM;
1123         }
1124
1125      case GL_RGB:
1126         switch (type) {
1127            case GL_BYTE:
1128            case GL_UNSIGNED_BYTE:
1129            case GL_SHORT:
1130            case GL_UNSIGNED_SHORT:
1131            case GL_INT:
1132            case GL_UNSIGNED_INT:
1133            case GL_FLOAT:
1134            case GL_UNSIGNED_BYTE_3_3_2:
1135            case GL_UNSIGNED_BYTE_2_3_3_REV:
1136            case GL_UNSIGNED_SHORT_5_6_5:
1137            case GL_UNSIGNED_SHORT_5_6_5_REV:
1138               return GL_NO_ERROR;
1139            case GL_HALF_FLOAT:
1140               return ctx->Extensions.ARB_half_float_pixel
1141                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1142            case GL_UNSIGNED_INT_5_9_9_9_REV:
1143               return ctx->Extensions.EXT_texture_shared_exponent
1144                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1145            case GL_UNSIGNED_INT_10F_11F_11F_REV:
1146               return ctx->Extensions.EXT_packed_float
1147                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1148            default:
1149               return GL_INVALID_ENUM;
1150         }
1151
1152      case GL_BGR:
1153         switch (type) {
1154            /* NOTE: no packed types are supported with BGR.  That's
1155             * intentional, according to the GL spec.
1156             */
1157            case GL_BYTE:
1158            case GL_UNSIGNED_BYTE:
1159            case GL_SHORT:
1160            case GL_UNSIGNED_SHORT:
1161            case GL_INT:
1162            case GL_UNSIGNED_INT:
1163            case GL_FLOAT:
1164               return GL_NO_ERROR;
1165            case GL_HALF_FLOAT:
1166               return ctx->Extensions.ARB_half_float_pixel
1167                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1168            default:
1169               return GL_INVALID_ENUM;
1170         }
1171
1172      case GL_RGBA:
1173      case GL_BGRA:
1174      case GL_ABGR_EXT:
1175         switch (type) {
1176            case GL_BYTE:
1177            case GL_UNSIGNED_BYTE:
1178            case GL_SHORT:
1179            case GL_UNSIGNED_SHORT:
1180            case GL_INT:
1181            case GL_UNSIGNED_INT:
1182            case GL_FLOAT:
1183            case GL_UNSIGNED_SHORT_4_4_4_4:
1184            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1185            case GL_UNSIGNED_SHORT_5_5_5_1:
1186            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1187            case GL_UNSIGNED_INT_8_8_8_8:
1188            case GL_UNSIGNED_INT_8_8_8_8_REV:
1189            case GL_UNSIGNED_INT_10_10_10_2:
1190            case GL_UNSIGNED_INT_2_10_10_10_REV:
1191               return GL_NO_ERROR;
1192            case GL_HALF_FLOAT:
1193               return ctx->Extensions.ARB_half_float_pixel
1194                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1195            default:
1196               return GL_INVALID_ENUM;
1197         }
1198
1199      case GL_YCBCR_MESA:
1200         if (!ctx->Extensions.MESA_ycbcr_texture)
1201            return GL_INVALID_ENUM;
1202         if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
1203             type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
1204            return GL_NO_ERROR;
1205         else
1206            return GL_INVALID_OPERATION;
1207
1208      case GL_DEPTH_STENCIL_EXT:
1209         if (ctx->Extensions.EXT_packed_depth_stencil &&
1210             type == GL_UNSIGNED_INT_24_8)
1211            return GL_NO_ERROR;
1212         else if (ctx->Extensions.ARB_depth_buffer_float &&
1213             type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)
1214            return GL_NO_ERROR;
1215         else
1216            return GL_INVALID_ENUM;
1217
1218      case GL_DUDV_ATI:
1219      case GL_DU8DV8_ATI:
1220         if (!ctx->Extensions.ATI_envmap_bumpmap)
1221            return GL_INVALID_ENUM;
1222         switch (type) {
1223            case GL_BYTE:
1224            case GL_UNSIGNED_BYTE:
1225            case GL_SHORT:
1226            case GL_UNSIGNED_SHORT:
1227            case GL_INT:
1228            case GL_UNSIGNED_INT:
1229            case GL_FLOAT:
1230               return GL_NO_ERROR;
1231            default:
1232               return GL_INVALID_ENUM;
1233         }
1234
1235      /* integer-valued formats */
1236      case GL_RED_INTEGER_EXT:
1237      case GL_GREEN_INTEGER_EXT:
1238      case GL_BLUE_INTEGER_EXT:
1239      case GL_ALPHA_INTEGER_EXT:
1240      case GL_RG_INTEGER:
1241         switch (type) {
1242            case GL_BYTE:
1243            case GL_UNSIGNED_BYTE:
1244            case GL_SHORT:
1245            case GL_UNSIGNED_SHORT:
1246            case GL_INT:
1247            case GL_UNSIGNED_INT:
1248               return (ctx->Version >= 30 ||
1249                       ctx->Extensions.EXT_texture_integer)
1250                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1251            default:
1252               return GL_INVALID_ENUM;
1253         }
1254
1255      case GL_RGB_INTEGER_EXT:
1256         switch (type) {
1257            case GL_BYTE:
1258            case GL_UNSIGNED_BYTE:
1259            case GL_SHORT:
1260            case GL_UNSIGNED_SHORT:
1261            case GL_INT:
1262            case GL_UNSIGNED_INT:
1263               return (ctx->Version >= 30 ||
1264                       ctx->Extensions.EXT_texture_integer)
1265                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1266            case GL_UNSIGNED_BYTE_3_3_2:
1267            case GL_UNSIGNED_BYTE_2_3_3_REV:
1268            case GL_UNSIGNED_SHORT_5_6_5:
1269            case GL_UNSIGNED_SHORT_5_6_5_REV:
1270               return ctx->Extensions.ARB_texture_rgb10_a2ui
1271                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1272            default:
1273               return GL_INVALID_ENUM;
1274         }
1275
1276      case GL_BGR_INTEGER_EXT:
1277         switch (type) {
1278            case GL_BYTE:
1279            case GL_UNSIGNED_BYTE:
1280            case GL_SHORT:
1281            case GL_UNSIGNED_SHORT:
1282            case GL_INT:
1283            case GL_UNSIGNED_INT:
1284            /* NOTE: no packed formats w/ BGR format */
1285               return (ctx->Version >= 30 ||
1286                       ctx->Extensions.EXT_texture_integer)
1287                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1288            default:
1289               return GL_INVALID_ENUM;
1290         }
1291
1292      case GL_RGBA_INTEGER_EXT:
1293      case GL_BGRA_INTEGER_EXT:
1294         switch (type) {
1295            case GL_BYTE:
1296            case GL_UNSIGNED_BYTE:
1297            case GL_SHORT:
1298            case GL_UNSIGNED_SHORT:
1299            case GL_INT:
1300            case GL_UNSIGNED_INT:
1301               return (ctx->Version >= 30 ||
1302                       ctx->Extensions.EXT_texture_integer)
1303                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1304            case GL_UNSIGNED_SHORT_4_4_4_4:
1305            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1306            case GL_UNSIGNED_SHORT_5_5_5_1:
1307            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1308            case GL_UNSIGNED_INT_8_8_8_8:
1309            case GL_UNSIGNED_INT_8_8_8_8_REV:
1310            case GL_UNSIGNED_INT_10_10_10_2:
1311            case GL_UNSIGNED_INT_2_10_10_10_REV:
1312               return ctx->Extensions.ARB_texture_rgb10_a2ui
1313                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1314            default:
1315               return GL_INVALID_ENUM;
1316         }
1317
1318      case GL_LUMINANCE_INTEGER_EXT:
1319      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1320         switch (type) {
1321            case GL_BYTE:
1322            case GL_UNSIGNED_BYTE:
1323            case GL_SHORT:
1324            case GL_UNSIGNED_SHORT:
1325            case GL_INT:
1326            case GL_UNSIGNED_INT:
1327               return ctx->Extensions.EXT_texture_integer
1328                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1329            default:
1330               return GL_INVALID_ENUM;
1331         }
1332
1333      default:
1334         return GL_INVALID_ENUM;
1335   }
1336   return GL_NO_ERROR;
1337}
1338