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