1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.7
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (c) 2008-2009 VMware, Inc.
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 * BRIAN PAUL 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/**
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file texformat.c
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texture formats.
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Gareth Hughes
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Brian Paul
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "context.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enums.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mfeatures.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texformat.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RETURN_IF_SUPPORTED(f) do {		\
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->TextureFormatSupported[f])		\
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return f;					\
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Choose an appropriate texture format given the format, type and
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * internalFormat parameters passed to glTexImage().
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx  the GL context.
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param internalFormat  user's prefered internal texture format.
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format  incoming image pixel format.
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type  incoming image data type.
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return a pointer to a gl_texture_format object which describes the
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * choosen texture format, or NULL on failure.
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is called via dd_function_table::ChooseTextureFormat.  Hardware drivers
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * will typically override this function with a specialized version.
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLint internalFormat, GLenum format, GLenum type)
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) format;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) type;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (internalFormat) {
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* shallow RGBA formats */
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA:
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA8:
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB5_A1:
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA2:
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444_REV); /* just to test another format*/
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA4:
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* deep RGBA formats */
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB10_A2:
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA12:
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA16:
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* shallow RGB formats */
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB:
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB8:
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R3_G3_B2:
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332);
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV);
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB4:
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB5:
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* deep RGB formats */
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB10:
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB12:
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB16:
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Alpha formats */
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA:
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA4:
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA8:
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA12:
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA16:
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_A16);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Luminance formats */
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE:
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE4:
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8:
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE12:
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16:
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_L16);
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Luminance/Alpha formats */
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE4_ALPHA4:
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL44);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA:
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE6_ALPHA2:
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8_ALPHA8:
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE12_ALPHA4:
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE12_ALPHA12:
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16_ALPHA16:
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL1616);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY:
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY4:
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY8:
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY12:
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY16:
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_I16);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_depth_texture) {
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH_COMPONENT:
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH_COMPONENT24:
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH_COMPONENT32:
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z32);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH_COMPONENT16:
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z16);
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (internalFormat) {
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_ALPHA_ARB:
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_LUMINANCE_ARB:
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_INTENSITY_ARB:
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGB_ARB:
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* We don't use texture compression for 1D and 1D array textures.
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * For 1D textures, compressions doesn't buy us much.
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * For 1D ARRAY textures, there's complicated issues with updating
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * sub-regions on non-block boundaries with glCopyTexSubImage, among
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * other issues.  FWIW, the GL_EXT_texture_array extension prohibits
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * 1D ARRAY textures in S3TC format.
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ctx->Extensions.EXT_texture_compression_s3tc ||
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ctx->Extensions.S3_s3tc)
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ctx->Extensions.TDFX_texture_compression_FXT1)
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RGBA_ARB:
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* We don't use texture compression for 1D and 1D array textures. */
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ctx->Extensions.EXT_texture_compression_s3tc ||
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ctx->Extensions.S3_s3tc)
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ctx->Extensions.TDFX_texture_compression_FXT1)
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_ES2_compatibility) {
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB565:
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.MESA_ycbcr_texture) {
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (internalFormat == GL_YCBCR_MESA) {
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (type == GL_UNSIGNED_SHORT_8_8_MESA)
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_texture_fxt1
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.TDFX_texture_compression_FXT1) {
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGB_FXT1_3DFX:
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGBA_FXT1_3DFX:
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_texture_s3tc
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_compression_s3tc) {
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1);
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5);
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.S3_s3tc) {
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB_S3TC:
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB4_S3TC:
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA_S3TC:
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA4_S3TC:
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_texture_float) {
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_ALPHA16F_ARB:
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_ALPHA32F_ARB:
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE16F_ARB:
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE32F_ARB:
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE_ALPHA16F_ARB:
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE_ALPHA32F_ARB:
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_INTENSITY16F_ARB:
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_INTENSITY32F_ARB:
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB16F_ARB:
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB32F_ARB:
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA16F_ARB:
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA32F_ARB:
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_shared_exponent) {
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB9_E5:
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]);
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return MESA_FORMAT_RGB9_E5_FLOAT;
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_packed_float) {
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_R11F_G11F_B10F:
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]);
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return MESA_FORMAT_R11_G11_B10_FLOAT;
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_packed_depth_stencil) {
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH_STENCIL_EXT:
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH24_STENCIL8_EXT:
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8);
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_depth_buffer_float) {
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH_COMPONENT32F:
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]);
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return MESA_FORMAT_Z32_FLOAT;
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DEPTH32F_STENCIL8:
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]);
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return MESA_FORMAT_Z32_FLOAT_X24S8;
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ATI_envmap_bumpmap) {
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DUDV_ATI:
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_DU8DV8_ATI:
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8);
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_snorm) {
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RED_SNORM:
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_R8_SNORM:
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8);
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RG_SNORM:
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RG8_SNORM:
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB_SNORM:
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB8_SNORM:
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* FALLTHROUGH */
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA_SNORM:
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA8_SNORM:
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_ALPHA_SNORM:
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_ALPHA8_SNORM:
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE_SNORM:
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE8_SNORM:
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE_ALPHA_SNORM:
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE8_ALPHA8_SNORM:
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_INTENSITY_SNORM:
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_INTENSITY8_SNORM:
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_R16_SNORM:
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RG16_SNORM:
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGB16_SNORM:
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* FALLTHROUGH */
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_RGBA16_SNORM:
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_ALPHA16_SNORM:
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16);
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE16_SNORM:
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16);
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* FALLTHROUGH */
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LUMINANCE16_ALPHA16_SNORM:
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616);
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_INTENSITY16_SNORM:
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16);
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fall-through */
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_EXT_texture_sRGB
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_sRGB) {
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_SRGB_EXT:
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_SRGB8_EXT:
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_SRGB_ALPHA_EXT:
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_SRGB8_ALPHA8_EXT:
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_SLUMINANCE_EXT:
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_SLUMINANCE8_EXT:
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_SLUMINANCE_ALPHA_EXT:
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_SLUMINANCE8_ALPHA8_EXT:
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SLUMINANCE_EXT:
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SRGB_EXT:
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_texture_s3tc
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ctx->Extensions.EXT_texture_compression_s3tc)
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SRGB_ALPHA_EXT:
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_texture_s3tc
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ctx->Extensions.EXT_texture_compression_s3tc)
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_texture_s3tc
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ctx->Extensions.EXT_texture_compression_s3tc)
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ctx->Extensions.EXT_texture_compression_s3tc)
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT1);
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ctx->Extensions.EXT_texture_compression_s3tc)
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3);
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ctx->Extensions.EXT_texture_compression_s3tc)
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5);
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* FEATURE_EXT_texture_sRGB */
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_integer) {
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA8UI_EXT:
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT8);
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA16UI_EXT:
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT16);
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA32UI_EXT:
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT32);
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA8I_EXT:
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT8);
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA16I_EXT:
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT16);
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA32I_EXT:
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT32);
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8UI_EXT:
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT8);
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16UI_EXT:
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT16);
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE32UI_EXT:
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT32);
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE8I_EXT:
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT8);
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE16I_EXT:
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT16);
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE32I_EXT:
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT32);
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA8UI_EXT:
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA16UI_EXT:
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA32UI_EXT:
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA8I_EXT:
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT8);
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA16I_EXT:
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT16);
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LUMINANCE_ALPHA32I_EXT:
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT32);
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY8UI_EXT:
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT8);
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY16UI_EXT:
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT16);
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY32UI_EXT:
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT32);
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY8I_EXT:
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT8);
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY16I_EXT:
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT16);
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_INTENSITY32I_EXT:
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32);
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Version >= 30 ||
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Extensions.EXT_texture_integer) {
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB8UI_EXT:
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8);
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB16UI_EXT:
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16);
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB32UI_EXT:
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32);
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB8I_EXT:
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT8);
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB16I_EXT:
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT16);
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB32I_EXT:
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT32);
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA8UI_EXT:
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA16UI_EXT:
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA32UI_EXT:
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA8I_EXT:
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA16I_EXT:
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGBA32I_EXT:
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_texture_rg) {
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R8:
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RED:
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RED:
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16:
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_R16);
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG:
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG8:
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMPRESSED_RG:
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16:
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG1616);
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.ARB_texture_float) {
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16F:
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R32F:
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16F:
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG32F:
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Version >= 30 ||
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (ctx->Extensions.ARB_texture_rg &&
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        ctx->Extensions.EXT_texture_integer)) {
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R8UI:
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8);
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG8UI:
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8);
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16UI:
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16);
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16UI:
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16);
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R32UI:
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32);
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG32UI:
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32);
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R8I:
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT8);
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG8I:
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT8);
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R16I:
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT16);
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG16I:
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT16);
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_R32I:
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT32);
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RG32I:
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT32);
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_texture_rgb10_a2ui) {
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB10_A2UI:
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010_UINT);
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RETURN_IF_SUPPORTED(MESA_FORMAT_ABGR2101010_UINT);
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0).
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_gles(ctx)) {
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BGRA:
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ; /* fallthrough */
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_texture_compression_rgtc) {
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RED_RGTC1:
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SIGNED_RED_RGTC1:
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RED_RGTC1);
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_RG_RGTC2:
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SIGNED_RG_RGTC2:
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_RGTC2);
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_texture_compression_latc) {
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_L_LATC1);
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L_LATC1);
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_LA_LATC2);
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ATI_texture_compression_3dc) {
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.OES_compressed_ETC1_RGB8_texture) {
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (internalFormat) {
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_ETC1_RGB8_OES:
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RETURN_IF_SUPPORTED(MESA_FORMAT_ETC1_RGB8);
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ; /* fallthrough */
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()",
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 _mesa_lookup_enum_by_nr(internalFormat));
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return MESA_FORMAT_NONE;
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
986