1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (c) 2008-2009  VMware, Inc.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (c) 2012 Intel Corporation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "context.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glformats.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_type_is_packed(GLenum type)
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (type) {
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE_3_3_2:
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE_2_3_3_REV:
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_UNSIGNED_BYTE_4_4:
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_6_5:
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_6_5_REV:
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_4_4_4_4:
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_5_5_1:
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8:
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8_REV:
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_10_10_10_2:
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_2_10_10_10_REV:
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_8_8_MESA:
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_24_8_EXT:
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_5_9_9_9_REV:
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_10F_11F_11F_REV:
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_FALSE;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the size of a GL data type.
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type GL data type.
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if an invalid type enum.
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_sizeof_type(GLenum type)
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (type) {
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BITMAP:
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE:
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLubyte);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BYTE:
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLbyte);
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT:
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLushort);
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SHORT:
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLshort);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT:
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLuint);
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INT:
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLint);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FLOAT:
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLfloat);
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DOUBLE:
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLdouble);
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_HALF_FLOAT_ARB:
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLhalfARB);
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FIXED:
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLfixed);
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return -1;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Same as _mesa_sizeof_type() but also accepting the packed pixel
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * format data types.
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_sizeof_packed_type(GLenum type)
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (type) {
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BITMAP:
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE:
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLubyte);
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BYTE:
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLbyte);
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT:
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLushort);
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SHORT:
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLshort);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT:
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLuint);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INT:
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLint);
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_HALF_FLOAT_ARB:
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLhalfARB);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FLOAT:
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLfloat);
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE_3_3_2:
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE_2_3_3_REV:
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_UNSIGNED_BYTE_4_4:
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLubyte);
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_6_5:
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_6_5_REV:
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_4_4_4_4:
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_5_5_1:
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_8_8_MESA:
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLushort);
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8:
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8_REV:
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_10_10_10_2:
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_2_10_10_10_REV:
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_24_8_EXT:
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_5_9_9_9_REV:
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_10F_11F_11F_REV:
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return sizeof(GLuint);
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 8;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return -1;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the number of components in a pixel format.
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format pixel format.
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return the number of components in the given format, or -1 if a bad format.
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_components_in_format(GLenum format)
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COLOR_INDEX:
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_STENCIL_INDEX:
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_COMPONENT:
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RED:
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RED_INTEGER_EXT:
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GREEN:
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GREEN_INTEGER_EXT:
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BLUE:
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BLUE_INTEGER_EXT:
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA:
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA_INTEGER_EXT:
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE:
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_INTEGER_EXT:
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY:
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA:
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG:
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_YCBCR_MESA:
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_STENCIL_EXT:
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DUDV_ATI:
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DU8DV8_ATI:
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG_INTEGER:
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 2;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB:
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGR:
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB_INTEGER_EXT:
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGR_INTEGER_EXT:
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 3;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA:
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGRA:
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ABGR_EXT:
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA_INTEGER_EXT:
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGRA_INTEGER_EXT:
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 4;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return -1;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the bytes per pixel of pixel format type pair.
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format pixel format.
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type pixel type.
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return bytes per pixel, or -1 if a bad format or type was given.
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_bytes_per_pixel(GLenum format, GLenum type)
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint comps = _mesa_components_in_format(format);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (comps < 0)
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return -1;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (type) {
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BITMAP:
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;  /* special case */
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BYTE:
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE:
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return comps * sizeof(GLubyte);
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SHORT:
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT:
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return comps * sizeof(GLshort);
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INT:
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT:
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return comps * sizeof(GLint);
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FLOAT:
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return comps * sizeof(GLfloat);
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_HALF_FLOAT_ARB:
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return comps * sizeof(GLhalfARB);
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE_3_3_2:
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE_2_3_3_REV:
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_RGB || format == GL_BGR ||
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return sizeof(GLubyte);
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;  /* error */
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_6_5:
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_6_5_REV:
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_RGB || format == GL_BGR ||
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return sizeof(GLushort);
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;  /* error */
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_4_4_4_4:
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_5_5_1:
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return sizeof(GLushort);
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8:
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8_REV:
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_10_10_10_2:
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_2_10_10_10_REV:
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return sizeof(GLuint);
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_8_8_MESA:
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_YCBCR_MESA)
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return sizeof(GLushort);
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_24_8_EXT:
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_DEPTH_STENCIL_EXT)
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return sizeof(GLuint);
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_5_9_9_9_REV:
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_RGB)
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return sizeof(GLuint);
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_10F_11F_11F_REV:
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_RGB)
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return sizeof(GLuint);
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_DEPTH_STENCIL)
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 8;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return -1;
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if the given format is an integer (non-normalized) format.
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_enum_format_integer(GLenum format)
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* generic integer formats */
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RED_INTEGER_EXT:
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GREEN_INTEGER_EXT:
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BLUE_INTEGER_EXT:
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA_INTEGER_EXT:
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB_INTEGER_EXT:
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA_INTEGER_EXT:
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGR_INTEGER_EXT:
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGRA_INTEGER_EXT:
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_INTEGER_EXT:
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG_INTEGER:
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* specific integer formats */
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA32UI_EXT:
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB32UI_EXT:
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG32UI:
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R32UI:
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA32UI_EXT:
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY32UI_EXT:
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE32UI_EXT:
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA32UI_EXT:
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA16UI_EXT:
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB16UI_EXT:
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG16UI:
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R16UI:
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA16UI_EXT:
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY16UI_EXT:
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE16UI_EXT:
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA16UI_EXT:
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA8UI_EXT:
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB8UI_EXT:
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG8UI:
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R8UI:
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA8UI_EXT:
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY8UI_EXT:
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE8UI_EXT:
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA8UI_EXT:
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA32I_EXT:
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB32I_EXT:
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG32I:
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R32I:
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA32I_EXT:
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY32I_EXT:
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE32I_EXT:
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA32I_EXT:
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA16I_EXT:
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB16I_EXT:
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG16I:
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R16I:
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA16I_EXT:
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY16I_EXT:
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE16I_EXT:
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA16I_EXT:
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA8I_EXT:
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB8I_EXT:
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG8I:
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R8I:
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA8I_EXT:
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTENSITY8I_EXT:
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE8I_EXT:
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA8I_EXT:
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB10_A2UI:
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if the given type is an integer (non-normalized) format.
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_type_integer(GLenum type)
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (type) {
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INT:
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT:
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SHORT:
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT:
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BYTE:
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE:
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if the given format or type is an integer (non-normalized) format.
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern GLboolean
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_enum_format_or_type_integer(GLenum format, GLenum type)
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return _mesa_is_enum_format_integer(format) || _mesa_is_type_integer(type);
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_type_unsigned(GLenum type)
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (type) {
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT:
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8:
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8_REV:
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_10_10_10_2:
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_2_10_10_10_REV:
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT:
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_4_4_4_4:
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_5_5_1:
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_6_5:
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_6_5_REV:
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_8_8_MESA:
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE:
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE_3_3_2:
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE_2_3_3_REV:
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if the given image format is a color/RGBA format (i.e., not color
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * index, depth, stencil, etc).
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format  the image format value (may by an internal texture format)
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_color_format(GLenum format)
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RED:
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_GREEN:
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BLUE:
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA:
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA4:
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA8:
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA12:
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA16:
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE:
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE4:
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8:
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE12:
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16:
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA:
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE4_ALPHA4:
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE6_ALPHA2:
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8_ALPHA8:
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE12_ALPHA4:
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE12_ALPHA12:
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16_ALPHA16:
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY:
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY4:
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY8:
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY12:
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY16:
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R8:
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16:
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG:
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG8:
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16:
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB:
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BGR:
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R3_G3_B2:
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB4:
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB5:
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB565:
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB8:
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB10:
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB12:
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB16:
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ABGR_EXT:
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA:
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BGRA:
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA2:
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA4:
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB5_A1:
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA8:
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB10_A2:
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA12:
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA16:
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* float texture formats */
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA16F_ARB:
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA32F_ARB:
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16F_ARB:
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE32F_ARB:
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA16F_ARB:
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA32F_ARB:
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY16F_ARB:
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY32F_ARB:
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16F:
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R32F:
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16F:
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG32F:
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB16F_ARB:
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB32F_ARB:
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA16F_ARB:
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA32F_ARB:
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* compressed formats */
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_ALPHA:
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_LUMINANCE:
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_LUMINANCE_ALPHA:
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_INTENSITY:
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RED:
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RG:
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGB:
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGBA:
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB_S3TC:
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB4_S3TC:
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA_S3TC:
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA4_S3TC:
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGB_FXT1_3DFX:
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGBA_FXT1_3DFX:
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_EXT_texture_sRGB
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SRGB_EXT:
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SRGB8_EXT:
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SRGB_ALPHA_EXT:
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SRGB8_ALPHA8_EXT:
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SLUMINANCE_ALPHA_EXT:
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SLUMINANCE8_ALPHA8_EXT:
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SLUMINANCE_EXT:
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SLUMINANCE8_EXT:
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_EXT:
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_ALPHA_EXT:
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SLUMINANCE_EXT:
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* FEATURE_EXT_texture_sRGB */
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RED_RGTC1:
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SIGNED_RED_RGTC1:
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RG_RGTC2:
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SIGNED_RG_RGTC2:
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ETC1_RGB8_OES:
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* generic integer formats */
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RED_INTEGER_EXT:
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_GREEN_INTEGER_EXT:
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BLUE_INTEGER_EXT:
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA_INTEGER_EXT:
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB_INTEGER_EXT:
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA_INTEGER_EXT:
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BGR_INTEGER_EXT:
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BGRA_INTEGER_EXT:
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG_INTEGER:
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_INTEGER_EXT:
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* sized integer formats */
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA32UI_EXT:
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB32UI_EXT:
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG32UI:
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R32UI:
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA32UI_EXT:
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY32UI_EXT:
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE32UI_EXT:
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA32UI_EXT:
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA16UI_EXT:
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB16UI_EXT:
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16UI:
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16UI:
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA16UI_EXT:
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY16UI_EXT:
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16UI_EXT:
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA16UI_EXT:
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA8UI_EXT:
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB8UI_EXT:
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG8UI:
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R8UI:
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA8UI_EXT:
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY8UI_EXT:
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8UI_EXT:
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA8UI_EXT:
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA32I_EXT:
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB32I_EXT:
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG32I:
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R32I:
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA32I_EXT:
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY32I_EXT:
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE32I_EXT:
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA32I_EXT:
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA16I_EXT:
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB16I_EXT:
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16I:
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16I:
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA16I_EXT:
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY16I_EXT:
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16I_EXT:
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA16I_EXT:
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA8I_EXT:
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB8I_EXT:
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG8I:
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R8I:
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA8I_EXT:
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY8I_EXT:
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8I_EXT:
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA8I_EXT:
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* signed, normalized texture formats */
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RED_SNORM:
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R8_SNORM:
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16_SNORM:
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG_SNORM:
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG8_SNORM:
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16_SNORM:
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB_SNORM:
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB8_SNORM:
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB16_SNORM:
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA_SNORM:
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA8_SNORM:
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA16_SNORM:
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA_SNORM:
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA8_SNORM:
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA16_SNORM:
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_SNORM:
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8_SNORM:
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16_SNORM:
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA_SNORM:
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8_ALPHA8_SNORM:
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16_ALPHA16_SNORM:
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY_SNORM:
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY8_SNORM:
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY16_SNORM:
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB9_E5:
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R11F_G11F_B10F:
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB10_A2UI:
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_YCBCR_MESA:  /* not considered to be RGB */
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* fall-through */
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if the given image format is a depth component format.
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_depth_format(GLenum format)
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT:
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT16:
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT24:
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT32:
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT32F:
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if the given image format is a stencil format.
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_stencil_format(GLenum format)
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_STENCIL_INDEX:
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if the given image format is a YCbCr format.
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_ycbcr_format(GLenum format)
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_YCBCR_MESA:
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if the given image format is a depth+stencil format.
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_depthstencil_format(GLenum format)
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH24_STENCIL8_EXT:
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_STENCIL_EXT:
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH32F_STENCIL8:
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if the given image format is a depth or stencil format.
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_depth_or_stencil_format(GLenum format)
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT:
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT16:
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT24:
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT32:
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_STENCIL_INDEX:
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_STENCIL_INDEX1_EXT:
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_STENCIL_INDEX4_EXT:
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_STENCIL_INDEX8_EXT:
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_STENCIL_INDEX16_EXT:
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_STENCIL_EXT:
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH24_STENCIL8_EXT:
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT32F:
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH32F_STENCIL8:
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if the given image format is a dudv format.
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_dudv_format(GLenum format)
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DUDV_ATI:
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DU8DV8_ATI:
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if an image format is a supported compressed format.
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format the internal format token provided by the user.
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if compressed, GL_FALSE if uncompressed
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_compressed_format(struct gl_context *ctx, GLenum format)
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ctx->Extensions.EXT_texture_compression_s3tc;
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_is_desktop_gl(ctx)
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         && ctx->Extensions.EXT_texture_compression_s3tc;
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB_S3TC:
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB4_S3TC:
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA_S3TC:
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA4_S3TC:
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_is_desktop_gl(ctx) && ctx->Extensions.S3_s3tc;
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_is_desktop_gl(ctx)
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         && ctx->Extensions.EXT_texture_sRGB
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         && ctx->Extensions.EXT_texture_compression_s3tc;
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RGB_FXT1_3DFX:
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RGBA_FXT1_3DFX:
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_is_desktop_gl(ctx)
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         && ctx->Extensions.TDFX_texture_compression_FXT1;
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RED_RGTC1:
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SIGNED_RED_RGTC1:
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RG_RGTC2:
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SIGNED_RG_RGTC2:
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_is_desktop_gl(ctx)
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         && ctx->Extensions.ARB_texture_compression_rgtc;
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ctx->API == API_OPENGL
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         && ctx->Extensions.EXT_texture_compression_latc;
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ctx->API == API_OPENGL
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         && ctx->Extensions.ATI_texture_compression_3dc;
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ETC1_RGB8_OES:
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_is_gles(ctx)
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         && ctx->Extensions.OES_compressed_ETC1_RGB8_texture;
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_ES
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGB8_OES:
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGBA8_OES:
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_R5_G6_B5_OES:
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGBA4_OES:
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE4_RGB5_A1_OES:
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGB8_OES:
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGBA8_OES:
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_R5_G6_B5_OES:
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGBA4_OES:
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PALETTE8_RGB5_A1_OES:
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ctx->API == API_OPENGLES;
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert various base formats to the cooresponding integer format.
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLenum
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_base_format_to_integer_format(GLenum format)
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch(format) {
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RED:
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RED_INTEGER;
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GREEN:
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_GREEN_INTEGER;
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BLUE:
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_BLUE_INTEGER;
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RG:
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RG_INTEGER;
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB:
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RGB_INTEGER;
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA:
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RGBA_INTEGER;
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGR:
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_BGR_INTEGER;
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BGRA:
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_BGRA_INTEGER;
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA:
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_ALPHA_INTEGER;
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE:
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_LUMINANCE_INTEGER_EXT;
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LUMINANCE_ALPHA:
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_LUMINANCE_ALPHA_INTEGER_EXT;
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return format;
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Does the given base texture/renderbuffer format have the channel
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * named by 'pname'?
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_base_format_has_channel(GLenum base_format, GLenum pname)
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_RED_SIZE:
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_RED_TYPE:
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RENDERBUFFER_RED_SIZE_EXT:
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (base_format == GL_RED ||
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  base_format == GL_RG ||
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  base_format == GL_RGB ||
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  base_format == GL_RGBA) {
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_GREEN_SIZE:
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_GREEN_TYPE:
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RENDERBUFFER_GREEN_SIZE_EXT:
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (base_format == GL_RG ||
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  base_format == GL_RGB ||
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  base_format == GL_RGBA) {
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_BLUE_SIZE:
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_BLUE_TYPE:
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RENDERBUFFER_BLUE_SIZE_EXT:
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (base_format == GL_RGB ||
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  base_format == GL_RGBA) {
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_ALPHA_SIZE:
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_ALPHA_TYPE:
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (base_format == GL_RGBA ||
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  base_format == GL_ALPHA ||
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  base_format == GL_LUMINANCE_ALPHA) {
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_LUMINANCE_SIZE:
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_LUMINANCE_TYPE:
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (base_format == GL_LUMINANCE ||
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  base_format == GL_LUMINANCE_ALPHA) {
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_INTENSITY_SIZE:
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_INTENSITY_TYPE:
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (base_format == GL_INTENSITY) {
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_DEPTH_SIZE:
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_DEPTH_TYPE:
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (base_format == GL_DEPTH_STENCIL ||
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  base_format == GL_DEPTH_COMPONENT) {
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (base_format == GL_DEPTH_STENCIL ||
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  base_format == GL_STENCIL_INDEX) {
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n",
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    __FUNCTION__, pname);
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_FALSE;
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If format is a generic compressed format, return the corresponding
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * non-compressed format.  For other formats, return the format as-is.
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLenum
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_generic_compressed_format_to_uncompressed_format(GLenum format)
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RED:
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RED;
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RG:
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RG;
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RGB:
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RGB;
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_RGBA:
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_RGBA;
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_ALPHA:
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_ALPHA;
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_LUMINANCE:
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_LUMINANCE;
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_LUMINANCE_ALPHA:
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_LUMINANCE_ALPHA;
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_INTENSITY:
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INTENSITY;
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* sRGB formats */
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SRGB:
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_SRGB;
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SRGB_ALPHA:
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_SRGB_ALPHA;
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SLUMINANCE:
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_SLUMINANCE;
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMPRESSED_SLUMINANCE_ALPHA:
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_SLUMINANCE_ALPHA;
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return format;
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do error checking of format/type combinations for glReadPixels,
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glDrawPixels and glTex[Sub]Image.  Note that depending on the format
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and type values, we may either generate GL_INVALID_OPERATION or
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_INVALID_ENUM.
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format pixel format.
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type pixel type.
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLenum
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_error_check_format_and_type(const struct gl_context *ctx,
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  GLenum format, GLenum type)
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* special type-based checks (see glReadPixels, glDrawPixels error lists) */
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (type) {
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BITMAP:
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) {
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_INVALID_ENUM;
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE_3_3_2:
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE_2_3_3_REV:
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_6_5:
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_6_5_REV:
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_RGB) {
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break; /* OK */
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_RGB_INTEGER_EXT &&
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Extensions.ARB_texture_rgb10_a2ui) {
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break; /* OK */
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_OPERATION;
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_4_4_4_4:
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_5_5_5_1:
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8:
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_8_8_8_8_REV:
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_10_10_10_2:
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_2_10_10_10_REV:
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format == GL_RGBA ||
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          format == GL_BGRA ||
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          format == GL_ABGR_EXT) {
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break; /* OK */
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) &&
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Extensions.ARB_texture_rgb10_a2ui) {
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break; /* OK */
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_INVALID_OPERATION;
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_24_8:
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.EXT_packed_depth_stencil) {
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_INVALID_ENUM;
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format != GL_DEPTH_STENCIL) {
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_INVALID_OPERATION;
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_NO_ERROR;
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.ARB_depth_buffer_float) {
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_INVALID_ENUM;
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format != GL_DEPTH_STENCIL) {
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_INVALID_OPERATION;
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_NO_ERROR;
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_10F_11F_11F_REV:
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.EXT_packed_float) {
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_INVALID_ENUM;
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format != GL_RGB) {
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_INVALID_OPERATION;
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_NO_ERROR;
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ; /* fall-through */
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* now, for each format, check the type for compatibility */
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COLOR_INDEX:
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_STENCIL_INDEX:
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BITMAP:
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_FLOAT:
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_NO_ERROR;
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_HALF_FLOAT:
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ctx->Extensions.ARB_half_float_pixel
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RED:
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_GREEN:
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BLUE:
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA:
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 /* not legal!  see table 3.6 of the 1.5 spec */
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY:
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE:
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA:
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_COMPONENT:
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_FLOAT:
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_NO_ERROR;
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_HALF_FLOAT:
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ctx->Extensions.ARB_half_float_pixel
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG:
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (!ctx->Extensions.ARB_texture_rg)
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return GL_INVALID_ENUM;
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_FLOAT:
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_NO_ERROR;
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_HALF_FLOAT:
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ctx->Extensions.ARB_half_float_pixel
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB:
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_FLOAT:
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE_3_3_2:
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE_2_3_3_REV:
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_5_6_5:
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_5_6_5_REV:
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_NO_ERROR;
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_HALF_FLOAT:
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ctx->Extensions.ARB_half_float_pixel
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT_5_9_9_9_REV:
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ctx->Extensions.EXT_texture_shared_exponent
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT_10F_11F_11F_REV:
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ctx->Extensions.EXT_packed_float
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BGR:
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* NOTE: no packed types are supported with BGR.  That's
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * intentional, according to the GL spec.
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             */
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_FLOAT:
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_NO_ERROR;
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_HALF_FLOAT:
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ctx->Extensions.ARB_half_float_pixel
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA:
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BGRA:
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ABGR_EXT:
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_FLOAT:
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_4_4_4_4:
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_5_5_5_1:
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT_8_8_8_8:
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT_8_8_8_8_REV:
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT_10_10_10_2:
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT_2_10_10_10_REV:
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_NO_ERROR;
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_HALF_FLOAT:
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ctx->Extensions.ARB_half_float_pixel
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_YCBCR_MESA:
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!ctx->Extensions.MESA_ycbcr_texture)
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_INVALID_ENUM;
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_NO_ERROR;
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_INVALID_OPERATION;
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DEPTH_STENCIL_EXT:
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Extensions.EXT_packed_depth_stencil &&
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             type == GL_UNSIGNED_INT_24_8)
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_NO_ERROR;
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else if (ctx->Extensions.ARB_depth_buffer_float &&
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_NO_ERROR;
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_INVALID_ENUM;
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DUDV_ATI:
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_DU8DV8_ATI:
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!ctx->Extensions.ATI_envmap_bumpmap)
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GL_INVALID_ENUM;
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_FLOAT:
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_NO_ERROR;
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* integer-valued formats */
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RED_INTEGER_EXT:
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_GREEN_INTEGER_EXT:
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BLUE_INTEGER_EXT:
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA_INTEGER_EXT:
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG_INTEGER:
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return (ctx->Version >= 30 ||
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       ctx->Extensions.EXT_texture_integer)
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB_INTEGER_EXT:
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return (ctx->Version >= 30 ||
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       ctx->Extensions.EXT_texture_integer)
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE_3_3_2:
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE_2_3_3_REV:
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_5_6_5:
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_5_6_5_REV:
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ctx->Extensions.ARB_texture_rgb10_a2ui
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BGR_INTEGER_EXT:
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* NOTE: no packed formats w/ BGR format */
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return (ctx->Version >= 30 ||
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       ctx->Extensions.EXT_texture_integer)
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA_INTEGER_EXT:
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BGRA_INTEGER_EXT:
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return (ctx->Version >= 30 ||
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       ctx->Extensions.EXT_texture_integer)
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_4_4_4_4:
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_5_5_5_1:
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT_8_8_8_8:
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT_8_8_8_8_REV:
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT_10_10_10_2:
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT_2_10_10_10_REV:
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ctx->Extensions.ARB_texture_rgb10_a2ui
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_INTEGER_EXT:
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (type) {
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_BYTE:
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_BYTE:
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_SHORT:
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_SHORT:
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_INT:
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GL_UNSIGNED_INT:
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return ctx->Extensions.EXT_texture_integer
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ? GL_NO_ERROR : GL_INVALID_ENUM;
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return GL_INVALID_ENUM;
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_INVALID_ENUM;
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_NO_ERROR;
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1377