~mmach/netext73/mesa-haswell

« back to all changes in this revision

Viewing changes to src/mesa/main/glformats.c

  • Committer: mmach
  • Date: 2022-09-22 19:56:13 UTC
  • Revision ID: netbit73@gmail.com-20220922195613-wtik9mmy20tmor0i
2022-09-22 21:17:09

Show diffs side-by-side

added added

removed removed

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