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