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 * If format is a generic compressed format, return the corresponding
975 * non-compressed format.  For other formats, return the format as-is.
976 */
977GLenum
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 */
1023GLenum
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