• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Mesa 3-D graphics library
3  *
4  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5  * Copyright (c) 2008-2009  VMware, Inc.
6  * Copyright (c) 2012 Intel Corporation
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the "Software"),
10  * to deal in the Software without restriction, including without limitation
11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12  * and/or sell copies of the Software, and to permit persons to whom the
13  * Software is furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included
16  * in all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21  * THE AUTHORS 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 
34 enum {
35    ZERO = 4,
36    ONE = 5
37 };
38 
39 enum {
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 
61 static 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  */
149 static int
get_map_idx(GLenum value)150 get_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  */
203 void
_mesa_compute_component_mapping(GLenum inFormat,GLenum outFormat,GLubyte * map)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  */
234 GLboolean
_mesa_type_is_packed(GLenum type)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  */
272 GLint
_mesa_sizeof_type(GLenum type)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  */
309 GLint
_mesa_sizeof_packed_type(GLenum type)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  */
368 GLint
_mesa_components_in_format(GLenum format)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  */
423 GLint
_mesa_bytes_per_pixel(GLenum format,GLenum type)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  */
533 GLint
_mesa_bytes_per_vertex_attrib(GLint comps,GLenum type)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  */
576 GLboolean
_mesa_is_enum_format_unsized(GLenum format)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  */
632 GLboolean
_mesa_is_enum_format_unorm(GLenum format)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  */
703 GLboolean
_mesa_is_enum_format_snorm(GLenum format)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  */
741 GLboolean
_mesa_is_enum_format_unsigned_int(GLenum format)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  */
781 GLboolean
_mesa_is_enum_format_signed_int(GLenum format)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  */
831 static bool
is_astc_2d_format(GLenum internalFormat)832 is_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  */
872 static bool
is_astc_3d_format(GLenum internalFormat)873 is_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  */
905 GLboolean
_mesa_is_astc_format(GLenum internalFormat)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  */
915 GLboolean
_mesa_is_etc2_format(GLenum internalFormat)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  */
938 GLboolean
_mesa_is_enum_format_integer(GLenum format)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 
946 GLboolean
_mesa_is_type_unsigned(GLenum type)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  */
983 GLboolean
_mesa_is_color_format(GLenum format)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  */
1251 GLboolean
_mesa_is_depth_format(GLenum format)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  */
1270 GLboolean
_mesa_is_stencil_format(GLenum format)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  */
1285 GLboolean
_mesa_is_ycbcr_format(GLenum format)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  */
1300 GLboolean
_mesa_is_depthstencil_format(GLenum format)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  */
1317 GLboolean
_mesa_is_depth_or_stencil_format(GLenum format)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  */
1343 GLboolean
_mesa_has_depth_float_channel(GLenum internalFormat)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  */
1355 GLboolean
_mesa_is_compressed_format(const struct gl_context * ctx,GLenum format)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  */
1422 GLboolean
_mesa_is_srgb_format(GLenum format)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  */
1467 GLenum
_mesa_unpack_format_to_base_format(GLenum format)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  */
1512 GLenum
_mesa_base_format_to_integer_format(GLenum format)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  */
1548 GLboolean
_mesa_base_format_has_channel(GLenum base_format,GLenum pname)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  */
1647 GLenum
_mesa_generic_compressed_format_to_uncompressed_format(GLenum format)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  */
1686 GLenum
_mesa_get_nongeneric_internalformat(GLenum format)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  */
1751 GLenum
_mesa_get_linear_internalformat(GLenum format)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  */
1788 GLenum
_mesa_error_check_format_and_type(const struct gl_context * ctx,GLenum format,GLenum type)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  */
2185 GLenum
_mesa_es_error_check_format_and_type(const struct gl_context * ctx,GLenum format,GLenum type,unsigned dimensions)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  */
2268 GLint
_mesa_base_tex_format(const struct gl_context * ctx,GLint internalFormat)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  */
2688 static GLenum
gles_effective_internal_format_for_format_and_type(GLenum format,GLenum type)2689 gles_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  */
2804 static GLenum
_mesa_gles_check_internalformat(const struct gl_context * ctx,GLenum internalFormat)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  */
2970 GLenum
_mesa_gles_error_check_format_and_type(const struct gl_context * ctx,GLenum format,GLenum type,GLenum internalFormat)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 
3636 static void
set_swizzle(uint8_t * swizzle,int x,int y,int z,int w)3637 set_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 
3645 static bool
get_swizzle_from_gl_format(GLenum format,uint8_t * swizzle)3646 get_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 
3710 bool
_mesa_swap_bytes_in_type_enum(GLenum * type)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 */
3756 uint32_t
_mesa_format_from_format_and_type(GLenum format,GLenum type)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 
4011 uint32_t
_mesa_tex_format_from_format_and_type(const struct gl_context * ctx,GLenum gl_format,GLenum type)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  */
4030 bool
_mesa_is_es3_color_renderable(const struct gl_context * ctx,GLenum internal_format)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  */
4093 bool
_mesa_is_es3_texture_filterable(const struct gl_context * ctx,GLenum internal_format)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