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