Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5563 serge 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
 
31
 
32
/**
33
 * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
34
 */
35
GLboolean
36
_mesa_type_is_packed(GLenum type)
37
{
38
   switch (type) {
39
   case GL_UNSIGNED_BYTE_3_3_2:
40
   case GL_UNSIGNED_BYTE_2_3_3_REV:
41
   case MESA_UNSIGNED_BYTE_4_4:
42
   case GL_UNSIGNED_SHORT_5_6_5:
43
   case GL_UNSIGNED_SHORT_5_6_5_REV:
44
   case GL_UNSIGNED_SHORT_4_4_4_4:
45
   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
46
   case GL_UNSIGNED_SHORT_5_5_5_1:
47
   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
48
   case GL_UNSIGNED_INT_8_8_8_8:
49
   case GL_UNSIGNED_INT_8_8_8_8_REV:
50
   case GL_UNSIGNED_INT_10_10_10_2:
51
   case GL_UNSIGNED_INT_2_10_10_10_REV:
52
   case GL_UNSIGNED_SHORT_8_8_MESA:
53
   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
54
   case GL_UNSIGNED_INT_24_8_EXT:
55
   case GL_UNSIGNED_INT_5_9_9_9_REV:
56
   case GL_UNSIGNED_INT_10F_11F_11F_REV:
57
   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
58
      return GL_TRUE;
59
   }
60
 
61
   return GL_FALSE;
62
}
63
 
64
 
65
/**
66
 * Get the size of a GL data type.
67
 *
68
 * \param type GL data type.
69
 *
70
 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
71
 * if an invalid type enum.
72
 */
73
GLint
74
_mesa_sizeof_type(GLenum type)
75
{
76
   switch (type) {
77
   case GL_BITMAP:
78
      return 0;
79
   case GL_UNSIGNED_BYTE:
80
      return sizeof(GLubyte);
81
   case GL_BYTE:
82
      return sizeof(GLbyte);
83
   case GL_UNSIGNED_SHORT:
84
      return sizeof(GLushort);
85
   case GL_SHORT:
86
      return sizeof(GLshort);
87
   case GL_UNSIGNED_INT:
88
      return sizeof(GLuint);
89
   case GL_INT:
90
      return sizeof(GLint);
91
   case GL_FLOAT:
92
      return sizeof(GLfloat);
93
   case GL_DOUBLE:
94
      return sizeof(GLdouble);
95
   case GL_HALF_FLOAT_ARB:
96
      return sizeof(GLhalfARB);
97
   case GL_FIXED:
98
      return sizeof(GLfixed);
99
   default:
100
      return -1;
101
   }
102
}
103
 
104
 
105
/**
106
 * Same as _mesa_sizeof_type() but also accepting the packed pixel
107
 * format data types.
108
 */
109
GLint
110
_mesa_sizeof_packed_type(GLenum type)
111
{
112
   switch (type) {
113
   case GL_BITMAP:
114
      return 0;
115
   case GL_UNSIGNED_BYTE:
116
      return sizeof(GLubyte);
117
   case GL_BYTE:
118
      return sizeof(GLbyte);
119
   case GL_UNSIGNED_SHORT:
120
      return sizeof(GLushort);
121
   case GL_SHORT:
122
      return sizeof(GLshort);
123
   case GL_UNSIGNED_INT:
124
      return sizeof(GLuint);
125
   case GL_INT:
126
      return sizeof(GLint);
127
   case GL_HALF_FLOAT_ARB:
128
      return sizeof(GLhalfARB);
129
   case GL_FLOAT:
130
      return sizeof(GLfloat);
131
   case GL_UNSIGNED_BYTE_3_3_2:
132
   case GL_UNSIGNED_BYTE_2_3_3_REV:
133
   case MESA_UNSIGNED_BYTE_4_4:
134
      return sizeof(GLubyte);
135
   case GL_UNSIGNED_SHORT_5_6_5:
136
   case GL_UNSIGNED_SHORT_5_6_5_REV:
137
   case GL_UNSIGNED_SHORT_4_4_4_4:
138
   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
139
   case GL_UNSIGNED_SHORT_5_5_5_1:
140
   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
141
   case GL_UNSIGNED_SHORT_8_8_MESA:
142
   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
143
      return sizeof(GLushort);
144
   case GL_UNSIGNED_INT_8_8_8_8:
145
   case GL_UNSIGNED_INT_8_8_8_8_REV:
146
   case GL_UNSIGNED_INT_10_10_10_2:
147
   case GL_UNSIGNED_INT_2_10_10_10_REV:
148
   case GL_UNSIGNED_INT_24_8_EXT:
149
   case GL_UNSIGNED_INT_5_9_9_9_REV:
150
   case GL_UNSIGNED_INT_10F_11F_11F_REV:
151
      return sizeof(GLuint);
152
   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
153
      return 8;
154
   default:
155
      return -1;
156
   }
157
}
158
 
159
 
160
/**
161
 * Get the number of components in a pixel format.
162
 *
163
 * \param format pixel format.
164
 *
165
 * \return the number of components in the given format, or -1 if a bad format.
166
 */
167
GLint
168
_mesa_components_in_format(GLenum format)
169
{
170
   switch (format) {
171
   case GL_COLOR_INDEX:
172
   case GL_STENCIL_INDEX:
173
   case GL_DEPTH_COMPONENT:
174
   case GL_RED:
175
   case GL_RED_INTEGER_EXT:
176
   case GL_GREEN:
177
   case GL_GREEN_INTEGER_EXT:
178
   case GL_BLUE:
179
   case GL_BLUE_INTEGER_EXT:
180
   case GL_ALPHA:
181
   case GL_ALPHA_INTEGER_EXT:
182
   case GL_LUMINANCE:
183
   case GL_LUMINANCE_INTEGER_EXT:
184
   case GL_INTENSITY:
185
      return 1;
186
 
187
   case GL_LUMINANCE_ALPHA:
188
   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
189
   case GL_RG:
190
   case GL_YCBCR_MESA:
191
   case GL_DEPTH_STENCIL_EXT:
192
   case GL_DUDV_ATI:
193
   case GL_DU8DV8_ATI:
194
   case GL_RG_INTEGER:
195
      return 2;
196
 
197
   case GL_RGB:
198
   case GL_BGR:
199
   case GL_RGB_INTEGER_EXT:
200
   case GL_BGR_INTEGER_EXT:
201
      return 3;
202
 
203
   case GL_RGBA:
204
   case GL_BGRA:
205
   case GL_ABGR_EXT:
206
   case GL_RGBA_INTEGER_EXT:
207
   case GL_BGRA_INTEGER_EXT:
208
      return 4;
209
 
210
   default:
211
      return -1;
212
   }
213
}
214
 
215
 
216
/**
217
 * Get the bytes per pixel of pixel format type pair.
218
 *
219
 * \param format pixel format.
220
 * \param type pixel type.
221
 *
222
 * \return bytes per pixel, or -1 if a bad format or type was given.
223
 */
224
GLint
225
_mesa_bytes_per_pixel(GLenum format, GLenum type)
226
{
227
   GLint comps = _mesa_components_in_format(format);
228
   if (comps < 0)
229
      return -1;
230
 
231
   switch (type) {
232
   case GL_BITMAP:
233
      return 0;  /* special case */
234
   case GL_BYTE:
235
   case GL_UNSIGNED_BYTE:
236
      return comps * sizeof(GLubyte);
237
   case GL_SHORT:
238
   case GL_UNSIGNED_SHORT:
239
      return comps * sizeof(GLshort);
240
   case GL_INT:
241
   case GL_UNSIGNED_INT:
242
      return comps * sizeof(GLint);
243
   case GL_FLOAT:
244
      return comps * sizeof(GLfloat);
245
   case GL_HALF_FLOAT_ARB:
246
      return comps * sizeof(GLhalfARB);
247
   case GL_UNSIGNED_BYTE_3_3_2:
248
   case GL_UNSIGNED_BYTE_2_3_3_REV:
249
      if (format == GL_RGB || format == GL_BGR ||
250
          format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
251
         return sizeof(GLubyte);
252
      else
253
         return -1;  /* error */
254
   case GL_UNSIGNED_SHORT_5_6_5:
255
   case GL_UNSIGNED_SHORT_5_6_5_REV:
256
      if (format == GL_RGB || format == GL_BGR ||
257
          format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
258
         return sizeof(GLushort);
259
      else
260
         return -1;  /* error */
261
   case GL_UNSIGNED_SHORT_4_4_4_4:
262
   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
263
   case GL_UNSIGNED_SHORT_5_5_5_1:
264
   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
265
      if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
266
          format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
267
         return sizeof(GLushort);
268
      else
269
         return -1;
270
   case GL_UNSIGNED_INT_8_8_8_8:
271
   case GL_UNSIGNED_INT_8_8_8_8_REV:
272
   case GL_UNSIGNED_INT_10_10_10_2:
273
   case GL_UNSIGNED_INT_2_10_10_10_REV:
274
      if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
275
          format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT ||
276
          format == GL_RGB)
277
         return sizeof(GLuint);
278
      else
279
         return -1;
280
   case GL_UNSIGNED_SHORT_8_8_MESA:
281
   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
282
      if (format == GL_YCBCR_MESA)
283
         return sizeof(GLushort);
284
      else
285
         return -1;
286
   case GL_UNSIGNED_INT_24_8_EXT:
287
      if (format == GL_DEPTH_STENCIL_EXT)
288
         return sizeof(GLuint);
289
      else
290
         return -1;
291
   case GL_UNSIGNED_INT_5_9_9_9_REV:
292
      if (format == GL_RGB)
293
         return sizeof(GLuint);
294
      else
295
         return -1;
296
   case GL_UNSIGNED_INT_10F_11F_11F_REV:
297
      if (format == GL_RGB)
298
         return sizeof(GLuint);
299
      else
300
         return -1;
301
   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
302
      if (format == GL_DEPTH_STENCIL)
303
         return 8;
304
      else
305
         return -1;
306
   default:
307
      return -1;
308
   }
309
}
310
 
311
 
312
/**
313
 * Get the number of bytes for a vertex attrib with the given number of
314
 * components and type.
315
 *
316
 * \param comps number of components.
317
 * \param type data type.
318
 *
319
 * \return bytes per attribute, or -1 if a bad comps/type combination was given.
320
 */
321
GLint
322
_mesa_bytes_per_vertex_attrib(GLint comps, GLenum type)
323
{
324
   switch (type) {
325
   case GL_BYTE:
326
   case GL_UNSIGNED_BYTE:
327
      return comps * sizeof(GLubyte);
328
   case GL_SHORT:
329
   case GL_UNSIGNED_SHORT:
330
      return comps * sizeof(GLshort);
331
   case GL_INT:
332
   case GL_UNSIGNED_INT:
333
      return comps * sizeof(GLint);
334
   case GL_FLOAT:
335
      return comps * sizeof(GLfloat);
336
   case GL_HALF_FLOAT_ARB:
337
      return comps * sizeof(GLhalfARB);
338
   case GL_DOUBLE:
339
      return comps * sizeof(GLdouble);
340
   case GL_FIXED:
341
      return comps * sizeof(GLfixed);
342
   case GL_INT_2_10_10_10_REV:
343
   case GL_UNSIGNED_INT_2_10_10_10_REV:
344
      if (comps == 4)
345
         return sizeof(GLuint);
346
      else
347
         return -1;
348
   default:
349
      return -1;
350
   }
351
}
352
 
353
 
354
/**
355
 * Test if the given format is an integer (non-normalized) format.
356
 */
357
GLboolean
358
_mesa_is_enum_format_unsigned_int(GLenum format)
359
{
360
   switch (format) {
361
   /* specific integer formats */
362
   case GL_RGBA32UI_EXT:
363
   case GL_RGB32UI_EXT:
364
   case GL_RG32UI:
365
   case GL_R32UI:
366
   case GL_ALPHA32UI_EXT:
367
   case GL_INTENSITY32UI_EXT:
368
   case GL_LUMINANCE32UI_EXT:
369
   case GL_LUMINANCE_ALPHA32UI_EXT:
370
   case GL_RGBA16UI_EXT:
371
   case GL_RGB16UI_EXT:
372
   case GL_RG16UI:
373
   case GL_R16UI:
374
   case GL_ALPHA16UI_EXT:
375
   case GL_INTENSITY16UI_EXT:
376
   case GL_LUMINANCE16UI_EXT:
377
   case GL_LUMINANCE_ALPHA16UI_EXT:
378
   case GL_RGBA8UI_EXT:
379
   case GL_RGB8UI_EXT:
380
   case GL_RG8UI:
381
   case GL_R8UI:
382
   case GL_ALPHA8UI_EXT:
383
   case GL_INTENSITY8UI_EXT:
384
   case GL_LUMINANCE8UI_EXT:
385
   case GL_LUMINANCE_ALPHA8UI_EXT:
386
   case GL_RGB10_A2UI:
387
      return GL_TRUE;
388
   default:
389
      return GL_FALSE;
390
   }
391
}
392
 
393
 
394
/**
395
 * Test if the given format is an integer (non-normalized) format.
396
 */
397
GLboolean
398
_mesa_is_enum_format_signed_int(GLenum format)
399
{
400
   switch (format) {
401
   /* generic integer formats */
402
   case GL_RED_INTEGER_EXT:
403
   case GL_GREEN_INTEGER_EXT:
404
   case GL_BLUE_INTEGER_EXT:
405
   case GL_ALPHA_INTEGER_EXT:
406
   case GL_RGB_INTEGER_EXT:
407
   case GL_RGBA_INTEGER_EXT:
408
   case GL_BGR_INTEGER_EXT:
409
   case GL_BGRA_INTEGER_EXT:
410
   case GL_LUMINANCE_INTEGER_EXT:
411
   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
412
   case GL_RG_INTEGER:
413
   /* specific integer formats */
414
   case GL_RGBA32I_EXT:
415
   case GL_RGB32I_EXT:
416
   case GL_RG32I:
417
   case GL_R32I:
418
   case GL_ALPHA32I_EXT:
419
   case GL_INTENSITY32I_EXT:
420
   case GL_LUMINANCE32I_EXT:
421
   case GL_LUMINANCE_ALPHA32I_EXT:
422
   case GL_RGBA16I_EXT:
423
   case GL_RGB16I_EXT:
424
   case GL_RG16I:
425
   case GL_R16I:
426
   case GL_ALPHA16I_EXT:
427
   case GL_INTENSITY16I_EXT:
428
   case GL_LUMINANCE16I_EXT:
429
   case GL_LUMINANCE_ALPHA16I_EXT:
430
   case GL_RGBA8I_EXT:
431
   case GL_RGB8I_EXT:
432
   case GL_RG8I:
433
   case GL_R8I:
434
   case GL_ALPHA8I_EXT:
435
   case GL_INTENSITY8I_EXT:
436
   case GL_LUMINANCE8I_EXT:
437
   case GL_LUMINANCE_ALPHA8I_EXT:
438
      return GL_TRUE;
439
   default:
440
      return GL_FALSE;
441
   }
442
}
443
 
444
 
445
/**
446
 * Test if the given format is an integer (non-normalized) format.
447
 */
448
GLboolean
449
_mesa_is_enum_format_integer(GLenum format)
450
{
451
   return _mesa_is_enum_format_unsigned_int(format) ||
452
          _mesa_is_enum_format_signed_int(format);
453
}
454
 
455
 
456
/**
457
 * Test if the given type is an integer (non-normalized) format.
458
 */
459
GLboolean
460
_mesa_is_type_integer(GLenum type)
461
{
462
   switch (type) {
463
   case GL_INT:
464
   case GL_UNSIGNED_INT:
465
   case GL_SHORT:
466
   case GL_UNSIGNED_SHORT:
467
   case GL_BYTE:
468
   case GL_UNSIGNED_BYTE:
469
      return GL_TRUE;
470
   default:
471
      return GL_FALSE;
472
   }
473
}
474
 
475
 
476
/**
477
 * Test if the given format or type is an integer (non-normalized) format.
478
 */
479
extern GLboolean
480
_mesa_is_enum_format_or_type_integer(GLenum format, GLenum type)
481
{
482
   return _mesa_is_enum_format_integer(format) || _mesa_is_type_integer(type);
483
}
484
 
485
 
486
GLboolean
487
_mesa_is_type_unsigned(GLenum type)
488
{
489
   switch (type) {
490
   case GL_UNSIGNED_INT:
491
   case GL_UNSIGNED_INT_8_8_8_8:
492
   case GL_UNSIGNED_INT_8_8_8_8_REV:
493
   case GL_UNSIGNED_INT_10_10_10_2:
494
   case GL_UNSIGNED_INT_2_10_10_10_REV:
495
 
496
   case GL_UNSIGNED_SHORT:
497
   case GL_UNSIGNED_SHORT_4_4_4_4:
498
   case GL_UNSIGNED_SHORT_5_5_5_1:
499
   case GL_UNSIGNED_SHORT_5_6_5:
500
   case GL_UNSIGNED_SHORT_5_6_5_REV:
501
   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
502
   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
503
   case GL_UNSIGNED_SHORT_8_8_MESA:
504
   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
505
 
506
   case GL_UNSIGNED_BYTE:
507
   case GL_UNSIGNED_BYTE_3_3_2:
508
   case GL_UNSIGNED_BYTE_2_3_3_REV:
509
      return GL_TRUE;
510
 
511
   default:
512
      return GL_FALSE;
513
   }
514
}
515
 
516
 
517
/**
518
 * Test if the given image format is a color/RGBA format (i.e., not color
519
 * index, depth, stencil, etc).
520
 * \param format  the image format value (may by an internal texture format)
521
 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
522
 */
523
GLboolean
524
_mesa_is_color_format(GLenum format)
525
{
526
   switch (format) {
527
      case GL_RED:
528
      case GL_GREEN:
529
      case GL_BLUE:
530
      case GL_ALPHA:
531
      case GL_ALPHA4:
532
      case GL_ALPHA8:
533
      case GL_ALPHA12:
534
      case GL_ALPHA16:
535
      case 1:
536
      case GL_LUMINANCE:
537
      case GL_LUMINANCE4:
538
      case GL_LUMINANCE8:
539
      case GL_LUMINANCE12:
540
      case GL_LUMINANCE16:
541
      case 2:
542
      case GL_LUMINANCE_ALPHA:
543
      case GL_LUMINANCE4_ALPHA4:
544
      case GL_LUMINANCE6_ALPHA2:
545
      case GL_LUMINANCE8_ALPHA8:
546
      case GL_LUMINANCE12_ALPHA4:
547
      case GL_LUMINANCE12_ALPHA12:
548
      case GL_LUMINANCE16_ALPHA16:
549
      case GL_INTENSITY:
550
      case GL_INTENSITY4:
551
      case GL_INTENSITY8:
552
      case GL_INTENSITY12:
553
      case GL_INTENSITY16:
554
      case GL_R8:
555
      case GL_R16:
556
      case GL_RG:
557
      case GL_RG8:
558
      case GL_RG16:
559
      case 3:
560
      case GL_RGB:
561
      case GL_BGR:
562
      case GL_R3_G3_B2:
563
      case GL_RGB4:
564
      case GL_RGB5:
565
      case GL_RGB565:
566
      case GL_RGB8:
567
      case GL_RGB10:
568
      case GL_RGB12:
569
      case GL_RGB16:
570
      case 4:
571
      case GL_ABGR_EXT:
572
      case GL_RGBA:
573
      case GL_BGRA:
574
      case GL_RGBA2:
575
      case GL_RGBA4:
576
      case GL_RGB5_A1:
577
      case GL_RGBA8:
578
      case GL_RGB10_A2:
579
      case GL_RGBA12:
580
      case GL_RGBA16:
581
      /* float texture formats */
582
      case GL_ALPHA16F_ARB:
583
      case GL_ALPHA32F_ARB:
584
      case GL_LUMINANCE16F_ARB:
585
      case GL_LUMINANCE32F_ARB:
586
      case GL_LUMINANCE_ALPHA16F_ARB:
587
      case GL_LUMINANCE_ALPHA32F_ARB:
588
      case GL_INTENSITY16F_ARB:
589
      case GL_INTENSITY32F_ARB:
590
      case GL_R16F:
591
      case GL_R32F:
592
      case GL_RG16F:
593
      case GL_RG32F:
594
      case GL_RGB16F_ARB:
595
      case GL_RGB32F_ARB:
596
      case GL_RGBA16F_ARB:
597
      case GL_RGBA32F_ARB:
598
      /* compressed formats */
599
      case GL_COMPRESSED_ALPHA:
600
      case GL_COMPRESSED_LUMINANCE:
601
      case GL_COMPRESSED_LUMINANCE_ALPHA:
602
      case GL_COMPRESSED_INTENSITY:
603
      case GL_COMPRESSED_RED:
604
      case GL_COMPRESSED_RG:
605
      case GL_COMPRESSED_RGB:
606
      case GL_COMPRESSED_RGBA:
607
      case GL_RGB_S3TC:
608
      case GL_RGB4_S3TC:
609
      case GL_RGBA_S3TC:
610
      case GL_RGBA4_S3TC:
611
      case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
612
      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
613
      case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
614
      case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
615
      case GL_COMPRESSED_RGB_FXT1_3DFX:
616
      case GL_COMPRESSED_RGBA_FXT1_3DFX:
617
      case GL_SRGB_EXT:
618
      case GL_SRGB8_EXT:
619
      case GL_SRGB_ALPHA_EXT:
620
      case GL_SRGB8_ALPHA8_EXT:
621
      case GL_SLUMINANCE_ALPHA_EXT:
622
      case GL_SLUMINANCE8_ALPHA8_EXT:
623
      case GL_SLUMINANCE_EXT:
624
      case GL_SLUMINANCE8_EXT:
625
      case GL_COMPRESSED_SRGB_EXT:
626
      case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
627
      case GL_COMPRESSED_SRGB_ALPHA_EXT:
628
      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
629
      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
630
      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
631
      case GL_COMPRESSED_SLUMINANCE_EXT:
632
      case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
633
      case GL_COMPRESSED_RED_RGTC1:
634
      case GL_COMPRESSED_SIGNED_RED_RGTC1:
635
      case GL_COMPRESSED_RG_RGTC2:
636
      case GL_COMPRESSED_SIGNED_RG_RGTC2:
637
      case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
638
      case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
639
      case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
640
      case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
641
      case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
642
      case GL_ETC1_RGB8_OES:
643
      case GL_COMPRESSED_RGB8_ETC2:
644
      case GL_COMPRESSED_SRGB8_ETC2:
645
      case GL_COMPRESSED_RGBA8_ETC2_EAC:
646
      case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
647
      case GL_COMPRESSED_R11_EAC:
648
      case GL_COMPRESSED_RG11_EAC:
649
      case GL_COMPRESSED_SIGNED_R11_EAC:
650
      case GL_COMPRESSED_SIGNED_RG11_EAC:
651
      case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
652
      case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
653
      /* generic integer formats */
654
      case GL_RED_INTEGER_EXT:
655
      case GL_GREEN_INTEGER_EXT:
656
      case GL_BLUE_INTEGER_EXT:
657
      case GL_ALPHA_INTEGER_EXT:
658
      case GL_RGB_INTEGER_EXT:
659
      case GL_RGBA_INTEGER_EXT:
660
      case GL_BGR_INTEGER_EXT:
661
      case GL_BGRA_INTEGER_EXT:
662
      case GL_RG_INTEGER:
663
      case GL_LUMINANCE_INTEGER_EXT:
664
      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
665
      /* sized integer formats */
666
      case GL_RGBA32UI_EXT:
667
      case GL_RGB32UI_EXT:
668
      case GL_RG32UI:
669
      case GL_R32UI:
670
      case GL_ALPHA32UI_EXT:
671
      case GL_INTENSITY32UI_EXT:
672
      case GL_LUMINANCE32UI_EXT:
673
      case GL_LUMINANCE_ALPHA32UI_EXT:
674
      case GL_RGBA16UI_EXT:
675
      case GL_RGB16UI_EXT:
676
      case GL_RG16UI:
677
      case GL_R16UI:
678
      case GL_ALPHA16UI_EXT:
679
      case GL_INTENSITY16UI_EXT:
680
      case GL_LUMINANCE16UI_EXT:
681
      case GL_LUMINANCE_ALPHA16UI_EXT:
682
      case GL_RGBA8UI_EXT:
683
      case GL_RGB8UI_EXT:
684
      case GL_RG8UI:
685
      case GL_R8UI:
686
      case GL_ALPHA8UI_EXT:
687
      case GL_INTENSITY8UI_EXT:
688
      case GL_LUMINANCE8UI_EXT:
689
      case GL_LUMINANCE_ALPHA8UI_EXT:
690
      case GL_RGBA32I_EXT:
691
      case GL_RGB32I_EXT:
692
      case GL_RG32I:
693
      case GL_R32I:
694
      case GL_ALPHA32I_EXT:
695
      case GL_INTENSITY32I_EXT:
696
      case GL_LUMINANCE32I_EXT:
697
      case GL_LUMINANCE_ALPHA32I_EXT:
698
      case GL_RGBA16I_EXT:
699
      case GL_RGB16I_EXT:
700
      case GL_RG16I:
701
      case GL_R16I:
702
      case GL_ALPHA16I_EXT:
703
      case GL_INTENSITY16I_EXT:
704
      case GL_LUMINANCE16I_EXT:
705
      case GL_LUMINANCE_ALPHA16I_EXT:
706
      case GL_RGBA8I_EXT:
707
      case GL_RGB8I_EXT:
708
      case GL_RG8I:
709
      case GL_R8I:
710
      case GL_ALPHA8I_EXT:
711
      case GL_INTENSITY8I_EXT:
712
      case GL_LUMINANCE8I_EXT:
713
      case GL_LUMINANCE_ALPHA8I_EXT:
714
      /* signed, normalized texture formats */
715
      case GL_RED_SNORM:
716
      case GL_R8_SNORM:
717
      case GL_R16_SNORM:
718
      case GL_RG_SNORM:
719
      case GL_RG8_SNORM:
720
      case GL_RG16_SNORM:
721
      case GL_RGB_SNORM:
722
      case GL_RGB8_SNORM:
723
      case GL_RGB16_SNORM:
724
      case GL_RGBA_SNORM:
725
      case GL_RGBA8_SNORM:
726
      case GL_RGBA16_SNORM:
727
      case GL_ALPHA_SNORM:
728
      case GL_ALPHA8_SNORM:
729
      case GL_ALPHA16_SNORM:
730
      case GL_LUMINANCE_SNORM:
731
      case GL_LUMINANCE8_SNORM:
732
      case GL_LUMINANCE16_SNORM:
733
      case GL_LUMINANCE_ALPHA_SNORM:
734
      case GL_LUMINANCE8_ALPHA8_SNORM:
735
      case GL_LUMINANCE16_ALPHA16_SNORM:
736
      case GL_INTENSITY_SNORM:
737
      case GL_INTENSITY8_SNORM:
738
      case GL_INTENSITY16_SNORM:
739
      case GL_RGB9_E5:
740
      case GL_R11F_G11F_B10F:
741
      case GL_RGB10_A2UI:
742
         return GL_TRUE;
743
      case GL_YCBCR_MESA:  /* not considered to be RGB */
744
         /* fall-through */
745
      default:
746
         return GL_FALSE;
747
   }
748
}
749
 
750
 
751
/**
752
 * Test if the given image format is a depth component format.
753
 */
754
GLboolean
755
_mesa_is_depth_format(GLenum format)
756
{
757
   switch (format) {
758
      case GL_DEPTH_COMPONENT:
759
      case GL_DEPTH_COMPONENT16:
760
      case GL_DEPTH_COMPONENT24:
761
      case GL_DEPTH_COMPONENT32:
762
      case GL_DEPTH_COMPONENT32F:
763
         return GL_TRUE;
764
      default:
765
         return GL_FALSE;
766
   }
767
}
768
 
769
 
770
/**
771
 * Test if the given image format is a stencil format.
772
 */
773
GLboolean
774
_mesa_is_stencil_format(GLenum format)
775
{
776
   switch (format) {
777
      case GL_STENCIL_INDEX:
778
         return GL_TRUE;
779
      default:
780
         return GL_FALSE;
781
   }
782
}
783
 
784
 
785
/**
786
 * Test if the given image format is a YCbCr format.
787
 */
788
GLboolean
789
_mesa_is_ycbcr_format(GLenum format)
790
{
791
   switch (format) {
792
      case GL_YCBCR_MESA:
793
         return GL_TRUE;
794
      default:
795
         return GL_FALSE;
796
   }
797
}
798
 
799
 
800
/**
801
 * Test if the given image format is a depth+stencil format.
802
 */
803
GLboolean
804
_mesa_is_depthstencil_format(GLenum format)
805
{
806
   switch (format) {
807
      case GL_DEPTH24_STENCIL8_EXT:
808
      case GL_DEPTH_STENCIL_EXT:
809
      case GL_DEPTH32F_STENCIL8:
810
         return GL_TRUE;
811
      default:
812
         return GL_FALSE;
813
   }
814
}
815
 
816
 
817
/**
818
 * Test if the given image format is a depth or stencil format.
819
 */
820
GLboolean
821
_mesa_is_depth_or_stencil_format(GLenum format)
822
{
823
   switch (format) {
824
      case GL_DEPTH_COMPONENT:
825
      case GL_DEPTH_COMPONENT16:
826
      case GL_DEPTH_COMPONENT24:
827
      case GL_DEPTH_COMPONENT32:
828
      case GL_STENCIL_INDEX:
829
      case GL_STENCIL_INDEX1_EXT:
830
      case GL_STENCIL_INDEX4_EXT:
831
      case GL_STENCIL_INDEX8_EXT:
832
      case GL_STENCIL_INDEX16_EXT:
833
      case GL_DEPTH_STENCIL_EXT:
834
      case GL_DEPTH24_STENCIL8_EXT:
835
      case GL_DEPTH_COMPONENT32F:
836
      case GL_DEPTH32F_STENCIL8:
837
         return GL_TRUE;
838
      default:
839
         return GL_FALSE;
840
   }
841
}
842
 
843
 
844
/**
845
 * Test if the given image format is a dudv format.
846
 */
847
GLboolean
848
_mesa_is_dudv_format(GLenum format)
849
{
850
   switch (format) {
851
      case GL_DUDV_ATI:
852
      case GL_DU8DV8_ATI:
853
         return GL_TRUE;
854
      default:
855
         return GL_FALSE;
856
   }
857
}
858
 
859
 
860
/**
861
 * Test if an image format is a supported compressed format.
862
 * \param format the internal format token provided by the user.
863
 * \return GL_TRUE if compressed, GL_FALSE if uncompressed
864
 */
865
GLboolean
866
_mesa_is_compressed_format(struct gl_context *ctx, GLenum format)
867
{
868
   switch (format) {
869
   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
870
   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
871
   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
872
   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
873
      /* Assume that the ANGLE flag will always be set if the EXT flag is set.
874
       */
875
      return ctx->Extensions.ANGLE_texture_compression_dxt;
876
   case GL_RGB_S3TC:
877
   case GL_RGB4_S3TC:
878
   case GL_RGBA_S3TC:
879
   case GL_RGBA4_S3TC:
880
      return _mesa_is_desktop_gl(ctx) &&
881
         ctx->Extensions.ANGLE_texture_compression_dxt;
882
   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
883
   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
884
   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
885
   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
886
      return _mesa_is_desktop_gl(ctx)
887
         && ctx->Extensions.EXT_texture_sRGB
888
         && ctx->Extensions.EXT_texture_compression_s3tc;
889
   case GL_COMPRESSED_RGB_FXT1_3DFX:
890
   case GL_COMPRESSED_RGBA_FXT1_3DFX:
891
      return _mesa_is_desktop_gl(ctx)
892
         && ctx->Extensions.TDFX_texture_compression_FXT1;
893
   case GL_COMPRESSED_RED_RGTC1:
894
   case GL_COMPRESSED_SIGNED_RED_RGTC1:
895
   case GL_COMPRESSED_RG_RGTC2:
896
   case GL_COMPRESSED_SIGNED_RG_RGTC2:
897
      return _mesa_is_desktop_gl(ctx)
898
         && ctx->Extensions.ARB_texture_compression_rgtc;
899
   case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
900
   case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
901
   case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
902
   case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
903
      return ctx->API == API_OPENGL_COMPAT
904
         && ctx->Extensions.EXT_texture_compression_latc;
905
   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
906
      return ctx->API == API_OPENGL_COMPAT
907
         && ctx->Extensions.ATI_texture_compression_3dc;
908
   case GL_ETC1_RGB8_OES:
909
      return _mesa_is_gles(ctx)
910
         && ctx->Extensions.OES_compressed_ETC1_RGB8_texture;
911
   case GL_COMPRESSED_RGB8_ETC2:
912
   case GL_COMPRESSED_SRGB8_ETC2:
913
   case GL_COMPRESSED_RGBA8_ETC2_EAC:
914
   case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
915
   case GL_COMPRESSED_R11_EAC:
916
   case GL_COMPRESSED_RG11_EAC:
917
   case GL_COMPRESSED_SIGNED_R11_EAC:
918
   case GL_COMPRESSED_SIGNED_RG11_EAC:
919
   case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
920
   case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
921
      return _mesa_is_gles3(ctx) || ctx->Extensions.ARB_ES3_compatibility;
922
   case GL_PALETTE4_RGB8_OES:
923
   case GL_PALETTE4_RGBA8_OES:
924
   case GL_PALETTE4_R5_G6_B5_OES:
925
   case GL_PALETTE4_RGBA4_OES:
926
   case GL_PALETTE4_RGB5_A1_OES:
927
   case GL_PALETTE8_RGB8_OES:
928
   case GL_PALETTE8_RGBA8_OES:
929
   case GL_PALETTE8_R5_G6_B5_OES:
930
   case GL_PALETTE8_RGBA4_OES:
931
   case GL_PALETTE8_RGB5_A1_OES:
932
      return ctx->API == API_OPENGLES;
933
   default:
934
      return GL_FALSE;
935
   }
936
}
937
 
938
 
939
/**
940
 * Convert various base formats to the cooresponding integer format.
941
 */
942
GLenum
943
_mesa_base_format_to_integer_format(GLenum format)
944
{
945
   switch(format) {
946
   case GL_RED:
947
      return GL_RED_INTEGER;
948
   case GL_GREEN:
949
      return GL_GREEN_INTEGER;
950
   case GL_BLUE:
951
      return GL_BLUE_INTEGER;
952
   case GL_RG:
953
      return GL_RG_INTEGER;
954
   case GL_RGB:
955
      return GL_RGB_INTEGER;
956
   case GL_RGBA:
957
      return GL_RGBA_INTEGER;
958
   case GL_BGR:
959
      return GL_BGR_INTEGER;
960
   case GL_BGRA:
961
      return GL_BGRA_INTEGER;
962
   case GL_ALPHA:
963
      return GL_ALPHA_INTEGER;
964
   case GL_LUMINANCE:
965
      return GL_LUMINANCE_INTEGER_EXT;
966
   case GL_LUMINANCE_ALPHA:
967
      return GL_LUMINANCE_ALPHA_INTEGER_EXT;
968
   }
969
 
970
   return format;
971
}
972
 
973
 
974
/**
975
 * Does the given base texture/renderbuffer format have the channel
976
 * named by 'pname'?
977
 */
978
GLboolean
979
_mesa_base_format_has_channel(GLenum base_format, GLenum pname)
980
{
981
   switch (pname) {
982
   case GL_TEXTURE_RED_SIZE:
983
   case GL_TEXTURE_RED_TYPE:
984
   case GL_RENDERBUFFER_RED_SIZE_EXT:
985
   case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
986
      if (base_format == GL_RED ||
987
	  base_format == GL_RG ||
988
	  base_format == GL_RGB ||
989
	  base_format == GL_RGBA) {
990
	 return GL_TRUE;
991
      }
992
      return GL_FALSE;
993
   case GL_TEXTURE_GREEN_SIZE:
994
   case GL_TEXTURE_GREEN_TYPE:
995
   case GL_RENDERBUFFER_GREEN_SIZE_EXT:
996
   case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
997
      if (base_format == GL_RG ||
998
	  base_format == GL_RGB ||
999
	  base_format == GL_RGBA) {
1000
	 return GL_TRUE;
1001
      }
1002
      return GL_FALSE;
1003
   case GL_TEXTURE_BLUE_SIZE:
1004
   case GL_TEXTURE_BLUE_TYPE:
1005
   case GL_RENDERBUFFER_BLUE_SIZE_EXT:
1006
   case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
1007
      if (base_format == GL_RGB ||
1008
	  base_format == GL_RGBA) {
1009
	 return GL_TRUE;
1010
      }
1011
      return GL_FALSE;
1012
   case GL_TEXTURE_ALPHA_SIZE:
1013
   case GL_TEXTURE_ALPHA_TYPE:
1014
   case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
1015
   case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
1016
      if (base_format == GL_RGBA ||
1017
	  base_format == GL_ALPHA ||
1018
	  base_format == GL_LUMINANCE_ALPHA) {
1019
	 return GL_TRUE;
1020
      }
1021
      return GL_FALSE;
1022
   case GL_TEXTURE_LUMINANCE_SIZE:
1023
   case GL_TEXTURE_LUMINANCE_TYPE:
1024
      if (base_format == GL_LUMINANCE ||
1025
	  base_format == GL_LUMINANCE_ALPHA) {
1026
	 return GL_TRUE;
1027
      }
1028
      return GL_FALSE;
1029
   case GL_TEXTURE_INTENSITY_SIZE:
1030
   case GL_TEXTURE_INTENSITY_TYPE:
1031
      if (base_format == GL_INTENSITY) {
1032
	 return GL_TRUE;
1033
      }
1034
      return GL_FALSE;
1035
   case GL_TEXTURE_DEPTH_SIZE:
1036
   case GL_TEXTURE_DEPTH_TYPE:
1037
   case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
1038
   case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
1039
      if (base_format == GL_DEPTH_STENCIL ||
1040
	  base_format == GL_DEPTH_COMPONENT) {
1041
	 return GL_TRUE;
1042
      }
1043
      return GL_FALSE;
1044
   case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
1045
   case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
1046
      if (base_format == GL_DEPTH_STENCIL ||
1047
	  base_format == GL_STENCIL_INDEX) {
1048
	 return GL_TRUE;
1049
      }
1050
      return GL_FALSE;
1051
   default:
1052
      _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n",
1053
		    __FUNCTION__, pname);
1054
      return GL_FALSE;
1055
   }
1056
 
1057
   return GL_FALSE;
1058
}
1059
 
1060
 
1061
/**
1062
 * Returns the number of channels/components for a base format.
1063
 */
1064
GLint
1065
_mesa_base_format_component_count(GLenum base_format)
1066
{
1067
   switch (base_format) {
1068
   case GL_RED:
1069
   case GL_ALPHA:
1070
   case GL_INTENSITY:
1071
   case GL_DEPTH_COMPONENT:
1072
      return 1;
1073
   case GL_RG:
1074
   case GL_LUMINANCE_ALPHA:
1075
   case GL_DEPTH_STENCIL:
1076
      return 2;
1077
   case GL_RGB:
1078
      return 3;
1079
   case GL_RGBA:
1080
      return 4;
1081
   default:
1082
      return -1;
1083
   }
1084
}
1085
 
1086
 
1087
/**
1088
 * If format is a generic compressed format, return the corresponding
1089
 * non-compressed format.  For other formats, return the format as-is.
1090
 */
1091
GLenum
1092
_mesa_generic_compressed_format_to_uncompressed_format(GLenum format)
1093
{
1094
   switch (format) {
1095
   case GL_COMPRESSED_RED:
1096
      return GL_RED;
1097
   case GL_COMPRESSED_RG:
1098
      return GL_RG;
1099
   case GL_COMPRESSED_RGB:
1100
      return GL_RGB;
1101
   case GL_COMPRESSED_RGBA:
1102
      return GL_RGBA;
1103
   case GL_COMPRESSED_ALPHA:
1104
      return GL_ALPHA;
1105
   case GL_COMPRESSED_LUMINANCE:
1106
      return GL_LUMINANCE;
1107
   case GL_COMPRESSED_LUMINANCE_ALPHA:
1108
      return GL_LUMINANCE_ALPHA;
1109
   case GL_COMPRESSED_INTENSITY:
1110
      return GL_INTENSITY;
1111
   /* sRGB formats */
1112
   case GL_COMPRESSED_SRGB:
1113
      return GL_SRGB;
1114
   case GL_COMPRESSED_SRGB_ALPHA:
1115
      return GL_SRGB_ALPHA;
1116
   case GL_COMPRESSED_SLUMINANCE:
1117
      return GL_SLUMINANCE;
1118
   case GL_COMPRESSED_SLUMINANCE_ALPHA:
1119
      return GL_SLUMINANCE_ALPHA;
1120
   default:
1121
      return format;
1122
   }
1123
}
1124
 
1125
 
1126
/**
1127
 * Return the equivalent non-generic internal format.
1128
 * This is useful for comparing whether two internal formats are equivalent.
1129
 */
1130
GLenum
1131
_mesa_get_nongeneric_internalformat(GLenum format)
1132
{
1133
   switch (format) {
1134
      /* GL 1.1 formats. */
1135
      case 4:
1136
      case GL_RGBA:
1137
         return GL_RGBA8;
1138
 
1139
      case 3:
1140
      case GL_RGB:
1141
         return GL_RGB8;
1142
 
1143
      case 2:
1144
      case GL_LUMINANCE_ALPHA:
1145
         return GL_LUMINANCE8_ALPHA8;
1146
 
1147
      case 1:
1148
      case GL_LUMINANCE:
1149
         return GL_LUMINANCE8;
1150
 
1151
      case GL_ALPHA:
1152
         return GL_ALPHA8;
1153
 
1154
      case GL_INTENSITY:
1155
         return GL_INTENSITY8;
1156
 
1157
      /* GL_ARB_texture_rg */
1158
      case GL_RED:
1159
         return GL_R8;
1160
 
1161
      case GL_RG:
1162
         return GL_RG8;
1163
 
1164
      /* GL_EXT_texture_sRGB */
1165
      case GL_SRGB:
1166
         return GL_SRGB8;
1167
 
1168
      case GL_SRGB_ALPHA:
1169
         return GL_SRGB8_ALPHA8;
1170
 
1171
      case GL_SLUMINANCE:
1172
         return GL_SLUMINANCE8;
1173
 
1174
      case GL_SLUMINANCE_ALPHA:
1175
         return GL_SLUMINANCE8_ALPHA8;
1176
 
1177
      /* GL_EXT_texture_snorm */
1178
      case GL_RGBA_SNORM:
1179
         return GL_RGBA8_SNORM;
1180
 
1181
      case GL_RGB_SNORM:
1182
         return GL_RGB8_SNORM;
1183
 
1184
      case GL_RG_SNORM:
1185
         return GL_RG8_SNORM;
1186
 
1187
      case GL_RED_SNORM:
1188
         return GL_R8_SNORM;
1189
 
1190
      case GL_LUMINANCE_ALPHA_SNORM:
1191
         return GL_LUMINANCE8_ALPHA8_SNORM;
1192
 
1193
      case GL_LUMINANCE_SNORM:
1194
         return GL_LUMINANCE8_SNORM;
1195
 
1196
      case GL_ALPHA_SNORM:
1197
         return GL_ALPHA8_SNORM;
1198
 
1199
      case GL_INTENSITY_SNORM:
1200
         return GL_INTENSITY8_SNORM;
1201
 
1202
      default:
1203
         return format;
1204
   }
1205
}
1206
 
1207
 
1208
/**
1209
 * Convert an sRGB internal format to linear.
1210
 */
1211
GLenum
1212
_mesa_get_linear_internalformat(GLenum format)
1213
{
1214
   switch (format) {
1215
   case GL_SRGB:
1216
      return GL_RGB;
1217
 
1218
   case GL_SRGB_ALPHA:
1219
      return GL_RGBA;
1220
 
1221
   case GL_SRGB8:
1222
      return GL_RGB8;
1223
 
1224
   case GL_SRGB8_ALPHA8:
1225
      return GL_RGBA8;
1226
 
1227
   case GL_SLUMINANCE:
1228
      return GL_LUMINANCE8;
1229
 
1230
   case GL_SLUMINANCE_ALPHA:
1231
      return GL_LUMINANCE8_ALPHA8;
1232
 
1233
   default:
1234
      return format;
1235
   }
1236
}
1237
 
1238
 
1239
/**
1240
 * Do error checking of format/type combinations for glReadPixels,
1241
 * glDrawPixels and glTex[Sub]Image.  Note that depending on the format
1242
 * and type values, we may either generate GL_INVALID_OPERATION or
1243
 * GL_INVALID_ENUM.
1244
 *
1245
 * \param format pixel format.
1246
 * \param type pixel type.
1247
 *
1248
 * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR
1249
 */
1250
GLenum
1251
_mesa_error_check_format_and_type(const struct gl_context *ctx,
1252
                                  GLenum format, GLenum type)
1253
{
1254
   /* special type-based checks (see glReadPixels, glDrawPixels error lists) */
1255
   switch (type) {
1256
   case GL_BITMAP:
1257
      if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) {
1258
         return GL_INVALID_ENUM;
1259
      }
1260
      break;
1261
 
1262
   case GL_UNSIGNED_BYTE_3_3_2:
1263
   case GL_UNSIGNED_BYTE_2_3_3_REV:
1264
   case GL_UNSIGNED_SHORT_5_6_5:
1265
   case GL_UNSIGNED_SHORT_5_6_5_REV:
1266
      if (format == GL_RGB) {
1267
         break; /* OK */
1268
      }
1269
      if (format == GL_RGB_INTEGER_EXT &&
1270
          ctx->Extensions.ARB_texture_rgb10_a2ui) {
1271
         break; /* OK */
1272
      }
1273
      return GL_INVALID_OPERATION;
1274
 
1275
   case GL_UNSIGNED_SHORT_4_4_4_4:
1276
   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1277
   case GL_UNSIGNED_SHORT_5_5_5_1:
1278
   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1279
   case GL_UNSIGNED_INT_8_8_8_8:
1280
   case GL_UNSIGNED_INT_8_8_8_8_REV:
1281
   case GL_UNSIGNED_INT_10_10_10_2:
1282
   case GL_UNSIGNED_INT_2_10_10_10_REV:
1283
      if (format == GL_RGBA ||
1284
          format == GL_BGRA ||
1285
          format == GL_ABGR_EXT) {
1286
         break; /* OK */
1287
      }
1288
      if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) &&
1289
          ctx->Extensions.ARB_texture_rgb10_a2ui) {
1290
         break; /* OK */
1291
      }
1292
      if (type == GL_UNSIGNED_INT_2_10_10_10_REV && format == GL_RGB &&
1293
          ctx->API == API_OPENGLES2) {
1294
         break; /* OK by GL_EXT_texture_type_2_10_10_10_REV */
1295
      }
1296
      return GL_INVALID_OPERATION;
1297
 
1298
   case GL_UNSIGNED_INT_24_8:
1299
      if (!ctx->Extensions.EXT_packed_depth_stencil) {
1300
         return GL_INVALID_ENUM;
1301
      }
1302
      if (format != GL_DEPTH_STENCIL) {
1303
         return GL_INVALID_OPERATION;
1304
      }
1305
      return GL_NO_ERROR;
1306
 
1307
   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
1308
      if (!ctx->Extensions.ARB_depth_buffer_float) {
1309
         return GL_INVALID_ENUM;
1310
      }
1311
      if (format != GL_DEPTH_STENCIL) {
1312
         return GL_INVALID_OPERATION;
1313
      }
1314
      return GL_NO_ERROR;
1315
 
1316
   case GL_UNSIGNED_INT_10F_11F_11F_REV:
1317
      if (!ctx->Extensions.EXT_packed_float) {
1318
         return GL_INVALID_ENUM;
1319
      }
1320
      if (format != GL_RGB) {
1321
         return GL_INVALID_OPERATION;
1322
      }
1323
      return GL_NO_ERROR;
1324
 
1325
   default:
1326
      ; /* fall-through */
1327
   }
1328
 
1329
   /* now, for each format, check the type for compatibility */
1330
   switch (format) {
1331
      case GL_COLOR_INDEX:
1332
      case GL_STENCIL_INDEX:
1333
         switch (type) {
1334
            case GL_BITMAP:
1335
            case GL_BYTE:
1336
            case GL_UNSIGNED_BYTE:
1337
            case GL_SHORT:
1338
            case GL_UNSIGNED_SHORT:
1339
            case GL_INT:
1340
            case GL_UNSIGNED_INT:
1341
            case GL_FLOAT:
1342
               return GL_NO_ERROR;
1343
            case GL_HALF_FLOAT:
1344
               return ctx->Extensions.ARB_half_float_pixel
1345
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1346
            default:
1347
               return GL_INVALID_ENUM;
1348
         }
1349
 
1350
      case GL_RED:
1351
      case GL_GREEN:
1352
      case GL_BLUE:
1353
      case GL_ALPHA:
1354
#if 0 /* not legal!  see table 3.6 of the 1.5 spec */
1355
      case GL_INTENSITY:
1356
#endif
1357
      case GL_LUMINANCE:
1358
      case GL_LUMINANCE_ALPHA:
1359
      case GL_DEPTH_COMPONENT:
1360
         switch (type) {
1361
            case GL_BYTE:
1362
            case GL_UNSIGNED_BYTE:
1363
            case GL_SHORT:
1364
            case GL_UNSIGNED_SHORT:
1365
            case GL_INT:
1366
            case GL_UNSIGNED_INT:
1367
            case GL_FLOAT:
1368
               return GL_NO_ERROR;
1369
            case GL_HALF_FLOAT:
1370
               return ctx->Extensions.ARB_half_float_pixel
1371
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1372
            default:
1373
               return GL_INVALID_ENUM;
1374
         }
1375
 
1376
      case GL_RG:
1377
	 if (!ctx->Extensions.ARB_texture_rg)
1378
	    return GL_INVALID_ENUM;
1379
         switch (type) {
1380
            case GL_BYTE:
1381
            case GL_UNSIGNED_BYTE:
1382
            case GL_SHORT:
1383
            case GL_UNSIGNED_SHORT:
1384
            case GL_INT:
1385
            case GL_UNSIGNED_INT:
1386
            case GL_FLOAT:
1387
               return GL_NO_ERROR;
1388
            case GL_HALF_FLOAT:
1389
               return ctx->Extensions.ARB_half_float_pixel
1390
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1391
            default:
1392
               return GL_INVALID_ENUM;
1393
         }
1394
 
1395
      case GL_RGB:
1396
         switch (type) {
1397
            case GL_BYTE:
1398
            case GL_UNSIGNED_BYTE:
1399
            case GL_SHORT:
1400
            case GL_UNSIGNED_SHORT:
1401
            case GL_INT:
1402
            case GL_UNSIGNED_INT:
1403
            case GL_FLOAT:
1404
            case GL_UNSIGNED_BYTE_3_3_2:
1405
            case GL_UNSIGNED_BYTE_2_3_3_REV:
1406
            case GL_UNSIGNED_SHORT_5_6_5:
1407
            case GL_UNSIGNED_SHORT_5_6_5_REV:
1408
               return GL_NO_ERROR;
1409
            case GL_UNSIGNED_INT_2_10_10_10_REV:
1410
               /* OK by GL_EXT_texture_type_2_10_10_10_REV */
1411
               return (ctx->API == API_OPENGLES2)
1412
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1413
            case GL_HALF_FLOAT:
1414
               return ctx->Extensions.ARB_half_float_pixel
1415
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1416
            case GL_UNSIGNED_INT_5_9_9_9_REV:
1417
               return ctx->Extensions.EXT_texture_shared_exponent
1418
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1419
            case GL_UNSIGNED_INT_10F_11F_11F_REV:
1420
               return ctx->Extensions.EXT_packed_float
1421
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1422
            default:
1423
               return GL_INVALID_ENUM;
1424
         }
1425
 
1426
      case GL_BGR:
1427
         switch (type) {
1428
            /* NOTE: no packed types are supported with BGR.  That's
1429
             * intentional, according to the GL spec.
1430
             */
1431
            case GL_BYTE:
1432
            case GL_UNSIGNED_BYTE:
1433
            case GL_SHORT:
1434
            case GL_UNSIGNED_SHORT:
1435
            case GL_INT:
1436
            case GL_UNSIGNED_INT:
1437
            case GL_FLOAT:
1438
               return GL_NO_ERROR;
1439
            case GL_HALF_FLOAT:
1440
               return ctx->Extensions.ARB_half_float_pixel
1441
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1442
            default:
1443
               return GL_INVALID_ENUM;
1444
         }
1445
 
1446
      case GL_RGBA:
1447
      case GL_BGRA:
1448
      case GL_ABGR_EXT:
1449
         switch (type) {
1450
            case GL_BYTE:
1451
            case GL_UNSIGNED_BYTE:
1452
            case GL_SHORT:
1453
            case GL_UNSIGNED_SHORT:
1454
            case GL_INT:
1455
            case GL_UNSIGNED_INT:
1456
            case GL_FLOAT:
1457
            case GL_UNSIGNED_SHORT_4_4_4_4:
1458
            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1459
            case GL_UNSIGNED_SHORT_5_5_5_1:
1460
            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1461
            case GL_UNSIGNED_INT_8_8_8_8:
1462
            case GL_UNSIGNED_INT_8_8_8_8_REV:
1463
            case GL_UNSIGNED_INT_10_10_10_2:
1464
            case GL_UNSIGNED_INT_2_10_10_10_REV:
1465
               return GL_NO_ERROR;
1466
            case GL_HALF_FLOAT:
1467
               return ctx->Extensions.ARB_half_float_pixel
1468
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1469
            default:
1470
               return GL_INVALID_ENUM;
1471
         }
1472
 
1473
      case GL_YCBCR_MESA:
1474
         if (!ctx->Extensions.MESA_ycbcr_texture)
1475
            return GL_INVALID_ENUM;
1476
         if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
1477
             type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
1478
            return GL_NO_ERROR;
1479
         else
1480
            return GL_INVALID_OPERATION;
1481
 
1482
      case GL_DEPTH_STENCIL_EXT:
1483
         if (ctx->Extensions.EXT_packed_depth_stencil &&
1484
             type == GL_UNSIGNED_INT_24_8)
1485
            return GL_NO_ERROR;
1486
         else if (ctx->Extensions.ARB_depth_buffer_float &&
1487
             type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)
1488
            return GL_NO_ERROR;
1489
         else
1490
            return GL_INVALID_ENUM;
1491
 
1492
      case GL_DUDV_ATI:
1493
      case GL_DU8DV8_ATI:
1494
         if (!ctx->Extensions.ATI_envmap_bumpmap)
1495
            return GL_INVALID_ENUM;
1496
         switch (type) {
1497
            case GL_BYTE:
1498
            case GL_UNSIGNED_BYTE:
1499
            case GL_SHORT:
1500
            case GL_UNSIGNED_SHORT:
1501
            case GL_INT:
1502
            case GL_UNSIGNED_INT:
1503
            case GL_FLOAT:
1504
               return GL_NO_ERROR;
1505
            default:
1506
               return GL_INVALID_ENUM;
1507
         }
1508
 
1509
      /* integer-valued formats */
1510
      case GL_RED_INTEGER_EXT:
1511
      case GL_GREEN_INTEGER_EXT:
1512
      case GL_BLUE_INTEGER_EXT:
1513
      case GL_ALPHA_INTEGER_EXT:
1514
      case GL_RG_INTEGER:
1515
         switch (type) {
1516
            case GL_BYTE:
1517
            case GL_UNSIGNED_BYTE:
1518
            case GL_SHORT:
1519
            case GL_UNSIGNED_SHORT:
1520
            case GL_INT:
1521
            case GL_UNSIGNED_INT:
1522
               return (ctx->Version >= 30 ||
1523
                       ctx->Extensions.EXT_texture_integer)
1524
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1525
            default:
1526
               return GL_INVALID_ENUM;
1527
         }
1528
 
1529
      case GL_RGB_INTEGER_EXT:
1530
         switch (type) {
1531
            case GL_BYTE:
1532
            case GL_UNSIGNED_BYTE:
1533
            case GL_SHORT:
1534
            case GL_UNSIGNED_SHORT:
1535
            case GL_INT:
1536
            case GL_UNSIGNED_INT:
1537
               return (ctx->Version >= 30 ||
1538
                       ctx->Extensions.EXT_texture_integer)
1539
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1540
            case GL_UNSIGNED_BYTE_3_3_2:
1541
            case GL_UNSIGNED_BYTE_2_3_3_REV:
1542
            case GL_UNSIGNED_SHORT_5_6_5:
1543
            case GL_UNSIGNED_SHORT_5_6_5_REV:
1544
               return ctx->Extensions.ARB_texture_rgb10_a2ui
1545
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1546
            default:
1547
               return GL_INVALID_ENUM;
1548
         }
1549
 
1550
      case GL_BGR_INTEGER_EXT:
1551
         switch (type) {
1552
            case GL_BYTE:
1553
            case GL_UNSIGNED_BYTE:
1554
            case GL_SHORT:
1555
            case GL_UNSIGNED_SHORT:
1556
            case GL_INT:
1557
            case GL_UNSIGNED_INT:
1558
            /* NOTE: no packed formats w/ BGR format */
1559
               return (ctx->Version >= 30 ||
1560
                       ctx->Extensions.EXT_texture_integer)
1561
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1562
            default:
1563
               return GL_INVALID_ENUM;
1564
         }
1565
 
1566
      case GL_RGBA_INTEGER_EXT:
1567
      case GL_BGRA_INTEGER_EXT:
1568
         switch (type) {
1569
            case GL_BYTE:
1570
            case GL_UNSIGNED_BYTE:
1571
            case GL_SHORT:
1572
            case GL_UNSIGNED_SHORT:
1573
            case GL_INT:
1574
            case GL_UNSIGNED_INT:
1575
               return (ctx->Version >= 30 ||
1576
                       ctx->Extensions.EXT_texture_integer)
1577
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1578
            case GL_UNSIGNED_SHORT_4_4_4_4:
1579
            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1580
            case GL_UNSIGNED_SHORT_5_5_5_1:
1581
            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1582
            case GL_UNSIGNED_INT_8_8_8_8:
1583
            case GL_UNSIGNED_INT_8_8_8_8_REV:
1584
            case GL_UNSIGNED_INT_10_10_10_2:
1585
            case GL_UNSIGNED_INT_2_10_10_10_REV:
1586
               return ctx->Extensions.ARB_texture_rgb10_a2ui
1587
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1588
            default:
1589
               return GL_INVALID_ENUM;
1590
         }
1591
 
1592
      case GL_LUMINANCE_INTEGER_EXT:
1593
      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1594
         switch (type) {
1595
            case GL_BYTE:
1596
            case GL_UNSIGNED_BYTE:
1597
            case GL_SHORT:
1598
            case GL_UNSIGNED_SHORT:
1599
            case GL_INT:
1600
            case GL_UNSIGNED_INT:
1601
               return ctx->Extensions.EXT_texture_integer
1602
                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1603
            default:
1604
               return GL_INVALID_ENUM;
1605
         }
1606
 
1607
      default:
1608
         return GL_INVALID_ENUM;
1609
   }
1610
   return GL_NO_ERROR;
1611
}
1612
 
1613
 
1614
/**
1615
 * Do error checking of format/type combinations for OpenGL ES glReadPixels
1616
 * and glTex[Sub]Image.
1617
 * \return error code, or GL_NO_ERROR.
1618
 */
1619
GLenum
1620
_mesa_es_error_check_format_and_type(GLenum format, GLenum type,
1621
                                     unsigned dimensions)
1622
{
1623
   GLboolean type_valid = GL_TRUE;
1624
 
1625
   switch (format) {
1626
   case GL_ALPHA:
1627
   case GL_LUMINANCE:
1628
   case GL_LUMINANCE_ALPHA:
1629
      type_valid = (type == GL_UNSIGNED_BYTE
1630
                    || type == GL_FLOAT
1631
                    || type == GL_HALF_FLOAT_OES);
1632
      break;
1633
 
1634
   case GL_RGB:
1635
      type_valid = (type == GL_UNSIGNED_BYTE
1636
                    || type == GL_UNSIGNED_SHORT_5_6_5
1637
                    || type == GL_FLOAT
1638
                    || type == GL_HALF_FLOAT_OES);
1639
      break;
1640
 
1641
   case GL_RGBA:
1642
      type_valid = (type == GL_UNSIGNED_BYTE
1643
                    || type == GL_UNSIGNED_SHORT_4_4_4_4
1644
                    || type == GL_UNSIGNED_SHORT_5_5_5_1
1645
                    || type == GL_FLOAT
1646
                    || type == GL_HALF_FLOAT_OES
1647
                    || type == GL_UNSIGNED_INT_2_10_10_10_REV);
1648
      break;
1649
 
1650
   case GL_DEPTH_COMPONENT:
1651
      /* This format is filtered against invalid dimensionalities elsewhere.
1652
       */
1653
      type_valid = (type == GL_UNSIGNED_SHORT
1654
                    || type == GL_UNSIGNED_INT);
1655
      break;
1656
 
1657
   case GL_DEPTH_STENCIL:
1658
      /* This format is filtered against invalid dimensionalities elsewhere.
1659
       */
1660
      type_valid = (type == GL_UNSIGNED_INT_24_8);
1661
      break;
1662
 
1663
   case GL_BGRA_EXT:
1664
      type_valid = (type == GL_UNSIGNED_BYTE);
1665
 
1666
      /* This feels like a bug in the EXT_texture_format_BGRA8888 spec, but
1667
       * the format does not appear to be allowed for 3D textures in OpenGL
1668
       * ES.
1669
       */
1670
      if (dimensions != 2)
1671
         return GL_INVALID_VALUE;
1672
 
1673
      break;
1674
 
1675
   default:
1676
      return GL_INVALID_VALUE;
1677
   }
1678
 
1679
   return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION;
1680
}
1681
 
1682
 
1683
/**
1684
 * Do error checking of format/type combinations for OpenGL ES 3
1685
 * glTex[Sub]Image.
1686
 * \return error code, or GL_NO_ERROR.
1687
 */
1688
GLenum
1689
_mesa_es3_error_check_format_and_type(GLenum format, GLenum type,
1690
                                      GLenum internalFormat)
1691
{
1692
   GLboolean type_valid = GL_TRUE;
1693
 
1694
   switch (format) {
1695
   case GL_RGBA:
1696
      switch (type) {
1697
      case GL_UNSIGNED_BYTE:
1698
         switch (internalFormat) {
1699
         case GL_RGBA:
1700
         case GL_RGBA8:
1701
         case GL_RGB5_A1:
1702
         case GL_RGBA4:
1703
         case GL_SRGB8_ALPHA8_EXT:
1704
            break;
1705
         default:
1706
            return GL_INVALID_OPERATION;
1707
         }
1708
         break;
1709
 
1710
      case GL_BYTE:
1711
         if (internalFormat != GL_RGBA8_SNORM)
1712
            return GL_INVALID_OPERATION;
1713
         break;
1714
 
1715
      case GL_UNSIGNED_SHORT_4_4_4_4:
1716
         switch (internalFormat) {
1717
         case GL_RGBA:
1718
         case GL_RGBA4:
1719
            break;
1720
         default:
1721
            return GL_INVALID_OPERATION;
1722
         }
1723
         break;
1724
 
1725
      case GL_UNSIGNED_SHORT_5_5_5_1:
1726
         switch (internalFormat) {
1727
         case GL_RGBA:
1728
         case GL_RGB5_A1:
1729
            break;
1730
         default:
1731
            return GL_INVALID_OPERATION;
1732
         }
1733
         break;
1734
 
1735
      case GL_UNSIGNED_INT_2_10_10_10_REV:
1736
         switch (internalFormat) {
1737
         case GL_RGBA: /* GL_EXT_texture_type_2_10_10_10_REV */
1738
         case GL_RGB10_A2:
1739
         case GL_RGB5_A1:
1740
            break;
1741
         default:
1742
            return GL_INVALID_OPERATION;
1743
         }
1744
         break;
1745
 
1746
      case GL_HALF_FLOAT:
1747
         if (internalFormat != GL_RGBA16F)
1748
            return GL_INVALID_OPERATION;
1749
         break;
1750
 
1751
      case GL_FLOAT:
1752
         switch (internalFormat) {
1753
         case GL_RGBA16F:
1754
         case GL_RGBA32F:
1755
            break;
1756
         default:
1757
            return GL_INVALID_OPERATION;
1758
         }
1759
         break;
1760
 
1761
      default:
1762
         return GL_INVALID_OPERATION;
1763
      }
1764
      break;
1765
 
1766
   case GL_RGBA_INTEGER:
1767
      switch (type) {
1768
      case GL_UNSIGNED_BYTE:
1769
         if (internalFormat != GL_RGBA8UI)
1770
            return GL_INVALID_OPERATION;
1771
         break;
1772
 
1773
      case GL_BYTE:
1774
         if (internalFormat != GL_RGBA8I)
1775
            return GL_INVALID_OPERATION;
1776
         break;
1777
 
1778
      case GL_UNSIGNED_SHORT:
1779
         if (internalFormat != GL_RGBA16UI)
1780
            return GL_INVALID_OPERATION;
1781
         break;
1782
 
1783
      case GL_SHORT:
1784
         if (internalFormat != GL_RGBA16I)
1785
            return GL_INVALID_OPERATION;
1786
         break;
1787
 
1788
      case GL_UNSIGNED_INT:
1789
         if (internalFormat != GL_RGBA32UI)
1790
            return GL_INVALID_OPERATION;
1791
         break;
1792
 
1793
      case GL_INT:
1794
         if (internalFormat != GL_RGBA32I)
1795
            return GL_INVALID_OPERATION;
1796
         break;
1797
 
1798
      case GL_UNSIGNED_INT_2_10_10_10_REV:
1799
         if (internalFormat != GL_RGB10_A2UI)
1800
            return GL_INVALID_OPERATION;
1801
         break;
1802
 
1803
      default:
1804
         return GL_INVALID_OPERATION;
1805
      }
1806
      break;
1807
 
1808
   case GL_RGB:
1809
      switch (type) {
1810
      case GL_UNSIGNED_BYTE:
1811
         switch (internalFormat) {
1812
         case GL_RGB:
1813
         case GL_RGB8:
1814
         case GL_RGB565:
1815
         case GL_SRGB8:
1816
            break;
1817
         default:
1818
            return GL_INVALID_OPERATION;
1819
         }
1820
         break;
1821
 
1822
      case GL_BYTE:
1823
         if (internalFormat != GL_RGB8_SNORM)
1824
            return GL_INVALID_OPERATION;
1825
         break;
1826
 
1827
      case GL_UNSIGNED_SHORT_5_6_5:
1828
         switch (internalFormat) {
1829
         case GL_RGB:
1830
         case GL_RGB565:
1831
            break;
1832
         default:
1833
            return GL_INVALID_OPERATION;
1834
         }
1835
         break;
1836
 
1837
      case GL_UNSIGNED_INT_10F_11F_11F_REV:
1838
         if (internalFormat != GL_R11F_G11F_B10F)
1839
            return GL_INVALID_OPERATION;
1840
         break;
1841
 
1842
      case GL_UNSIGNED_INT_5_9_9_9_REV:
1843
         if (internalFormat != GL_RGB9_E5)
1844
            return GL_INVALID_OPERATION;
1845
         break;
1846
 
1847
      case GL_HALF_FLOAT:
1848
         switch (internalFormat) {
1849
         case GL_RGB16F:
1850
         case GL_R11F_G11F_B10F:
1851
         case GL_RGB9_E5:
1852
            break;
1853
         default:
1854
            return GL_INVALID_OPERATION;
1855
         }
1856
         break;
1857
 
1858
      case GL_FLOAT:
1859
         switch (internalFormat) {
1860
         case GL_RGB16F:
1861
         case GL_RGB32F:
1862
         case GL_R11F_G11F_B10F:
1863
         case GL_RGB9_E5:
1864
            break;
1865
         default:
1866
            return GL_INVALID_OPERATION;
1867
         }
1868
         break;
1869
 
1870
      case GL_UNSIGNED_INT_2_10_10_10_REV:
1871
         switch (internalFormat) {
1872
         case GL_RGB: /* GL_EXT_texture_type_2_10_10_10_REV */
1873
            break;
1874
         default:
1875
            return GL_INVALID_OPERATION;
1876
         }
1877
         break;
1878
 
1879
      default:
1880
         return GL_INVALID_OPERATION;
1881
      }
1882
      break;
1883
 
1884
   case GL_RGB_INTEGER:
1885
      switch (type) {
1886
      case GL_UNSIGNED_BYTE:
1887
         if (internalFormat != GL_RGB8UI)
1888
            return GL_INVALID_OPERATION;
1889
         break;
1890
 
1891
      case GL_BYTE:
1892
         if (internalFormat != GL_RGB8I)
1893
            return GL_INVALID_OPERATION;
1894
         break;
1895
 
1896
      case GL_UNSIGNED_SHORT:
1897
         if (internalFormat != GL_RGB16UI)
1898
            return GL_INVALID_OPERATION;
1899
         break;
1900
 
1901
      case GL_SHORT:
1902
         if (internalFormat != GL_RGB16I)
1903
            return GL_INVALID_OPERATION;
1904
         break;
1905
 
1906
      case GL_UNSIGNED_INT:
1907
         if (internalFormat != GL_RGB32UI)
1908
            return GL_INVALID_OPERATION;
1909
         break;
1910
 
1911
      case GL_INT:
1912
         if (internalFormat != GL_RGB32I)
1913
            return GL_INVALID_OPERATION;
1914
         break;
1915
 
1916
      default:
1917
         return GL_INVALID_OPERATION;
1918
      }
1919
      break;
1920
 
1921
   case GL_RG:
1922
      switch (type) {
1923
      case GL_UNSIGNED_BYTE:
1924
         if (internalFormat != GL_RG8)
1925
            return GL_INVALID_OPERATION;
1926
         break;
1927
 
1928
      case GL_BYTE:
1929
         if (internalFormat != GL_RG8_SNORM)
1930
            return GL_INVALID_OPERATION;
1931
         break;
1932
 
1933
      case GL_HALF_FLOAT:
1934
         if (internalFormat != GL_RG16F)
1935
            return GL_INVALID_OPERATION;
1936
         break;
1937
 
1938
      case GL_FLOAT:
1939
         switch (internalFormat) {
1940
         case GL_RG16F:
1941
         case GL_RG32F:
1942
            break;
1943
         default:
1944
            return GL_INVALID_OPERATION;
1945
         }
1946
         break;
1947
 
1948
      default:
1949
         return GL_INVALID_OPERATION;
1950
      }
1951
      break;
1952
 
1953
   case GL_RG_INTEGER:
1954
      switch (type) {
1955
      case GL_UNSIGNED_BYTE:
1956
         if (internalFormat != GL_RG8UI)
1957
            return GL_INVALID_OPERATION;
1958
         break;
1959
 
1960
      case GL_BYTE:
1961
         if (internalFormat != GL_RG8I)
1962
            return GL_INVALID_OPERATION;
1963
         break;
1964
 
1965
      case GL_UNSIGNED_SHORT:
1966
         if (internalFormat != GL_RG16UI)
1967
            return GL_INVALID_OPERATION;
1968
         break;
1969
 
1970
      case GL_SHORT:
1971
         if (internalFormat != GL_RG16I)
1972
            return GL_INVALID_OPERATION;
1973
         break;
1974
 
1975
      case GL_UNSIGNED_INT:
1976
         if (internalFormat != GL_RG32UI)
1977
            return GL_INVALID_OPERATION;
1978
         break;
1979
 
1980
      case GL_INT:
1981
         if (internalFormat != GL_RG32I)
1982
            return GL_INVALID_OPERATION;
1983
         break;
1984
 
1985
      default:
1986
         return GL_INVALID_OPERATION;
1987
      }
1988
      break;
1989
 
1990
   case GL_RED:
1991
      switch (type) {
1992
      case GL_UNSIGNED_BYTE:
1993
         if (internalFormat != GL_R8)
1994
            return GL_INVALID_OPERATION;
1995
         break;
1996
 
1997
      case GL_BYTE:
1998
         if (internalFormat != GL_R8_SNORM)
1999
            return GL_INVALID_OPERATION;
2000
         break;
2001
 
2002
      case GL_HALF_FLOAT:
2003
         if (internalFormat != GL_R16F)
2004
            return GL_INVALID_OPERATION;
2005
         break;
2006
 
2007
      case GL_FLOAT:
2008
         switch (internalFormat) {
2009
         case GL_R16F:
2010
         case GL_R32F:
2011
            break;
2012
         default:
2013
            return GL_INVALID_OPERATION;
2014
         }
2015
         break;
2016
 
2017
      default:
2018
         return GL_INVALID_OPERATION;
2019
      }
2020
      break;
2021
 
2022
   case GL_RED_INTEGER:
2023
      switch (type) {
2024
      case GL_UNSIGNED_BYTE:
2025
         if (internalFormat != GL_R8UI)
2026
            return GL_INVALID_OPERATION;
2027
         break;
2028
 
2029
      case GL_BYTE:
2030
         if (internalFormat != GL_R8I)
2031
            return GL_INVALID_OPERATION;
2032
         break;
2033
 
2034
      case GL_UNSIGNED_SHORT:
2035
         if (internalFormat != GL_R16UI)
2036
            return GL_INVALID_OPERATION;
2037
         break;
2038
 
2039
      case GL_SHORT:
2040
         if (internalFormat != GL_R16I)
2041
            return GL_INVALID_OPERATION;
2042
         break;
2043
 
2044
      case GL_UNSIGNED_INT:
2045
         if (internalFormat != GL_R32UI)
2046
            return GL_INVALID_OPERATION;
2047
         break;
2048
 
2049
      case GL_INT:
2050
         if (internalFormat != GL_R32I)
2051
            return GL_INVALID_OPERATION;
2052
         break;
2053
 
2054
      default:
2055
         return GL_INVALID_OPERATION;
2056
      }
2057
      break;
2058
 
2059
   case GL_DEPTH_COMPONENT:
2060
      switch (type) {
2061
      case GL_UNSIGNED_SHORT:
2062
         if (internalFormat != GL_DEPTH_COMPONENT
2063
             && internalFormat != GL_DEPTH_COMPONENT16)
2064
            return GL_INVALID_OPERATION;
2065
         break;
2066
 
2067
      case GL_UNSIGNED_INT:
2068
         switch (internalFormat) {
2069
         case GL_DEPTH_COMPONENT:
2070
         case GL_DEPTH_COMPONENT16:
2071
         case GL_DEPTH_COMPONENT24:
2072
            break;
2073
         default:
2074
            return GL_INVALID_OPERATION;
2075
         }
2076
         break;
2077
 
2078
      case GL_FLOAT:
2079
         if (internalFormat != GL_DEPTH_COMPONENT32F)
2080
            return GL_INVALID_OPERATION;
2081
         break;
2082
 
2083
      default:
2084
         return GL_INVALID_OPERATION;
2085
      }
2086
      break;
2087
 
2088
   case GL_DEPTH_STENCIL:
2089
      switch (type) {
2090
      case GL_UNSIGNED_INT_24_8:
2091
         if (internalFormat != GL_DEPTH_STENCIL
2092
             && internalFormat != GL_DEPTH24_STENCIL8)
2093
            return GL_INVALID_OPERATION;
2094
         break;
2095
 
2096
      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
2097
         if (internalFormat != GL_DEPTH32F_STENCIL8)
2098
            return GL_INVALID_OPERATION;
2099
         break;
2100
 
2101
      default:
2102
         return GL_INVALID_OPERATION;
2103
      }
2104
      break;
2105
 
2106
   case GL_ALPHA:
2107
   case GL_LUMINANCE:
2108
   case GL_LUMINANCE_ALPHA:
2109
      if (type != GL_UNSIGNED_BYTE || format != internalFormat)
2110
         return GL_INVALID_OPERATION;
2111
      break;
2112
   }
2113
 
2114
   return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION;
2115
}