glformats.c revision 9cfcac45283e12188de915bd6be3522f13b690d3
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          format == GL_RGB)
276         return sizeof(GLuint);
277      else
278         return -1;
279   case GL_UNSIGNED_SHORT_8_8_MESA:
280   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
281      if (format == GL_YCBCR_MESA)
282         return sizeof(GLushort);
283      else
284         return -1;
285   case GL_UNSIGNED_INT_24_8_EXT:
286      if (format == GL_DEPTH_STENCIL_EXT)
287         return sizeof(GLuint);
288      else
289         return -1;
290   case GL_UNSIGNED_INT_5_9_9_9_REV:
291      if (format == GL_RGB)
292         return sizeof(GLuint);
293      else
294         return -1;
295   case GL_UNSIGNED_INT_10F_11F_11F_REV:
296      if (format == GL_RGB)
297         return sizeof(GLuint);
298      else
299         return -1;
300   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
301      if (format == GL_DEPTH_STENCIL)
302         return 8;
303      else
304         return -1;
305   default:
306      return -1;
307   }
308}
309
310
311/**
312 * Get the number of bytes for a vertex attrib with the given number of
313 * components and type.
314 *
315 * \param comps number of components.
316 * \param type data type.
317 *
318 * \return bytes per attribute, or -1 if a bad comps/type combination was given.
319 */
320GLint
321_mesa_bytes_per_vertex_attrib(GLint comps, GLenum type)
322{
323   switch (type) {
324   case GL_BYTE:
325   case GL_UNSIGNED_BYTE:
326      return comps * sizeof(GLubyte);
327   case GL_SHORT:
328   case GL_UNSIGNED_SHORT:
329      return comps * sizeof(GLshort);
330   case GL_INT:
331   case GL_UNSIGNED_INT:
332      return comps * sizeof(GLint);
333   case GL_FLOAT:
334      return comps * sizeof(GLfloat);
335   case GL_HALF_FLOAT_ARB:
336      return comps * sizeof(GLhalfARB);
337   case GL_DOUBLE:
338      return comps * sizeof(GLdouble);
339   case GL_FIXED:
340      return comps * sizeof(GLfixed);
341   case GL_INT_2_10_10_10_REV:
342   case GL_UNSIGNED_INT_2_10_10_10_REV:
343      if (comps == 4)
344         return sizeof(GLuint);
345      else
346         return -1;
347   default:
348      return -1;
349   }
350}
351
352
353/**
354 * Test if the given format is an integer (non-normalized) format.
355 */
356GLboolean
357_mesa_is_enum_format_unsigned_int(GLenum format)
358{
359   switch (format) {
360   /* specific integer formats */
361   case GL_RGBA32UI_EXT:
362   case GL_RGB32UI_EXT:
363   case GL_RG32UI:
364   case GL_R32UI:
365   case GL_ALPHA32UI_EXT:
366   case GL_INTENSITY32UI_EXT:
367   case GL_LUMINANCE32UI_EXT:
368   case GL_LUMINANCE_ALPHA32UI_EXT:
369   case GL_RGBA16UI_EXT:
370   case GL_RGB16UI_EXT:
371   case GL_RG16UI:
372   case GL_R16UI:
373   case GL_ALPHA16UI_EXT:
374   case GL_INTENSITY16UI_EXT:
375   case GL_LUMINANCE16UI_EXT:
376   case GL_LUMINANCE_ALPHA16UI_EXT:
377   case GL_RGBA8UI_EXT:
378   case GL_RGB8UI_EXT:
379   case GL_RG8UI:
380   case GL_R8UI:
381   case GL_ALPHA8UI_EXT:
382   case GL_INTENSITY8UI_EXT:
383   case GL_LUMINANCE8UI_EXT:
384   case GL_LUMINANCE_ALPHA8UI_EXT:
385   case GL_RGB10_A2UI:
386      return GL_TRUE;
387   default:
388      return GL_FALSE;
389   }
390}
391
392
393/**
394 * Test if the given format is an integer (non-normalized) format.
395 */
396GLboolean
397_mesa_is_enum_format_signed_int(GLenum format)
398{
399   switch (format) {
400   /* generic integer formats */
401   case GL_RED_INTEGER_EXT:
402   case GL_GREEN_INTEGER_EXT:
403   case GL_BLUE_INTEGER_EXT:
404   case GL_ALPHA_INTEGER_EXT:
405   case GL_RGB_INTEGER_EXT:
406   case GL_RGBA_INTEGER_EXT:
407   case GL_BGR_INTEGER_EXT:
408   case GL_BGRA_INTEGER_EXT:
409   case GL_LUMINANCE_INTEGER_EXT:
410   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
411   case GL_RG_INTEGER:
412   /* specific integer formats */
413   case GL_RGBA32I_EXT:
414   case GL_RGB32I_EXT:
415   case GL_RG32I:
416   case GL_R32I:
417   case GL_ALPHA32I_EXT:
418   case GL_INTENSITY32I_EXT:
419   case GL_LUMINANCE32I_EXT:
420   case GL_LUMINANCE_ALPHA32I_EXT:
421   case GL_RGBA16I_EXT:
422   case GL_RGB16I_EXT:
423   case GL_RG16I:
424   case GL_R16I:
425   case GL_ALPHA16I_EXT:
426   case GL_INTENSITY16I_EXT:
427   case GL_LUMINANCE16I_EXT:
428   case GL_LUMINANCE_ALPHA16I_EXT:
429   case GL_RGBA8I_EXT:
430   case GL_RGB8I_EXT:
431   case GL_RG8I:
432   case GL_R8I:
433   case GL_ALPHA8I_EXT:
434   case GL_INTENSITY8I_EXT:
435   case GL_LUMINANCE8I_EXT:
436   case GL_LUMINANCE_ALPHA8I_EXT:
437      return GL_TRUE;
438   default:
439      return GL_FALSE;
440   }
441}
442
443
444/**
445 * Test if the given format is an integer (non-normalized) format.
446 */
447GLboolean
448_mesa_is_enum_format_integer(GLenum format)
449{
450   return _mesa_is_enum_format_unsigned_int(format) ||
451          _mesa_is_enum_format_signed_int(format);
452}
453
454
455/**
456 * Test if the given type is an integer (non-normalized) format.
457 */
458GLboolean
459_mesa_is_type_integer(GLenum type)
460{
461   switch (type) {
462   case GL_INT:
463   case GL_UNSIGNED_INT:
464   case GL_SHORT:
465   case GL_UNSIGNED_SHORT:
466   case GL_BYTE:
467   case GL_UNSIGNED_BYTE:
468      return GL_TRUE;
469   default:
470      return GL_FALSE;
471   }
472}
473
474
475/**
476 * Test if the given format or type is an integer (non-normalized) format.
477 */
478extern GLboolean
479_mesa_is_enum_format_or_type_integer(GLenum format, GLenum type)
480{
481   return _mesa_is_enum_format_integer(format) || _mesa_is_type_integer(type);
482}
483
484
485GLboolean
486_mesa_is_type_unsigned(GLenum type)
487{
488   switch (type) {
489   case GL_UNSIGNED_INT:
490   case GL_UNSIGNED_INT_8_8_8_8:
491   case GL_UNSIGNED_INT_8_8_8_8_REV:
492   case GL_UNSIGNED_INT_10_10_10_2:
493   case GL_UNSIGNED_INT_2_10_10_10_REV:
494
495   case GL_UNSIGNED_SHORT:
496   case GL_UNSIGNED_SHORT_4_4_4_4:
497   case GL_UNSIGNED_SHORT_5_5_5_1:
498   case GL_UNSIGNED_SHORT_5_6_5:
499   case GL_UNSIGNED_SHORT_5_6_5_REV:
500   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
501   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
502   case GL_UNSIGNED_SHORT_8_8_MESA:
503   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
504
505   case GL_UNSIGNED_BYTE:
506   case GL_UNSIGNED_BYTE_3_3_2:
507   case GL_UNSIGNED_BYTE_2_3_3_REV:
508      return GL_TRUE;
509
510   default:
511      return GL_FALSE;
512   }
513}
514
515
516/**
517 * Test if the given image format is a color/RGBA format (i.e., not color
518 * index, depth, stencil, etc).
519 * \param format  the image format value (may by an internal texture format)
520 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
521 */
522GLboolean
523_mesa_is_color_format(GLenum format)
524{
525   switch (format) {
526      case GL_RED:
527      case GL_GREEN:
528      case GL_BLUE:
529      case GL_ALPHA:
530      case GL_ALPHA4:
531      case GL_ALPHA8:
532      case GL_ALPHA12:
533      case GL_ALPHA16:
534      case 1:
535      case GL_LUMINANCE:
536      case GL_LUMINANCE4:
537      case GL_LUMINANCE8:
538      case GL_LUMINANCE12:
539      case GL_LUMINANCE16:
540      case 2:
541      case GL_LUMINANCE_ALPHA:
542      case GL_LUMINANCE4_ALPHA4:
543      case GL_LUMINANCE6_ALPHA2:
544      case GL_LUMINANCE8_ALPHA8:
545      case GL_LUMINANCE12_ALPHA4:
546      case GL_LUMINANCE12_ALPHA12:
547      case GL_LUMINANCE16_ALPHA16:
548      case GL_INTENSITY:
549      case GL_INTENSITY4:
550      case GL_INTENSITY8:
551      case GL_INTENSITY12:
552      case GL_INTENSITY16:
553      case GL_R8:
554      case GL_R16:
555      case GL_RG:
556      case GL_RG8:
557      case GL_RG16:
558      case 3:
559      case GL_RGB:
560      case GL_BGR:
561      case GL_R3_G3_B2:
562      case GL_RGB4:
563      case GL_RGB5:
564      case GL_RGB565:
565      case GL_RGB8:
566      case GL_RGB10:
567      case GL_RGB12:
568      case GL_RGB16:
569      case 4:
570      case GL_ABGR_EXT:
571      case GL_RGBA:
572      case GL_BGRA:
573      case GL_RGBA2:
574      case GL_RGBA4:
575      case GL_RGB5_A1:
576      case GL_RGBA8:
577      case GL_RGB10_A2:
578      case GL_RGBA12:
579      case GL_RGBA16:
580      /* float texture formats */
581      case GL_ALPHA16F_ARB:
582      case GL_ALPHA32F_ARB:
583      case GL_LUMINANCE16F_ARB:
584      case GL_LUMINANCE32F_ARB:
585      case GL_LUMINANCE_ALPHA16F_ARB:
586      case GL_LUMINANCE_ALPHA32F_ARB:
587      case GL_INTENSITY16F_ARB:
588      case GL_INTENSITY32F_ARB:
589      case GL_R16F:
590      case GL_R32F:
591      case GL_RG16F:
592      case GL_RG32F:
593      case GL_RGB16F_ARB:
594      case GL_RGB32F_ARB:
595      case GL_RGBA16F_ARB:
596      case GL_RGBA32F_ARB:
597      /* compressed formats */
598      case GL_COMPRESSED_ALPHA:
599      case GL_COMPRESSED_LUMINANCE:
600      case GL_COMPRESSED_LUMINANCE_ALPHA:
601      case GL_COMPRESSED_INTENSITY:
602      case GL_COMPRESSED_RED:
603      case GL_COMPRESSED_RG:
604      case GL_COMPRESSED_RGB:
605      case GL_COMPRESSED_RGBA:
606      case GL_RGB_S3TC:
607      case GL_RGB4_S3TC:
608      case GL_RGBA_S3TC:
609      case GL_RGBA4_S3TC:
610      case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
611      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
612      case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
613      case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
614      case GL_COMPRESSED_RGB_FXT1_3DFX:
615      case GL_COMPRESSED_RGBA_FXT1_3DFX:
616      case GL_SRGB_EXT:
617      case GL_SRGB8_EXT:
618      case GL_SRGB_ALPHA_EXT:
619      case GL_SRGB8_ALPHA8_EXT:
620      case GL_SLUMINANCE_ALPHA_EXT:
621      case GL_SLUMINANCE8_ALPHA8_EXT:
622      case GL_SLUMINANCE_EXT:
623      case GL_SLUMINANCE8_EXT:
624      case GL_COMPRESSED_SRGB_EXT:
625      case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
626      case GL_COMPRESSED_SRGB_ALPHA_EXT:
627      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
628      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
629      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
630      case GL_COMPRESSED_SLUMINANCE_EXT:
631      case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
632      case GL_COMPRESSED_RED_RGTC1:
633      case GL_COMPRESSED_SIGNED_RED_RGTC1:
634      case GL_COMPRESSED_RG_RGTC2:
635      case GL_COMPRESSED_SIGNED_RG_RGTC2:
636      case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
637      case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
638      case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
639      case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
640      case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
641      case GL_ETC1_RGB8_OES:
642      case GL_COMPRESSED_RGB8_ETC2:
643      case GL_COMPRESSED_SRGB8_ETC2:
644      case GL_COMPRESSED_RGBA8_ETC2_EAC:
645      case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
646      case GL_COMPRESSED_R11_EAC:
647      case GL_COMPRESSED_RG11_EAC:
648      case GL_COMPRESSED_SIGNED_R11_EAC:
649      case GL_COMPRESSED_SIGNED_RG11_EAC:
650      case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
651      case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
652      /* generic integer formats */
653      case GL_RED_INTEGER_EXT:
654      case GL_GREEN_INTEGER_EXT:
655      case GL_BLUE_INTEGER_EXT:
656      case GL_ALPHA_INTEGER_EXT:
657      case GL_RGB_INTEGER_EXT:
658      case GL_RGBA_INTEGER_EXT:
659      case GL_BGR_INTEGER_EXT:
660      case GL_BGRA_INTEGER_EXT:
661      case GL_RG_INTEGER:
662      case GL_LUMINANCE_INTEGER_EXT:
663      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
664      /* sized integer formats */
665      case GL_RGBA32UI_EXT:
666      case GL_RGB32UI_EXT:
667      case GL_RG32UI:
668      case GL_R32UI:
669      case GL_ALPHA32UI_EXT:
670      case GL_INTENSITY32UI_EXT:
671      case GL_LUMINANCE32UI_EXT:
672      case GL_LUMINANCE_ALPHA32UI_EXT:
673      case GL_RGBA16UI_EXT:
674      case GL_RGB16UI_EXT:
675      case GL_RG16UI:
676      case GL_R16UI:
677      case GL_ALPHA16UI_EXT:
678      case GL_INTENSITY16UI_EXT:
679      case GL_LUMINANCE16UI_EXT:
680      case GL_LUMINANCE_ALPHA16UI_EXT:
681      case GL_RGBA8UI_EXT:
682      case GL_RGB8UI_EXT:
683      case GL_RG8UI:
684      case GL_R8UI:
685      case GL_ALPHA8UI_EXT:
686      case GL_INTENSITY8UI_EXT:
687      case GL_LUMINANCE8UI_EXT:
688      case GL_LUMINANCE_ALPHA8UI_EXT:
689      case GL_RGBA32I_EXT:
690      case GL_RGB32I_EXT:
691      case GL_RG32I:
692      case GL_R32I:
693      case GL_ALPHA32I_EXT:
694      case GL_INTENSITY32I_EXT:
695      case GL_LUMINANCE32I_EXT:
696      case GL_LUMINANCE_ALPHA32I_EXT:
697      case GL_RGBA16I_EXT:
698      case GL_RGB16I_EXT:
699      case GL_RG16I:
700      case GL_R16I:
701      case GL_ALPHA16I_EXT:
702      case GL_INTENSITY16I_EXT:
703      case GL_LUMINANCE16I_EXT:
704      case GL_LUMINANCE_ALPHA16I_EXT:
705      case GL_RGBA8I_EXT:
706      case GL_RGB8I_EXT:
707      case GL_RG8I:
708      case GL_R8I:
709      case GL_ALPHA8I_EXT:
710      case GL_INTENSITY8I_EXT:
711      case GL_LUMINANCE8I_EXT:
712      case GL_LUMINANCE_ALPHA8I_EXT:
713      /* signed, normalized texture formats */
714      case GL_RED_SNORM:
715      case GL_R8_SNORM:
716      case GL_R16_SNORM:
717      case GL_RG_SNORM:
718      case GL_RG8_SNORM:
719      case GL_RG16_SNORM:
720      case GL_RGB_SNORM:
721      case GL_RGB8_SNORM:
722      case GL_RGB16_SNORM:
723      case GL_RGBA_SNORM:
724      case GL_RGBA8_SNORM:
725      case GL_RGBA16_SNORM:
726      case GL_ALPHA_SNORM:
727      case GL_ALPHA8_SNORM:
728      case GL_ALPHA16_SNORM:
729      case GL_LUMINANCE_SNORM:
730      case GL_LUMINANCE8_SNORM:
731      case GL_LUMINANCE16_SNORM:
732      case GL_LUMINANCE_ALPHA_SNORM:
733      case GL_LUMINANCE8_ALPHA8_SNORM:
734      case GL_LUMINANCE16_ALPHA16_SNORM:
735      case GL_INTENSITY_SNORM:
736      case GL_INTENSITY8_SNORM:
737      case GL_INTENSITY16_SNORM:
738      case GL_RGB9_E5:
739      case GL_R11F_G11F_B10F:
740      case GL_RGB10_A2UI:
741         return GL_TRUE;
742      case GL_YCBCR_MESA:  /* not considered to be RGB */
743         /* fall-through */
744      default:
745         return GL_FALSE;
746   }
747}
748
749
750/**
751 * Test if the given image format is a depth component format.
752 */
753GLboolean
754_mesa_is_depth_format(GLenum format)
755{
756   switch (format) {
757      case GL_DEPTH_COMPONENT:
758      case GL_DEPTH_COMPONENT16:
759      case GL_DEPTH_COMPONENT24:
760      case GL_DEPTH_COMPONENT32:
761      case GL_DEPTH_COMPONENT32F:
762         return GL_TRUE;
763      default:
764         return GL_FALSE;
765   }
766}
767
768
769/**
770 * Test if the given image format is a stencil format.
771 */
772GLboolean
773_mesa_is_stencil_format(GLenum format)
774{
775   switch (format) {
776      case GL_STENCIL_INDEX:
777         return GL_TRUE;
778      default:
779         return GL_FALSE;
780   }
781}
782
783
784/**
785 * Test if the given image format is a YCbCr format.
786 */
787GLboolean
788_mesa_is_ycbcr_format(GLenum format)
789{
790   switch (format) {
791      case GL_YCBCR_MESA:
792         return GL_TRUE;
793      default:
794         return GL_FALSE;
795   }
796}
797
798
799/**
800 * Test if the given image format is a depth+stencil format.
801 */
802GLboolean
803_mesa_is_depthstencil_format(GLenum format)
804{
805   switch (format) {
806      case GL_DEPTH24_STENCIL8_EXT:
807      case GL_DEPTH_STENCIL_EXT:
808      case GL_DEPTH32F_STENCIL8:
809         return GL_TRUE;
810      default:
811         return GL_FALSE;
812   }
813}
814
815
816/**
817 * Test if the given image format is a depth or stencil format.
818 */
819GLboolean
820_mesa_is_depth_or_stencil_format(GLenum format)
821{
822   switch (format) {
823      case GL_DEPTH_COMPONENT:
824      case GL_DEPTH_COMPONENT16:
825      case GL_DEPTH_COMPONENT24:
826      case GL_DEPTH_COMPONENT32:
827      case GL_STENCIL_INDEX:
828      case GL_STENCIL_INDEX1_EXT:
829      case GL_STENCIL_INDEX4_EXT:
830      case GL_STENCIL_INDEX8_EXT:
831      case GL_STENCIL_INDEX16_EXT:
832      case GL_DEPTH_STENCIL_EXT:
833      case GL_DEPTH24_STENCIL8_EXT:
834      case GL_DEPTH_COMPONENT32F:
835      case GL_DEPTH32F_STENCIL8:
836         return GL_TRUE;
837      default:
838         return GL_FALSE;
839   }
840}
841
842
843/**
844 * Test if the given image format is a dudv format.
845 */
846GLboolean
847_mesa_is_dudv_format(GLenum format)
848{
849   switch (format) {
850      case GL_DUDV_ATI:
851      case GL_DU8DV8_ATI:
852         return GL_TRUE;
853      default:
854         return GL_FALSE;
855   }
856}
857
858
859/**
860 * Test if an image format is a supported compressed format.
861 * \param format the internal format token provided by the user.
862 * \return GL_TRUE if compressed, GL_FALSE if uncompressed
863 */
864GLboolean
865_mesa_is_compressed_format(struct gl_context *ctx, GLenum format)
866{
867   switch (format) {
868   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
869   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
870      return ctx->Extensions.EXT_texture_compression_s3tc;
871   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
872   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
873      return (_mesa_is_desktop_gl(ctx) &&
874	      ctx->Extensions.EXT_texture_compression_s3tc) ||
875	     (ctx->API == API_OPENGLES2 &&
876	      ctx->Extensions.ANGLE_texture_compression_dxt);
877   case GL_RGB_S3TC:
878   case GL_RGB4_S3TC:
879   case GL_RGBA_S3TC:
880   case GL_RGBA4_S3TC:
881      return _mesa_is_desktop_gl(ctx) && ctx->Extensions.S3_s3tc;
882   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
883   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
884   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
885   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
886      return _mesa_is_desktop_gl(ctx)
887         && ctx->Extensions.EXT_texture_sRGB
888         && ctx->Extensions.EXT_texture_compression_s3tc;
889   case GL_COMPRESSED_RGB_FXT1_3DFX:
890   case GL_COMPRESSED_RGBA_FXT1_3DFX:
891      return _mesa_is_desktop_gl(ctx)
892         && ctx->Extensions.TDFX_texture_compression_FXT1;
893   case GL_COMPRESSED_RED_RGTC1:
894   case GL_COMPRESSED_SIGNED_RED_RGTC1:
895   case GL_COMPRESSED_RG_RGTC2:
896   case GL_COMPRESSED_SIGNED_RG_RGTC2:
897      return _mesa_is_desktop_gl(ctx)
898         && ctx->Extensions.ARB_texture_compression_rgtc;
899   case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
900   case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
901   case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
902   case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
903      return ctx->API == API_OPENGL_COMPAT
904         && ctx->Extensions.EXT_texture_compression_latc;
905   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
906      return ctx->API == API_OPENGL_COMPAT
907         && ctx->Extensions.ATI_texture_compression_3dc;
908   case GL_ETC1_RGB8_OES:
909      return _mesa_is_gles(ctx)
910         && ctx->Extensions.OES_compressed_ETC1_RGB8_texture;
911   case GL_COMPRESSED_RGB8_ETC2:
912   case GL_COMPRESSED_SRGB8_ETC2:
913   case GL_COMPRESSED_RGBA8_ETC2_EAC:
914   case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
915   case GL_COMPRESSED_R11_EAC:
916   case GL_COMPRESSED_RG11_EAC:
917   case GL_COMPRESSED_SIGNED_R11_EAC:
918   case GL_COMPRESSED_SIGNED_RG11_EAC:
919   case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
920   case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
921      return _mesa_is_gles3(ctx);
922   case GL_PALETTE4_RGB8_OES:
923   case GL_PALETTE4_RGBA8_OES:
924   case GL_PALETTE4_R5_G6_B5_OES:
925   case GL_PALETTE4_RGBA4_OES:
926   case GL_PALETTE4_RGB5_A1_OES:
927   case GL_PALETTE8_RGB8_OES:
928   case GL_PALETTE8_RGBA8_OES:
929   case GL_PALETTE8_R5_G6_B5_OES:
930   case GL_PALETTE8_RGBA4_OES:
931   case GL_PALETTE8_RGB5_A1_OES:
932      return ctx->API == API_OPENGLES;
933   default:
934      return GL_FALSE;
935   }
936}
937
938
939/**
940 * Convert various base formats to the cooresponding integer format.
941 */
942GLenum
943_mesa_base_format_to_integer_format(GLenum format)
944{
945   switch(format) {
946   case GL_RED:
947      return GL_RED_INTEGER;
948   case GL_GREEN:
949      return GL_GREEN_INTEGER;
950   case GL_BLUE:
951      return GL_BLUE_INTEGER;
952   case GL_RG:
953      return GL_RG_INTEGER;
954   case GL_RGB:
955      return GL_RGB_INTEGER;
956   case GL_RGBA:
957      return GL_RGBA_INTEGER;
958   case GL_BGR:
959      return GL_BGR_INTEGER;
960   case GL_BGRA:
961      return GL_BGRA_INTEGER;
962   case GL_ALPHA:
963      return GL_ALPHA_INTEGER;
964   case GL_LUMINANCE:
965      return GL_LUMINANCE_INTEGER_EXT;
966   case GL_LUMINANCE_ALPHA:
967      return GL_LUMINANCE_ALPHA_INTEGER_EXT;
968   }
969
970   return format;
971}
972
973
974/**
975 * Does the given base texture/renderbuffer format have the channel
976 * named by 'pname'?
977 */
978GLboolean
979_mesa_base_format_has_channel(GLenum base_format, GLenum pname)
980{
981   switch (pname) {
982   case GL_TEXTURE_RED_SIZE:
983   case GL_TEXTURE_RED_TYPE:
984   case GL_RENDERBUFFER_RED_SIZE_EXT:
985   case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
986      if (base_format == GL_RED ||
987	  base_format == GL_RG ||
988	  base_format == GL_RGB ||
989	  base_format == GL_RGBA) {
990	 return GL_TRUE;
991      }
992      return GL_FALSE;
993   case GL_TEXTURE_GREEN_SIZE:
994   case GL_TEXTURE_GREEN_TYPE:
995   case GL_RENDERBUFFER_GREEN_SIZE_EXT:
996   case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
997      if (base_format == GL_RG ||
998	  base_format == GL_RGB ||
999	  base_format == GL_RGBA) {
1000	 return GL_TRUE;
1001      }
1002      return GL_FALSE;
1003   case GL_TEXTURE_BLUE_SIZE:
1004   case GL_TEXTURE_BLUE_TYPE:
1005   case GL_RENDERBUFFER_BLUE_SIZE_EXT:
1006   case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
1007      if (base_format == GL_RGB ||
1008	  base_format == GL_RGBA) {
1009	 return GL_TRUE;
1010      }
1011      return GL_FALSE;
1012   case GL_TEXTURE_ALPHA_SIZE:
1013   case GL_TEXTURE_ALPHA_TYPE:
1014   case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
1015   case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
1016      if (base_format == GL_RGBA ||
1017	  base_format == GL_ALPHA ||
1018	  base_format == GL_LUMINANCE_ALPHA) {
1019	 return GL_TRUE;
1020      }
1021      return GL_FALSE;
1022   case GL_TEXTURE_LUMINANCE_SIZE:
1023   case GL_TEXTURE_LUMINANCE_TYPE:
1024      if (base_format == GL_LUMINANCE ||
1025	  base_format == GL_LUMINANCE_ALPHA) {
1026	 return GL_TRUE;
1027      }
1028      return GL_FALSE;
1029   case GL_TEXTURE_INTENSITY_SIZE:
1030   case GL_TEXTURE_INTENSITY_TYPE:
1031      if (base_format == GL_INTENSITY) {
1032	 return GL_TRUE;
1033      }
1034      return GL_FALSE;
1035   case GL_TEXTURE_DEPTH_SIZE:
1036   case GL_TEXTURE_DEPTH_TYPE:
1037   case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
1038   case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
1039      if (base_format == GL_DEPTH_STENCIL ||
1040	  base_format == GL_DEPTH_COMPONENT) {
1041	 return GL_TRUE;
1042      }
1043      return GL_FALSE;
1044   case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
1045   case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
1046      if (base_format == GL_DEPTH_STENCIL ||
1047	  base_format == GL_STENCIL_INDEX) {
1048	 return GL_TRUE;
1049      }
1050      return GL_FALSE;
1051   default:
1052      _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n",
1053		    __FUNCTION__, pname);
1054      return GL_FALSE;
1055   }
1056
1057   return GL_FALSE;
1058}
1059
1060
1061/**
1062 * Returns the number of channels/components for a base format.
1063 */
1064GLint
1065_mesa_base_format_component_count(GLenum base_format)
1066{
1067   switch (base_format) {
1068   case GL_RED:
1069   case GL_ALPHA:
1070   case GL_INTENSITY:
1071   case GL_DEPTH_COMPONENT:
1072      return 1;
1073   case GL_RG:
1074   case GL_LUMINANCE_ALPHA:
1075   case GL_DEPTH_STENCIL:
1076      return 2;
1077   case GL_RGB:
1078      return 3;
1079   case GL_RGBA:
1080      return 4;
1081   default:
1082      return -1;
1083   }
1084}
1085
1086
1087/**
1088 * If format is a generic compressed format, return the corresponding
1089 * non-compressed format.  For other formats, return the format as-is.
1090 */
1091GLenum
1092_mesa_generic_compressed_format_to_uncompressed_format(GLenum format)
1093{
1094   switch (format) {
1095   case GL_COMPRESSED_RED:
1096      return GL_RED;
1097   case GL_COMPRESSED_RG:
1098      return GL_RG;
1099   case GL_COMPRESSED_RGB:
1100      return GL_RGB;
1101   case GL_COMPRESSED_RGBA:
1102      return GL_RGBA;
1103   case GL_COMPRESSED_ALPHA:
1104      return GL_ALPHA;
1105   case GL_COMPRESSED_LUMINANCE:
1106      return GL_LUMINANCE;
1107   case GL_COMPRESSED_LUMINANCE_ALPHA:
1108      return GL_LUMINANCE_ALPHA;
1109   case GL_COMPRESSED_INTENSITY:
1110      return GL_INTENSITY;
1111   /* sRGB formats */
1112   case GL_COMPRESSED_SRGB:
1113      return GL_SRGB;
1114   case GL_COMPRESSED_SRGB_ALPHA:
1115      return GL_SRGB_ALPHA;
1116   case GL_COMPRESSED_SLUMINANCE:
1117      return GL_SLUMINANCE;
1118   case GL_COMPRESSED_SLUMINANCE_ALPHA:
1119      return GL_SLUMINANCE_ALPHA;
1120   default:
1121      return format;
1122   }
1123}
1124
1125
1126/**
1127 * Return the equivalent non-generic internal format.
1128 * This is useful for comparing whether two internal formats are equivalent.
1129 */
1130GLenum
1131_mesa_get_nongeneric_internalformat(GLenum format)
1132{
1133   switch (format) {
1134      /* GL 1.1 formats. */
1135      case 4:
1136      case GL_RGBA:
1137         return GL_RGBA8;
1138
1139      case 3:
1140      case GL_RGB:
1141         return GL_RGB8;
1142
1143      case 2:
1144      case GL_LUMINANCE_ALPHA:
1145         return GL_LUMINANCE8_ALPHA8;
1146
1147      case 1:
1148      case GL_LUMINANCE:
1149         return GL_LUMINANCE8;
1150
1151      case GL_ALPHA:
1152         return GL_ALPHA8;
1153
1154      case GL_INTENSITY:
1155         return GL_INTENSITY8;
1156
1157      /* GL_ARB_texture_rg */
1158      case GL_RED:
1159         return GL_R8;
1160
1161      case GL_RG:
1162         return GL_RG8;
1163
1164      /* GL_EXT_texture_sRGB */
1165      case GL_SRGB:
1166         return GL_SRGB8;
1167
1168      case GL_SRGB_ALPHA:
1169         return GL_SRGB8_ALPHA8;
1170
1171      case GL_SLUMINANCE:
1172         return GL_SLUMINANCE8;
1173
1174      case GL_SLUMINANCE_ALPHA:
1175         return GL_SLUMINANCE8_ALPHA8;
1176
1177      /* GL_EXT_texture_snorm */
1178      case GL_RGBA_SNORM:
1179         return GL_RGBA8_SNORM;
1180
1181      case GL_RGB_SNORM:
1182         return GL_RGB8_SNORM;
1183
1184      case GL_RG_SNORM:
1185         return GL_RG8_SNORM;
1186
1187      case GL_RED_SNORM:
1188         return GL_R8_SNORM;
1189
1190      case GL_LUMINANCE_ALPHA_SNORM:
1191         return GL_LUMINANCE8_ALPHA8_SNORM;
1192
1193      case GL_LUMINANCE_SNORM:
1194         return GL_LUMINANCE8_SNORM;
1195
1196      case GL_ALPHA_SNORM:
1197         return GL_ALPHA8_SNORM;
1198
1199      case GL_INTENSITY_SNORM:
1200         return GL_INTENSITY8_SNORM;
1201
1202      default:
1203         return format;
1204   }
1205}
1206
1207
1208/**
1209 * Convert an sRGB internal format to linear.
1210 */
1211GLenum
1212_mesa_get_linear_internalformat(GLenum format)
1213{
1214   switch (format) {
1215   case GL_SRGB:
1216      return GL_RGB;
1217
1218   case GL_SRGB_ALPHA:
1219      return GL_RGBA;
1220
1221   case GL_SRGB8:
1222      return GL_RGB8;
1223
1224   case GL_SRGB8_ALPHA8:
1225      return GL_RGBA8;
1226
1227   case GL_SLUMINANCE:
1228      return GL_LUMINANCE8;
1229
1230   case GL_SLUMINANCE_ALPHA:
1231      return GL_LUMINANCE8_ALPHA8;
1232
1233   default:
1234      return format;
1235   }
1236}
1237
1238
1239/**
1240 * Do error checking of format/type combinations for glReadPixels,
1241 * glDrawPixels and glTex[Sub]Image.  Note that depending on the format
1242 * and type values, we may either generate GL_INVALID_OPERATION or
1243 * GL_INVALID_ENUM.
1244 *
1245 * \param format pixel format.
1246 * \param type pixel type.
1247 *
1248 * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR
1249 */
1250GLenum
1251_mesa_error_check_format_and_type(const struct gl_context *ctx,
1252                                  GLenum format, GLenum type)
1253{
1254   /* special type-based checks (see glReadPixels, glDrawPixels error lists) */
1255   switch (type) {
1256   case GL_BITMAP:
1257      if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) {
1258         return GL_INVALID_ENUM;
1259      }
1260      break;
1261
1262   case GL_UNSIGNED_BYTE_3_3_2:
1263   case GL_UNSIGNED_BYTE_2_3_3_REV:
1264   case GL_UNSIGNED_SHORT_5_6_5:
1265   case GL_UNSIGNED_SHORT_5_6_5_REV:
1266      if (format == GL_RGB) {
1267         break; /* OK */
1268      }
1269      if (format == GL_RGB_INTEGER_EXT &&
1270          ctx->Extensions.ARB_texture_rgb10_a2ui) {
1271         break; /* OK */
1272      }
1273      return GL_INVALID_OPERATION;
1274
1275   case GL_UNSIGNED_SHORT_4_4_4_4:
1276   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1277   case GL_UNSIGNED_SHORT_5_5_5_1:
1278   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1279   case GL_UNSIGNED_INT_8_8_8_8:
1280   case GL_UNSIGNED_INT_8_8_8_8_REV:
1281   case GL_UNSIGNED_INT_10_10_10_2:
1282   case GL_UNSIGNED_INT_2_10_10_10_REV:
1283      if (format == GL_RGBA ||
1284          format == GL_BGRA ||
1285          format == GL_ABGR_EXT) {
1286         break; /* OK */
1287      }
1288      if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) &&
1289          ctx->Extensions.ARB_texture_rgb10_a2ui) {
1290         break; /* OK */
1291      }
1292      return GL_INVALID_OPERATION;
1293
1294   case GL_UNSIGNED_INT_24_8:
1295      if (!ctx->Extensions.EXT_packed_depth_stencil) {
1296         return GL_INVALID_ENUM;
1297      }
1298      if (format != GL_DEPTH_STENCIL) {
1299         return GL_INVALID_OPERATION;
1300      }
1301      return GL_NO_ERROR;
1302
1303   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
1304      if (!ctx->Extensions.ARB_depth_buffer_float) {
1305         return GL_INVALID_ENUM;
1306      }
1307      if (format != GL_DEPTH_STENCIL) {
1308         return GL_INVALID_OPERATION;
1309      }
1310      return GL_NO_ERROR;
1311
1312   case GL_UNSIGNED_INT_10F_11F_11F_REV:
1313      if (!ctx->Extensions.EXT_packed_float) {
1314         return GL_INVALID_ENUM;
1315      }
1316      if (format != GL_RGB) {
1317         return GL_INVALID_OPERATION;
1318      }
1319      return GL_NO_ERROR;
1320
1321   default:
1322      ; /* fall-through */
1323   }
1324
1325   /* now, for each format, check the type for compatibility */
1326   switch (format) {
1327      case GL_COLOR_INDEX:
1328      case GL_STENCIL_INDEX:
1329         switch (type) {
1330            case GL_BITMAP:
1331            case GL_BYTE:
1332            case GL_UNSIGNED_BYTE:
1333            case GL_SHORT:
1334            case GL_UNSIGNED_SHORT:
1335            case GL_INT:
1336            case GL_UNSIGNED_INT:
1337            case GL_FLOAT:
1338               return GL_NO_ERROR;
1339            case GL_HALF_FLOAT:
1340               return ctx->Extensions.ARB_half_float_pixel
1341                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1342            default:
1343               return GL_INVALID_ENUM;
1344         }
1345
1346      case GL_RED:
1347      case GL_GREEN:
1348      case GL_BLUE:
1349      case GL_ALPHA:
1350#if 0 /* not legal!  see table 3.6 of the 1.5 spec */
1351      case GL_INTENSITY:
1352#endif
1353      case GL_LUMINANCE:
1354      case GL_LUMINANCE_ALPHA:
1355      case GL_DEPTH_COMPONENT:
1356         switch (type) {
1357            case GL_BYTE:
1358            case GL_UNSIGNED_BYTE:
1359            case GL_SHORT:
1360            case GL_UNSIGNED_SHORT:
1361            case GL_INT:
1362            case GL_UNSIGNED_INT:
1363            case GL_FLOAT:
1364               return GL_NO_ERROR;
1365            case GL_HALF_FLOAT:
1366               return ctx->Extensions.ARB_half_float_pixel
1367                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1368            default:
1369               return GL_INVALID_ENUM;
1370         }
1371
1372      case GL_RG:
1373	 if (!ctx->Extensions.ARB_texture_rg)
1374	    return GL_INVALID_ENUM;
1375         switch (type) {
1376            case GL_BYTE:
1377            case GL_UNSIGNED_BYTE:
1378            case GL_SHORT:
1379            case GL_UNSIGNED_SHORT:
1380            case GL_INT:
1381            case GL_UNSIGNED_INT:
1382            case GL_FLOAT:
1383               return GL_NO_ERROR;
1384            case GL_HALF_FLOAT:
1385               return ctx->Extensions.ARB_half_float_pixel
1386                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1387            default:
1388               return GL_INVALID_ENUM;
1389         }
1390
1391      case GL_RGB:
1392         switch (type) {
1393            case GL_BYTE:
1394            case GL_UNSIGNED_BYTE:
1395            case GL_SHORT:
1396            case GL_UNSIGNED_SHORT:
1397            case GL_INT:
1398            case GL_UNSIGNED_INT:
1399            case GL_FLOAT:
1400            case GL_UNSIGNED_BYTE_3_3_2:
1401            case GL_UNSIGNED_BYTE_2_3_3_REV:
1402            case GL_UNSIGNED_SHORT_5_6_5:
1403            case GL_UNSIGNED_SHORT_5_6_5_REV:
1404               return GL_NO_ERROR;
1405            case GL_HALF_FLOAT:
1406               return ctx->Extensions.ARB_half_float_pixel
1407                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1408            case GL_UNSIGNED_INT_5_9_9_9_REV:
1409               return ctx->Extensions.EXT_texture_shared_exponent
1410                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1411            case GL_UNSIGNED_INT_10F_11F_11F_REV:
1412               return ctx->Extensions.EXT_packed_float
1413                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1414            default:
1415               return GL_INVALID_ENUM;
1416         }
1417
1418      case GL_BGR:
1419         switch (type) {
1420            /* NOTE: no packed types are supported with BGR.  That's
1421             * intentional, according to the GL spec.
1422             */
1423            case GL_BYTE:
1424            case GL_UNSIGNED_BYTE:
1425            case GL_SHORT:
1426            case GL_UNSIGNED_SHORT:
1427            case GL_INT:
1428            case GL_UNSIGNED_INT:
1429            case GL_FLOAT:
1430               return GL_NO_ERROR;
1431            case GL_HALF_FLOAT:
1432               return ctx->Extensions.ARB_half_float_pixel
1433                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1434            default:
1435               return GL_INVALID_ENUM;
1436         }
1437
1438      case GL_RGBA:
1439      case GL_BGRA:
1440      case GL_ABGR_EXT:
1441         switch (type) {
1442            case GL_BYTE:
1443            case GL_UNSIGNED_BYTE:
1444            case GL_SHORT:
1445            case GL_UNSIGNED_SHORT:
1446            case GL_INT:
1447            case GL_UNSIGNED_INT:
1448            case GL_FLOAT:
1449            case GL_UNSIGNED_SHORT_4_4_4_4:
1450            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1451            case GL_UNSIGNED_SHORT_5_5_5_1:
1452            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1453            case GL_UNSIGNED_INT_8_8_8_8:
1454            case GL_UNSIGNED_INT_8_8_8_8_REV:
1455            case GL_UNSIGNED_INT_10_10_10_2:
1456            case GL_UNSIGNED_INT_2_10_10_10_REV:
1457               return GL_NO_ERROR;
1458            case GL_HALF_FLOAT:
1459               return ctx->Extensions.ARB_half_float_pixel
1460                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1461            default:
1462               return GL_INVALID_ENUM;
1463         }
1464
1465      case GL_YCBCR_MESA:
1466         if (!ctx->Extensions.MESA_ycbcr_texture)
1467            return GL_INVALID_ENUM;
1468         if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
1469             type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
1470            return GL_NO_ERROR;
1471         else
1472            return GL_INVALID_OPERATION;
1473
1474      case GL_DEPTH_STENCIL_EXT:
1475         if (ctx->Extensions.EXT_packed_depth_stencil &&
1476             type == GL_UNSIGNED_INT_24_8)
1477            return GL_NO_ERROR;
1478         else if (ctx->Extensions.ARB_depth_buffer_float &&
1479             type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)
1480            return GL_NO_ERROR;
1481         else
1482            return GL_INVALID_ENUM;
1483
1484      case GL_DUDV_ATI:
1485      case GL_DU8DV8_ATI:
1486         if (!ctx->Extensions.ATI_envmap_bumpmap)
1487            return GL_INVALID_ENUM;
1488         switch (type) {
1489            case GL_BYTE:
1490            case GL_UNSIGNED_BYTE:
1491            case GL_SHORT:
1492            case GL_UNSIGNED_SHORT:
1493            case GL_INT:
1494            case GL_UNSIGNED_INT:
1495            case GL_FLOAT:
1496               return GL_NO_ERROR;
1497            default:
1498               return GL_INVALID_ENUM;
1499         }
1500
1501      /* integer-valued formats */
1502      case GL_RED_INTEGER_EXT:
1503      case GL_GREEN_INTEGER_EXT:
1504      case GL_BLUE_INTEGER_EXT:
1505      case GL_ALPHA_INTEGER_EXT:
1506      case GL_RG_INTEGER:
1507         switch (type) {
1508            case GL_BYTE:
1509            case GL_UNSIGNED_BYTE:
1510            case GL_SHORT:
1511            case GL_UNSIGNED_SHORT:
1512            case GL_INT:
1513            case GL_UNSIGNED_INT:
1514               return (ctx->Version >= 30 ||
1515                       ctx->Extensions.EXT_texture_integer)
1516                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1517            default:
1518               return GL_INVALID_ENUM;
1519         }
1520
1521      case GL_RGB_INTEGER_EXT:
1522         switch (type) {
1523            case GL_BYTE:
1524            case GL_UNSIGNED_BYTE:
1525            case GL_SHORT:
1526            case GL_UNSIGNED_SHORT:
1527            case GL_INT:
1528            case GL_UNSIGNED_INT:
1529               return (ctx->Version >= 30 ||
1530                       ctx->Extensions.EXT_texture_integer)
1531                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1532            case GL_UNSIGNED_BYTE_3_3_2:
1533            case GL_UNSIGNED_BYTE_2_3_3_REV:
1534            case GL_UNSIGNED_SHORT_5_6_5:
1535            case GL_UNSIGNED_SHORT_5_6_5_REV:
1536               return ctx->Extensions.ARB_texture_rgb10_a2ui
1537                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1538            default:
1539               return GL_INVALID_ENUM;
1540         }
1541
1542      case GL_BGR_INTEGER_EXT:
1543         switch (type) {
1544            case GL_BYTE:
1545            case GL_UNSIGNED_BYTE:
1546            case GL_SHORT:
1547            case GL_UNSIGNED_SHORT:
1548            case GL_INT:
1549            case GL_UNSIGNED_INT:
1550            /* NOTE: no packed formats w/ BGR format */
1551               return (ctx->Version >= 30 ||
1552                       ctx->Extensions.EXT_texture_integer)
1553                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1554            default:
1555               return GL_INVALID_ENUM;
1556         }
1557
1558      case GL_RGBA_INTEGER_EXT:
1559      case GL_BGRA_INTEGER_EXT:
1560         switch (type) {
1561            case GL_BYTE:
1562            case GL_UNSIGNED_BYTE:
1563            case GL_SHORT:
1564            case GL_UNSIGNED_SHORT:
1565            case GL_INT:
1566            case GL_UNSIGNED_INT:
1567               return (ctx->Version >= 30 ||
1568                       ctx->Extensions.EXT_texture_integer)
1569                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1570            case GL_UNSIGNED_SHORT_4_4_4_4:
1571            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1572            case GL_UNSIGNED_SHORT_5_5_5_1:
1573            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1574            case GL_UNSIGNED_INT_8_8_8_8:
1575            case GL_UNSIGNED_INT_8_8_8_8_REV:
1576            case GL_UNSIGNED_INT_10_10_10_2:
1577            case GL_UNSIGNED_INT_2_10_10_10_REV:
1578               return ctx->Extensions.ARB_texture_rgb10_a2ui
1579                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1580            default:
1581               return GL_INVALID_ENUM;
1582         }
1583
1584      case GL_LUMINANCE_INTEGER_EXT:
1585      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1586         switch (type) {
1587            case GL_BYTE:
1588            case GL_UNSIGNED_BYTE:
1589            case GL_SHORT:
1590            case GL_UNSIGNED_SHORT:
1591            case GL_INT:
1592            case GL_UNSIGNED_INT:
1593               return ctx->Extensions.EXT_texture_integer
1594                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1595            default:
1596               return GL_INVALID_ENUM;
1597         }
1598
1599      default:
1600         return GL_INVALID_ENUM;
1601   }
1602   return GL_NO_ERROR;
1603}
1604
1605
1606/**
1607 * Do error checking of format/type combinations for OpenGL ES glReadPixels
1608 * and glTex[Sub]Image.
1609 * \return error code, or GL_NO_ERROR.
1610 */
1611GLenum
1612_mesa_es_error_check_format_and_type(GLenum format, GLenum type,
1613                                     unsigned dimensions)
1614{
1615   GLboolean type_valid = GL_TRUE;
1616
1617   switch (format) {
1618   case GL_ALPHA:
1619   case GL_LUMINANCE:
1620   case GL_LUMINANCE_ALPHA:
1621      type_valid = (type == GL_UNSIGNED_BYTE
1622                    || type == GL_FLOAT
1623                    || type == GL_HALF_FLOAT_OES);
1624      break;
1625
1626   case GL_RGB:
1627      type_valid = (type == GL_UNSIGNED_BYTE
1628                    || type == GL_UNSIGNED_SHORT_5_6_5
1629                    || type == GL_FLOAT
1630                    || type == GL_HALF_FLOAT_OES);
1631      break;
1632
1633   case GL_RGBA:
1634      type_valid = (type == GL_UNSIGNED_BYTE
1635                    || type == GL_UNSIGNED_SHORT_4_4_4_4
1636                    || type == GL_UNSIGNED_SHORT_5_5_5_1
1637                    || type == GL_FLOAT
1638                    || type == GL_HALF_FLOAT_OES
1639                    || type == GL_UNSIGNED_INT_2_10_10_10_REV);
1640      break;
1641
1642   case GL_DEPTH_COMPONENT:
1643      /* This format is filtered against invalid dimensionalities elsewhere.
1644       */
1645      type_valid = (type == GL_UNSIGNED_SHORT
1646                    || type == GL_UNSIGNED_INT);
1647      break;
1648
1649   case GL_DEPTH_STENCIL:
1650      /* This format is filtered against invalid dimensionalities elsewhere.
1651       */
1652      type_valid = (type == GL_UNSIGNED_INT_24_8);
1653      break;
1654
1655   case GL_BGRA_EXT:
1656      type_valid = (type == GL_UNSIGNED_BYTE);
1657
1658      /* This feels like a bug in the EXT_texture_format_BGRA8888 spec, but
1659       * the format does not appear to be allowed for 3D textures in OpenGL
1660       * ES.
1661       */
1662      if (dimensions != 2)
1663         return GL_INVALID_VALUE;
1664
1665      break;
1666
1667   default:
1668      return GL_INVALID_VALUE;
1669   }
1670
1671   return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION;
1672}
1673
1674
1675/**
1676 * Do error checking of format/type combinations for OpenGL ES 3
1677 * glTex[Sub]Image.
1678 * \return error code, or GL_NO_ERROR.
1679 */
1680GLenum
1681_mesa_es3_error_check_format_and_type(GLenum format, GLenum type,
1682                                      GLenum internalFormat,
1683                                      unsigned dimensions)
1684{
1685   GLboolean type_valid = GL_TRUE;
1686
1687   switch (format) {
1688   case GL_RGBA:
1689      switch (type) {
1690      case GL_UNSIGNED_BYTE:
1691         switch (internalFormat) {
1692         case GL_RGBA:
1693         case GL_RGBA8:
1694         case GL_RGB5_A1:
1695         case GL_RGBA4:
1696         case GL_SRGB8_ALPHA8_EXT:
1697            break;
1698         default:
1699            return GL_INVALID_OPERATION;
1700         }
1701         break;
1702
1703      case GL_BYTE:
1704         if (internalFormat != GL_RGBA8_SNORM)
1705            return GL_INVALID_OPERATION;
1706         break;
1707
1708      case GL_UNSIGNED_SHORT_4_4_4_4:
1709         switch (internalFormat) {
1710         case GL_RGBA:
1711         case GL_RGBA4:
1712            break;
1713         default:
1714            return GL_INVALID_OPERATION;
1715         }
1716         break;
1717
1718      case GL_UNSIGNED_SHORT_5_5_5_1:
1719         switch (internalFormat) {
1720         case GL_RGBA:
1721         case GL_RGB5_A1:
1722            break;
1723         default:
1724            return GL_INVALID_OPERATION;
1725         }
1726         break;
1727
1728      case GL_UNSIGNED_INT_2_10_10_10_REV:
1729         switch (internalFormat) {
1730         case GL_RGBA: /* GL_EXT_texture_type_2_10_10_10_REV */
1731         case GL_RGB10_A2:
1732         case GL_RGB5_A1:
1733            break;
1734         default:
1735            return GL_INVALID_OPERATION;
1736         }
1737         break;
1738
1739      case GL_HALF_FLOAT:
1740         if (internalFormat != GL_RGBA16F)
1741            return GL_INVALID_OPERATION;
1742         break;
1743
1744      case GL_FLOAT:
1745         switch (internalFormat) {
1746         case GL_RGBA16F:
1747         case GL_RGBA32F:
1748            break;
1749         default:
1750            return GL_INVALID_OPERATION;
1751         }
1752         break;
1753
1754      default:
1755         return GL_INVALID_OPERATION;
1756      }
1757      break;
1758
1759   case GL_RGBA_INTEGER:
1760      switch (type) {
1761      case GL_UNSIGNED_BYTE:
1762         if (internalFormat != GL_RGBA8UI)
1763            return GL_INVALID_OPERATION;
1764         break;
1765
1766      case GL_BYTE:
1767         if (internalFormat != GL_RGBA8I)
1768            return GL_INVALID_OPERATION;
1769         break;
1770
1771      case GL_UNSIGNED_SHORT:
1772         if (internalFormat != GL_RGBA16UI)
1773            return GL_INVALID_OPERATION;
1774         break;
1775
1776      case GL_SHORT:
1777         if (internalFormat != GL_RGBA16I)
1778            return GL_INVALID_OPERATION;
1779         break;
1780
1781      case GL_UNSIGNED_INT:
1782         if (internalFormat != GL_RGBA32UI)
1783            return GL_INVALID_OPERATION;
1784         break;
1785
1786      case GL_INT:
1787         if (internalFormat != GL_RGBA32I)
1788            return GL_INVALID_OPERATION;
1789         break;
1790
1791      case GL_UNSIGNED_INT_2_10_10_10_REV:
1792         if (internalFormat != GL_RGB10_A2UI)
1793            return GL_INVALID_OPERATION;
1794         break;
1795
1796      default:
1797         return GL_INVALID_OPERATION;
1798      }
1799      break;
1800
1801   case GL_RGB:
1802      switch (type) {
1803      case GL_UNSIGNED_BYTE:
1804         switch (internalFormat) {
1805         case GL_RGB:
1806         case GL_RGB8:
1807         case GL_RGB565:
1808         case GL_SRGB8:
1809            break;
1810         default:
1811            return GL_INVALID_OPERATION;
1812         }
1813         break;
1814
1815      case GL_BYTE:
1816         if (internalFormat != GL_RGB8_SNORM)
1817            return GL_INVALID_OPERATION;
1818         break;
1819
1820      case GL_UNSIGNED_SHORT_5_6_5:
1821         switch (internalFormat) {
1822         case GL_RGB:
1823         case GL_RGB565:
1824            break;
1825         default:
1826            return GL_INVALID_OPERATION;
1827         }
1828         break;
1829
1830      case GL_UNSIGNED_INT_10F_11F_11F_REV:
1831         if (internalFormat != GL_R11F_G11F_B10F)
1832            return GL_INVALID_OPERATION;
1833         break;
1834
1835      case GL_UNSIGNED_INT_5_9_9_9_REV:
1836         if (internalFormat != GL_RGB9_E5)
1837            return GL_INVALID_OPERATION;
1838         break;
1839
1840      case GL_HALF_FLOAT:
1841         switch (internalFormat) {
1842         case GL_RGB16F:
1843         case GL_R11F_G11F_B10F:
1844         case GL_RGB9_E5:
1845            break;
1846         default:
1847            return GL_INVALID_OPERATION;
1848         }
1849         break;
1850
1851      case GL_FLOAT:
1852         switch (internalFormat) {
1853         case GL_RGB16F:
1854         case GL_RGB32F:
1855         case GL_R11F_G11F_B10F:
1856         case GL_RGB9_E5:
1857            break;
1858         default:
1859            return GL_INVALID_OPERATION;
1860         }
1861         break;
1862
1863      case GL_UNSIGNED_INT_2_10_10_10_REV:
1864         switch (internalFormat) {
1865         case GL_RGB: /* GL_EXT_texture_type_2_10_10_10_REV */
1866            break;
1867         default:
1868            return GL_INVALID_OPERATION;
1869         }
1870         break;
1871
1872      default:
1873         return GL_INVALID_OPERATION;
1874      }
1875      break;
1876
1877   case GL_RGB_INTEGER:
1878      switch (type) {
1879      case GL_UNSIGNED_BYTE:
1880         if (internalFormat != GL_RGB8UI)
1881            return GL_INVALID_OPERATION;
1882         break;
1883
1884      case GL_BYTE:
1885         if (internalFormat != GL_RGB8I)
1886            return GL_INVALID_OPERATION;
1887         break;
1888
1889      case GL_UNSIGNED_SHORT:
1890         if (internalFormat != GL_RGB16UI)
1891            return GL_INVALID_OPERATION;
1892         break;
1893
1894      case GL_SHORT:
1895         if (internalFormat != GL_RGB16I)
1896            return GL_INVALID_OPERATION;
1897         break;
1898
1899      case GL_UNSIGNED_INT:
1900         if (internalFormat != GL_RGB32UI)
1901            return GL_INVALID_OPERATION;
1902         break;
1903
1904      case GL_INT:
1905         if (internalFormat != GL_RGB32I)
1906            return GL_INVALID_OPERATION;
1907         break;
1908
1909      default:
1910         return GL_INVALID_OPERATION;
1911      }
1912      break;
1913
1914   case GL_RG:
1915      switch (type) {
1916      case GL_UNSIGNED_BYTE:
1917         if (internalFormat != GL_RG8)
1918            return GL_INVALID_OPERATION;
1919         break;
1920
1921      case GL_BYTE:
1922         if (internalFormat != GL_RG8_SNORM)
1923            return GL_INVALID_OPERATION;
1924         break;
1925
1926      case GL_HALF_FLOAT:
1927         if (internalFormat != GL_RG16F)
1928            return GL_INVALID_OPERATION;
1929         break;
1930
1931      case GL_FLOAT:
1932         switch (internalFormat) {
1933         case GL_RG16F:
1934         case GL_RG32F:
1935            break;
1936         default:
1937            return GL_INVALID_OPERATION;
1938         }
1939         break;
1940
1941      default:
1942         return GL_INVALID_OPERATION;
1943      }
1944      break;
1945
1946   case GL_RG_INTEGER:
1947      switch (type) {
1948      case GL_UNSIGNED_BYTE:
1949         if (internalFormat != GL_RG8UI)
1950            return GL_INVALID_OPERATION;
1951         break;
1952
1953      case GL_BYTE:
1954         if (internalFormat != GL_RG8I)
1955            return GL_INVALID_OPERATION;
1956         break;
1957
1958      case GL_UNSIGNED_SHORT:
1959         if (internalFormat != GL_RG16UI)
1960            return GL_INVALID_OPERATION;
1961         break;
1962
1963      case GL_SHORT:
1964         if (internalFormat != GL_RG16I)
1965            return GL_INVALID_OPERATION;
1966         break;
1967
1968      case GL_UNSIGNED_INT:
1969         if (internalFormat != GL_RG32UI)
1970            return GL_INVALID_OPERATION;
1971         break;
1972
1973      case GL_INT:
1974         if (internalFormat != GL_RG32I)
1975            return GL_INVALID_OPERATION;
1976         break;
1977
1978      default:
1979         return GL_INVALID_OPERATION;
1980      }
1981      break;
1982
1983   case GL_RED:
1984      switch (type) {
1985      case GL_UNSIGNED_BYTE:
1986         if (internalFormat != GL_R8)
1987            return GL_INVALID_OPERATION;
1988         break;
1989
1990      case GL_BYTE:
1991         if (internalFormat != GL_R8_SNORM)
1992            return GL_INVALID_OPERATION;
1993         break;
1994
1995      case GL_HALF_FLOAT:
1996         if (internalFormat != GL_R16F)
1997            return GL_INVALID_OPERATION;
1998         break;
1999
2000      case GL_FLOAT:
2001         switch (internalFormat) {
2002         case GL_R16F:
2003         case GL_R32F:
2004            break;
2005         default:
2006            return GL_INVALID_OPERATION;
2007         }
2008         break;
2009
2010      default:
2011         return GL_INVALID_OPERATION;
2012      }
2013      break;
2014
2015   case GL_RED_INTEGER:
2016      switch (type) {
2017      case GL_UNSIGNED_BYTE:
2018         if (internalFormat != GL_R8UI)
2019            return GL_INVALID_OPERATION;
2020         break;
2021
2022      case GL_BYTE:
2023         if (internalFormat != GL_R8I)
2024            return GL_INVALID_OPERATION;
2025         break;
2026
2027      case GL_UNSIGNED_SHORT:
2028         if (internalFormat != GL_R16UI)
2029            return GL_INVALID_OPERATION;
2030         break;
2031
2032      case GL_SHORT:
2033         if (internalFormat != GL_R16I)
2034            return GL_INVALID_OPERATION;
2035         break;
2036
2037      case GL_UNSIGNED_INT:
2038         if (internalFormat != GL_R32UI)
2039            return GL_INVALID_OPERATION;
2040         break;
2041
2042      case GL_INT:
2043         if (internalFormat != GL_R32I)
2044            return GL_INVALID_OPERATION;
2045         break;
2046
2047      default:
2048         return GL_INVALID_OPERATION;
2049      }
2050      break;
2051
2052   case GL_DEPTH_COMPONENT:
2053      if (dimensions != 2) {
2054         return GL_INVALID_OPERATION;
2055      }
2056      switch (type) {
2057      case GL_UNSIGNED_SHORT:
2058         if (internalFormat != GL_DEPTH_COMPONENT16)
2059            return GL_INVALID_OPERATION;
2060         break;
2061
2062      case GL_UNSIGNED_INT:
2063         switch (internalFormat) {
2064         case GL_DEPTH_COMPONENT16:
2065         case GL_DEPTH_COMPONENT24:
2066            break;
2067         default:
2068            return GL_INVALID_OPERATION;
2069         }
2070         break;
2071
2072      case GL_FLOAT:
2073         if (internalFormat != GL_DEPTH_COMPONENT32F)
2074            return GL_INVALID_OPERATION;
2075         break;
2076
2077      default:
2078         return GL_INVALID_OPERATION;
2079      }
2080      break;
2081
2082   case GL_DEPTH_STENCIL:
2083      if (dimensions != 2) {
2084         return GL_INVALID_OPERATION;
2085      }
2086      switch (type) {
2087      case GL_UNSIGNED_INT_24_8:
2088         if (internalFormat != GL_DEPTH24_STENCIL8)
2089            return GL_INVALID_OPERATION;
2090         break;
2091
2092      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
2093         if (internalFormat != GL_DEPTH32F_STENCIL8)
2094            return GL_INVALID_OPERATION;
2095         break;
2096
2097      default:
2098         return GL_INVALID_OPERATION;
2099      }
2100      break;
2101
2102   case GL_ALPHA:
2103   case GL_LUMINANCE:
2104   case GL_LUMINANCE_ALPHA:
2105      if (type != GL_UNSIGNED_BYTE || format != internalFormat)
2106         return GL_INVALID_OPERATION;
2107      break;
2108   }
2109
2110   return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION;
2111}
2112