xref: /third_party/mesa3d/src/mesa/main/glformats.c (revision bf215546)
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 OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 * OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
28#include "context.h"
29#include "glformats.h"
30#include "formats.h"
31#include "texcompress.h"
32#include "enums.h"
33
34enum {
35   ZERO = 4,
36   ONE = 5
37};
38
39enum {
40   IDX_LUMINANCE = 0,
41   IDX_ALPHA,
42   IDX_INTENSITY,
43   IDX_LUMINANCE_ALPHA,
44   IDX_RGB,
45   IDX_RGBA,
46   IDX_RED,
47   IDX_GREEN,
48   IDX_BLUE,
49   IDX_BGR,
50   IDX_BGRA,
51   IDX_ABGR,
52   IDX_RG,
53   MAX_IDX
54};
55
56#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
57#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
58#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
59#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
60
61static const struct {
62   GLubyte format_idx;
63   GLubyte to_rgba[6];
64   GLubyte from_rgba[6];
65} mappings[MAX_IDX] =
66{
67   {
68      IDX_LUMINANCE,
69      MAP4(0,0,0,ONE),
70      MAP1(0)
71   },
72
73   {
74      IDX_ALPHA,
75      MAP4(ZERO, ZERO, ZERO, 0),
76      MAP1(3)
77   },
78
79   {
80      IDX_INTENSITY,
81      MAP4(0, 0, 0, 0),
82      MAP1(0),
83   },
84
85   {
86      IDX_LUMINANCE_ALPHA,
87      MAP4(0,0,0,1),
88      MAP2(0,3)
89   },
90
91   {
92      IDX_RGB,
93      MAP4(0,1,2,ONE),
94      MAP3(0,1,2)
95   },
96
97   {
98      IDX_RGBA,
99      MAP4(0,1,2,3),
100      MAP4(0,1,2,3),
101   },
102
103   {
104      IDX_RED,
105      MAP4(0, ZERO, ZERO, ONE),
106      MAP1(0),
107   },
108
109   {
110      IDX_GREEN,
111      MAP4(ZERO, 0, ZERO, ONE),
112      MAP1(1),
113   },
114
115   {
116      IDX_BLUE,
117      MAP4(ZERO, ZERO, 0, ONE),
118      MAP1(2),
119   },
120
121   {
122      IDX_BGR,
123      MAP4(2,1,0,ONE),
124      MAP3(2,1,0)
125   },
126
127   {
128      IDX_BGRA,
129      MAP4(2,1,0,3),
130      MAP4(2,1,0,3)
131   },
132
133   {
134      IDX_ABGR,
135      MAP4(3,2,1,0),
136      MAP4(3,2,1,0)
137   },
138
139   {
140      IDX_RG,
141      MAP4(0, 1, ZERO, ONE),
142      MAP2(0, 1)
143   },
144};
145
146/**
147 * Convert a GL image format enum to an IDX_* value (see above).
148 */
149static int
150get_map_idx(GLenum value)
151{
152   switch (value) {
153   case GL_LUMINANCE:
154   case GL_LUMINANCE_INTEGER_EXT:
155      return IDX_LUMINANCE;
156   case GL_ALPHA:
157   case GL_ALPHA_INTEGER:
158      return IDX_ALPHA;
159   case GL_INTENSITY:
160      return IDX_INTENSITY;
161   case GL_LUMINANCE_ALPHA:
162   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
163      return IDX_LUMINANCE_ALPHA;
164   case GL_RGB:
165   case GL_RGB_INTEGER:
166      return IDX_RGB;
167   case GL_RGBA:
168   case GL_RGBA_INTEGER:
169      return IDX_RGBA;
170   case GL_RED:
171   case GL_RED_INTEGER:
172      return IDX_RED;
173   case GL_GREEN:
174      return IDX_GREEN;
175   case GL_BLUE:
176      return IDX_BLUE;
177   case GL_BGR:
178   case GL_BGR_INTEGER:
179      return IDX_BGR;
180   case GL_BGRA:
181   case GL_BGRA_INTEGER:
182      return IDX_BGRA;
183   case GL_ABGR_EXT:
184      return IDX_ABGR;
185   case GL_RG:
186   case GL_RG_INTEGER:
187      return IDX_RG;
188   default:
189      _mesa_problem(NULL, "Unexpected inFormat %s",
190                    _mesa_enum_to_string(value));
191      return 0;
192   }
193}
194
195/**
196 * When promoting texture formats (see below) we need to compute the
197 * mapping of dest components back to source components.
198 * This function does that.
199 * \param inFormat  the incoming format of the texture
200 * \param outFormat  the final texture format
201 * \return map[6]  a full 6-component map
202 */
203void
204_mesa_compute_component_mapping(GLenum inFormat, GLenum outFormat, GLubyte *map)
205{
206   const int inFmt = get_map_idx(inFormat);
207   const int outFmt = get_map_idx(outFormat);
208   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
209   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
210   int i;
211
212   for (i = 0; i < 4; i++)
213      map[i] = in2rgba[rgba2out[i]];
214
215   map[ZERO] = ZERO;
216   map[ONE] = ONE;
217
218#if 0
219   printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
220	  inFormat, _mesa_enum_to_string(inFormat),
221	  outFormat, _mesa_enum_to_string(outFormat),
222	  map[0],
223	  map[1],
224	  map[2],
225	  map[3],
226	  map[4],
227	  map[5]);
228#endif
229}
230
231/**
232 * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
233 */
234GLboolean
235_mesa_type_is_packed(GLenum type)
236{
237   switch (type) {
238   case GL_UNSIGNED_BYTE_3_3_2:
239   case GL_UNSIGNED_BYTE_2_3_3_REV:
240   case MESA_UNSIGNED_BYTE_4_4:
241   case GL_UNSIGNED_SHORT_5_6_5:
242   case GL_UNSIGNED_SHORT_5_6_5_REV:
243   case GL_UNSIGNED_SHORT_4_4_4_4:
244   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
245   case GL_UNSIGNED_SHORT_5_5_5_1:
246   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
247   case GL_UNSIGNED_INT_8_8_8_8:
248   case GL_UNSIGNED_INT_8_8_8_8_REV:
249   case GL_UNSIGNED_INT_10_10_10_2:
250   case GL_UNSIGNED_INT_2_10_10_10_REV:
251   case GL_UNSIGNED_SHORT_8_8_MESA:
252   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
253   case GL_UNSIGNED_INT_24_8_EXT:
254   case GL_UNSIGNED_INT_5_9_9_9_REV:
255   case GL_UNSIGNED_INT_10F_11F_11F_REV:
256   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
257      return GL_TRUE;
258   }
259
260   return GL_FALSE;
261}
262
263
264/**
265 * Get the size of a GL data type.
266 *
267 * \param type GL data type.
268 *
269 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
270 * if an invalid type enum.
271 */
272GLint
273_mesa_sizeof_type(GLenum type)
274{
275   switch (type) {
276   case GL_BITMAP:
277      return 0;
278   case GL_UNSIGNED_BYTE:
279      return sizeof(GLubyte);
280   case GL_BYTE:
281      return sizeof(GLbyte);
282   case GL_UNSIGNED_SHORT:
283      return sizeof(GLushort);
284   case GL_SHORT:
285      return sizeof(GLshort);
286   case GL_UNSIGNED_INT:
287      return sizeof(GLuint);
288   case GL_INT:
289      return sizeof(GLint);
290   case GL_FLOAT:
291      return sizeof(GLfloat);
292   case GL_DOUBLE:
293      return sizeof(GLdouble);
294   case GL_HALF_FLOAT_ARB:
295   case GL_HALF_FLOAT_OES:
296      return sizeof(GLhalfARB);
297   case GL_FIXED:
298      return sizeof(GLfixed);
299   default:
300      return -1;
301   }
302}
303
304
305/**
306 * Same as _mesa_sizeof_type() but also accepting the packed pixel
307 * format data types.
308 */
309GLint
310_mesa_sizeof_packed_type(GLenum type)
311{
312   switch (type) {
313   case GL_BITMAP:
314      return 0;
315   case GL_UNSIGNED_BYTE:
316      return sizeof(GLubyte);
317   case GL_BYTE:
318      return sizeof(GLbyte);
319   case GL_UNSIGNED_SHORT:
320      return sizeof(GLushort);
321   case GL_SHORT:
322      return sizeof(GLshort);
323   case GL_UNSIGNED_INT:
324      return sizeof(GLuint);
325   case GL_INT:
326      return sizeof(GLint);
327   case GL_HALF_FLOAT_ARB:
328   case GL_HALF_FLOAT_OES:
329      return sizeof(GLhalfARB);
330   case GL_FLOAT:
331      return sizeof(GLfloat);
332   case GL_UNSIGNED_BYTE_3_3_2:
333   case GL_UNSIGNED_BYTE_2_3_3_REV:
334   case MESA_UNSIGNED_BYTE_4_4:
335      return sizeof(GLubyte);
336   case GL_UNSIGNED_SHORT_5_6_5:
337   case GL_UNSIGNED_SHORT_5_6_5_REV:
338   case GL_UNSIGNED_SHORT_4_4_4_4:
339   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
340   case GL_UNSIGNED_SHORT_5_5_5_1:
341   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
342   case GL_UNSIGNED_SHORT_8_8_MESA:
343   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
344      return sizeof(GLushort);
345   case GL_UNSIGNED_INT_8_8_8_8:
346   case GL_UNSIGNED_INT_8_8_8_8_REV:
347   case GL_UNSIGNED_INT_10_10_10_2:
348   case GL_UNSIGNED_INT_2_10_10_10_REV:
349   case GL_UNSIGNED_INT_24_8_EXT:
350   case GL_UNSIGNED_INT_5_9_9_9_REV:
351   case GL_UNSIGNED_INT_10F_11F_11F_REV:
352      return sizeof(GLuint);
353   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
354      return 8;
355   default:
356      return -1;
357   }
358}
359
360
361/**
362 * Get the number of components in a pixel format.
363 *
364 * \param format pixel format.
365 *
366 * \return the number of components in the given format, or -1 if a bad format.
367 */
368GLint
369_mesa_components_in_format(GLenum format)
370{
371   switch (format) {
372   case GL_COLOR_INDEX:
373   case GL_STENCIL_INDEX:
374   case GL_DEPTH_COMPONENT:
375   case GL_RED:
376   case GL_RED_INTEGER_EXT:
377   case GL_GREEN:
378   case GL_GREEN_INTEGER_EXT:
379   case GL_BLUE:
380   case GL_BLUE_INTEGER_EXT:
381   case GL_ALPHA:
382   case GL_ALPHA_INTEGER_EXT:
383   case GL_LUMINANCE:
384   case GL_LUMINANCE_INTEGER_EXT:
385   case GL_INTENSITY:
386      return 1;
387
388   case GL_LUMINANCE_ALPHA:
389   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
390   case GL_RG:
391   case GL_YCBCR_MESA:
392   case GL_DEPTH_STENCIL_EXT:
393   case GL_RG_INTEGER:
394      return 2;
395
396   case GL_RGB:
397   case GL_BGR:
398   case GL_RGB_INTEGER_EXT:
399   case GL_BGR_INTEGER_EXT:
400      return 3;
401
402   case GL_RGBA:
403   case GL_BGRA:
404   case GL_ABGR_EXT:
405   case GL_RGBA_INTEGER_EXT:
406   case GL_BGRA_INTEGER_EXT:
407      return 4;
408
409   default:
410      return -1;
411   }
412}
413
414
415/**
416 * Get the bytes per pixel of pixel format type pair.
417 *
418 * \param format pixel format.
419 * \param type pixel type.
420 *
421 * \return bytes per pixel, or -1 if a bad format or type was given.
422 */
423GLint
424_mesa_bytes_per_pixel(GLenum format, GLenum type)
425{
426   GLint comps = _mesa_components_in_format(format);
427   if (comps < 0)
428      return -1;
429
430   switch (type) {
431   case GL_BITMAP:
432      return 0;  /* special case */
433   case GL_BYTE:
434   case GL_UNSIGNED_BYTE:
435      return comps * sizeof(GLubyte);
436   case GL_SHORT:
437   case GL_UNSIGNED_SHORT:
438      return comps * sizeof(GLshort);
439   case GL_INT:
440   case GL_UNSIGNED_INT:
441      return comps * sizeof(GLint);
442   case GL_FLOAT:
443      return comps * sizeof(GLfloat);
444   case GL_HALF_FLOAT_ARB:
445   case GL_HALF_FLOAT_OES:
446      return comps * sizeof(GLhalfARB);
447   case GL_UNSIGNED_BYTE_3_3_2:
448   case GL_UNSIGNED_BYTE_2_3_3_REV:
449      if (format == GL_RGB || format == GL_BGR ||
450          format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
451         return sizeof(GLubyte);
452      else
453         return -1;  /* error */
454   case GL_UNSIGNED_SHORT_5_6_5:
455   case GL_UNSIGNED_SHORT_5_6_5_REV:
456      if (format == GL_RGB || format == GL_BGR ||
457          format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
458         return sizeof(GLushort);
459      else
460         return -1;  /* error */
461   case GL_UNSIGNED_SHORT_4_4_4_4:
462   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
463      if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
464          format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
465         return sizeof(GLushort);
466      else
467         return -1;
468   case GL_UNSIGNED_SHORT_5_5_5_1:
469   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
470      if (format == GL_RGBA || format == GL_BGRA ||
471          format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
472         return sizeof(GLushort);
473      else
474         return -1;
475   case GL_UNSIGNED_INT_8_8_8_8:
476   case GL_UNSIGNED_INT_8_8_8_8_REV:
477      if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
478          format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT ||
479          format == GL_RGB)
480         return sizeof(GLuint);
481      else
482         return -1;
483   case GL_UNSIGNED_INT_10_10_10_2:
484   case GL_UNSIGNED_INT_2_10_10_10_REV:
485      if (format == GL_RGBA || format == GL_BGRA ||
486          format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT ||
487          format == GL_RGB)
488         return sizeof(GLuint);
489      else
490         return -1;
491   case GL_UNSIGNED_SHORT_8_8_MESA:
492   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
493      if (format == GL_YCBCR_MESA)
494         return sizeof(GLushort);
495      else
496         return -1;
497   case GL_UNSIGNED_INT_24_8_EXT:
498      if (format == GL_DEPTH_COMPONENT ||
499          format == GL_DEPTH_STENCIL_EXT)
500         return sizeof(GLuint);
501      else
502         return -1;
503   case GL_UNSIGNED_INT_5_9_9_9_REV:
504      if (format == GL_RGB)
505         return sizeof(GLuint);
506      else
507         return -1;
508   case GL_UNSIGNED_INT_10F_11F_11F_REV:
509      if (format == GL_RGB)
510         return sizeof(GLuint);
511      else
512         return -1;
513   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
514      if (format == GL_DEPTH_STENCIL)
515         return 8;
516      else
517         return -1;
518   default:
519      return -1;
520   }
521}
522
523
524/**
525 * Get the number of bytes for a vertex attrib with the given number of
526 * components and type.
527 *
528 * \param comps number of components.
529 * \param type data type.
530 *
531 * \return bytes per attribute, or -1 if a bad comps/type combination was given.
532 */
533GLint
534_mesa_bytes_per_vertex_attrib(GLint comps, GLenum type)
535{
536   switch (type) {
537   case GL_BYTE:
538   case GL_UNSIGNED_BYTE:
539      return comps * sizeof(GLubyte);
540   case GL_SHORT:
541   case GL_UNSIGNED_SHORT:
542      return comps * sizeof(GLshort);
543   case GL_INT:
544   case GL_UNSIGNED_INT:
545      return comps * sizeof(GLint);
546   case GL_FLOAT:
547      return comps * sizeof(GLfloat);
548   case GL_HALF_FLOAT_ARB:
549   case GL_HALF_FLOAT_OES:
550      return comps * sizeof(GLhalfARB);
551   case GL_DOUBLE:
552      return comps * sizeof(GLdouble);
553   case GL_FIXED:
554      return comps * sizeof(GLfixed);
555   case GL_INT_2_10_10_10_REV:
556   case GL_UNSIGNED_INT_2_10_10_10_REV:
557      if (comps == 4)
558         return sizeof(GLuint);
559      else
560         return -1;
561   case GL_UNSIGNED_INT_10F_11F_11F_REV:
562      if (comps == 3)
563         return sizeof(GLuint);
564      else
565         return -1;
566   case GL_UNSIGNED_INT64_ARB:
567      return comps * 8;
568   default:
569      return -1;
570   }
571}
572
573/**
574 * Test if the given format is unsized.
575 */
576GLboolean
577_mesa_is_enum_format_unsized(GLenum format)
578{
579   switch (format) {
580   case GL_RGBA:
581   case GL_BGRA:
582   case GL_ABGR_EXT:
583   case GL_RGB:
584   case GL_BGR:
585   case GL_RG:
586   case GL_RED:
587   case GL_GREEN:
588   case GL_BLUE:
589   case GL_ALPHA:
590   case GL_INTENSITY:
591   case GL_LUMINANCE:
592   case GL_LUMINANCE_ALPHA:
593
594   case GL_SRGB:
595   case GL_SRGB_ALPHA:
596   case GL_SLUMINANCE:
597   case GL_SLUMINANCE_ALPHA:
598
599   case GL_RGBA_SNORM:
600   case GL_RGB_SNORM:
601   case GL_RG_SNORM:
602   case GL_RED_SNORM:
603   case GL_ALPHA_SNORM:
604   case GL_INTENSITY_SNORM:
605   case GL_LUMINANCE_SNORM:
606   case GL_LUMINANCE_ALPHA_SNORM:
607
608   case GL_RED_INTEGER:
609   case GL_GREEN_INTEGER:
610   case GL_BLUE_INTEGER:
611   case GL_ALPHA_INTEGER:
612   case GL_RGB_INTEGER:
613   case GL_RGBA_INTEGER:
614   case GL_BGR_INTEGER:
615   case GL_BGRA_INTEGER:
616   case GL_RG_INTEGER:
617   case GL_LUMINANCE_INTEGER_EXT:
618   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
619
620   case GL_DEPTH_COMPONENT:
621   case GL_DEPTH_STENCIL:
622   case GL_STENCIL_INDEX:
623      return GL_TRUE;
624   default:
625      return GL_FALSE;
626   }
627}
628
629/**
630 * Test if the given format is a UNORM (unsigned-normalized) format.
631 */
632GLboolean
633_mesa_is_enum_format_unorm(GLenum format)
634{
635      switch(format) {
636      case GL_RED:
637      case GL_GREEN:
638      case GL_BLUE:
639      case GL_ALPHA:
640      case GL_ALPHA4:
641      case GL_ALPHA8:
642      case GL_ALPHA12:
643      case GL_ALPHA16:
644      case 1:
645      case GL_LUMINANCE:
646      case GL_SLUMINANCE:
647      case GL_LUMINANCE4:
648      case GL_LUMINANCE8:
649      case GL_LUMINANCE12:
650      case GL_LUMINANCE16:
651      case 2:
652      case GL_LUMINANCE_ALPHA:
653      case GL_SLUMINANCE_ALPHA:
654      case GL_LUMINANCE4_ALPHA4:
655      case GL_LUMINANCE6_ALPHA2:
656      case GL_LUMINANCE8_ALPHA8:
657      case GL_LUMINANCE12_ALPHA4:
658      case GL_LUMINANCE12_ALPHA12:
659      case GL_LUMINANCE16_ALPHA16:
660      case GL_INTENSITY:
661      case GL_INTENSITY4:
662      case GL_INTENSITY8:
663      case GL_INTENSITY12:
664      case GL_INTENSITY16:
665      case GL_R8:
666      case GL_R16:
667      case GL_RG:
668      case GL_RG8:
669      case GL_RG16:
670      case 3:
671      case GL_RGB:
672      case GL_BGR:
673      case GL_SRGB:
674      case GL_R3_G3_B2:
675      case GL_RGB4:
676      case GL_RGB5:
677      case GL_RGB565:
678      case GL_RGB8:
679      case GL_RGB10:
680      case GL_RGB12:
681      case GL_RGB16:
682      case 4:
683      case GL_ABGR_EXT:
684      case GL_RGBA:
685      case GL_BGRA:
686      case GL_SRGB_ALPHA:
687      case GL_RGBA2:
688      case GL_RGBA4:
689      case GL_RGB5_A1:
690      case GL_RGBA8:
691      case GL_RGB10_A2:
692      case GL_RGBA12:
693      case GL_RGBA16:
694         return GL_TRUE;
695      default:
696         return GL_FALSE;
697   }
698}
699
700/**
701 * Test if the given format is a SNORM (signed-normalized) format.
702 */
703GLboolean
704_mesa_is_enum_format_snorm(GLenum format)
705{
706   switch (format) {
707   /* signed, normalized texture formats */
708   case GL_RED_SNORM:
709   case GL_R8_SNORM:
710   case GL_R16_SNORM:
711   case GL_RG_SNORM:
712   case GL_RG8_SNORM:
713   case GL_RG16_SNORM:
714   case GL_RGB_SNORM:
715   case GL_RGB8_SNORM:
716   case GL_RGB16_SNORM:
717   case GL_RGBA_SNORM:
718   case GL_RGBA8_SNORM:
719   case GL_RGBA16_SNORM:
720   case GL_ALPHA_SNORM:
721   case GL_ALPHA8_SNORM:
722   case GL_ALPHA16_SNORM:
723   case GL_LUMINANCE_SNORM:
724   case GL_LUMINANCE8_SNORM:
725   case GL_LUMINANCE16_SNORM:
726   case GL_LUMINANCE_ALPHA_SNORM:
727   case GL_LUMINANCE8_ALPHA8_SNORM:
728   case GL_LUMINANCE16_ALPHA16_SNORM:
729   case GL_INTENSITY_SNORM:
730   case GL_INTENSITY8_SNORM:
731   case GL_INTENSITY16_SNORM:
732      return GL_TRUE;
733   default:
734      return GL_FALSE;
735   }
736}
737
738/**
739 * Test if the given format is an integer (non-normalized) format.
740 */
741GLboolean
742_mesa_is_enum_format_unsigned_int(GLenum format)
743{
744   switch (format) {
745   /* specific integer formats */
746   case GL_RGBA32UI_EXT:
747   case GL_RGB32UI_EXT:
748   case GL_RG32UI:
749   case GL_R32UI:
750   case GL_ALPHA32UI_EXT:
751   case GL_INTENSITY32UI_EXT:
752   case GL_LUMINANCE32UI_EXT:
753   case GL_LUMINANCE_ALPHA32UI_EXT:
754   case GL_RGBA16UI_EXT:
755   case GL_RGB16UI_EXT:
756   case GL_RG16UI:
757   case GL_R16UI:
758   case GL_ALPHA16UI_EXT:
759   case GL_INTENSITY16UI_EXT:
760   case GL_LUMINANCE16UI_EXT:
761   case GL_LUMINANCE_ALPHA16UI_EXT:
762   case GL_RGBA8UI_EXT:
763   case GL_RGB8UI_EXT:
764   case GL_RG8UI:
765   case GL_R8UI:
766   case GL_ALPHA8UI_EXT:
767   case GL_INTENSITY8UI_EXT:
768   case GL_LUMINANCE8UI_EXT:
769   case GL_LUMINANCE_ALPHA8UI_EXT:
770   case GL_RGB10_A2UI:
771      return GL_TRUE;
772   default:
773      return GL_FALSE;
774   }
775}
776
777
778/**
779 * Test if the given format is an integer (non-normalized) format.
780 */
781GLboolean
782_mesa_is_enum_format_signed_int(GLenum format)
783{
784   switch (format) {
785   /* generic integer formats */
786   case GL_RED_INTEGER_EXT:
787   case GL_GREEN_INTEGER_EXT:
788   case GL_BLUE_INTEGER_EXT:
789   case GL_ALPHA_INTEGER_EXT:
790   case GL_RGB_INTEGER_EXT:
791   case GL_RGBA_INTEGER_EXT:
792   case GL_BGR_INTEGER_EXT:
793   case GL_BGRA_INTEGER_EXT:
794   case GL_LUMINANCE_INTEGER_EXT:
795   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
796   case GL_RG_INTEGER:
797   /* specific integer formats */
798   case GL_RGBA32I_EXT:
799   case GL_RGB32I_EXT:
800   case GL_RG32I:
801   case GL_R32I:
802   case GL_ALPHA32I_EXT:
803   case GL_INTENSITY32I_EXT:
804   case GL_LUMINANCE32I_EXT:
805   case GL_LUMINANCE_ALPHA32I_EXT:
806   case GL_RGBA16I_EXT:
807   case GL_RGB16I_EXT:
808   case GL_RG16I:
809   case GL_R16I:
810   case GL_ALPHA16I_EXT:
811   case GL_INTENSITY16I_EXT:
812   case GL_LUMINANCE16I_EXT:
813   case GL_LUMINANCE_ALPHA16I_EXT:
814   case GL_RGBA8I_EXT:
815   case GL_RGB8I_EXT:
816   case GL_RG8I:
817   case GL_R8I:
818   case GL_ALPHA8I_EXT:
819   case GL_INTENSITY8I_EXT:
820   case GL_LUMINANCE8I_EXT:
821   case GL_LUMINANCE_ALPHA8I_EXT:
822      return GL_TRUE;
823   default:
824      return GL_FALSE;
825   }
826}
827
828/**
829 * Test if the given format is an ASTC 2D format.
830 */
831static bool
832is_astc_2d_format(GLenum internalFormat)
833{
834   switch (internalFormat) {
835   case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
836   case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
837   case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
838   case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
839   case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
840   case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
841   case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
842   case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
843   case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
844   case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
845   case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
846   case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
847   case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
848   case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
849   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
850   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
851   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
852   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
853   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
854   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
855   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
856   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
857   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
858   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
859   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
860   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
861   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
862   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
863      return true;
864   default:
865      return false;
866   }
867}
868
869/**
870 * Test if the given format is an ASTC 3D format.
871 */
872static bool
873is_astc_3d_format(GLenum internalFormat)
874{
875   switch (internalFormat) {
876   case GL_COMPRESSED_RGBA_ASTC_3x3x3_OES:
877   case GL_COMPRESSED_RGBA_ASTC_4x3x3_OES:
878   case GL_COMPRESSED_RGBA_ASTC_4x4x3_OES:
879   case GL_COMPRESSED_RGBA_ASTC_4x4x4_OES:
880   case GL_COMPRESSED_RGBA_ASTC_5x4x4_OES:
881   case GL_COMPRESSED_RGBA_ASTC_5x5x4_OES:
882   case GL_COMPRESSED_RGBA_ASTC_5x5x5_OES:
883   case GL_COMPRESSED_RGBA_ASTC_6x5x5_OES:
884   case GL_COMPRESSED_RGBA_ASTC_6x6x5_OES:
885   case GL_COMPRESSED_RGBA_ASTC_6x6x6_OES:
886   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES:
887   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES:
888   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES:
889   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES:
890   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES:
891   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES:
892   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES:
893   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES:
894   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES:
895   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES:
896      return true;
897   default:
898      return false;
899   }
900}
901
902/**
903 * Test if the given format is an ASTC format.
904 */
905GLboolean
906_mesa_is_astc_format(GLenum internalFormat)
907{
908   return is_astc_2d_format(internalFormat) ||
909          is_astc_3d_format(internalFormat);
910}
911
912/**
913 * Test if the given format is an ETC2 format.
914 */
915GLboolean
916_mesa_is_etc2_format(GLenum internalFormat)
917{
918   switch (internalFormat) {
919   case GL_COMPRESSED_RGB8_ETC2:
920   case GL_COMPRESSED_SRGB8_ETC2:
921   case GL_COMPRESSED_RGBA8_ETC2_EAC:
922   case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
923   case GL_COMPRESSED_R11_EAC:
924   case GL_COMPRESSED_RG11_EAC:
925   case GL_COMPRESSED_SIGNED_R11_EAC:
926   case GL_COMPRESSED_SIGNED_RG11_EAC:
927   case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
928   case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
929      return true;
930   default:
931      return false;
932   }
933}
934
935/**
936 * Test if the given format is an integer (non-normalized) format.
937 */
938GLboolean
939_mesa_is_enum_format_integer(GLenum format)
940{
941   return _mesa_is_enum_format_unsigned_int(format) ||
942          _mesa_is_enum_format_signed_int(format);
943}
944
945
946GLboolean
947_mesa_is_type_unsigned(GLenum type)
948{
949   switch (type) {
950   case GL_UNSIGNED_INT:
951   case GL_UNSIGNED_INT_8_8_8_8:
952   case GL_UNSIGNED_INT_8_8_8_8_REV:
953   case GL_UNSIGNED_INT_10_10_10_2:
954   case GL_UNSIGNED_INT_2_10_10_10_REV:
955
956   case GL_UNSIGNED_SHORT:
957   case GL_UNSIGNED_SHORT_4_4_4_4:
958   case GL_UNSIGNED_SHORT_5_5_5_1:
959   case GL_UNSIGNED_SHORT_5_6_5:
960   case GL_UNSIGNED_SHORT_5_6_5_REV:
961   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
962   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
963   case GL_UNSIGNED_SHORT_8_8_MESA:
964   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
965
966   case GL_UNSIGNED_BYTE:
967   case GL_UNSIGNED_BYTE_3_3_2:
968   case GL_UNSIGNED_BYTE_2_3_3_REV:
969      return GL_TRUE;
970
971   default:
972      return GL_FALSE;
973   }
974}
975
976
977/**
978 * Test if the given image format is a color/RGBA format (i.e., not color
979 * index, depth, stencil, etc).
980 * \param format  the image format value (may by an internal texture format)
981 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
982 */
983GLboolean
984_mesa_is_color_format(GLenum format)
985{
986   switch (format) {
987      case GL_RED:
988      case GL_GREEN:
989      case GL_BLUE:
990      case GL_ALPHA:
991      case GL_ALPHA4:
992      case GL_ALPHA8:
993      case GL_ALPHA12:
994      case GL_ALPHA16:
995      case 1:
996      case GL_LUMINANCE:
997      case GL_LUMINANCE4:
998      case GL_LUMINANCE8:
999      case GL_LUMINANCE12:
1000      case GL_LUMINANCE16:
1001      case 2:
1002      case GL_LUMINANCE_ALPHA:
1003      case GL_LUMINANCE4_ALPHA4:
1004      case GL_LUMINANCE6_ALPHA2:
1005      case GL_LUMINANCE8_ALPHA8:
1006      case GL_LUMINANCE12_ALPHA4:
1007      case GL_LUMINANCE12_ALPHA12:
1008      case GL_LUMINANCE16_ALPHA16:
1009      case GL_INTENSITY:
1010      case GL_INTENSITY4:
1011      case GL_INTENSITY8:
1012      case GL_INTENSITY12:
1013      case GL_INTENSITY16:
1014      case GL_R8:
1015      case GL_R16:
1016      case GL_RG:
1017      case GL_RG8:
1018      case GL_RG16:
1019      case 3:
1020      case GL_RGB:
1021      case GL_BGR:
1022      case GL_R3_G3_B2:
1023      case GL_RGB4:
1024      case GL_RGB5:
1025      case GL_RGB565:
1026      case GL_RGB8:
1027      case GL_RGB10:
1028      case GL_RGB12:
1029      case GL_RGB16:
1030      case 4:
1031      case GL_ABGR_EXT:
1032      case GL_RGBA:
1033      case GL_BGRA:
1034      case GL_RGBA2:
1035      case GL_RGBA4:
1036      case GL_RGB5_A1:
1037      case GL_RGBA8:
1038      case GL_RGB10_A2:
1039      case GL_RGBA12:
1040      case GL_RGBA16:
1041      /* float texture formats */
1042      case GL_ALPHA16F_ARB:
1043      case GL_ALPHA32F_ARB:
1044      case GL_LUMINANCE16F_ARB:
1045      case GL_LUMINANCE32F_ARB:
1046      case GL_LUMINANCE_ALPHA16F_ARB:
1047      case GL_LUMINANCE_ALPHA32F_ARB:
1048      case GL_INTENSITY16F_ARB:
1049      case GL_INTENSITY32F_ARB:
1050      case GL_R16F:
1051      case GL_R32F:
1052      case GL_RG16F:
1053      case GL_RG32F:
1054      case GL_RGB16F_ARB:
1055      case GL_RGB32F_ARB:
1056      case GL_RGBA16F_ARB:
1057      case GL_RGBA32F_ARB:
1058      /* compressed formats */
1059      case GL_COMPRESSED_ALPHA:
1060      case GL_COMPRESSED_LUMINANCE:
1061      case GL_COMPRESSED_LUMINANCE_ALPHA:
1062      case GL_COMPRESSED_INTENSITY:
1063      case GL_COMPRESSED_RED:
1064      case GL_COMPRESSED_RG:
1065      case GL_COMPRESSED_RGB:
1066      case GL_COMPRESSED_RGBA:
1067      case GL_RGB_S3TC:
1068      case GL_RGB4_S3TC:
1069      case GL_RGBA_S3TC:
1070      case GL_RGBA4_S3TC:
1071      case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1072      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1073      case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
1074      case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
1075      case GL_COMPRESSED_RGB_FXT1_3DFX:
1076      case GL_COMPRESSED_RGBA_FXT1_3DFX:
1077      case GL_SR8_EXT:
1078      case GL_SRG8_EXT:
1079      case GL_SRGB_EXT:
1080      case GL_SRGB8_EXT:
1081      case GL_SRGB_ALPHA_EXT:
1082      case GL_SRGB8_ALPHA8_EXT:
1083      case GL_SLUMINANCE_ALPHA_EXT:
1084      case GL_SLUMINANCE8_ALPHA8_EXT:
1085      case GL_SLUMINANCE_EXT:
1086      case GL_SLUMINANCE8_EXT:
1087      case GL_COMPRESSED_SRGB_EXT:
1088      case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
1089      case GL_COMPRESSED_SRGB_ALPHA_EXT:
1090      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
1091      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
1092      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
1093      case GL_COMPRESSED_SLUMINANCE_EXT:
1094      case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
1095      case GL_COMPRESSED_RED_RGTC1:
1096      case GL_COMPRESSED_SIGNED_RED_RGTC1:
1097      case GL_COMPRESSED_RG_RGTC2:
1098      case GL_COMPRESSED_SIGNED_RG_RGTC2:
1099      case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
1100      case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
1101      case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
1102      case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
1103      case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
1104      case GL_ETC1_RGB8_OES:
1105      case GL_COMPRESSED_RGB8_ETC2:
1106      case GL_COMPRESSED_SRGB8_ETC2:
1107      case GL_COMPRESSED_RGBA8_ETC2_EAC:
1108      case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
1109      case GL_COMPRESSED_R11_EAC:
1110      case GL_COMPRESSED_RG11_EAC:
1111      case GL_COMPRESSED_SIGNED_R11_EAC:
1112      case GL_COMPRESSED_SIGNED_RG11_EAC:
1113      case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
1114      case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
1115      case GL_COMPRESSED_RGBA_BPTC_UNORM:
1116      case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM:
1117      case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT:
1118      case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
1119      case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
1120      case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
1121      case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
1122      case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
1123      case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
1124      case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
1125      case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
1126      case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
1127      case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
1128      case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
1129      case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
1130      case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
1131      case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
1132      case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
1133      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
1134      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
1135      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
1136      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
1137      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
1138      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
1139      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
1140      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
1141      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
1142      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
1143      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
1144      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
1145      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
1146      case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
1147      case GL_ATC_RGB_AMD:
1148      case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD:
1149      case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
1150      /* generic integer formats */
1151      case GL_RED_INTEGER_EXT:
1152      case GL_GREEN_INTEGER_EXT:
1153      case GL_BLUE_INTEGER_EXT:
1154      case GL_ALPHA_INTEGER_EXT:
1155      case GL_RGB_INTEGER_EXT:
1156      case GL_RGBA_INTEGER_EXT:
1157      case GL_BGR_INTEGER_EXT:
1158      case GL_BGRA_INTEGER_EXT:
1159      case GL_RG_INTEGER:
1160      case GL_LUMINANCE_INTEGER_EXT:
1161      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1162      /* sized integer formats */
1163      case GL_RGBA32UI_EXT:
1164      case GL_RGB32UI_EXT:
1165      case GL_RG32UI:
1166      case GL_R32UI:
1167      case GL_ALPHA32UI_EXT:
1168      case GL_INTENSITY32UI_EXT:
1169      case GL_LUMINANCE32UI_EXT:
1170      case GL_LUMINANCE_ALPHA32UI_EXT:
1171      case GL_RGBA16UI_EXT:
1172      case GL_RGB16UI_EXT:
1173      case GL_RG16UI:
1174      case GL_R16UI:
1175      case GL_ALPHA16UI_EXT:
1176      case GL_INTENSITY16UI_EXT:
1177      case GL_LUMINANCE16UI_EXT:
1178      case GL_LUMINANCE_ALPHA16UI_EXT:
1179      case GL_RGBA8UI_EXT:
1180      case GL_RGB8UI_EXT:
1181      case GL_RG8UI:
1182      case GL_R8UI:
1183      case GL_ALPHA8UI_EXT:
1184      case GL_INTENSITY8UI_EXT:
1185      case GL_LUMINANCE8UI_EXT:
1186      case GL_LUMINANCE_ALPHA8UI_EXT:
1187      case GL_RGBA32I_EXT:
1188      case GL_RGB32I_EXT:
1189      case GL_RG32I:
1190      case GL_R32I:
1191      case GL_ALPHA32I_EXT:
1192      case GL_INTENSITY32I_EXT:
1193      case GL_LUMINANCE32I_EXT:
1194      case GL_LUMINANCE_ALPHA32I_EXT:
1195      case GL_RGBA16I_EXT:
1196      case GL_RGB16I_EXT:
1197      case GL_RG16I:
1198      case GL_R16I:
1199      case GL_ALPHA16I_EXT:
1200      case GL_INTENSITY16I_EXT:
1201      case GL_LUMINANCE16I_EXT:
1202      case GL_LUMINANCE_ALPHA16I_EXT:
1203      case GL_RGBA8I_EXT:
1204      case GL_RGB8I_EXT:
1205      case GL_RG8I:
1206      case GL_R8I:
1207      case GL_ALPHA8I_EXT:
1208      case GL_INTENSITY8I_EXT:
1209      case GL_LUMINANCE8I_EXT:
1210      case GL_LUMINANCE_ALPHA8I_EXT:
1211      /* signed, normalized texture formats */
1212      case GL_RED_SNORM:
1213      case GL_R8_SNORM:
1214      case GL_R16_SNORM:
1215      case GL_RG_SNORM:
1216      case GL_RG8_SNORM:
1217      case GL_RG16_SNORM:
1218      case GL_RGB_SNORM:
1219      case GL_RGB8_SNORM:
1220      case GL_RGB16_SNORM:
1221      case GL_RGBA_SNORM:
1222      case GL_RGBA8_SNORM:
1223      case GL_RGBA16_SNORM:
1224      case GL_ALPHA_SNORM:
1225      case GL_ALPHA8_SNORM:
1226      case GL_ALPHA16_SNORM:
1227      case GL_LUMINANCE_SNORM:
1228      case GL_LUMINANCE8_SNORM:
1229      case GL_LUMINANCE16_SNORM:
1230      case GL_LUMINANCE_ALPHA_SNORM:
1231      case GL_LUMINANCE8_ALPHA8_SNORM:
1232      case GL_LUMINANCE16_ALPHA16_SNORM:
1233      case GL_INTENSITY_SNORM:
1234      case GL_INTENSITY8_SNORM:
1235      case GL_INTENSITY16_SNORM:
1236      case GL_RGB9_E5:
1237      case GL_R11F_G11F_B10F:
1238      case GL_RGB10_A2UI:
1239         return GL_TRUE;
1240      case GL_YCBCR_MESA:  /* not considered to be RGB */
1241         FALLTHROUGH;
1242      default:
1243         return GL_FALSE;
1244   }
1245}
1246
1247
1248/**
1249 * Test if the given image format is a depth component format.
1250 */
1251GLboolean
1252_mesa_is_depth_format(GLenum format)
1253{
1254   switch (format) {
1255      case GL_DEPTH_COMPONENT:
1256      case GL_DEPTH_COMPONENT16:
1257      case GL_DEPTH_COMPONENT24:
1258      case GL_DEPTH_COMPONENT32:
1259      case GL_DEPTH_COMPONENT32F:
1260         return GL_TRUE;
1261      default:
1262         return GL_FALSE;
1263   }
1264}
1265
1266
1267/**
1268 * Test if the given image format is a stencil format.
1269 */
1270GLboolean
1271_mesa_is_stencil_format(GLenum format)
1272{
1273   switch (format) {
1274      case GL_STENCIL_INDEX:
1275         return GL_TRUE;
1276      default:
1277         return GL_FALSE;
1278   }
1279}
1280
1281
1282/**
1283 * Test if the given image format is a YCbCr format.
1284 */
1285GLboolean
1286_mesa_is_ycbcr_format(GLenum format)
1287{
1288   switch (format) {
1289      case GL_YCBCR_MESA:
1290         return GL_TRUE;
1291      default:
1292         return GL_FALSE;
1293   }
1294}
1295
1296
1297/**
1298 * Test if the given image format is a depth+stencil format.
1299 */
1300GLboolean
1301_mesa_is_depthstencil_format(GLenum format)
1302{
1303   switch (format) {
1304      case GL_DEPTH24_STENCIL8_EXT:
1305      case GL_DEPTH_STENCIL_EXT:
1306      case GL_DEPTH32F_STENCIL8:
1307         return GL_TRUE;
1308      default:
1309         return GL_FALSE;
1310   }
1311}
1312
1313
1314/**
1315 * Test if the given image format is a depth or stencil format.
1316 */
1317GLboolean
1318_mesa_is_depth_or_stencil_format(GLenum format)
1319{
1320   switch (format) {
1321      case GL_DEPTH_COMPONENT:
1322      case GL_DEPTH_COMPONENT16:
1323      case GL_DEPTH_COMPONENT24:
1324      case GL_DEPTH_COMPONENT32:
1325      case GL_STENCIL_INDEX:
1326      case GL_STENCIL_INDEX1_EXT:
1327      case GL_STENCIL_INDEX4_EXT:
1328      case GL_STENCIL_INDEX8_EXT:
1329      case GL_STENCIL_INDEX16_EXT:
1330      case GL_DEPTH_STENCIL_EXT:
1331      case GL_DEPTH24_STENCIL8_EXT:
1332      case GL_DEPTH_COMPONENT32F:
1333      case GL_DEPTH32F_STENCIL8:
1334         return GL_TRUE;
1335      default:
1336         return GL_FALSE;
1337   }
1338}
1339
1340/**
1341 * Test if the given image format has a floating-point depth component.
1342 */
1343GLboolean
1344_mesa_has_depth_float_channel(GLenum internalFormat)
1345{
1346   return internalFormat == GL_DEPTH32F_STENCIL8 ||
1347          internalFormat == GL_DEPTH_COMPONENT32F;
1348}
1349
1350/**
1351 * Test if an image format is a supported compressed format.
1352 * \param format the internal format token provided by the user.
1353 * \return GL_TRUE if compressed, GL_FALSE if uncompressed
1354 */
1355GLboolean
1356_mesa_is_compressed_format(const struct gl_context *ctx, GLenum format)
1357{
1358   mesa_format m_format = _mesa_glenum_to_compressed_format(format);
1359
1360   /* Some formats in this switch have an equivalent mesa_format_layout
1361    * to the compressed formats in the layout switch below and thus
1362    * must be handled first.
1363    */
1364   switch (format) {
1365   case GL_RGB_S3TC:
1366   case GL_RGB4_S3TC:
1367   case GL_RGBA_S3TC:
1368   case GL_RGBA4_S3TC:
1369      return _mesa_has_S3_s3tc(ctx);
1370   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
1371      return _mesa_has_ATI_texture_compression_3dc(ctx);
1372   case GL_PALETTE4_RGB8_OES:
1373   case GL_PALETTE4_RGBA8_OES:
1374   case GL_PALETTE4_R5_G6_B5_OES:
1375   case GL_PALETTE4_RGBA4_OES:
1376   case GL_PALETTE4_RGB5_A1_OES:
1377   case GL_PALETTE8_RGB8_OES:
1378   case GL_PALETTE8_RGBA8_OES:
1379   case GL_PALETTE8_R5_G6_B5_OES:
1380   case GL_PALETTE8_RGBA4_OES:
1381   case GL_PALETTE8_RGB5_A1_OES:
1382      return ctx->API == API_OPENGLES;
1383   }
1384
1385   switch (_mesa_get_format_layout(m_format)) {
1386   case MESA_FORMAT_LAYOUT_S3TC:
1387      if (!_mesa_is_format_srgb(m_format)) {
1388         return _mesa_has_EXT_texture_compression_s3tc(ctx);
1389      } else {
1390         return (_mesa_has_EXT_texture_sRGB(ctx) ||
1391            _mesa_has_EXT_texture_compression_s3tc_srgb(ctx)) &&
1392            _mesa_has_EXT_texture_compression_s3tc(ctx);
1393      }
1394   case MESA_FORMAT_LAYOUT_FXT1:
1395      return _mesa_has_3DFX_texture_compression_FXT1(ctx);
1396   case MESA_FORMAT_LAYOUT_RGTC:
1397      return _mesa_has_ARB_texture_compression_rgtc(ctx) ||
1398             _mesa_has_EXT_texture_compression_rgtc(ctx);
1399   case MESA_FORMAT_LAYOUT_LATC:
1400      return _mesa_has_EXT_texture_compression_latc(ctx);
1401   case MESA_FORMAT_LAYOUT_ETC1:
1402      return _mesa_has_OES_compressed_ETC1_RGB8_texture(ctx);
1403   case MESA_FORMAT_LAYOUT_ETC2:
1404      return _mesa_is_gles3(ctx) || _mesa_has_ARB_ES3_compatibility(ctx);
1405   case MESA_FORMAT_LAYOUT_BPTC:
1406      return _mesa_has_ARB_texture_compression_bptc(ctx) ||
1407             _mesa_has_EXT_texture_compression_bptc(ctx);
1408   case MESA_FORMAT_LAYOUT_ASTC:
1409      return _mesa_has_KHR_texture_compression_astc_ldr(ctx);
1410   case MESA_FORMAT_LAYOUT_ATC:
1411      return _mesa_has_AMD_compressed_ATC_texture(ctx);
1412   default:
1413      return GL_FALSE;
1414   }
1415}
1416
1417/**
1418 * Test if the given format represents an sRGB format.
1419 * \param format the GL format (can be an internal format)
1420 * \return GL_TRUE if format is sRGB, GL_FALSE otherwise
1421 */
1422GLboolean
1423_mesa_is_srgb_format(GLenum format)
1424{
1425   switch (format) {
1426   case GL_SR8_EXT:
1427   case GL_SRG8_EXT:
1428   case GL_SRGB:
1429   case GL_SRGB8:
1430   case GL_SRGB_ALPHA:
1431   case GL_SRGB8_ALPHA8:
1432   case GL_COMPRESSED_SRGB:
1433   case GL_COMPRESSED_SRGB_ALPHA:
1434   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
1435   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
1436   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
1437   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
1438   case GL_COMPRESSED_SRGB8_ETC2:
1439   case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
1440   case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
1441   case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM:
1442   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
1443   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
1444   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
1445   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
1446   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
1447   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
1448   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
1449   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
1450   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
1451   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
1452   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
1453   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
1454   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
1455   case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
1456      return GL_TRUE;
1457   default:
1458      break;
1459   }
1460
1461   return GL_FALSE;
1462}
1463
1464/**
1465 * Convert various unpack formats to the corresponding base format.
1466 */
1467GLenum
1468_mesa_unpack_format_to_base_format(GLenum format)
1469{
1470   switch(format) {
1471   case GL_RED_INTEGER:
1472      return GL_RED;
1473   case GL_GREEN_INTEGER:
1474      return GL_GREEN;
1475   case GL_BLUE_INTEGER:
1476      return GL_BLUE;
1477   case GL_ALPHA_INTEGER:
1478      return GL_ALPHA;
1479   case GL_RG_INTEGER:
1480      return GL_RG;
1481   case GL_RGB_INTEGER:
1482      return GL_RGB;
1483   case GL_RGBA_INTEGER:
1484      return GL_RGBA;
1485   case GL_BGR_INTEGER:
1486      return GL_BGR;
1487   case GL_BGRA_INTEGER:
1488      return GL_BGRA;
1489   case GL_LUMINANCE_INTEGER_EXT:
1490      return GL_LUMINANCE;
1491   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1492      return GL_LUMINANCE_ALPHA;
1493   case GL_RED:
1494   case GL_GREEN:
1495   case GL_BLUE:
1496   case GL_RG:
1497   case GL_RGB:
1498   case GL_RGBA:
1499   case GL_BGR:
1500   case GL_BGRA:
1501   case GL_ALPHA:
1502   case GL_LUMINANCE:
1503   case GL_LUMINANCE_ALPHA:
1504   default:
1505      return format;
1506   }
1507}
1508
1509/**
1510 * Convert various base formats to the corresponding integer format.
1511 */
1512GLenum
1513_mesa_base_format_to_integer_format(GLenum format)
1514{
1515   switch(format) {
1516   case GL_RED:
1517      return GL_RED_INTEGER;
1518   case GL_GREEN:
1519      return GL_GREEN_INTEGER;
1520   case GL_BLUE:
1521      return GL_BLUE_INTEGER;
1522   case GL_RG:
1523      return GL_RG_INTEGER;
1524   case GL_RGB:
1525      return GL_RGB_INTEGER;
1526   case GL_RGBA:
1527      return GL_RGBA_INTEGER;
1528   case GL_BGR:
1529      return GL_BGR_INTEGER;
1530   case GL_BGRA:
1531      return GL_BGRA_INTEGER;
1532   case GL_ALPHA:
1533      return GL_ALPHA_INTEGER;
1534   case GL_LUMINANCE:
1535      return GL_LUMINANCE_INTEGER_EXT;
1536   case GL_LUMINANCE_ALPHA:
1537      return GL_LUMINANCE_ALPHA_INTEGER_EXT;
1538   }
1539
1540   return format;
1541}
1542
1543
1544/**
1545 * Does the given base texture/renderbuffer format have the channel
1546 * named by 'pname'?
1547 */
1548GLboolean
1549_mesa_base_format_has_channel(GLenum base_format, GLenum pname)
1550{
1551   switch (pname) {
1552   case GL_TEXTURE_RED_SIZE:
1553   case GL_TEXTURE_RED_TYPE:
1554   case GL_RENDERBUFFER_RED_SIZE_EXT:
1555   case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
1556   case GL_INTERNALFORMAT_RED_SIZE:
1557   case GL_INTERNALFORMAT_RED_TYPE:
1558      if (base_format == GL_RED ||
1559	  base_format == GL_RG ||
1560	  base_format == GL_RGB ||
1561	  base_format == GL_RGBA) {
1562	 return GL_TRUE;
1563      }
1564      return GL_FALSE;
1565   case GL_TEXTURE_GREEN_SIZE:
1566   case GL_TEXTURE_GREEN_TYPE:
1567   case GL_RENDERBUFFER_GREEN_SIZE_EXT:
1568   case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
1569   case GL_INTERNALFORMAT_GREEN_SIZE:
1570   case GL_INTERNALFORMAT_GREEN_TYPE:
1571      if (base_format == GL_RG ||
1572	  base_format == GL_RGB ||
1573	  base_format == GL_RGBA) {
1574	 return GL_TRUE;
1575      }
1576      return GL_FALSE;
1577   case GL_TEXTURE_BLUE_SIZE:
1578   case GL_TEXTURE_BLUE_TYPE:
1579   case GL_RENDERBUFFER_BLUE_SIZE_EXT:
1580   case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
1581   case GL_INTERNALFORMAT_BLUE_SIZE:
1582   case GL_INTERNALFORMAT_BLUE_TYPE:
1583      if (base_format == GL_RGB ||
1584	  base_format == GL_RGBA) {
1585	 return GL_TRUE;
1586      }
1587      return GL_FALSE;
1588   case GL_TEXTURE_ALPHA_SIZE:
1589   case GL_TEXTURE_ALPHA_TYPE:
1590   case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
1591   case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
1592   case GL_INTERNALFORMAT_ALPHA_SIZE:
1593   case GL_INTERNALFORMAT_ALPHA_TYPE:
1594      if (base_format == GL_RGBA ||
1595	  base_format == GL_ALPHA ||
1596	  base_format == GL_LUMINANCE_ALPHA) {
1597	 return GL_TRUE;
1598      }
1599      return GL_FALSE;
1600   case GL_TEXTURE_LUMINANCE_SIZE:
1601   case GL_TEXTURE_LUMINANCE_TYPE:
1602      if (base_format == GL_LUMINANCE ||
1603	  base_format == GL_LUMINANCE_ALPHA) {
1604	 return GL_TRUE;
1605      }
1606      return GL_FALSE;
1607   case GL_TEXTURE_INTENSITY_SIZE:
1608   case GL_TEXTURE_INTENSITY_TYPE:
1609      if (base_format == GL_INTENSITY) {
1610	 return GL_TRUE;
1611      }
1612      return GL_FALSE;
1613   case GL_TEXTURE_DEPTH_SIZE:
1614   case GL_TEXTURE_DEPTH_TYPE:
1615   case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
1616   case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
1617   case GL_INTERNALFORMAT_DEPTH_SIZE:
1618   case GL_INTERNALFORMAT_DEPTH_TYPE:
1619      if (base_format == GL_DEPTH_STENCIL ||
1620	  base_format == GL_DEPTH_COMPONENT) {
1621	 return GL_TRUE;
1622      }
1623      return GL_FALSE;
1624   case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
1625   case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
1626   case GL_INTERNALFORMAT_STENCIL_SIZE:
1627   case GL_INTERNALFORMAT_STENCIL_TYPE:
1628      if (base_format == GL_DEPTH_STENCIL ||
1629	  base_format == GL_STENCIL_INDEX) {
1630	 return GL_TRUE;
1631      }
1632      return GL_FALSE;
1633   default:
1634      _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n",
1635		    __func__, pname);
1636      return GL_FALSE;
1637   }
1638
1639   return GL_FALSE;
1640}
1641
1642
1643/**
1644 * If format is a generic compressed format, return the corresponding
1645 * non-compressed format.  For other formats, return the format as-is.
1646 */
1647GLenum
1648_mesa_generic_compressed_format_to_uncompressed_format(GLenum format)
1649{
1650   switch (format) {
1651   case GL_COMPRESSED_RED:
1652      return GL_RED;
1653   case GL_COMPRESSED_RG:
1654      return GL_RG;
1655   case GL_COMPRESSED_RGB:
1656      return GL_RGB;
1657   case GL_COMPRESSED_RGBA:
1658      return GL_RGBA;
1659   case GL_COMPRESSED_ALPHA:
1660      return GL_ALPHA;
1661   case GL_COMPRESSED_LUMINANCE:
1662      return GL_LUMINANCE;
1663   case GL_COMPRESSED_LUMINANCE_ALPHA:
1664      return GL_LUMINANCE_ALPHA;
1665   case GL_COMPRESSED_INTENSITY:
1666      return GL_INTENSITY;
1667   /* sRGB formats */
1668   case GL_COMPRESSED_SRGB:
1669      return GL_SRGB;
1670   case GL_COMPRESSED_SRGB_ALPHA:
1671      return GL_SRGB_ALPHA;
1672   case GL_COMPRESSED_SLUMINANCE:
1673      return GL_SLUMINANCE;
1674   case GL_COMPRESSED_SLUMINANCE_ALPHA:
1675      return GL_SLUMINANCE_ALPHA;
1676   default:
1677      return format;
1678   }
1679}
1680
1681
1682/**
1683 * Return the equivalent non-generic internal format.
1684 * This is useful for comparing whether two internal formats are equivalent.
1685 */
1686GLenum
1687_mesa_get_nongeneric_internalformat(GLenum format)
1688{
1689   switch (format) {
1690   /* GL 1.1 formats. */
1691   case 4:
1692   case GL_RGBA:
1693      return GL_RGBA8;
1694   case 3:
1695   case GL_RGB:
1696      return GL_RGB8;
1697   case 2:
1698   case GL_LUMINANCE_ALPHA:
1699      return GL_LUMINANCE8_ALPHA8;
1700   case 1:
1701   case GL_LUMINANCE:
1702      return GL_LUMINANCE8;
1703   case GL_ALPHA:
1704      return GL_ALPHA8;
1705   case GL_INTENSITY:
1706      return GL_INTENSITY8;
1707
1708   /* GL_ARB_texture_rg */
1709   case GL_RED:
1710      return GL_R8;
1711   case GL_RG:
1712      return GL_RG8;
1713
1714   /* GL_EXT_texture_sRGB */
1715   case GL_SRGB:
1716      return GL_SRGB8;
1717   case GL_SRGB_ALPHA:
1718      return GL_SRGB8_ALPHA8;
1719   case GL_SLUMINANCE:
1720      return GL_SLUMINANCE8;
1721   case GL_SLUMINANCE_ALPHA:
1722      return GL_SLUMINANCE8_ALPHA8;
1723
1724   /* GL_EXT_texture_snorm */
1725   case GL_RGBA_SNORM:
1726      return GL_RGBA8_SNORM;
1727   case GL_RGB_SNORM:
1728      return GL_RGB8_SNORM;
1729   case GL_RG_SNORM:
1730      return GL_RG8_SNORM;
1731   case GL_RED_SNORM:
1732      return GL_R8_SNORM;
1733   case GL_LUMINANCE_ALPHA_SNORM:
1734      return GL_LUMINANCE8_ALPHA8_SNORM;
1735   case GL_LUMINANCE_SNORM:
1736      return GL_LUMINANCE8_SNORM;
1737   case GL_ALPHA_SNORM:
1738      return GL_ALPHA8_SNORM;
1739   case GL_INTENSITY_SNORM:
1740      return GL_INTENSITY8_SNORM;
1741
1742   default:
1743      return format;
1744   }
1745}
1746
1747
1748/**
1749 * Convert an sRGB internal format to linear.
1750 */
1751GLenum
1752_mesa_get_linear_internalformat(GLenum format)
1753{
1754   switch (format) {
1755   case GL_SRGB:
1756      return GL_RGB;
1757   case GL_SRGB_ALPHA:
1758      return GL_RGBA;
1759   case GL_SRGB8:
1760      return GL_RGB8;
1761   case GL_SRGB8_ALPHA8:
1762      return GL_RGBA8;
1763   case GL_SLUMINANCE8:
1764      return GL_LUMINANCE8;
1765   case GL_SLUMINANCE:
1766      return GL_LUMINANCE;
1767   case GL_SLUMINANCE_ALPHA:
1768      return GL_LUMINANCE_ALPHA;
1769   case GL_SLUMINANCE8_ALPHA8:
1770      return GL_LUMINANCE8_ALPHA8;
1771   default:
1772      return format;
1773   }
1774}
1775
1776
1777/**
1778 * Do error checking of format/type combinations for glReadPixels,
1779 * glDrawPixels and glTex[Sub]Image.  Note that depending on the format
1780 * and type values, we may either generate GL_INVALID_OPERATION or
1781 * GL_INVALID_ENUM.
1782 *
1783 * \param format pixel format.
1784 * \param type pixel type.
1785 *
1786 * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR
1787 */
1788GLenum
1789_mesa_error_check_format_and_type(const struct gl_context *ctx,
1790                                  GLenum format, GLenum type)
1791{
1792   /* From OpenGL 3.3 spec, page 220:
1793    *    "If the format is DEPTH_STENCIL, then values are taken from
1794    *    both the depth buffer and the stencil buffer. If there is no
1795    *    depth buffer or if there is no stencil buffer, then the error
1796    *    INVALID_OPERATION occurs. If the type parameter is not
1797    *    UNSIGNED_INT_24_8 or FLOAT_32_UNSIGNED_INT_24_8_REV, then the
1798    *    error INVALID_ENUM occurs."
1799    *
1800    * OpenGL ES still generates GL_INVALID_OPERATION because glReadPixels
1801    * cannot be used to read depth or stencil in that API.
1802    */
1803   if (_mesa_is_desktop_gl(ctx) && format == GL_DEPTH_STENCIL
1804       && type != GL_UNSIGNED_INT_24_8
1805       && type != GL_FLOAT_32_UNSIGNED_INT_24_8_REV)
1806      return GL_INVALID_ENUM;
1807
1808   /* special type-based checks (see glReadPixels, glDrawPixels error lists) */
1809   switch (type) {
1810   case GL_BITMAP:
1811      if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) {
1812         return GL_INVALID_ENUM;
1813      }
1814      break;
1815
1816   case GL_UNSIGNED_BYTE_3_3_2:
1817   case GL_UNSIGNED_BYTE_2_3_3_REV:
1818   case GL_UNSIGNED_SHORT_5_6_5:
1819   case GL_UNSIGNED_SHORT_5_6_5_REV:
1820      if (format == GL_RGB) {
1821         break; /* OK */
1822      }
1823      if (format == GL_RGB_INTEGER_EXT &&
1824          _mesa_has_texture_rgb10_a2ui(ctx)) {
1825         break; /* OK */
1826      }
1827      return GL_INVALID_OPERATION;
1828
1829   case GL_UNSIGNED_SHORT_4_4_4_4:
1830   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1831   case GL_UNSIGNED_INT_8_8_8_8:
1832   case GL_UNSIGNED_INT_8_8_8_8_REV:
1833      if (format == GL_RGBA ||
1834          format == GL_BGRA ||
1835          format == GL_ABGR_EXT) {
1836         break; /* OK */
1837      }
1838      if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) &&
1839          _mesa_has_texture_rgb10_a2ui(ctx)) {
1840         break; /* OK */
1841      }
1842      return GL_INVALID_OPERATION;
1843
1844   case GL_UNSIGNED_SHORT_5_5_5_1:
1845   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1846   case GL_UNSIGNED_INT_10_10_10_2:
1847   case GL_UNSIGNED_INT_2_10_10_10_REV:
1848      if (format == GL_RGBA ||
1849          format == GL_BGRA) {
1850         break; /* OK */
1851      }
1852      if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) &&
1853          _mesa_has_texture_rgb10_a2ui(ctx)) {
1854         break; /* OK */
1855      }
1856      if (type == GL_UNSIGNED_INT_2_10_10_10_REV && format == GL_RGB &&
1857          ctx->API == API_OPENGLES2) {
1858         break; /* OK by GL_EXT_texture_type_2_10_10_10_REV */
1859      }
1860      return GL_INVALID_OPERATION;
1861
1862   case GL_UNSIGNED_INT_24_8:
1863      /* Depth buffer OK to read in OpenGL ES (NV_read_depth). */
1864      if (ctx->API == API_OPENGLES2 && format == GL_DEPTH_COMPONENT)
1865         return GL_NO_ERROR;
1866
1867      if (format != GL_DEPTH_STENCIL) {
1868         return GL_INVALID_OPERATION;
1869      }
1870      return GL_NO_ERROR;
1871
1872   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
1873      if (!_mesa_has_float_depth_buffer(ctx)) {
1874         return GL_INVALID_ENUM;
1875      }
1876      if (format != GL_DEPTH_STENCIL) {
1877         return GL_INVALID_OPERATION;
1878      }
1879      return GL_NO_ERROR;
1880
1881   case GL_UNSIGNED_INT_10F_11F_11F_REV:
1882      if (!_mesa_has_packed_float(ctx)) {
1883         return GL_INVALID_ENUM;
1884      }
1885      if (format != GL_RGB) {
1886         return GL_INVALID_OPERATION;
1887      }
1888      return GL_NO_ERROR;
1889
1890   case GL_HALF_FLOAT_OES:
1891      switch (format) {
1892      case GL_RGBA:
1893      case GL_RGB:
1894      case GL_LUMINANCE_ALPHA:
1895      case GL_LUMINANCE:
1896      case GL_ALPHA:
1897         return GL_NO_ERROR;
1898      case GL_RG:
1899      case GL_RED:
1900         if (_mesa_has_rg_textures(ctx))
1901            return GL_NO_ERROR;
1902         FALLTHROUGH;
1903      default:
1904         return GL_INVALID_OPERATION;
1905      }
1906
1907   default:
1908      ; /* fall-through */
1909   }
1910
1911   /* now, for each format, check the type for compatibility */
1912   switch (format) {
1913      case GL_COLOR_INDEX:
1914      case GL_STENCIL_INDEX:
1915         switch (type) {
1916            case GL_BITMAP:
1917            case GL_BYTE:
1918            case GL_UNSIGNED_BYTE:
1919            case GL_SHORT:
1920            case GL_UNSIGNED_SHORT:
1921            case GL_INT:
1922            case GL_UNSIGNED_INT:
1923            case GL_FLOAT:
1924            case GL_HALF_FLOAT:
1925               return GL_NO_ERROR;
1926            default:
1927               return GL_INVALID_ENUM;
1928         }
1929
1930      case GL_RED:
1931      case GL_GREEN:
1932      case GL_BLUE:
1933      case GL_ALPHA:
1934#if 0 /* not legal!  see table 3.6 of the 1.5 spec */
1935      case GL_INTENSITY:
1936#endif
1937      case GL_LUMINANCE:
1938      case GL_LUMINANCE_ALPHA:
1939      case GL_DEPTH_COMPONENT:
1940         switch (type) {
1941            case GL_BYTE:
1942            case GL_UNSIGNED_BYTE:
1943            case GL_SHORT:
1944            case GL_UNSIGNED_SHORT:
1945            case GL_INT:
1946            case GL_UNSIGNED_INT:
1947            case GL_FLOAT:
1948            case GL_HALF_FLOAT:
1949               return GL_NO_ERROR;
1950            default:
1951               return GL_INVALID_ENUM;
1952         }
1953
1954      case GL_RG:
1955         if (!_mesa_has_rg_textures(ctx))
1956            return GL_INVALID_ENUM;
1957         switch (type) {
1958            case GL_BYTE:
1959            case GL_UNSIGNED_BYTE:
1960            case GL_SHORT:
1961            case GL_UNSIGNED_SHORT:
1962            case GL_INT:
1963            case GL_UNSIGNED_INT:
1964            case GL_FLOAT:
1965            case GL_HALF_FLOAT:
1966               return GL_NO_ERROR;
1967            default:
1968               return GL_INVALID_ENUM;
1969         }
1970
1971      case GL_RGB:
1972         switch (type) {
1973            case GL_BYTE:
1974            case GL_UNSIGNED_BYTE:
1975            case GL_SHORT:
1976            case GL_UNSIGNED_SHORT:
1977            case GL_INT:
1978            case GL_UNSIGNED_INT:
1979            case GL_FLOAT:
1980            case GL_UNSIGNED_BYTE_3_3_2:
1981            case GL_UNSIGNED_BYTE_2_3_3_REV:
1982            case GL_UNSIGNED_SHORT_5_6_5:
1983            case GL_UNSIGNED_SHORT_5_6_5_REV:
1984            case GL_HALF_FLOAT:
1985               return GL_NO_ERROR;
1986            case GL_UNSIGNED_INT_2_10_10_10_REV:
1987               /* OK by GL_EXT_texture_type_2_10_10_10_REV */
1988               return (ctx->API == API_OPENGLES2)
1989                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1990            case GL_UNSIGNED_INT_5_9_9_9_REV:
1991               return _mesa_has_texture_shared_exponent(ctx)
1992                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1993            case GL_UNSIGNED_INT_10F_11F_11F_REV:
1994               return _mesa_has_packed_float(ctx)
1995                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1996            default:
1997               return GL_INVALID_ENUM;
1998         }
1999
2000      case GL_BGR:
2001         switch (type) {
2002            /* NOTE: no packed types are supported with BGR.  That's
2003             * intentional, according to the GL spec.
2004             */
2005            case GL_BYTE:
2006            case GL_UNSIGNED_BYTE:
2007            case GL_SHORT:
2008            case GL_UNSIGNED_SHORT:
2009            case GL_INT:
2010            case GL_UNSIGNED_INT:
2011            case GL_FLOAT:
2012            case GL_HALF_FLOAT:
2013               return GL_NO_ERROR;
2014            default:
2015               return GL_INVALID_ENUM;
2016         }
2017
2018      case GL_RGBA:
2019      case GL_BGRA:
2020         switch (type) {
2021            case GL_BYTE:
2022            case GL_UNSIGNED_BYTE:
2023            case GL_SHORT:
2024            case GL_UNSIGNED_SHORT:
2025            case GL_INT:
2026            case GL_UNSIGNED_INT:
2027            case GL_FLOAT:
2028            case GL_UNSIGNED_SHORT_4_4_4_4:
2029            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2030            case GL_UNSIGNED_SHORT_5_5_5_1:
2031            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2032            case GL_UNSIGNED_INT_8_8_8_8:
2033            case GL_UNSIGNED_INT_8_8_8_8_REV:
2034            case GL_UNSIGNED_INT_10_10_10_2:
2035            case GL_UNSIGNED_INT_2_10_10_10_REV:
2036            case GL_HALF_FLOAT:
2037               return GL_NO_ERROR;
2038            default:
2039               return GL_INVALID_ENUM;
2040         }
2041
2042      case GL_ABGR_EXT:
2043         switch (type) {
2044            case GL_BYTE:
2045            case GL_UNSIGNED_BYTE:
2046            case GL_SHORT:
2047            case GL_UNSIGNED_SHORT:
2048            case GL_INT:
2049            case GL_UNSIGNED_INT:
2050            case GL_FLOAT:
2051            case GL_UNSIGNED_SHORT_4_4_4_4:
2052            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2053            case GL_UNSIGNED_INT_8_8_8_8:
2054            case GL_UNSIGNED_INT_8_8_8_8_REV:
2055            case GL_HALF_FLOAT:
2056               return GL_NO_ERROR;
2057            default:
2058               return GL_INVALID_ENUM;
2059         }
2060
2061      case GL_YCBCR_MESA:
2062         if (!_mesa_has_MESA_ycbcr_texture(ctx))
2063            return GL_INVALID_ENUM;
2064         if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
2065             type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
2066            return GL_NO_ERROR;
2067         else
2068            return GL_INVALID_OPERATION;
2069
2070      case GL_DEPTH_STENCIL:
2071         if (type == GL_UNSIGNED_INT_24_8)
2072            return GL_NO_ERROR;
2073         else if (_mesa_has_float_depth_buffer(ctx) &&
2074             type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)
2075            return GL_NO_ERROR;
2076         else
2077            return GL_INVALID_ENUM;
2078
2079      /* integer-valued formats */
2080      case GL_RED_INTEGER_EXT:
2081      case GL_GREEN_INTEGER_EXT:
2082      case GL_BLUE_INTEGER_EXT:
2083      case GL_ALPHA_INTEGER_EXT:
2084      case GL_RG_INTEGER:
2085         switch (type) {
2086            case GL_BYTE:
2087            case GL_UNSIGNED_BYTE:
2088            case GL_SHORT:
2089            case GL_UNSIGNED_SHORT:
2090            case GL_INT:
2091            case GL_UNSIGNED_INT:
2092               return _mesa_has_integer_textures(ctx)
2093                  ? GL_NO_ERROR : GL_INVALID_ENUM;
2094            default:
2095               return GL_INVALID_ENUM;
2096         }
2097
2098      case GL_RGB_INTEGER_EXT:
2099         switch (type) {
2100            case GL_BYTE:
2101            case GL_UNSIGNED_BYTE:
2102            case GL_SHORT:
2103            case GL_UNSIGNED_SHORT:
2104            case GL_INT:
2105            case GL_UNSIGNED_INT:
2106               return _mesa_has_integer_textures(ctx)
2107                  ? GL_NO_ERROR : GL_INVALID_ENUM;
2108            case GL_UNSIGNED_BYTE_3_3_2:
2109            case GL_UNSIGNED_BYTE_2_3_3_REV:
2110            case GL_UNSIGNED_SHORT_5_6_5:
2111            case GL_UNSIGNED_SHORT_5_6_5_REV:
2112               return _mesa_has_texture_rgb10_a2ui(ctx)
2113                  ? GL_NO_ERROR : GL_INVALID_ENUM;
2114            default:
2115               return GL_INVALID_ENUM;
2116         }
2117
2118      case GL_BGR_INTEGER_EXT:
2119         switch (type) {
2120            case GL_BYTE:
2121            case GL_UNSIGNED_BYTE:
2122            case GL_SHORT:
2123            case GL_UNSIGNED_SHORT:
2124            case GL_INT:
2125            case GL_UNSIGNED_INT:
2126            /* NOTE: no packed formats w/ BGR format */
2127               return _mesa_has_integer_textures(ctx)
2128                  ? GL_NO_ERROR : GL_INVALID_ENUM;
2129            default:
2130               return GL_INVALID_ENUM;
2131         }
2132
2133      case GL_RGBA_INTEGER_EXT:
2134      case GL_BGRA_INTEGER_EXT:
2135         switch (type) {
2136            case GL_BYTE:
2137            case GL_UNSIGNED_BYTE:
2138            case GL_SHORT:
2139            case GL_UNSIGNED_SHORT:
2140            case GL_INT:
2141            case GL_UNSIGNED_INT:
2142               return _mesa_has_integer_textures(ctx)
2143                  ? GL_NO_ERROR : GL_INVALID_ENUM;
2144            case GL_UNSIGNED_SHORT_4_4_4_4:
2145            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2146            case GL_UNSIGNED_SHORT_5_5_5_1:
2147            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2148            case GL_UNSIGNED_INT_8_8_8_8:
2149            case GL_UNSIGNED_INT_8_8_8_8_REV:
2150            case GL_UNSIGNED_INT_10_10_10_2:
2151            case GL_UNSIGNED_INT_2_10_10_10_REV:
2152               return _mesa_has_texture_rgb10_a2ui(ctx)
2153                  ? GL_NO_ERROR : GL_INVALID_ENUM;
2154            default:
2155               return GL_INVALID_ENUM;
2156         }
2157
2158      case GL_LUMINANCE_INTEGER_EXT:
2159      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
2160         switch (type) {
2161            case GL_BYTE:
2162            case GL_UNSIGNED_BYTE:
2163            case GL_SHORT:
2164            case GL_UNSIGNED_SHORT:
2165            case GL_INT:
2166            case GL_UNSIGNED_INT:
2167               return _mesa_has_integer_textures(ctx)
2168                  ? GL_NO_ERROR : GL_INVALID_ENUM;
2169            default:
2170               return GL_INVALID_ENUM;
2171         }
2172
2173      default:
2174         return GL_INVALID_ENUM;
2175   }
2176   return GL_NO_ERROR;
2177}
2178
2179
2180/**
2181 * Do error checking of format/type combinations for OpenGL ES glReadPixels
2182 * and glTex[Sub]Image.
2183 * \return error code, or GL_NO_ERROR.
2184 */
2185GLenum
2186_mesa_es_error_check_format_and_type(const struct gl_context *ctx,
2187                                     GLenum format, GLenum type,
2188                                     unsigned dimensions)
2189{
2190   GLboolean type_valid = GL_TRUE;
2191
2192   switch (format) {
2193   case GL_RED:
2194   case GL_RG:
2195      if (!_mesa_has_rg_textures(ctx))
2196         return GL_INVALID_VALUE;
2197      FALLTHROUGH;
2198   case GL_ALPHA:
2199   case GL_LUMINANCE:
2200   case GL_LUMINANCE_ALPHA:
2201      type_valid = (type == GL_UNSIGNED_BYTE
2202                    || type == GL_FLOAT
2203                    || type == GL_HALF_FLOAT_OES);
2204      break;
2205
2206   case GL_RGB:
2207      type_valid = (type == GL_UNSIGNED_BYTE
2208                    || type == GL_UNSIGNED_SHORT_5_6_5
2209                    || type == GL_FLOAT
2210                    || type == GL_HALF_FLOAT_OES);
2211      break;
2212
2213   case GL_RGBA:
2214      type_valid = (type == GL_UNSIGNED_BYTE
2215                    || type == GL_UNSIGNED_SHORT_4_4_4_4
2216                    || type == GL_UNSIGNED_SHORT_5_5_5_1
2217                    || type == GL_FLOAT
2218                    || type == GL_HALF_FLOAT_OES
2219                    || (_mesa_has_texture_type_2_10_10_10_REV(ctx) &&
2220                        type == GL_UNSIGNED_INT_2_10_10_10_REV));
2221      break;
2222
2223   case GL_DEPTH_COMPONENT:
2224      /* This format is filtered against invalid dimensionalities elsewhere.
2225       */
2226      type_valid = (type == GL_UNSIGNED_SHORT
2227                    || type == GL_UNSIGNED_INT);
2228      break;
2229
2230   case GL_DEPTH_STENCIL:
2231      /* This format is filtered against invalid dimensionalities elsewhere.
2232       */
2233      type_valid = (type == GL_UNSIGNED_INT_24_8);
2234      break;
2235
2236   case GL_BGRA_EXT:
2237      type_valid = (type == GL_UNSIGNED_BYTE);
2238
2239      /* This feels like a bug in the EXT_texture_format_BGRA8888 spec, but
2240       * the format does not appear to be allowed for 3D textures in OpenGL
2241       * ES.
2242       */
2243      if (dimensions != 2)
2244         return GL_INVALID_VALUE;
2245
2246      break;
2247
2248   default:
2249      return GL_INVALID_VALUE;
2250   }
2251
2252   return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION;
2253}
2254
2255/**
2256 * Return the simple base format for a given internal texture format.
2257 * For example, given GL_LUMINANCE12_ALPHA4, return GL_LUMINANCE_ALPHA.
2258 *
2259 * \param ctx GL context.
2260 * \param internalFormat the internal texture format token or 1, 2, 3, or 4.
2261 *
2262 * \return the corresponding \u base internal format (GL_ALPHA, GL_LUMINANCE,
2263 * GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA), or -1 if invalid enum.
2264 *
2265 * This is the format which is used during texture application (i.e. the
2266 * texture format and env mode determine the arithmetic used.
2267 */
2268GLint
2269_mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat)
2270{
2271   switch (internalFormat) {
2272   case GL_ALPHA:
2273   case GL_ALPHA4:
2274   case GL_ALPHA8:
2275   case GL_ALPHA12:
2276   case GL_ALPHA16:
2277      return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
2278   case 1:
2279   case GL_LUMINANCE:
2280   case GL_LUMINANCE4:
2281   case GL_LUMINANCE8:
2282   case GL_LUMINANCE12:
2283   case GL_LUMINANCE16:
2284      return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
2285   case 2:
2286   case GL_LUMINANCE_ALPHA:
2287   case GL_LUMINANCE4_ALPHA4:
2288   case GL_LUMINANCE6_ALPHA2:
2289   case GL_LUMINANCE8_ALPHA8:
2290   case GL_LUMINANCE12_ALPHA4:
2291   case GL_LUMINANCE12_ALPHA12:
2292   case GL_LUMINANCE16_ALPHA16:
2293      return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
2294   case GL_INTENSITY:
2295   case GL_INTENSITY4:
2296   case GL_INTENSITY8:
2297   case GL_INTENSITY12:
2298   case GL_INTENSITY16:
2299      return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
2300   case 3:
2301      return (ctx->API != API_OPENGL_CORE) ? GL_RGB : -1;
2302   case GL_RGB:
2303   case GL_R3_G3_B2:
2304   case GL_RGB4:
2305   case GL_RGB5:
2306   case GL_RGB8:
2307   case GL_RGB10:
2308   case GL_RGB12:
2309   case GL_RGB16:
2310      return GL_RGB;
2311   case 4:
2312      return (ctx->API != API_OPENGL_CORE) ? GL_RGBA : -1;
2313   case GL_RGBA:
2314   case GL_RGBA2:
2315   case GL_RGBA4:
2316   case GL_RGB5_A1:
2317   case GL_RGBA8:
2318   case GL_RGB10_A2:
2319   case GL_RGBA12:
2320   case GL_RGBA16:
2321      return GL_RGBA;
2322   default:
2323      ; /* fallthrough */
2324   }
2325
2326   /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0).
2327    */
2328   if (_mesa_is_gles(ctx)) {
2329      switch (internalFormat) {
2330      case GL_BGRA:
2331         return GL_RGBA;
2332      default:
2333         ; /* fallthrough */
2334      }
2335   }
2336
2337   if (_mesa_has_ARB_ES2_compatibility(ctx) ||
2338       _mesa_has_OES_framebuffer_object(ctx) ||
2339       ctx->API == API_OPENGLES2) {
2340      switch (internalFormat) {
2341      case GL_RGB565:
2342         return GL_RGB;
2343      default:
2344         ; /* fallthrough */
2345      }
2346   }
2347
2348   if (ctx->API != API_OPENGLES) {
2349      switch (internalFormat) {
2350      case GL_DEPTH_COMPONENT:
2351      case GL_DEPTH_COMPONENT16:
2352      case GL_DEPTH_COMPONENT24:
2353      case GL_DEPTH_COMPONENT32:
2354         return GL_DEPTH_COMPONENT;
2355      case GL_DEPTH_STENCIL:
2356      case GL_DEPTH24_STENCIL8:
2357         return GL_DEPTH_STENCIL;
2358      default:
2359         ; /* fallthrough */
2360      }
2361   }
2362
2363   if (_mesa_has_ARB_texture_stencil8(ctx) ||
2364       _mesa_has_OES_texture_stencil8(ctx)) {
2365      switch (internalFormat) {
2366      case GL_STENCIL_INDEX:
2367      case GL_STENCIL_INDEX1:
2368      case GL_STENCIL_INDEX4:
2369      case GL_STENCIL_INDEX8:
2370      case GL_STENCIL_INDEX16:
2371         return GL_STENCIL_INDEX;
2372      default:
2373         ; /* fallthrough */
2374      }
2375   }
2376
2377   switch (internalFormat) {
2378   case GL_COMPRESSED_ALPHA:
2379      return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
2380   case GL_COMPRESSED_LUMINANCE:
2381      return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
2382   case GL_COMPRESSED_LUMINANCE_ALPHA:
2383      return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
2384   case GL_COMPRESSED_INTENSITY:
2385      return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
2386   case GL_COMPRESSED_RGB:
2387      return GL_RGB;
2388   case GL_COMPRESSED_RGBA:
2389      return GL_RGBA;
2390   default:
2391      ; /* fallthrough */
2392   }
2393
2394   if (_mesa_is_compressed_format(ctx, internalFormat)) {
2395      GLenum base_compressed =
2396         _mesa_gl_compressed_format_base_format(internalFormat);
2397      if (base_compressed)
2398            return base_compressed;
2399   }
2400
2401   if ((_mesa_has_KHR_texture_compression_astc_ldr(ctx) &&
2402        is_astc_2d_format(internalFormat)) ||
2403       (_mesa_has_OES_texture_compression_astc(ctx) &&
2404        is_astc_3d_format(internalFormat)))
2405        return GL_RGBA;
2406
2407   if (_mesa_has_MESA_ycbcr_texture(ctx)) {
2408      if (internalFormat == GL_YCBCR_MESA)
2409         return GL_YCBCR_MESA;
2410   }
2411
2412   if (_mesa_has_half_float_textures(ctx)) {
2413      switch (internalFormat) {
2414      case GL_ALPHA16F_ARB:
2415         return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
2416      case GL_RGBA16F_ARB:
2417         return GL_RGBA;
2418      case GL_RGB16F_ARB:
2419         return GL_RGB;
2420      case GL_INTENSITY16F_ARB:
2421         return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
2422      case GL_LUMINANCE16F_ARB:
2423         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
2424      case GL_LUMINANCE_ALPHA16F_ARB:
2425         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
2426      }
2427   }
2428
2429   if (_mesa_has_float_textures(ctx)) {
2430      switch (internalFormat) {
2431      case GL_ALPHA32F_ARB:
2432         return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
2433      case GL_RGBA32F_ARB:
2434         return GL_RGBA;
2435      case GL_RGB32F_ARB:
2436         return GL_RGB;
2437      case GL_INTENSITY32F_ARB:
2438         return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
2439      case GL_LUMINANCE32F_ARB:
2440         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
2441      case GL_LUMINANCE_ALPHA32F_ARB:
2442         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
2443      }
2444   }
2445
2446   if (_mesa_has_EXT_texture_snorm(ctx) || _mesa_is_gles3(ctx)) {
2447      switch (internalFormat) {
2448      case GL_RED_SNORM:
2449      case GL_R8_SNORM:
2450      case GL_R16_SNORM:
2451         return GL_RED;
2452      case GL_RG_SNORM:
2453      case GL_RG8_SNORM:
2454      case GL_RG16_SNORM:
2455         return GL_RG;
2456      case GL_RGB_SNORM:
2457      case GL_RGB8_SNORM:
2458      case GL_RGB16_SNORM:
2459         return GL_RGB;
2460      case GL_RGBA_SNORM:
2461      case GL_RGBA8_SNORM:
2462      case GL_RGBA16_SNORM:
2463         return GL_RGBA;
2464      case GL_ALPHA_SNORM:
2465      case GL_ALPHA8_SNORM:
2466      case GL_ALPHA16_SNORM:
2467         return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
2468      case GL_LUMINANCE_SNORM:
2469      case GL_LUMINANCE8_SNORM:
2470      case GL_LUMINANCE16_SNORM:
2471         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
2472      case GL_LUMINANCE_ALPHA_SNORM:
2473      case GL_LUMINANCE8_ALPHA8_SNORM:
2474      case GL_LUMINANCE16_ALPHA16_SNORM:
2475         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
2476      case GL_INTENSITY_SNORM:
2477      case GL_INTENSITY8_SNORM:
2478      case GL_INTENSITY16_SNORM:
2479         return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
2480      default:
2481         ; /* fallthrough */
2482      }
2483   }
2484
2485   if (_mesa_has_EXT_texture_sRGB(ctx) || _mesa_is_gles3(ctx)) {
2486      switch (internalFormat) {
2487      case GL_SRGB_EXT:
2488      case GL_SRGB8_EXT:
2489      case GL_COMPRESSED_SRGB_EXT:
2490         return GL_RGB;
2491      case GL_SRGB_ALPHA_EXT:
2492      case GL_SRGB8_ALPHA8_EXT:
2493      case GL_COMPRESSED_SRGB_ALPHA_EXT:
2494         return GL_RGBA;
2495      case GL_SLUMINANCE_ALPHA_EXT:
2496      case GL_SLUMINANCE8_ALPHA8_EXT:
2497      case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
2498         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
2499      case GL_SLUMINANCE_EXT:
2500      case GL_SLUMINANCE8_EXT:
2501      case GL_COMPRESSED_SLUMINANCE_EXT:
2502         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
2503      default:
2504         ; /* fallthrough */
2505      }
2506   }
2507
2508   if (_mesa_has_EXT_texture_sRGB_R8(ctx)) {
2509      switch (internalFormat) {
2510      case GL_SR8_EXT:
2511         return GL_RED;
2512      default:
2513         ; /* fallthrough */
2514      }
2515   }
2516
2517   if (_mesa_has_EXT_texture_sRGB_RG8(ctx)) {
2518      switch (internalFormat) {
2519      case GL_SRG8_EXT:
2520         return GL_RG;
2521      default:
2522         ; /* fallthrough */
2523      }
2524   }
2525
2526   if (_mesa_has_integer_textures(ctx)) {
2527      switch (internalFormat) {
2528      case GL_RGBA8UI_EXT:
2529      case GL_RGBA16UI_EXT:
2530      case GL_RGBA32UI_EXT:
2531      case GL_RGBA8I_EXT:
2532      case GL_RGBA16I_EXT:
2533      case GL_RGBA32I_EXT:
2534         return GL_RGBA;
2535      case GL_RGB8UI_EXT:
2536      case GL_RGB16UI_EXT:
2537      case GL_RGB32UI_EXT:
2538      case GL_RGB8I_EXT:
2539      case GL_RGB16I_EXT:
2540      case GL_RGB32I_EXT:
2541         return GL_RGB;
2542      }
2543   }
2544
2545   if (_mesa_has_texture_rgb10_a2ui(ctx)) {
2546      switch (internalFormat) {
2547      case GL_RGB10_A2UI:
2548         return GL_RGBA;
2549      }
2550   }
2551
2552   if (_mesa_has_integer_textures(ctx)) {
2553      switch (internalFormat) {
2554      case GL_ALPHA8UI_EXT:
2555      case GL_ALPHA16UI_EXT:
2556      case GL_ALPHA32UI_EXT:
2557      case GL_ALPHA8I_EXT:
2558      case GL_ALPHA16I_EXT:
2559      case GL_ALPHA32I_EXT:
2560         return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1;
2561      case GL_INTENSITY8UI_EXT:
2562      case GL_INTENSITY16UI_EXT:
2563      case GL_INTENSITY32UI_EXT:
2564      case GL_INTENSITY8I_EXT:
2565      case GL_INTENSITY16I_EXT:
2566      case GL_INTENSITY32I_EXT:
2567         return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1;
2568      case GL_LUMINANCE8UI_EXT:
2569      case GL_LUMINANCE16UI_EXT:
2570      case GL_LUMINANCE32UI_EXT:
2571      case GL_LUMINANCE8I_EXT:
2572      case GL_LUMINANCE16I_EXT:
2573      case GL_LUMINANCE32I_EXT:
2574         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1;
2575      case GL_LUMINANCE_ALPHA8UI_EXT:
2576      case GL_LUMINANCE_ALPHA16UI_EXT:
2577      case GL_LUMINANCE_ALPHA32UI_EXT:
2578      case GL_LUMINANCE_ALPHA8I_EXT:
2579      case GL_LUMINANCE_ALPHA16I_EXT:
2580      case GL_LUMINANCE_ALPHA32I_EXT:
2581         return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1;
2582      default:
2583         ; /* fallthrough */
2584      }
2585   }
2586
2587   if (_mesa_has_rg_textures(ctx)) {
2588      switch (internalFormat) {
2589      case GL_R16F:
2590         if (!_mesa_has_half_float_textures(ctx))
2591            break;
2592         return GL_RED;
2593      case GL_R32F:
2594         if (!_mesa_has_float_textures(ctx))
2595            break;
2596         return GL_RED;
2597      case GL_R8I:
2598      case GL_R8UI:
2599      case GL_R16I:
2600      case GL_R16UI:
2601      case GL_R32I:
2602      case GL_R32UI:
2603         if (!_mesa_has_integer_textures(ctx))
2604            break;
2605         FALLTHROUGH;
2606      case GL_R8:
2607      case GL_R16:
2608      case GL_RED:
2609      case GL_COMPRESSED_RED:
2610         return GL_RED;
2611
2612      case GL_RG16F:
2613         if (!_mesa_has_half_float_textures(ctx))
2614            break;
2615         return GL_RG;
2616      case GL_RG32F:
2617         if (!_mesa_has_float_textures(ctx))
2618            break;
2619         return GL_RG;
2620      case GL_RG8I:
2621      case GL_RG8UI:
2622      case GL_RG16I:
2623      case GL_RG16UI:
2624      case GL_RG32I:
2625      case GL_RG32UI:
2626         if (!_mesa_has_integer_textures(ctx))
2627            break;
2628         FALLTHROUGH;
2629      case GL_RG:
2630      case GL_RG8:
2631      case GL_RG16:
2632      case GL_COMPRESSED_RG:
2633         return GL_RG;
2634      default:
2635         ; /* fallthrough */
2636      }
2637   }
2638
2639   if (_mesa_has_texture_shared_exponent(ctx)) {
2640      switch (internalFormat) {
2641      case GL_RGB9_E5_EXT:
2642         return GL_RGB;
2643      default:
2644         ; /* fallthrough */
2645      }
2646   }
2647
2648   if (_mesa_has_packed_float(ctx)) {
2649      switch (internalFormat) {
2650      case GL_R11F_G11F_B10F_EXT:
2651         return GL_RGB;
2652      default:
2653         ; /* fallthrough */
2654      }
2655   }
2656
2657   if (_mesa_has_float_depth_buffer(ctx)) {
2658      switch (internalFormat) {
2659      case GL_DEPTH_COMPONENT32F:
2660         return GL_DEPTH_COMPONENT;
2661      case GL_DEPTH32F_STENCIL8:
2662         return GL_DEPTH_STENCIL;
2663      default:
2664         ; /* fallthrough */
2665      }
2666   }
2667
2668   return -1; /* error */
2669}
2670
2671/**
2672 * Returns the effective internal format from a texture format and type.
2673 * This is used by texture image operations internally for validation, when
2674 * the specified internal format is a base (unsized) format.
2675 *
2676 * This method will only return a valid effective internal format if the
2677 * combination of format, type and internal format in base form, is acceptable.
2678 *
2679 * If a single sized internal format is defined in the spec (OpenGL-ES 3.0.4) or
2680 * in extensions, to unambiguously correspond to the given base format, then
2681 * that internal format is returned as the effective. Otherwise, if the
2682 * combination is accepted but a single effective format is not defined, the
2683 * passed base format will be returned instead.
2684 *
2685 * \param format the texture format
2686 * \param type the texture type
2687 */
2688static GLenum
2689gles_effective_internal_format_for_format_and_type(GLenum format,
2690                                                   GLenum type)
2691{
2692   switch (type) {
2693   case GL_UNSIGNED_BYTE:
2694      switch (format) {
2695      case GL_RGBA:
2696         return GL_RGBA8;
2697      case GL_RGB:
2698         return GL_RGB8;
2699      case GL_RG:
2700         return GL_RG8;
2701      case GL_RED:
2702         return GL_R8;
2703      /* Although LUMINANCE_ALPHA, LUMINANCE and ALPHA appear in table 3.12,
2704       * (section 3.8 Texturing, page 128 of the OpenGL-ES 3.0.4) as effective
2705       * internal formats, they do not correspond to GL constants, so the base
2706       * format is returned instead.
2707       */
2708      case GL_BGRA_EXT:
2709      case GL_LUMINANCE_ALPHA:
2710      case GL_LUMINANCE:
2711      case GL_ALPHA:
2712         return format;
2713      }
2714      break;
2715
2716   case GL_UNSIGNED_SHORT_4_4_4_4:
2717      if (format == GL_RGBA)
2718         return GL_RGBA4;
2719      break;
2720
2721   case GL_UNSIGNED_SHORT_5_5_5_1:
2722      if (format == GL_RGBA)
2723         return GL_RGB5_A1;
2724      break;
2725
2726   case GL_UNSIGNED_SHORT_5_6_5:
2727      if (format == GL_RGB)
2728         return GL_RGB565;
2729      break;
2730
2731   /* OES_packed_depth_stencil */
2732   case GL_UNSIGNED_INT_24_8:
2733      if (format == GL_DEPTH_STENCIL)
2734         return GL_DEPTH24_STENCIL8;
2735      break;
2736
2737   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
2738      if (format == GL_DEPTH_STENCIL)
2739         return GL_DEPTH32F_STENCIL8;
2740      break;
2741
2742   case GL_UNSIGNED_SHORT:
2743      if (format == GL_DEPTH_COMPONENT)
2744         return GL_DEPTH_COMPONENT16;
2745      break;
2746
2747   case GL_UNSIGNED_INT:
2748      /* It can be DEPTH_COMPONENT16 or DEPTH_COMPONENT24, so just return
2749       * the format.
2750       */
2751      if (format == GL_DEPTH_COMPONENT)
2752         return format;
2753      break;
2754
2755   /* OES_texture_float and OES_texture_half_float */
2756   case GL_FLOAT:
2757      if (format == GL_DEPTH_COMPONENT)
2758         return GL_DEPTH_COMPONENT32F;
2759      FALLTHROUGH;
2760   case GL_HALF_FLOAT_OES:
2761      switch (format) {
2762      case GL_RGBA:
2763      case GL_RGB:
2764      case GL_LUMINANCE_ALPHA:
2765      case GL_LUMINANCE:
2766      case GL_ALPHA:
2767      case GL_RED:
2768      case GL_RG:
2769         return format;
2770      }
2771      break;
2772   case GL_HALF_FLOAT:
2773      switch (format) {
2774      case GL_RG:
2775      case GL_RED:
2776         return format;
2777      }
2778      break;
2779
2780   /* GL_EXT_texture_type_2_10_10_10_REV */
2781   case GL_UNSIGNED_INT_2_10_10_10_REV:
2782      switch (format) {
2783      case GL_RGBA:
2784      case GL_RGB:
2785         return format;
2786      }
2787      break;
2788
2789   default:
2790      /* fall through and return NONE */
2791      break;
2792   }
2793
2794   return GL_NONE;
2795}
2796
2797/**
2798 * Error checking if internalformat for glTex[Sub]Image is valid
2799 * within OpenGL ES 3.2 (or introduced by an ES extension).
2800 *
2801 * Note, further checks in _mesa_gles_error_check_format_and_type
2802 * are required for complete checking between format and type.
2803 */
2804static GLenum
2805_mesa_gles_check_internalformat(const struct gl_context *ctx,
2806                                GLenum internalFormat)
2807{
2808   switch (internalFormat) {
2809   /* OpenGL ES 2.0 */
2810   case GL_ALPHA:
2811   case GL_LUMINANCE:
2812   case GL_LUMINANCE_ALPHA:
2813   case GL_RGB:
2814   case GL_RGBA:
2815
2816   /* GL_OES_depth_texture */
2817   case GL_DEPTH_COMPONENT:
2818
2819   /* GL_EXT_texture_format_BGRA8888 */
2820   case GL_BGRA:
2821
2822   /* GL_OES_required_internalformat */
2823   case GL_RGB565:
2824   case GL_RGB8:
2825   case GL_RGBA4:
2826   case GL_RGB5_A1:
2827   case GL_RGBA8:
2828   case GL_DEPTH_COMPONENT16:
2829   case GL_DEPTH_COMPONENT24:
2830   case GL_DEPTH_COMPONENT32:
2831   case GL_DEPTH24_STENCIL8:
2832   case GL_RGB10_EXT:
2833   case GL_RGB10_A2_EXT:
2834   case GL_ALPHA8:
2835   case GL_LUMINANCE8:
2836   case GL_LUMINANCE8_ALPHA8:
2837   case GL_LUMINANCE4_ALPHA4:
2838      return GL_NO_ERROR;
2839
2840   case GL_R8:
2841   case GL_RG8:
2842   case GL_RED:
2843   case GL_RG:
2844      if (!_mesa_has_rg_textures(ctx))
2845         return GL_INVALID_VALUE;
2846      return GL_NO_ERROR;
2847
2848   /* GL_OES_texture_stencil8 */
2849   case GL_STENCIL_INDEX8:
2850      if (!_mesa_has_OES_texture_stencil8(ctx))
2851         return GL_INVALID_VALUE;
2852      return GL_NO_ERROR;
2853
2854   case GL_COMPRESSED_RGBA_BPTC_UNORM:
2855   case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM:
2856   case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT:
2857   case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
2858      if (!_mesa_has_EXT_texture_compression_bptc(ctx))
2859         return GL_INVALID_VALUE;
2860      return GL_NO_ERROR;
2861
2862   case GL_COMPRESSED_RED_RGTC1:
2863   case GL_COMPRESSED_SIGNED_RED_RGTC1:
2864   case GL_COMPRESSED_RED_GREEN_RGTC2_EXT:
2865   case GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT:
2866      if (!_mesa_has_EXT_texture_compression_rgtc(ctx))
2867         return GL_INVALID_VALUE;
2868      return GL_NO_ERROR;
2869
2870   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
2871   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
2872   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
2873   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
2874      if (!_mesa_has_EXT_texture_compression_s3tc(ctx))
2875         return GL_INVALID_VALUE;
2876      return GL_NO_ERROR;
2877
2878   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
2879   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
2880   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
2881   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
2882      if (!_mesa_has_EXT_texture_compression_s3tc_srgb(ctx))
2883         return GL_INVALID_VALUE;
2884      return GL_NO_ERROR;
2885
2886   case GL_R16:
2887   case GL_RG16:
2888   case GL_RGB16:
2889   case GL_RGBA16:
2890      if (!_mesa_has_EXT_texture_norm16(ctx))
2891         return GL_INVALID_VALUE;
2892      return GL_NO_ERROR;
2893
2894   case GL_R16_SNORM:
2895   case GL_RG16_SNORM:
2896   case GL_RGB16_SNORM:
2897   case GL_RGBA16_SNORM:
2898      if (!_mesa_has_EXT_texture_norm16(ctx) &&
2899          !_mesa_has_EXT_texture_snorm(ctx))
2900         return GL_INVALID_VALUE;
2901      return GL_NO_ERROR;
2902
2903   case GL_SR8_EXT:
2904      if (!_mesa_has_EXT_texture_sRGB_R8(ctx))
2905         return GL_INVALID_VALUE;
2906      return GL_NO_ERROR;
2907
2908   case GL_SRG8_EXT:
2909      if (!_mesa_has_EXT_texture_sRGB_RG8(ctx))
2910         return GL_INVALID_VALUE;
2911      return GL_NO_ERROR;
2912
2913   /* OpenGL ES 3.0 */
2914   case GL_SRGB8_ALPHA8:
2915   case GL_RGBA8_SNORM:
2916   case GL_RGBA16F:
2917   case GL_RGBA32F:
2918   case GL_RGBA8UI:
2919   case GL_RGBA8I:
2920   case GL_RGBA16UI:
2921   case GL_RGBA16I:
2922   case GL_RGBA32UI:
2923   case GL_RGBA32I:
2924   case GL_RGB10_A2UI:
2925   case GL_SRGB8:
2926   case GL_RGB8_SNORM:
2927   case GL_R11F_G11F_B10F:
2928   case GL_RGB9_E5:
2929   case GL_RGB16F:
2930   case GL_RGB32F:
2931   case GL_RGB8UI:
2932   case GL_RGB8I:
2933   case GL_RGB16UI:
2934   case GL_RGB16I:
2935   case GL_RGB32UI:
2936   case GL_RGB32I:
2937   case GL_RG8_SNORM:
2938   case GL_RG16F:
2939   case GL_RG32F:
2940   case GL_RG8UI:
2941   case GL_RG8I:
2942   case GL_RG16UI:
2943   case GL_RG16I:
2944   case GL_RG32UI:
2945   case GL_RG32I:
2946   case GL_R8_SNORM:
2947   case GL_R16F:
2948   case GL_R32F:
2949   case GL_R8UI:
2950   case GL_R8I:
2951   case GL_R16UI:
2952   case GL_R16I:
2953   case GL_R32UI:
2954   case GL_R32I:
2955   case GL_DEPTH_COMPONENT32F:
2956   case GL_DEPTH32F_STENCIL8:
2957      if (!_mesa_is_gles3(ctx))
2958         return GL_INVALID_VALUE;
2959      return GL_NO_ERROR;
2960   default:
2961      return GL_INVALID_VALUE;
2962   }
2963}
2964
2965/**
2966 * Do error checking of format/type combinations for OpenGL ES 3
2967 * glTex[Sub]Image, or ES1/ES2 with GL_OES_required_internalformat.
2968 * \return error code, or GL_NO_ERROR.
2969 */
2970GLenum
2971_mesa_gles_error_check_format_and_type(const struct gl_context *ctx,
2972                                       GLenum format, GLenum type,
2973                                       GLenum internalFormat)
2974{
2975   /* If internalFormat is an unsized format, then the effective internal
2976    * format derived from format and type should be used instead. Page 127,
2977    * section "3.8 Texturing" of the GLES 3.0.4 spec states:
2978    *
2979    *    "if internalformat is a base internal format, the effective
2980    *     internal format is a sized internal format that is derived
2981    *     from the format and type for internal use by the GL.
2982    *     Table 3.12 specifies the mapping of format and type to effective
2983    *     internal formats. The effective internal format is used by the GL
2984    *     for purposes such as texture completeness or type checks for
2985    *     CopyTex* commands. In these cases, the GL is required to operate
2986    *     as if the effective internal format was used as the internalformat
2987    *     when specifying the texture data."
2988    */
2989   if (_mesa_is_enum_format_unsized(internalFormat)) {
2990      GLenum effectiveInternalFormat =
2991         gles_effective_internal_format_for_format_and_type(format, type);
2992
2993      if (effectiveInternalFormat == GL_NONE)
2994         return GL_INVALID_OPERATION;
2995
2996      GLenum baseInternalFormat;
2997      if (internalFormat == GL_BGRA_EXT) {
2998         /* Unfortunately, _mesa_base_tex_format returns a base format of
2999          * GL_RGBA for GL_BGRA_EXT.  This makes perfect sense if you're
3000          * asking the question, "what channels does this format have?"
3001          * However, if we're trying to determine if two internal formats
3002          * match in the ES3 sense, we actually want GL_BGRA.
3003          */
3004         baseInternalFormat = GL_BGRA_EXT;
3005      } else {
3006         baseInternalFormat =
3007            _mesa_base_tex_format(ctx, effectiveInternalFormat);
3008      }
3009
3010      if (internalFormat != baseInternalFormat)
3011         return GL_INVALID_OPERATION;
3012
3013      internalFormat = effectiveInternalFormat;
3014   }
3015
3016   /* The GLES variant of EXT_texture_compression_s3tc is very vague and
3017    * doesn't list valid types. Just do exactly what the spec says.
3018    */
3019   if (internalFormat == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
3020       internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
3021       internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ||
3022       internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
3023      return format == GL_RGB || format == GL_RGBA ? GL_NO_ERROR :
3024                                                     GL_INVALID_OPERATION;
3025
3026   /* Before checking for the combination, verify that
3027    * given internalformat is legal for OpenGL ES.
3028    */
3029   GLenum internal_format_error =
3030      _mesa_gles_check_internalformat(ctx, internalFormat);
3031
3032   if (internal_format_error != GL_NO_ERROR)
3033      return internal_format_error;
3034
3035   switch (format) {
3036   case GL_BGRA_EXT:
3037      if (type != GL_UNSIGNED_BYTE ||
3038              (internalFormat != GL_BGRA &&
3039               internalFormat != GL_RGBA8 &&
3040               internalFormat != GL_SRGB8_ALPHA8))
3041         return GL_INVALID_OPERATION;
3042      break;
3043
3044   case GL_BGR_EXT:
3045      if (type != GL_UNSIGNED_BYTE ||
3046              (internalFormat != GL_RGB8 &&
3047               internalFormat != GL_SRGB8))
3048         return GL_INVALID_OPERATION;
3049      break;
3050
3051   case GL_RGBA:
3052      switch (type) {
3053      case GL_UNSIGNED_BYTE:
3054         switch (internalFormat) {
3055         case GL_RGBA:
3056         case GL_RGBA8:
3057         case GL_RGB5_A1:
3058         case GL_RGBA4:
3059            break;
3060         case GL_SRGB8_ALPHA8_EXT:
3061            if (ctx->Version <= 20)
3062               return GL_INVALID_OPERATION;
3063            break;
3064         case GL_COMPRESSED_RGBA_BPTC_UNORM:
3065         case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM:
3066            break;
3067         default:
3068            return GL_INVALID_OPERATION;
3069         }
3070         break;
3071
3072      case GL_BYTE:
3073         if (ctx->Version <= 20 || internalFormat != GL_RGBA8_SNORM)
3074            return GL_INVALID_OPERATION;
3075         break;
3076
3077      case GL_UNSIGNED_SHORT:
3078         if (internalFormat != GL_RGBA16)
3079            return GL_INVALID_OPERATION;
3080         break;
3081
3082      case GL_SHORT:
3083         if (internalFormat != GL_RGBA16_SNORM)
3084            return GL_INVALID_OPERATION;
3085         break;
3086
3087      case GL_UNSIGNED_SHORT_4_4_4_4:
3088         switch (internalFormat) {
3089         case GL_RGBA:
3090         case GL_RGBA4:
3091            break;
3092         default:
3093            return GL_INVALID_OPERATION;
3094         }
3095         break;
3096
3097      case GL_UNSIGNED_SHORT_5_5_5_1:
3098         switch (internalFormat) {
3099         case GL_RGBA:
3100         case GL_RGB5_A1:
3101            break;
3102         default:
3103            return GL_INVALID_OPERATION;
3104         }
3105         break;
3106
3107      case GL_UNSIGNED_INT_2_10_10_10_REV:
3108         switch (internalFormat) {
3109         case GL_RGBA:
3110         case GL_RGB10_A2:
3111         case GL_RGB5_A1:
3112            if (!_mesa_has_texture_type_2_10_10_10_REV(ctx))
3113               return GL_INVALID_OPERATION;
3114            break;
3115         default:
3116            return GL_INVALID_OPERATION;
3117         }
3118         break;
3119
3120      case GL_HALF_FLOAT:
3121         if (ctx->Version <= 20 || internalFormat != GL_RGBA16F)
3122            return GL_INVALID_OPERATION;
3123         break;
3124
3125      case GL_FLOAT:
3126         switch (internalFormat) {
3127         case GL_RGBA16F:
3128         case GL_RGBA32F:
3129            if (ctx->Version <= 20)
3130               return GL_INVALID_OPERATION;
3131            break;
3132         case GL_RGBA:
3133            if (!_mesa_has_OES_texture_float(ctx) || internalFormat != format)
3134               return GL_INVALID_OPERATION;
3135            break;
3136         default:
3137            return GL_INVALID_OPERATION;
3138         }
3139         break;
3140
3141      case GL_HALF_FLOAT_OES:
3142         if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format)
3143            return GL_INVALID_OPERATION;
3144         break;
3145      default:
3146         return GL_INVALID_OPERATION;
3147      }
3148      break;
3149
3150   case GL_RGBA_INTEGER:
3151      if (ctx->Version <= 20)
3152         return GL_INVALID_OPERATION;
3153      switch (type) {
3154      case GL_UNSIGNED_BYTE:
3155         if (internalFormat != GL_RGBA8UI)
3156            return GL_INVALID_OPERATION;
3157         break;
3158
3159      case GL_BYTE:
3160         if (internalFormat != GL_RGBA8I)
3161            return GL_INVALID_OPERATION;
3162         break;
3163
3164      case GL_UNSIGNED_SHORT:
3165         if (internalFormat != GL_RGBA16UI)
3166            return GL_INVALID_OPERATION;
3167         break;
3168
3169      case GL_SHORT:
3170         if (internalFormat != GL_RGBA16I)
3171            return GL_INVALID_OPERATION;
3172         break;
3173
3174      case GL_UNSIGNED_INT:
3175         if (internalFormat != GL_RGBA32UI)
3176            return GL_INVALID_OPERATION;
3177         break;
3178
3179      case GL_INT:
3180         if (internalFormat != GL_RGBA32I)
3181            return GL_INVALID_OPERATION;
3182         break;
3183
3184      case GL_UNSIGNED_INT_2_10_10_10_REV:
3185         if (internalFormat != GL_RGB10_A2UI)
3186            return GL_INVALID_OPERATION;
3187         break;
3188
3189      default:
3190         return GL_INVALID_OPERATION;
3191      }
3192      break;
3193
3194   case GL_RGB:
3195      switch (type) {
3196      case GL_UNSIGNED_BYTE:
3197         switch (internalFormat) {
3198         case GL_RGB:
3199         case GL_RGB8:
3200         case GL_RGB565:
3201            break;
3202         case GL_SRGB8:
3203            if (ctx->Version <= 20)
3204               return GL_INVALID_OPERATION;
3205            break;
3206         default:
3207            return GL_INVALID_OPERATION;
3208         }
3209         break;
3210
3211      case GL_BYTE:
3212         if (ctx->Version <= 20 || internalFormat != GL_RGB8_SNORM)
3213            return GL_INVALID_OPERATION;
3214         break;
3215
3216      case GL_UNSIGNED_SHORT:
3217         if (internalFormat != GL_RGB16)
3218            return GL_INVALID_OPERATION;
3219         break;
3220
3221      case GL_SHORT:
3222         if (internalFormat != GL_RGB16_SNORM)
3223            return GL_INVALID_OPERATION;
3224         break;
3225
3226      case GL_UNSIGNED_SHORT_5_6_5:
3227         switch (internalFormat) {
3228         case GL_RGB:
3229         case GL_RGB565:
3230            break;
3231         default:
3232            return GL_INVALID_OPERATION;
3233         }
3234         break;
3235
3236      case GL_UNSIGNED_INT_10F_11F_11F_REV:
3237         if (ctx->Version <= 20 || internalFormat != GL_R11F_G11F_B10F)
3238            return GL_INVALID_OPERATION;
3239         break;
3240
3241      case GL_UNSIGNED_INT_5_9_9_9_REV:
3242         if (ctx->Version <= 20 || internalFormat != GL_RGB9_E5)
3243            return GL_INVALID_OPERATION;
3244         break;
3245
3246      case GL_HALF_FLOAT:
3247         if (ctx->Version <= 20)
3248            return GL_INVALID_OPERATION;
3249         switch (internalFormat) {
3250         case GL_RGB16F:
3251         case GL_R11F_G11F_B10F:
3252         case GL_RGB9_E5:
3253            break;
3254         default:
3255            return GL_INVALID_OPERATION;
3256         }
3257         break;
3258
3259      case GL_FLOAT:
3260         switch (internalFormat) {
3261         case GL_RGB16F:
3262         case GL_RGB32F:
3263         case GL_R11F_G11F_B10F:
3264         case GL_RGB9_E5:
3265            if (ctx->Version <= 20)
3266               return GL_INVALID_OPERATION;
3267            break;
3268         case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT:
3269         case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
3270            break;
3271         case GL_RGB:
3272            if (!_mesa_has_OES_texture_float(ctx) || internalFormat != format)
3273               return GL_INVALID_OPERATION;
3274            break;
3275         default:
3276            return GL_INVALID_OPERATION;
3277         }
3278         break;
3279
3280      case GL_HALF_FLOAT_OES:
3281         if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format)
3282            return GL_INVALID_OPERATION;
3283         break;
3284
3285      case GL_UNSIGNED_INT_2_10_10_10_REV:
3286         switch (internalFormat) {
3287         case GL_RGB:
3288         case GL_RGB10:
3289         case GL_RGB8:
3290         case GL_RGB565:
3291            /* GL_EXT_texture_type_2_10_10_10_REV allows GL_RGB even though
3292             * GLES3 doesn't, and GL_OES_required_internalformat extends that
3293             * to allow the sized RGB internalformats as well.
3294             */
3295            if (!_mesa_has_texture_type_2_10_10_10_REV(ctx))
3296               return GL_INVALID_OPERATION;
3297            break;
3298         default:
3299            return GL_INVALID_OPERATION;
3300         }
3301         break;
3302
3303      default:
3304         return GL_INVALID_OPERATION;
3305      }
3306      break;
3307
3308   case GL_RGB_INTEGER:
3309      if (ctx->Version <= 20)
3310         return GL_INVALID_OPERATION;
3311      switch (type) {
3312      case GL_UNSIGNED_BYTE:
3313         if (internalFormat != GL_RGB8UI)
3314            return GL_INVALID_OPERATION;
3315         break;
3316
3317      case GL_BYTE:
3318         if (internalFormat != GL_RGB8I)
3319            return GL_INVALID_OPERATION;
3320         break;
3321
3322      case GL_UNSIGNED_SHORT:
3323         if (internalFormat != GL_RGB16UI)
3324            return GL_INVALID_OPERATION;
3325         break;
3326
3327      case GL_SHORT:
3328         if (internalFormat != GL_RGB16I)
3329            return GL_INVALID_OPERATION;
3330         break;
3331
3332      case GL_UNSIGNED_INT:
3333         if (internalFormat != GL_RGB32UI)
3334            return GL_INVALID_OPERATION;
3335         break;
3336
3337      case GL_INT:
3338         if (internalFormat != GL_RGB32I)
3339            return GL_INVALID_OPERATION;
3340         break;
3341
3342      default:
3343         return GL_INVALID_OPERATION;
3344      }
3345      break;
3346
3347   case GL_RG:
3348      if (!_mesa_has_rg_textures(ctx))
3349         return GL_INVALID_OPERATION;
3350      switch (type) {
3351      case GL_UNSIGNED_BYTE:
3352         if (internalFormat != GL_RG8 &&
3353             internalFormat != GL_COMPRESSED_RED_GREEN_RGTC2_EXT &&
3354             internalFormat != GL_SRG8_EXT)
3355            return GL_INVALID_OPERATION;
3356         break;
3357
3358      case GL_BYTE:
3359         if (internalFormat != GL_RG8_SNORM &&
3360             internalFormat != GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT)
3361            return GL_INVALID_OPERATION;
3362         break;
3363
3364      case GL_UNSIGNED_SHORT:
3365         if (internalFormat != GL_RG16)
3366            return GL_INVALID_OPERATION;
3367         break;
3368
3369      case GL_SHORT:
3370         if (internalFormat != GL_RG16_SNORM)
3371            return GL_INVALID_OPERATION;
3372         break;
3373
3374      case GL_HALF_FLOAT:
3375      case GL_HALF_FLOAT_OES:
3376         switch (internalFormat) {
3377            case GL_RG16F:
3378               if (ctx->Version <= 20)
3379                  return GL_INVALID_OPERATION;
3380               break;
3381            case GL_RG:
3382               if (!_mesa_has_OES_texture_half_float(ctx))
3383                  return GL_INVALID_OPERATION;
3384               break;
3385            default:
3386               return GL_INVALID_OPERATION;
3387         }
3388         break;
3389
3390      case GL_FLOAT:
3391         switch (internalFormat) {
3392         case GL_RG16F:
3393         case GL_RG32F:
3394            break;
3395         case GL_RG:
3396            if (!_mesa_has_OES_texture_float(ctx))
3397               return GL_INVALID_OPERATION;
3398            break;
3399         default:
3400            return GL_INVALID_OPERATION;
3401         }
3402         break;
3403
3404      default:
3405         return GL_INVALID_OPERATION;
3406      }
3407      break;
3408
3409   case GL_RG_INTEGER:
3410      if (ctx->Version <= 20)
3411         return GL_INVALID_OPERATION;
3412      switch (type) {
3413      case GL_UNSIGNED_BYTE:
3414         if (internalFormat != GL_RG8UI)
3415            return GL_INVALID_OPERATION;
3416         break;
3417
3418      case GL_BYTE:
3419         if (internalFormat != GL_RG8I)
3420            return GL_INVALID_OPERATION;
3421         break;
3422
3423      case GL_UNSIGNED_SHORT:
3424         if (internalFormat != GL_RG16UI)
3425            return GL_INVALID_OPERATION;
3426         break;
3427
3428      case GL_SHORT:
3429         if (internalFormat != GL_RG16I)
3430            return GL_INVALID_OPERATION;
3431         break;
3432
3433      case GL_UNSIGNED_INT:
3434         if (internalFormat != GL_RG32UI)
3435            return GL_INVALID_OPERATION;
3436         break;
3437
3438      case GL_INT:
3439         if (internalFormat != GL_RG32I)
3440            return GL_INVALID_OPERATION;
3441         break;
3442
3443      default:
3444         return GL_INVALID_OPERATION;
3445      }
3446      break;
3447
3448   case GL_RED:
3449      if (!_mesa_has_rg_textures(ctx))
3450         return GL_INVALID_OPERATION;
3451      switch (type) {
3452      case GL_UNSIGNED_BYTE:
3453         if (internalFormat != GL_R8 &&
3454             internalFormat != GL_SR8_EXT &&
3455             internalFormat != GL_COMPRESSED_RED_RGTC1_EXT) {
3456            return GL_INVALID_OPERATION;
3457         }
3458         break;
3459
3460      case GL_BYTE:
3461         if (internalFormat != GL_R8_SNORM &&
3462             internalFormat != GL_COMPRESSED_SIGNED_RED_RGTC1_EXT)
3463            return GL_INVALID_OPERATION;
3464         break;
3465
3466      case GL_UNSIGNED_SHORT:
3467         if (internalFormat != GL_R16)
3468            return GL_INVALID_OPERATION;
3469         break;
3470
3471      case GL_SHORT:
3472         if (internalFormat != GL_R16_SNORM)
3473            return GL_INVALID_OPERATION;
3474         break;
3475
3476      case GL_HALF_FLOAT:
3477      case GL_HALF_FLOAT_OES:
3478         switch (internalFormat) {
3479         case GL_R16F:
3480            if (ctx->Version <= 20)
3481               return GL_INVALID_OPERATION;
3482            break;
3483         case GL_RG:
3484         case GL_RED:
3485            if (!_mesa_has_OES_texture_half_float(ctx))
3486               return GL_INVALID_OPERATION;
3487            break;
3488         default:
3489            return GL_INVALID_OPERATION;
3490         }
3491         break;
3492
3493      case GL_FLOAT:
3494         switch (internalFormat) {
3495         case GL_R16F:
3496         case GL_R32F:
3497            break;
3498         case GL_RED:
3499            if (!_mesa_has_OES_texture_float(ctx))
3500               return GL_INVALID_OPERATION;
3501            break;
3502         default:
3503            return GL_INVALID_OPERATION;
3504         }
3505         break;
3506
3507      default:
3508         return GL_INVALID_OPERATION;
3509      }
3510      break;
3511
3512   case GL_RED_INTEGER:
3513      if (ctx->Version <= 20)
3514         return GL_INVALID_OPERATION;
3515      switch (type) {
3516      case GL_UNSIGNED_BYTE:
3517         if (internalFormat != GL_R8UI)
3518            return GL_INVALID_OPERATION;
3519         break;
3520
3521      case GL_BYTE:
3522         if (internalFormat != GL_R8I)
3523            return GL_INVALID_OPERATION;
3524         break;
3525
3526      case GL_UNSIGNED_SHORT:
3527         if (internalFormat != GL_R16UI)
3528            return GL_INVALID_OPERATION;
3529         break;
3530
3531      case GL_SHORT:
3532         if (internalFormat != GL_R16I)
3533            return GL_INVALID_OPERATION;
3534         break;
3535
3536      case GL_UNSIGNED_INT:
3537         if (internalFormat != GL_R32UI)
3538            return GL_INVALID_OPERATION;
3539         break;
3540
3541      case GL_INT:
3542         if (internalFormat != GL_R32I)
3543            return GL_INVALID_OPERATION;
3544         break;
3545
3546      default:
3547         return GL_INVALID_OPERATION;
3548      }
3549      break;
3550
3551   case GL_DEPTH_COMPONENT:
3552      switch (type) {
3553      case GL_UNSIGNED_SHORT:
3554         if (internalFormat != GL_DEPTH_COMPONENT &&
3555             internalFormat != GL_DEPTH_COMPONENT16)
3556            return GL_INVALID_OPERATION;
3557         break;
3558
3559      case GL_UNSIGNED_INT:
3560         switch (internalFormat) {
3561         case GL_DEPTH_COMPONENT:
3562         case GL_DEPTH_COMPONENT16:
3563         case GL_DEPTH_COMPONENT24:
3564            break;
3565         default:
3566            return GL_INVALID_OPERATION;
3567         }
3568         break;
3569
3570      case GL_FLOAT:
3571         if (ctx->Version <= 20 || internalFormat != GL_DEPTH_COMPONENT32F)
3572            return GL_INVALID_OPERATION;
3573         break;
3574
3575      default:
3576         return GL_INVALID_OPERATION;
3577      }
3578      break;
3579
3580   case GL_DEPTH_STENCIL:
3581      switch (type) {
3582      case GL_UNSIGNED_INT_24_8:
3583         if (internalFormat != GL_DEPTH_STENCIL &&
3584             internalFormat != GL_DEPTH24_STENCIL8)
3585            return GL_INVALID_OPERATION;
3586         break;
3587
3588      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
3589         if (ctx->Version <= 20 || internalFormat != GL_DEPTH32F_STENCIL8)
3590            return GL_INVALID_OPERATION;
3591         break;
3592
3593      default:
3594         return GL_INVALID_OPERATION;
3595      }
3596      break;
3597
3598   case GL_STENCIL_INDEX:
3599      if (type != GL_UNSIGNED_BYTE ||
3600          internalFormat != GL_STENCIL_INDEX8) {
3601         return GL_INVALID_OPERATION;
3602      }
3603      break;
3604
3605   case GL_ALPHA:
3606   case GL_LUMINANCE:
3607   case GL_LUMINANCE_ALPHA:
3608      switch (type) {
3609      case GL_FLOAT:
3610         if (!_mesa_has_OES_texture_float(ctx) || internalFormat != format)
3611            return GL_INVALID_OPERATION;
3612         break;
3613      case GL_HALF_FLOAT_OES:
3614         if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format)
3615            return GL_INVALID_OPERATION;
3616         break;
3617      case GL_UNSIGNED_BYTE:
3618         if (!(format == internalFormat ||
3619               (format == GL_ALPHA && internalFormat == GL_ALPHA8) ||
3620               (format == GL_LUMINANCE && internalFormat == GL_LUMINANCE8) ||
3621               (format == GL_LUMINANCE_ALPHA &&
3622                ((internalFormat == GL_LUMINANCE8_ALPHA8) ||
3623                 (internalFormat == GL_LUMINANCE4_ALPHA4))))) {
3624            return GL_INVALID_OPERATION;
3625         }
3626         break;
3627      default:
3628         return GL_INVALID_OPERATION;
3629      }
3630      break;
3631   }
3632
3633   return GL_NO_ERROR;
3634}
3635
3636static void
3637set_swizzle(uint8_t *swizzle, int x, int y, int z, int w)
3638{
3639   swizzle[MESA_FORMAT_SWIZZLE_X] = x;
3640   swizzle[MESA_FORMAT_SWIZZLE_Y] = y;
3641   swizzle[MESA_FORMAT_SWIZZLE_Z] = z;
3642   swizzle[MESA_FORMAT_SWIZZLE_W] = w;
3643}
3644
3645static bool
3646get_swizzle_from_gl_format(GLenum format, uint8_t *swizzle)
3647{
3648   switch (format) {
3649   case GL_RGBA:
3650   case GL_RGBA_INTEGER_EXT:
3651      set_swizzle(swizzle, 0, 1, 2, 3);
3652      return true;
3653   case GL_BGRA:
3654   case GL_BGRA_INTEGER_EXT:
3655      set_swizzle(swizzle, 2, 1, 0, 3);
3656      return true;
3657   case GL_ABGR_EXT:
3658      set_swizzle(swizzle, 3, 2, 1, 0);
3659      return true;
3660   case GL_RGB:
3661   case GL_RGB_INTEGER_EXT:
3662      set_swizzle(swizzle, 0, 1, 2, 5);
3663      return true;
3664   case GL_BGR:
3665   case GL_BGR_INTEGER_EXT:
3666      set_swizzle(swizzle, 2, 1, 0, 5);
3667      return true;
3668   case GL_LUMINANCE_ALPHA:
3669   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
3670      set_swizzle(swizzle, 0, 0, 0, 1);
3671      return true;
3672   case GL_RG:
3673   case GL_RG_INTEGER:
3674      set_swizzle(swizzle, 0, 1, 4, 5);
3675      return true;
3676   case GL_RED:
3677   case GL_RED_INTEGER_EXT:
3678      set_swizzle(swizzle, 0, 4, 4, 5);
3679      return true;
3680   case GL_GREEN:
3681   case GL_GREEN_INTEGER_EXT:
3682      set_swizzle(swizzle, 4, 0, 4, 5);
3683      return true;
3684   case GL_BLUE:
3685   case GL_BLUE_INTEGER_EXT:
3686      set_swizzle(swizzle, 4, 4, 0, 5);
3687      return true;
3688   case GL_ALPHA:
3689   case GL_ALPHA_INTEGER_EXT:
3690      set_swizzle(swizzle, 4, 4, 4, 0);
3691      return true;
3692   case GL_LUMINANCE:
3693   case GL_LUMINANCE_INTEGER_EXT:
3694      set_swizzle(swizzle, 0, 0, 0, 5);
3695      return true;
3696   case GL_INTENSITY:
3697      set_swizzle(swizzle, 0, 0, 0, 0);
3698      return true;
3699   case GL_DEPTH_COMPONENT:
3700      set_swizzle(swizzle, 0, 6, 6, 6);
3701      return true;
3702   case GL_STENCIL_INDEX:
3703      set_swizzle(swizzle, 6, 0, 6, 6);
3704      return true;
3705   default:
3706      return false;
3707   }
3708}
3709
3710bool
3711_mesa_swap_bytes_in_type_enum(GLenum *type)
3712{
3713   switch (*type) {
3714   case GL_UNSIGNED_INT_8_8_8_8:
3715      *type = GL_UNSIGNED_INT_8_8_8_8_REV;
3716      return true;
3717   case GL_UNSIGNED_INT_8_8_8_8_REV:
3718      *type = GL_UNSIGNED_INT_8_8_8_8;
3719      return true;
3720   case GL_UNSIGNED_SHORT_8_8_MESA:
3721      *type = GL_UNSIGNED_SHORT_8_8_REV_MESA;
3722      return true;
3723   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
3724      *type = GL_UNSIGNED_SHORT_8_8_MESA;
3725      return true;
3726   case GL_BYTE:
3727   case GL_UNSIGNED_BYTE:
3728      /* format/types that are arrays of 8-bit values are unaffected by
3729       * swapBytes.
3730       */
3731      return true;
3732   default:
3733      /* swapping bytes on 4444, 1555, or >8 bit per channel types etc. will
3734       * never match a Mesa format.
3735       */
3736      return false;
3737   }
3738}
3739
3740/**
3741* Take an OpenGL format (GL_RGB, GL_RGBA, etc), OpenGL data type (GL_INT,
3742* GL_FOAT, etc) and return a matching mesa_array_format or a mesa_format
3743* otherwise (for non-array formats).
3744*
3745* This function will typically be used to compute a mesa format from a GL type
3746* so we can then call _mesa_format_convert. This function does
3747* not consider byte swapping, so it returns types assuming that no byte
3748* swapping is involved. If byte swapping is involved then clients are supposed
3749* to handle that on their side before calling _mesa_format_convert.
3750*
3751* This function returns an uint32_t that can pack a mesa_format or a
3752* mesa_array_format. Clients must check the mesa array format bit
3753* (MESA_ARRAY_FORMAT_BIT) on the return value to know if the returned
3754* format is a mesa_array_format or a mesa_format.
3755*/
3756uint32_t
3757_mesa_format_from_format_and_type(GLenum format, GLenum type)
3758{
3759   bool is_array_format = true;
3760   uint8_t swizzle[4];
3761   bool normalized = false, is_float = false, is_signed = false;
3762   int num_channels = 0, type_size = 0;
3763
3764   if (format == GL_COLOR_INDEX)
3765      return MESA_FORMAT_NONE;
3766
3767   /* Extract array format type information from the OpenGL data type */
3768   switch (type) {
3769   case GL_UNSIGNED_BYTE:
3770      type_size = 1;
3771      break;
3772   case GL_BYTE:
3773      type_size = 1;
3774      is_signed = true;
3775      break;
3776   case GL_UNSIGNED_SHORT:
3777      type_size = 2;
3778      break;
3779   case GL_SHORT:
3780      type_size = 2;
3781      is_signed = true;
3782      break;
3783   case GL_UNSIGNED_INT:
3784      type_size = 4;
3785      break;
3786   case GL_INT:
3787      type_size = 4;
3788      is_signed = true;
3789      break;
3790   case GL_HALF_FLOAT:
3791   case GL_HALF_FLOAT_OES:
3792      type_size = 2;
3793      is_signed = true;
3794      is_float = true;
3795      break;
3796   case GL_FLOAT:
3797      type_size = 4;
3798      is_signed = true;
3799      is_float = true;
3800      break;
3801   default:
3802      is_array_format = false;
3803      break;
3804   }
3805
3806   /* Extract array format swizzle information from the OpenGL format */
3807   if (is_array_format)
3808      is_array_format = get_swizzle_from_gl_format(format, swizzle);
3809
3810   /* If this is an array format type after checking data type and format,
3811    * create the array format
3812    */
3813   if (is_array_format) {
3814      enum mesa_array_format_base_format bf;
3815      switch (format) {
3816      case GL_DEPTH_COMPONENT:
3817         bf = MESA_ARRAY_FORMAT_BASE_FORMAT_DEPTH;
3818         break;
3819      case GL_STENCIL_INDEX:
3820         bf = MESA_ARRAY_FORMAT_BASE_FORMAT_STENCIL;
3821         break;
3822      default:
3823         bf = MESA_ARRAY_FORMAT_BASE_FORMAT_RGBA_VARIANTS;
3824         break;
3825      }
3826
3827      normalized = !(_mesa_is_enum_format_integer(format) ||
3828                     format == GL_STENCIL_INDEX);
3829      num_channels = _mesa_components_in_format(format);
3830
3831      return MESA_ARRAY_FORMAT(bf, type_size, is_signed, is_float,
3832                               normalized, num_channels,
3833                               swizzle[0], swizzle[1], swizzle[2], swizzle[3]);
3834   }
3835
3836   /* Otherwise this is not an array format, so return the mesa_format
3837    * matching the OpenGL format and data type
3838    */
3839   switch (type) {
3840   case GL_UNSIGNED_SHORT_5_6_5:
3841     if (format == GL_RGB)
3842         return MESA_FORMAT_B5G6R5_UNORM;
3843      else if (format == GL_BGR)
3844         return MESA_FORMAT_R5G6B5_UNORM;
3845      else if (format == GL_RGB_INTEGER)
3846         return MESA_FORMAT_B5G6R5_UINT;
3847      break;
3848   case GL_UNSIGNED_SHORT_5_6_5_REV:
3849      if (format == GL_RGB)
3850         return MESA_FORMAT_R5G6B5_UNORM;
3851      else if (format == GL_BGR)
3852         return MESA_FORMAT_B5G6R5_UNORM;
3853      else if (format == GL_RGB_INTEGER)
3854         return MESA_FORMAT_R5G6B5_UINT;
3855      break;
3856   case GL_UNSIGNED_SHORT_4_4_4_4:
3857      if (format == GL_RGBA)
3858         return MESA_FORMAT_A4B4G4R4_UNORM;
3859      else if (format == GL_BGRA)
3860         return MESA_FORMAT_A4R4G4B4_UNORM;
3861      else if (format == GL_ABGR_EXT)
3862         return MESA_FORMAT_R4G4B4A4_UNORM;
3863      else if (format == GL_RGBA_INTEGER)
3864         return MESA_FORMAT_A4B4G4R4_UINT;
3865      else if (format == GL_BGRA_INTEGER)
3866         return MESA_FORMAT_A4R4G4B4_UINT;
3867      break;
3868   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
3869      if (format == GL_RGBA)
3870         return MESA_FORMAT_R4G4B4A4_UNORM;
3871      else if (format == GL_BGRA)
3872         return MESA_FORMAT_B4G4R4A4_UNORM;
3873      else if (format == GL_ABGR_EXT)
3874         return MESA_FORMAT_A4B4G4R4_UNORM;
3875      else if (format == GL_RGBA_INTEGER)
3876         return MESA_FORMAT_R4G4B4A4_UINT;
3877      else if (format == GL_BGRA_INTEGER)
3878         return MESA_FORMAT_B4G4R4A4_UINT;
3879      break;
3880   case GL_UNSIGNED_SHORT_5_5_5_1:
3881      if (format == GL_RGBA)
3882         return MESA_FORMAT_A1B5G5R5_UNORM;
3883      else if (format == GL_BGRA)
3884         return MESA_FORMAT_A1R5G5B5_UNORM;
3885      else if (format == GL_RGBA_INTEGER)
3886         return MESA_FORMAT_A1B5G5R5_UINT;
3887      else if (format == GL_BGRA_INTEGER)
3888         return MESA_FORMAT_A1R5G5B5_UINT;
3889      break;
3890   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
3891      if (format == GL_RGBA)
3892         return MESA_FORMAT_R5G5B5A1_UNORM;
3893      else if (format == GL_BGRA)
3894         return MESA_FORMAT_B5G5R5A1_UNORM;
3895      else if (format == GL_RGBA_INTEGER)
3896         return MESA_FORMAT_R5G5B5A1_UINT;
3897      else if (format == GL_BGRA_INTEGER)
3898         return MESA_FORMAT_B5G5R5A1_UINT;
3899      break;
3900   case GL_UNSIGNED_BYTE_3_3_2:
3901      if (format == GL_RGB)
3902         return MESA_FORMAT_B2G3R3_UNORM;
3903      else if (format == GL_RGB_INTEGER)
3904         return MESA_FORMAT_B2G3R3_UINT;
3905      break;
3906   case GL_UNSIGNED_BYTE_2_3_3_REV:
3907      if (format == GL_RGB)
3908         return MESA_FORMAT_R3G3B2_UNORM;
3909      else if (format == GL_RGB_INTEGER)
3910         return MESA_FORMAT_R3G3B2_UINT;
3911      break;
3912   case GL_UNSIGNED_INT_5_9_9_9_REV:
3913      if (format == GL_RGB)
3914         return MESA_FORMAT_R9G9B9E5_FLOAT;
3915      break;
3916   case GL_UNSIGNED_INT_10_10_10_2:
3917      if (format == GL_RGBA)
3918         return MESA_FORMAT_A2B10G10R10_UNORM;
3919      else if (format == GL_RGBA_INTEGER)
3920         return MESA_FORMAT_A2B10G10R10_UINT;
3921      else if (format == GL_BGRA)
3922         return MESA_FORMAT_A2R10G10B10_UNORM;
3923      else if (format == GL_BGRA_INTEGER)
3924         return MESA_FORMAT_A2R10G10B10_UINT;
3925      break;
3926   case GL_UNSIGNED_INT_2_10_10_10_REV:
3927      if (format == GL_RGB)
3928         return MESA_FORMAT_R10G10B10X2_UNORM;
3929      if (format == GL_RGBA)
3930         return MESA_FORMAT_R10G10B10A2_UNORM;
3931      else if (format == GL_RGBA_INTEGER)
3932         return MESA_FORMAT_R10G10B10A2_UINT;
3933      else if (format == GL_BGRA)
3934         return MESA_FORMAT_B10G10R10A2_UNORM;
3935      else if (format == GL_BGRA_INTEGER)
3936         return MESA_FORMAT_B10G10R10A2_UINT;
3937      break;
3938   case GL_UNSIGNED_INT_8_8_8_8:
3939      if (format == GL_RGBA)
3940         return MESA_FORMAT_A8B8G8R8_UNORM;
3941      else if (format == GL_BGRA)
3942         return MESA_FORMAT_A8R8G8B8_UNORM;
3943      else if (format == GL_ABGR_EXT)
3944         return MESA_FORMAT_R8G8B8A8_UNORM;
3945      else if (format == GL_RGBA_INTEGER)
3946         return MESA_FORMAT_A8B8G8R8_UINT;
3947      else if (format == GL_BGRA_INTEGER)
3948         return MESA_FORMAT_A8R8G8B8_UINT;
3949      break;
3950   case GL_UNSIGNED_INT_8_8_8_8_REV:
3951      if (format == GL_RGBA)
3952         return MESA_FORMAT_R8G8B8A8_UNORM;
3953      else if (format == GL_BGRA)
3954         return MESA_FORMAT_B8G8R8A8_UNORM;
3955      else if (format == GL_ABGR_EXT)
3956         return MESA_FORMAT_A8B8G8R8_UNORM;
3957      else if (format == GL_RGBA_INTEGER)
3958         return MESA_FORMAT_R8G8B8A8_UINT;
3959      else if (format == GL_BGRA_INTEGER)
3960         return MESA_FORMAT_B8G8R8A8_UINT;
3961      break;
3962   case GL_UNSIGNED_SHORT_8_8_MESA:
3963      if (format == GL_YCBCR_MESA)
3964         return MESA_FORMAT_YCBCR;
3965      break;
3966   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
3967      if (format == GL_YCBCR_MESA)
3968         return MESA_FORMAT_YCBCR_REV;
3969      break;
3970   case GL_UNSIGNED_INT_10F_11F_11F_REV:
3971      if (format == GL_RGB)
3972         return MESA_FORMAT_R11G11B10_FLOAT;
3973      break;
3974   case GL_FLOAT:
3975      if (format == GL_DEPTH_COMPONENT)
3976         return MESA_FORMAT_Z_FLOAT32;
3977      break;
3978   case GL_UNSIGNED_INT:
3979      if (format == GL_DEPTH_COMPONENT)
3980         return MESA_FORMAT_Z_UNORM32;
3981      break;
3982   case GL_UNSIGNED_SHORT:
3983      if (format == GL_DEPTH_COMPONENT)
3984         return MESA_FORMAT_Z_UNORM16;
3985      break;
3986   case GL_UNSIGNED_INT_24_8:
3987      if (format == GL_DEPTH_STENCIL)
3988         return MESA_FORMAT_S8_UINT_Z24_UNORM;
3989      else if (format == GL_DEPTH_COMPONENT)
3990         return MESA_FORMAT_X8_UINT_Z24_UNORM;
3991      break;
3992   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
3993      if (format == GL_DEPTH_STENCIL)
3994         return MESA_FORMAT_Z32_FLOAT_S8X24_UINT;
3995      break;
3996   default:
3997      break;
3998   }
3999
4000   fprintf(stderr, "Unsupported format/type: %s/%s\n",
4001           _mesa_enum_to_string(format),
4002           _mesa_enum_to_string(type));
4003
4004   /* If we got here it means that we could not find a Mesa format that
4005    * matches the GL format/type provided. We may need to add a new Mesa
4006    * format in that case.
4007    */
4008   unreachable("Unsupported format");
4009}
4010
4011uint32_t
4012_mesa_tex_format_from_format_and_type(const struct gl_context *ctx,
4013                                      GLenum gl_format, GLenum type)
4014{
4015   mesa_format format = _mesa_format_from_format_and_type(gl_format, type);
4016
4017   if (_mesa_format_is_mesa_array_format(format))
4018      format = _mesa_format_from_array_format(format);
4019
4020   if (format == MESA_FORMAT_NONE || !ctx->TextureFormatSupported[format])
4021      return MESA_FORMAT_NONE;
4022
4023   return format;
4024}
4025
4026/**
4027 * Returns true if \p internal_format is a sized internal format that
4028 * is marked "Color Renderable" in Table 8.10 of the ES 3.2 specification.
4029 */
4030bool
4031_mesa_is_es3_color_renderable(const struct gl_context *ctx,
4032                              GLenum internal_format)
4033{
4034   switch (internal_format) {
4035   case GL_R8:
4036   case GL_RG8:
4037   case GL_RGB8:
4038   case GL_RGB565:
4039   case GL_RGBA4:
4040   case GL_RGB5_A1:
4041   case GL_RGBA8:
4042   case GL_RGB10_A2:
4043   case GL_RGB10_A2UI:
4044   case GL_SRGB8_ALPHA8:
4045   case GL_R16F:
4046   case GL_RG16F:
4047   case GL_RGBA16F:
4048   case GL_R32F:
4049   case GL_RG32F:
4050   case GL_RGBA32F:
4051   case GL_R11F_G11F_B10F:
4052   case GL_R8I:
4053   case GL_R8UI:
4054   case GL_R16I:
4055   case GL_R16UI:
4056   case GL_R32I:
4057   case GL_R32UI:
4058   case GL_RG8I:
4059   case GL_RG8UI:
4060   case GL_RG16I:
4061   case GL_RG16UI:
4062   case GL_RG32I:
4063   case GL_RG32UI:
4064   case GL_RGBA8I:
4065   case GL_RGBA8UI:
4066   case GL_RGBA16I:
4067   case GL_RGBA16UI:
4068   case GL_RGBA32I:
4069   case GL_RGBA32UI:
4070      return true;
4071   case GL_R16:
4072   case GL_RG16:
4073   case GL_RGBA16:
4074      return _mesa_has_EXT_texture_norm16(ctx);
4075   case GL_R8_SNORM:
4076   case GL_RG8_SNORM:
4077   case GL_RGBA8_SNORM:
4078      return _mesa_has_EXT_render_snorm(ctx);
4079   case GL_R16_SNORM:
4080   case GL_RG16_SNORM:
4081   case GL_RGBA16_SNORM:
4082      return _mesa_has_EXT_texture_norm16(ctx) &&
4083             _mesa_has_EXT_render_snorm(ctx);
4084   default:
4085      return false;
4086   }
4087}
4088
4089/**
4090 * Returns true if \p internal_format is a sized internal format that
4091 * is marked "Texture Filterable" in Table 8.10 of the ES 3.2 specification.
4092 */
4093bool
4094_mesa_is_es3_texture_filterable(const struct gl_context *ctx,
4095                                GLenum internal_format)
4096{
4097   switch (internal_format) {
4098   case GL_R8:
4099   case GL_R8_SNORM:
4100   case GL_RG8:
4101   case GL_RG8_SNORM:
4102   case GL_RGB8:
4103   case GL_RGB8_SNORM:
4104   case GL_RGB565:
4105   case GL_RGBA4:
4106   case GL_RGB5_A1:
4107   case GL_RGBA8:
4108   case GL_RGBA8_SNORM:
4109   case GL_RGB10_A2:
4110   case GL_SRGB8:
4111   case GL_SRGB8_ALPHA8:
4112   case GL_R16F:
4113   case GL_RG16F:
4114   case GL_RGB16F:
4115   case GL_RGBA16F:
4116   case GL_R11F_G11F_B10F:
4117   case GL_RGB9_E5:
4118      return true;
4119   case GL_R16:
4120   case GL_R16_SNORM:
4121   case GL_RG16:
4122   case GL_RG16_SNORM:
4123   case GL_RGB16:
4124   case GL_RGB16_SNORM:
4125   case GL_RGBA16:
4126   case GL_RGBA16_SNORM:
4127      return _mesa_has_EXT_texture_norm16(ctx);
4128   case GL_R32F:
4129   case GL_RG32F:
4130   case GL_RGB32F:
4131   case GL_RGBA32F:
4132      /* The OES_texture_float_linear spec says:
4133       *
4134       *    "When implemented against OpenGL ES 3.0 or later versions, sized
4135       *     32-bit floating-point formats become texture-filterable. This
4136       *     should be noted by, for example, checking the ``TF'' column of
4137       *     table 8.13 in the ES 3.1 Specification (``Correspondence of sized
4138       *     internal formats to base internal formats ... and use cases ...'')
4139       *     for the R32F, RG32F, RGB32F, and RGBA32F formats."
4140       */
4141      return _mesa_has_OES_texture_float_linear(ctx);
4142   default:
4143      return false;
4144   }
4145}
4146