mesa: Give _mesa_format_get_color_encoding a clearer name.
[mesa.git] / src / mesa / state_tracker / st_format.c
1 /**************************************************************************
2 *
3 * Copyright 2007 VMware, Inc.
4 * Copyright (c) 2008-2010 VMware, Inc.
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sub license, and/or sell copies of the Software, and to
12 * permit persons to whom the Software is furnished to do so, subject to
13 * the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial portions
17 * of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 *
27 **************************************************************************/
28
29
30 /**
31 * Mesa / Gallium format conversion and format selection code.
32 * \author Brian Paul
33 */
34
35 #include "main/imports.h"
36 #include "main/context.h"
37 #include "main/enums.h"
38 #include "main/formats.h"
39 #include "main/glformats.h"
40 #include "main/texcompress.h"
41 #include "main/texgetimage.h"
42 #include "main/teximage.h"
43 #include "main/texstore.h"
44 #include "main/image.h"
45 #include "main/macros.h"
46 #include "main/formatquery.h"
47
48 #include "pipe/p_context.h"
49 #include "pipe/p_defines.h"
50 #include "pipe/p_screen.h"
51 #include "util/u_format.h"
52 #include "st_cb_texture.h"
53 #include "st_context.h"
54 #include "st_format.h"
55 #include "st_texture.h"
56
57
58 /**
59 * Translate Mesa format to Gallium format.
60 */
61 enum pipe_format
62 st_mesa_format_to_pipe_format(const struct st_context *st,
63 mesa_format mesaFormat)
64 {
65 struct pipe_screen *screen = st->pipe->screen;
66 bool has_bgra_srgb = screen->is_format_supported(screen,
67 PIPE_FORMAT_B8G8R8A8_SRGB,
68 PIPE_TEXTURE_2D, 0, 0,
69 PIPE_BIND_SAMPLER_VIEW);
70
71 switch (mesaFormat) {
72 case MESA_FORMAT_A8B8G8R8_UNORM:
73 return PIPE_FORMAT_ABGR8888_UNORM;
74 case MESA_FORMAT_R8G8B8A8_UNORM:
75 return PIPE_FORMAT_RGBA8888_UNORM;
76 case MESA_FORMAT_B8G8R8A8_UNORM:
77 return PIPE_FORMAT_BGRA8888_UNORM;
78 case MESA_FORMAT_A8R8G8B8_UNORM:
79 return PIPE_FORMAT_ARGB8888_UNORM;
80 case MESA_FORMAT_X8B8G8R8_UNORM:
81 return PIPE_FORMAT_XBGR8888_UNORM;
82 case MESA_FORMAT_R8G8B8X8_UNORM:
83 return PIPE_FORMAT_RGBX8888_UNORM;
84 case MESA_FORMAT_B8G8R8X8_UNORM:
85 return PIPE_FORMAT_BGRX8888_UNORM;
86 case MESA_FORMAT_X8R8G8B8_UNORM:
87 return PIPE_FORMAT_XRGB8888_UNORM;
88 case MESA_FORMAT_B5G5R5A1_UNORM:
89 return PIPE_FORMAT_B5G5R5A1_UNORM;
90 case MESA_FORMAT_A1B5G5R5_UNORM:
91 return PIPE_FORMAT_A1B5G5R5_UNORM;
92 case MESA_FORMAT_B4G4R4A4_UNORM:
93 return PIPE_FORMAT_B4G4R4A4_UNORM;
94 case MESA_FORMAT_A4B4G4R4_UNORM:
95 return PIPE_FORMAT_A4B4G4R4_UNORM;
96 case MESA_FORMAT_B5G6R5_UNORM:
97 return PIPE_FORMAT_B5G6R5_UNORM;
98 case MESA_FORMAT_B2G3R3_UNORM:
99 return PIPE_FORMAT_B2G3R3_UNORM;
100 case MESA_FORMAT_B10G10R10A2_UNORM:
101 return PIPE_FORMAT_B10G10R10A2_UNORM;
102 case MESA_FORMAT_R10G10B10A2_UNORM:
103 return PIPE_FORMAT_R10G10B10A2_UNORM;
104 case MESA_FORMAT_R10G10B10X2_UNORM:
105 return PIPE_FORMAT_R10G10B10X2_UNORM;
106 case MESA_FORMAT_L4A4_UNORM:
107 return PIPE_FORMAT_L4A4_UNORM;
108 case MESA_FORMAT_L8A8_UNORM:
109 return PIPE_FORMAT_LA88_UNORM;
110 case MESA_FORMAT_A8L8_UNORM:
111 return PIPE_FORMAT_AL88_UNORM;
112 case MESA_FORMAT_L16A16_UNORM:
113 return PIPE_FORMAT_LA1616_UNORM;
114 case MESA_FORMAT_A16L16_UNORM:
115 return PIPE_FORMAT_AL1616_UNORM;
116 case MESA_FORMAT_A_UNORM8:
117 return PIPE_FORMAT_A8_UNORM;
118 case MESA_FORMAT_A_UNORM16:
119 return PIPE_FORMAT_A16_UNORM;
120 case MESA_FORMAT_L_UNORM8:
121 return PIPE_FORMAT_L8_UNORM;
122 case MESA_FORMAT_L_UNORM16:
123 return PIPE_FORMAT_L16_UNORM;
124 case MESA_FORMAT_I_UNORM8:
125 return PIPE_FORMAT_I8_UNORM;
126 case MESA_FORMAT_I_UNORM16:
127 return PIPE_FORMAT_I16_UNORM;
128 case MESA_FORMAT_Z_UNORM16:
129 return PIPE_FORMAT_Z16_UNORM;
130 case MESA_FORMAT_Z_UNORM32:
131 return PIPE_FORMAT_Z32_UNORM;
132 case MESA_FORMAT_S8_UINT_Z24_UNORM:
133 return PIPE_FORMAT_S8_UINT_Z24_UNORM;
134 case MESA_FORMAT_Z24_UNORM_S8_UINT:
135 return PIPE_FORMAT_Z24_UNORM_S8_UINT;
136 case MESA_FORMAT_X8_UINT_Z24_UNORM:
137 return PIPE_FORMAT_X8Z24_UNORM;
138 case MESA_FORMAT_Z24_UNORM_X8_UINT:
139 return PIPE_FORMAT_Z24X8_UNORM;
140 case MESA_FORMAT_S_UINT8:
141 return PIPE_FORMAT_S8_UINT;
142 case MESA_FORMAT_Z_FLOAT32:
143 return PIPE_FORMAT_Z32_FLOAT;
144 case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
145 return PIPE_FORMAT_Z32_FLOAT_S8X24_UINT;
146 case MESA_FORMAT_YCBCR:
147 return PIPE_FORMAT_UYVY;
148 case MESA_FORMAT_YCBCR_REV:
149 return PIPE_FORMAT_YUYV;
150 case MESA_FORMAT_RGB_DXT1:
151 return PIPE_FORMAT_DXT1_RGB;
152 case MESA_FORMAT_RGBA_DXT1:
153 return PIPE_FORMAT_DXT1_RGBA;
154 case MESA_FORMAT_RGBA_DXT3:
155 return PIPE_FORMAT_DXT3_RGBA;
156 case MESA_FORMAT_RGBA_DXT5:
157 return PIPE_FORMAT_DXT5_RGBA;
158 case MESA_FORMAT_SRGB_DXT1:
159 return PIPE_FORMAT_DXT1_SRGB;
160 case MESA_FORMAT_SRGBA_DXT1:
161 return PIPE_FORMAT_DXT1_SRGBA;
162 case MESA_FORMAT_SRGBA_DXT3:
163 return PIPE_FORMAT_DXT3_SRGBA;
164 case MESA_FORMAT_SRGBA_DXT5:
165 return PIPE_FORMAT_DXT5_SRGBA;
166 case MESA_FORMAT_L8A8_SRGB:
167 return PIPE_FORMAT_LA88_SRGB;
168 case MESA_FORMAT_A8L8_SRGB:
169 return PIPE_FORMAT_AL88_SRGB;
170 case MESA_FORMAT_L_SRGB8:
171 return PIPE_FORMAT_L8_SRGB;
172 case MESA_FORMAT_R_SRGB8:
173 return PIPE_FORMAT_R8_SRGB;
174 case MESA_FORMAT_BGR_SRGB8:
175 return PIPE_FORMAT_R8G8B8_SRGB;
176 case MESA_FORMAT_A8B8G8R8_SRGB:
177 return PIPE_FORMAT_ABGR8888_SRGB;
178 case MESA_FORMAT_R8G8B8A8_SRGB:
179 return PIPE_FORMAT_RGBA8888_SRGB;
180 case MESA_FORMAT_B8G8R8A8_SRGB:
181 return PIPE_FORMAT_BGRA8888_SRGB;
182 case MESA_FORMAT_A8R8G8B8_SRGB:
183 return PIPE_FORMAT_ARGB8888_SRGB;
184 case MESA_FORMAT_RGBA_FLOAT32:
185 return PIPE_FORMAT_R32G32B32A32_FLOAT;
186 case MESA_FORMAT_RGBA_FLOAT16:
187 return PIPE_FORMAT_R16G16B16A16_FLOAT;
188 case MESA_FORMAT_RGB_FLOAT32:
189 return PIPE_FORMAT_R32G32B32_FLOAT;
190 case MESA_FORMAT_RGB_FLOAT16:
191 return PIPE_FORMAT_R16G16B16_FLOAT;
192 case MESA_FORMAT_LA_FLOAT32:
193 return PIPE_FORMAT_L32A32_FLOAT;
194 case MESA_FORMAT_LA_FLOAT16:
195 return PIPE_FORMAT_L16A16_FLOAT;
196 case MESA_FORMAT_L_FLOAT32:
197 return PIPE_FORMAT_L32_FLOAT;
198 case MESA_FORMAT_L_FLOAT16:
199 return PIPE_FORMAT_L16_FLOAT;
200 case MESA_FORMAT_A_FLOAT32:
201 return PIPE_FORMAT_A32_FLOAT;
202 case MESA_FORMAT_A_FLOAT16:
203 return PIPE_FORMAT_A16_FLOAT;
204 case MESA_FORMAT_I_FLOAT32:
205 return PIPE_FORMAT_I32_FLOAT;
206 case MESA_FORMAT_I_FLOAT16:
207 return PIPE_FORMAT_I16_FLOAT;
208 case MESA_FORMAT_R_FLOAT32:
209 return PIPE_FORMAT_R32_FLOAT;
210 case MESA_FORMAT_R_FLOAT16:
211 return PIPE_FORMAT_R16_FLOAT;
212 case MESA_FORMAT_RG_FLOAT32:
213 return PIPE_FORMAT_R32G32_FLOAT;
214 case MESA_FORMAT_RG_FLOAT16:
215 return PIPE_FORMAT_R16G16_FLOAT;
216
217 case MESA_FORMAT_R_UNORM8:
218 return PIPE_FORMAT_R8_UNORM;
219 case MESA_FORMAT_R_UNORM16:
220 return PIPE_FORMAT_R16_UNORM;
221 case MESA_FORMAT_R8G8_UNORM:
222 return PIPE_FORMAT_RG88_UNORM;
223 case MESA_FORMAT_G8R8_UNORM:
224 return PIPE_FORMAT_GR88_UNORM;
225 case MESA_FORMAT_R16G16_UNORM:
226 return PIPE_FORMAT_RG1616_UNORM;
227 case MESA_FORMAT_G16R16_UNORM:
228 return PIPE_FORMAT_GR1616_UNORM;
229 case MESA_FORMAT_RGBA_UNORM16:
230 return PIPE_FORMAT_R16G16B16A16_UNORM;
231
232 /* signed int formats */
233 case MESA_FORMAT_A_UINT8:
234 return PIPE_FORMAT_A8_UINT;
235 case MESA_FORMAT_A_UINT16:
236 return PIPE_FORMAT_A16_UINT;
237 case MESA_FORMAT_A_UINT32:
238 return PIPE_FORMAT_A32_UINT;
239
240 case MESA_FORMAT_A_SINT8:
241 return PIPE_FORMAT_A8_SINT;
242 case MESA_FORMAT_A_SINT16:
243 return PIPE_FORMAT_A16_SINT;
244 case MESA_FORMAT_A_SINT32:
245 return PIPE_FORMAT_A32_SINT;
246
247 case MESA_FORMAT_I_UINT8:
248 return PIPE_FORMAT_I8_UINT;
249 case MESA_FORMAT_I_UINT16:
250 return PIPE_FORMAT_I16_UINT;
251 case MESA_FORMAT_I_UINT32:
252 return PIPE_FORMAT_I32_UINT;
253
254 case MESA_FORMAT_I_SINT8:
255 return PIPE_FORMAT_I8_SINT;
256 case MESA_FORMAT_I_SINT16:
257 return PIPE_FORMAT_I16_SINT;
258 case MESA_FORMAT_I_SINT32:
259 return PIPE_FORMAT_I32_SINT;
260
261 case MESA_FORMAT_L_UINT8:
262 return PIPE_FORMAT_L8_UINT;
263 case MESA_FORMAT_L_UINT16:
264 return PIPE_FORMAT_L16_UINT;
265 case MESA_FORMAT_L_UINT32:
266 return PIPE_FORMAT_L32_UINT;
267
268 case MESA_FORMAT_L_SINT8:
269 return PIPE_FORMAT_L8_SINT;
270 case MESA_FORMAT_L_SINT16:
271 return PIPE_FORMAT_L16_SINT;
272 case MESA_FORMAT_L_SINT32:
273 return PIPE_FORMAT_L32_SINT;
274
275 case MESA_FORMAT_LA_UINT8:
276 return PIPE_FORMAT_L8A8_UINT;
277 case MESA_FORMAT_LA_UINT16:
278 return PIPE_FORMAT_L16A16_UINT;
279 case MESA_FORMAT_LA_UINT32:
280 return PIPE_FORMAT_L32A32_UINT;
281
282 case MESA_FORMAT_LA_SINT8:
283 return PIPE_FORMAT_L8A8_SINT;
284 case MESA_FORMAT_LA_SINT16:
285 return PIPE_FORMAT_L16A16_SINT;
286 case MESA_FORMAT_LA_SINT32:
287 return PIPE_FORMAT_L32A32_SINT;
288
289 case MESA_FORMAT_R_SINT8:
290 return PIPE_FORMAT_R8_SINT;
291 case MESA_FORMAT_RG_SINT8:
292 return PIPE_FORMAT_R8G8_SINT;
293 case MESA_FORMAT_RGB_SINT8:
294 return PIPE_FORMAT_R8G8B8_SINT;
295 case MESA_FORMAT_RGBA_SINT8:
296 return PIPE_FORMAT_R8G8B8A8_SINT;
297 case MESA_FORMAT_R_SINT16:
298 return PIPE_FORMAT_R16_SINT;
299 case MESA_FORMAT_RG_SINT16:
300 return PIPE_FORMAT_R16G16_SINT;
301 case MESA_FORMAT_RGB_SINT16:
302 return PIPE_FORMAT_R16G16B16_SINT;
303 case MESA_FORMAT_RGBA_SINT16:
304 return PIPE_FORMAT_R16G16B16A16_SINT;
305 case MESA_FORMAT_R_SINT32:
306 return PIPE_FORMAT_R32_SINT;
307 case MESA_FORMAT_RG_SINT32:
308 return PIPE_FORMAT_R32G32_SINT;
309 case MESA_FORMAT_RGB_SINT32:
310 return PIPE_FORMAT_R32G32B32_SINT;
311 case MESA_FORMAT_RGBA_SINT32:
312 return PIPE_FORMAT_R32G32B32A32_SINT;
313
314 /* unsigned int formats */
315 case MESA_FORMAT_R_UINT8:
316 return PIPE_FORMAT_R8_UINT;
317 case MESA_FORMAT_RG_UINT8:
318 return PIPE_FORMAT_R8G8_UINT;
319 case MESA_FORMAT_RGB_UINT8:
320 return PIPE_FORMAT_R8G8B8_UINT;
321 case MESA_FORMAT_RGBA_UINT8:
322 return PIPE_FORMAT_R8G8B8A8_UINT;
323 case MESA_FORMAT_R_UINT16:
324 return PIPE_FORMAT_R16_UINT;
325 case MESA_FORMAT_RG_UINT16:
326 return PIPE_FORMAT_R16G16_UINT;
327 case MESA_FORMAT_RGB_UINT16:
328 return PIPE_FORMAT_R16G16B16_UINT;
329 case MESA_FORMAT_RGBA_UINT16:
330 return PIPE_FORMAT_R16G16B16A16_UINT;
331 case MESA_FORMAT_R_UINT32:
332 return PIPE_FORMAT_R32_UINT;
333 case MESA_FORMAT_RG_UINT32:
334 return PIPE_FORMAT_R32G32_UINT;
335 case MESA_FORMAT_RGB_UINT32:
336 return PIPE_FORMAT_R32G32B32_UINT;
337 case MESA_FORMAT_RGBA_UINT32:
338 return PIPE_FORMAT_R32G32B32A32_UINT;
339
340 case MESA_FORMAT_R_RGTC1_UNORM:
341 return PIPE_FORMAT_RGTC1_UNORM;
342 case MESA_FORMAT_R_RGTC1_SNORM:
343 return PIPE_FORMAT_RGTC1_SNORM;
344 case MESA_FORMAT_RG_RGTC2_UNORM:
345 return PIPE_FORMAT_RGTC2_UNORM;
346 case MESA_FORMAT_RG_RGTC2_SNORM:
347 return PIPE_FORMAT_RGTC2_SNORM;
348
349 case MESA_FORMAT_L_LATC1_UNORM:
350 return PIPE_FORMAT_LATC1_UNORM;
351 case MESA_FORMAT_L_LATC1_SNORM:
352 return PIPE_FORMAT_LATC1_SNORM;
353 case MESA_FORMAT_LA_LATC2_UNORM:
354 return PIPE_FORMAT_LATC2_UNORM;
355 case MESA_FORMAT_LA_LATC2_SNORM:
356 return PIPE_FORMAT_LATC2_SNORM;
357
358 /* The destination RGBA format mustn't be changed, because it's also
359 * a destination format of the unpack/decompression function. */
360 case MESA_FORMAT_ETC1_RGB8:
361 return st->has_etc1 ? PIPE_FORMAT_ETC1_RGB8 : PIPE_FORMAT_R8G8B8A8_UNORM;
362
363 case MESA_FORMAT_BPTC_RGBA_UNORM:
364 return PIPE_FORMAT_BPTC_RGBA_UNORM;
365 case MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM:
366 return PIPE_FORMAT_BPTC_SRGBA;
367 case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT:
368 return PIPE_FORMAT_BPTC_RGB_FLOAT;
369 case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT:
370 return PIPE_FORMAT_BPTC_RGB_UFLOAT;
371
372 /* signed normalized formats */
373 case MESA_FORMAT_R_SNORM8:
374 return PIPE_FORMAT_R8_SNORM;
375 case MESA_FORMAT_R8G8_SNORM:
376 return PIPE_FORMAT_RG88_SNORM;
377 case MESA_FORMAT_G8R8_SNORM:
378 return PIPE_FORMAT_GR88_SNORM;
379 case MESA_FORMAT_R8G8B8A8_SNORM:
380 return PIPE_FORMAT_RGBA8888_SNORM;
381 case MESA_FORMAT_A8B8G8R8_SNORM:
382 return PIPE_FORMAT_ABGR8888_SNORM;
383
384 case MESA_FORMAT_A_SNORM8:
385 return PIPE_FORMAT_A8_SNORM;
386 case MESA_FORMAT_L_SNORM8:
387 return PIPE_FORMAT_L8_SNORM;
388 case MESA_FORMAT_L8A8_SNORM:
389 return PIPE_FORMAT_LA88_SNORM;
390 case MESA_FORMAT_A8L8_SNORM:
391 return PIPE_FORMAT_AL88_SNORM;
392 case MESA_FORMAT_I_SNORM8:
393 return PIPE_FORMAT_I8_SNORM;
394
395 case MESA_FORMAT_R_SNORM16:
396 return PIPE_FORMAT_R16_SNORM;
397 case MESA_FORMAT_R16G16_SNORM:
398 return PIPE_FORMAT_RG1616_SNORM;
399 case MESA_FORMAT_G16R16_SNORM:
400 return PIPE_FORMAT_GR1616_SNORM;
401 case MESA_FORMAT_RGBA_SNORM16:
402 return PIPE_FORMAT_R16G16B16A16_SNORM;
403
404 case MESA_FORMAT_A_SNORM16:
405 return PIPE_FORMAT_A16_SNORM;
406 case MESA_FORMAT_L_SNORM16:
407 return PIPE_FORMAT_L16_SNORM;
408 case MESA_FORMAT_LA_SNORM16:
409 return PIPE_FORMAT_L16A16_SNORM;
410 case MESA_FORMAT_I_SNORM16:
411 return PIPE_FORMAT_I16_SNORM;
412
413 case MESA_FORMAT_R9G9B9E5_FLOAT:
414 return PIPE_FORMAT_R9G9B9E5_FLOAT;
415 case MESA_FORMAT_R11G11B10_FLOAT:
416 return PIPE_FORMAT_R11G11B10_FLOAT;
417 case MESA_FORMAT_B10G10R10A2_UINT:
418 return PIPE_FORMAT_B10G10R10A2_UINT;
419 case MESA_FORMAT_R10G10B10A2_UINT:
420 return PIPE_FORMAT_R10G10B10A2_UINT;
421
422 case MESA_FORMAT_B4G4R4X4_UNORM:
423 return PIPE_FORMAT_B4G4R4X4_UNORM;
424 case MESA_FORMAT_B5G5R5X1_UNORM:
425 return PIPE_FORMAT_B5G5R5X1_UNORM;
426 case MESA_FORMAT_X1B5G5R5_UNORM:
427 return PIPE_FORMAT_X1B5G5R5_UNORM;
428 case MESA_FORMAT_R8G8B8X8_SNORM:
429 return PIPE_FORMAT_RGBX8888_SNORM;
430 case MESA_FORMAT_X8B8G8R8_SNORM:
431 return PIPE_FORMAT_XBGR8888_SNORM;
432 case MESA_FORMAT_R8G8B8X8_SRGB:
433 return PIPE_FORMAT_RGBX8888_SRGB;
434 case MESA_FORMAT_X8B8G8R8_SRGB:
435 return PIPE_FORMAT_XBGR8888_SRGB;
436 case MESA_FORMAT_RGBX_UINT8:
437 return PIPE_FORMAT_R8G8B8X8_UINT;
438 case MESA_FORMAT_RGBX_SINT8:
439 return PIPE_FORMAT_R8G8B8X8_SINT;
440 case MESA_FORMAT_B10G10R10X2_UNORM:
441 return PIPE_FORMAT_B10G10R10X2_UNORM;
442 case MESA_FORMAT_RGBX_UNORM16:
443 return PIPE_FORMAT_R16G16B16X16_UNORM;
444 case MESA_FORMAT_RGBX_SNORM16:
445 return PIPE_FORMAT_R16G16B16X16_SNORM;
446 case MESA_FORMAT_RGBX_FLOAT16:
447 return PIPE_FORMAT_R16G16B16X16_FLOAT;
448 case MESA_FORMAT_RGBX_UINT16:
449 return PIPE_FORMAT_R16G16B16X16_UINT;
450 case MESA_FORMAT_RGBX_SINT16:
451 return PIPE_FORMAT_R16G16B16X16_SINT;
452 case MESA_FORMAT_RGBX_FLOAT32:
453 return PIPE_FORMAT_R32G32B32X32_FLOAT;
454 case MESA_FORMAT_RGBX_UINT32:
455 return PIPE_FORMAT_R32G32B32X32_UINT;
456 case MESA_FORMAT_RGBX_SINT32:
457 return PIPE_FORMAT_R32G32B32X32_SINT;
458
459 case MESA_FORMAT_B8G8R8X8_SRGB:
460 return PIPE_FORMAT_BGRX8888_SRGB;
461 case MESA_FORMAT_X8R8G8B8_SRGB:
462 return PIPE_FORMAT_XRGB8888_SRGB;
463
464 /* ETC2 formats are emulated as uncompressed ones.
465 * The destination formats mustn't be changed, because they are also
466 * destination formats of the unpack/decompression function. */
467 case MESA_FORMAT_ETC2_RGB8:
468 return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8 : PIPE_FORMAT_R8G8B8A8_UNORM;
469 case MESA_FORMAT_ETC2_SRGB8:
470 return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8 :
471 has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
472 case MESA_FORMAT_ETC2_RGBA8_EAC:
473 return st->has_etc2 ? PIPE_FORMAT_ETC2_RGBA8 : PIPE_FORMAT_R8G8B8A8_UNORM;
474 case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
475 return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGBA8 :
476 has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
477 case MESA_FORMAT_ETC2_R11_EAC:
478 return st->has_etc2 ? PIPE_FORMAT_ETC2_R11_UNORM : PIPE_FORMAT_R16_UNORM;
479 case MESA_FORMAT_ETC2_RG11_EAC:
480 return st->has_etc2 ? PIPE_FORMAT_ETC2_RG11_UNORM : PIPE_FORMAT_R16G16_UNORM;
481 case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
482 return st->has_etc2 ? PIPE_FORMAT_ETC2_R11_SNORM : PIPE_FORMAT_R16_SNORM;
483 case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
484 return st->has_etc2 ? PIPE_FORMAT_ETC2_RG11_SNORM : PIPE_FORMAT_R16G16_SNORM;
485 case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
486 return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8A1 : PIPE_FORMAT_R8G8B8A8_UNORM;
487 case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
488 return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8A1 :
489 has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
490
491 case MESA_FORMAT_RGBA_ASTC_4x4:
492 if (!st->has_astc_2d_ldr)
493 return PIPE_FORMAT_R8G8B8A8_UNORM;
494 return PIPE_FORMAT_ASTC_4x4;
495 case MESA_FORMAT_RGBA_ASTC_5x4:
496 if (!st->has_astc_2d_ldr)
497 return PIPE_FORMAT_R8G8B8A8_UNORM;
498 return PIPE_FORMAT_ASTC_5x4;
499 case MESA_FORMAT_RGBA_ASTC_5x5:
500 if (!st->has_astc_2d_ldr)
501 return PIPE_FORMAT_R8G8B8A8_UNORM;
502 return PIPE_FORMAT_ASTC_5x5;
503 case MESA_FORMAT_RGBA_ASTC_6x5:
504 if (!st->has_astc_2d_ldr)
505 return PIPE_FORMAT_R8G8B8A8_UNORM;
506 return PIPE_FORMAT_ASTC_6x5;
507 case MESA_FORMAT_RGBA_ASTC_6x6:
508 if (!st->has_astc_2d_ldr)
509 return PIPE_FORMAT_R8G8B8A8_UNORM;
510 return PIPE_FORMAT_ASTC_6x6;
511 case MESA_FORMAT_RGBA_ASTC_8x5:
512 if (!st->has_astc_2d_ldr)
513 return PIPE_FORMAT_R8G8B8A8_UNORM;
514 return PIPE_FORMAT_ASTC_8x5;
515 case MESA_FORMAT_RGBA_ASTC_8x6:
516 if (!st->has_astc_2d_ldr)
517 return PIPE_FORMAT_R8G8B8A8_UNORM;
518 return PIPE_FORMAT_ASTC_8x6;
519 case MESA_FORMAT_RGBA_ASTC_8x8:
520 if (!st->has_astc_2d_ldr)
521 return PIPE_FORMAT_R8G8B8A8_UNORM;
522 return PIPE_FORMAT_ASTC_8x8;
523 case MESA_FORMAT_RGBA_ASTC_10x5:
524 if (!st->has_astc_2d_ldr)
525 return PIPE_FORMAT_R8G8B8A8_UNORM;
526 return PIPE_FORMAT_ASTC_10x5;
527 case MESA_FORMAT_RGBA_ASTC_10x6:
528 if (!st->has_astc_2d_ldr)
529 return PIPE_FORMAT_R8G8B8A8_UNORM;
530 return PIPE_FORMAT_ASTC_10x6;
531 case MESA_FORMAT_RGBA_ASTC_10x8:
532 if (!st->has_astc_2d_ldr)
533 return PIPE_FORMAT_R8G8B8A8_UNORM;
534 return PIPE_FORMAT_ASTC_10x8;
535 case MESA_FORMAT_RGBA_ASTC_10x10:
536 if (!st->has_astc_2d_ldr)
537 return PIPE_FORMAT_R8G8B8A8_UNORM;
538 return PIPE_FORMAT_ASTC_10x10;
539 case MESA_FORMAT_RGBA_ASTC_12x10:
540 if (!st->has_astc_2d_ldr)
541 return PIPE_FORMAT_R8G8B8A8_UNORM;
542 return PIPE_FORMAT_ASTC_12x10;
543 case MESA_FORMAT_RGBA_ASTC_12x12:
544 if (!st->has_astc_2d_ldr)
545 return PIPE_FORMAT_R8G8B8A8_UNORM;
546 return PIPE_FORMAT_ASTC_12x12;
547
548 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4:
549 if (!st->has_astc_2d_ldr)
550 return PIPE_FORMAT_R8G8B8A8_SRGB;
551 return PIPE_FORMAT_ASTC_4x4_SRGB;
552 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4:
553 if (!st->has_astc_2d_ldr)
554 return PIPE_FORMAT_R8G8B8A8_SRGB;
555 return PIPE_FORMAT_ASTC_5x4_SRGB;
556 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5:
557 if (!st->has_astc_2d_ldr)
558 return PIPE_FORMAT_R8G8B8A8_SRGB;
559 return PIPE_FORMAT_ASTC_5x5_SRGB;
560 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5:
561 if (!st->has_astc_2d_ldr)
562 return PIPE_FORMAT_R8G8B8A8_SRGB;
563 return PIPE_FORMAT_ASTC_6x5_SRGB;
564 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6:
565 if (!st->has_astc_2d_ldr)
566 return PIPE_FORMAT_R8G8B8A8_SRGB;
567 return PIPE_FORMAT_ASTC_6x6_SRGB;
568 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5:
569 if (!st->has_astc_2d_ldr)
570 return PIPE_FORMAT_R8G8B8A8_SRGB;
571 return PIPE_FORMAT_ASTC_8x5_SRGB;
572 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6:
573 if (!st->has_astc_2d_ldr)
574 return PIPE_FORMAT_R8G8B8A8_SRGB;
575 return PIPE_FORMAT_ASTC_8x6_SRGB;
576 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8:
577 if (!st->has_astc_2d_ldr)
578 return PIPE_FORMAT_R8G8B8A8_SRGB;
579 return PIPE_FORMAT_ASTC_8x8_SRGB;
580 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5:
581 if (!st->has_astc_2d_ldr)
582 return PIPE_FORMAT_R8G8B8A8_SRGB;
583 return PIPE_FORMAT_ASTC_10x5_SRGB;
584 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6:
585 if (!st->has_astc_2d_ldr)
586 return PIPE_FORMAT_R8G8B8A8_SRGB;
587 return PIPE_FORMAT_ASTC_10x6_SRGB;
588 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8:
589 if (!st->has_astc_2d_ldr)
590 return PIPE_FORMAT_R8G8B8A8_SRGB;
591 return PIPE_FORMAT_ASTC_10x8_SRGB;
592 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10:
593 if (!st->has_astc_2d_ldr)
594 return PIPE_FORMAT_R8G8B8A8_SRGB;
595 return PIPE_FORMAT_ASTC_10x10_SRGB;
596 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10:
597 if (!st->has_astc_2d_ldr)
598 return PIPE_FORMAT_R8G8B8A8_SRGB;
599 return PIPE_FORMAT_ASTC_12x10_SRGB;
600 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12:
601 if (!st->has_astc_2d_ldr)
602 return PIPE_FORMAT_R8G8B8A8_SRGB;
603 return PIPE_FORMAT_ASTC_12x12_SRGB;
604
605 case MESA_FORMAT_ATC_RGB:
606 return PIPE_FORMAT_ATC_RGB;
607 case MESA_FORMAT_ATC_RGBA_EXPLICIT:
608 return PIPE_FORMAT_ATC_RGBA_EXPLICIT;
609 case MESA_FORMAT_ATC_RGBA_INTERPOLATED:
610 return PIPE_FORMAT_ATC_RGBA_INTERPOLATED;
611
612 default:
613 return PIPE_FORMAT_NONE;
614 }
615 }
616
617
618 /**
619 * Translate Gallium format to Mesa format.
620 */
621 mesa_format
622 st_pipe_format_to_mesa_format(enum pipe_format format)
623 {
624 switch (format) {
625 case PIPE_FORMAT_ABGR8888_UNORM:
626 return MESA_FORMAT_A8B8G8R8_UNORM;
627 case PIPE_FORMAT_RGBA8888_UNORM:
628 return MESA_FORMAT_R8G8B8A8_UNORM;
629 case PIPE_FORMAT_BGRA8888_UNORM:
630 return MESA_FORMAT_B8G8R8A8_UNORM;
631 case PIPE_FORMAT_ARGB8888_UNORM:
632 return MESA_FORMAT_A8R8G8B8_UNORM;
633 case PIPE_FORMAT_XBGR8888_UNORM:
634 return MESA_FORMAT_X8B8G8R8_UNORM;
635 case PIPE_FORMAT_RGBX8888_UNORM:
636 return MESA_FORMAT_R8G8B8X8_UNORM;
637 case PIPE_FORMAT_BGRX8888_UNORM:
638 return MESA_FORMAT_B8G8R8X8_UNORM;
639 case PIPE_FORMAT_XRGB8888_UNORM:
640 return MESA_FORMAT_X8R8G8B8_UNORM;
641 case PIPE_FORMAT_B5G5R5A1_UNORM:
642 return MESA_FORMAT_B5G5R5A1_UNORM;
643 case PIPE_FORMAT_A1B5G5R5_UNORM:
644 return MESA_FORMAT_A1B5G5R5_UNORM;
645 case PIPE_FORMAT_B4G4R4A4_UNORM:
646 return MESA_FORMAT_B4G4R4A4_UNORM;
647 case PIPE_FORMAT_A4B4G4R4_UNORM:
648 return MESA_FORMAT_A4B4G4R4_UNORM;
649 case PIPE_FORMAT_B5G6R5_UNORM:
650 return MESA_FORMAT_B5G6R5_UNORM;
651 case PIPE_FORMAT_B2G3R3_UNORM:
652 return MESA_FORMAT_B2G3R3_UNORM;
653 case PIPE_FORMAT_B10G10R10A2_UNORM:
654 return MESA_FORMAT_B10G10R10A2_UNORM;
655 case PIPE_FORMAT_R10G10B10A2_UNORM:
656 return MESA_FORMAT_R10G10B10A2_UNORM;
657 case PIPE_FORMAT_R10G10B10X2_UNORM:
658 return MESA_FORMAT_R10G10B10X2_UNORM;
659 case PIPE_FORMAT_L4A4_UNORM:
660 return MESA_FORMAT_L4A4_UNORM;
661 case PIPE_FORMAT_LA88_UNORM:
662 return MESA_FORMAT_L8A8_UNORM;
663 case PIPE_FORMAT_AL88_UNORM:
664 return MESA_FORMAT_A8L8_UNORM;
665 case PIPE_FORMAT_LA1616_UNORM:
666 return MESA_FORMAT_L16A16_UNORM;
667 case PIPE_FORMAT_AL1616_UNORM:
668 return MESA_FORMAT_A16L16_UNORM;
669 case PIPE_FORMAT_A8_UNORM:
670 return MESA_FORMAT_A_UNORM8;
671 case PIPE_FORMAT_A16_UNORM:
672 return MESA_FORMAT_A_UNORM16;
673 case PIPE_FORMAT_L8_UNORM:
674 return MESA_FORMAT_L_UNORM8;
675 case PIPE_FORMAT_L16_UNORM:
676 return MESA_FORMAT_L_UNORM16;
677 case PIPE_FORMAT_I8_UNORM:
678 return MESA_FORMAT_I_UNORM8;
679 case PIPE_FORMAT_I16_UNORM:
680 return MESA_FORMAT_I_UNORM16;
681 case PIPE_FORMAT_S8_UINT:
682 return MESA_FORMAT_S_UINT8;
683
684 case PIPE_FORMAT_R16G16B16A16_UNORM:
685 return MESA_FORMAT_RGBA_UNORM16;
686
687 case PIPE_FORMAT_Z16_UNORM:
688 return MESA_FORMAT_Z_UNORM16;
689 case PIPE_FORMAT_Z32_UNORM:
690 return MESA_FORMAT_Z_UNORM32;
691 case PIPE_FORMAT_S8_UINT_Z24_UNORM:
692 return MESA_FORMAT_S8_UINT_Z24_UNORM;
693 case PIPE_FORMAT_X8Z24_UNORM:
694 return MESA_FORMAT_X8_UINT_Z24_UNORM;
695 case PIPE_FORMAT_Z24X8_UNORM:
696 return MESA_FORMAT_Z24_UNORM_X8_UINT;
697 case PIPE_FORMAT_Z24_UNORM_S8_UINT:
698 return MESA_FORMAT_Z24_UNORM_S8_UINT;
699 case PIPE_FORMAT_Z32_FLOAT:
700 return MESA_FORMAT_Z_FLOAT32;
701 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
702 return MESA_FORMAT_Z32_FLOAT_S8X24_UINT;
703
704 case PIPE_FORMAT_UYVY:
705 return MESA_FORMAT_YCBCR;
706 case PIPE_FORMAT_YUYV:
707 return MESA_FORMAT_YCBCR_REV;
708
709 case PIPE_FORMAT_DXT1_RGB:
710 return MESA_FORMAT_RGB_DXT1;
711 case PIPE_FORMAT_DXT1_RGBA:
712 return MESA_FORMAT_RGBA_DXT1;
713 case PIPE_FORMAT_DXT3_RGBA:
714 return MESA_FORMAT_RGBA_DXT3;
715 case PIPE_FORMAT_DXT5_RGBA:
716 return MESA_FORMAT_RGBA_DXT5;
717 case PIPE_FORMAT_DXT1_SRGB:
718 return MESA_FORMAT_SRGB_DXT1;
719 case PIPE_FORMAT_DXT1_SRGBA:
720 return MESA_FORMAT_SRGBA_DXT1;
721 case PIPE_FORMAT_DXT3_SRGBA:
722 return MESA_FORMAT_SRGBA_DXT3;
723 case PIPE_FORMAT_DXT5_SRGBA:
724 return MESA_FORMAT_SRGBA_DXT5;
725 case PIPE_FORMAT_LA88_SRGB:
726 return MESA_FORMAT_L8A8_SRGB;
727 case PIPE_FORMAT_AL88_SRGB:
728 return MESA_FORMAT_A8L8_SRGB;
729 case PIPE_FORMAT_L8_SRGB:
730 return MESA_FORMAT_L_SRGB8;
731 case PIPE_FORMAT_R8_SRGB:
732 return MESA_FORMAT_R_SRGB8;
733 case PIPE_FORMAT_R8G8B8_SRGB:
734 return MESA_FORMAT_BGR_SRGB8;
735 case PIPE_FORMAT_ABGR8888_SRGB:
736 return MESA_FORMAT_A8B8G8R8_SRGB;
737 case PIPE_FORMAT_RGBA8888_SRGB:
738 return MESA_FORMAT_R8G8B8A8_SRGB;
739 case PIPE_FORMAT_BGRA8888_SRGB:
740 return MESA_FORMAT_B8G8R8A8_SRGB;
741 case PIPE_FORMAT_ARGB8888_SRGB:
742 return MESA_FORMAT_A8R8G8B8_SRGB;
743 case PIPE_FORMAT_R32G32B32A32_FLOAT:
744 return MESA_FORMAT_RGBA_FLOAT32;
745 case PIPE_FORMAT_R16G16B16A16_FLOAT:
746 return MESA_FORMAT_RGBA_FLOAT16;
747 case PIPE_FORMAT_R32G32B32_FLOAT:
748 return MESA_FORMAT_RGB_FLOAT32;
749 case PIPE_FORMAT_R16G16B16_FLOAT:
750 return MESA_FORMAT_RGB_FLOAT16;
751 case PIPE_FORMAT_L32A32_FLOAT:
752 return MESA_FORMAT_LA_FLOAT32;
753 case PIPE_FORMAT_L16A16_FLOAT:
754 return MESA_FORMAT_LA_FLOAT16;
755 case PIPE_FORMAT_L32_FLOAT:
756 return MESA_FORMAT_L_FLOAT32;
757 case PIPE_FORMAT_L16_FLOAT:
758 return MESA_FORMAT_L_FLOAT16;
759 case PIPE_FORMAT_A32_FLOAT:
760 return MESA_FORMAT_A_FLOAT32;
761 case PIPE_FORMAT_A16_FLOAT:
762 return MESA_FORMAT_A_FLOAT16;
763 case PIPE_FORMAT_I32_FLOAT:
764 return MESA_FORMAT_I_FLOAT32;
765 case PIPE_FORMAT_I16_FLOAT:
766 return MESA_FORMAT_I_FLOAT16;
767 case PIPE_FORMAT_R32_FLOAT:
768 return MESA_FORMAT_R_FLOAT32;
769 case PIPE_FORMAT_R16_FLOAT:
770 return MESA_FORMAT_R_FLOAT16;
771 case PIPE_FORMAT_R32G32_FLOAT:
772 return MESA_FORMAT_RG_FLOAT32;
773 case PIPE_FORMAT_R16G16_FLOAT:
774 return MESA_FORMAT_RG_FLOAT16;
775
776 case PIPE_FORMAT_R8_UNORM:
777 return MESA_FORMAT_R_UNORM8;
778 case PIPE_FORMAT_R16_UNORM:
779 return MESA_FORMAT_R_UNORM16;
780 case PIPE_FORMAT_RG88_UNORM:
781 return MESA_FORMAT_R8G8_UNORM;
782 case PIPE_FORMAT_GR88_UNORM:
783 return MESA_FORMAT_G8R8_UNORM;
784 case PIPE_FORMAT_RG1616_UNORM:
785 return MESA_FORMAT_R16G16_UNORM;
786 case PIPE_FORMAT_GR1616_UNORM:
787 return MESA_FORMAT_G16R16_UNORM;
788
789 case PIPE_FORMAT_A8_UINT:
790 return MESA_FORMAT_A_UINT8;
791 case PIPE_FORMAT_A16_UINT:
792 return MESA_FORMAT_A_UINT16;
793 case PIPE_FORMAT_A32_UINT:
794 return MESA_FORMAT_A_UINT32;
795 case PIPE_FORMAT_A8_SINT:
796 return MESA_FORMAT_A_SINT8;
797 case PIPE_FORMAT_A16_SINT:
798 return MESA_FORMAT_A_SINT16;
799 case PIPE_FORMAT_A32_SINT:
800 return MESA_FORMAT_A_SINT32;
801
802 case PIPE_FORMAT_I8_UINT:
803 return MESA_FORMAT_I_UINT8;
804 case PIPE_FORMAT_I16_UINT:
805 return MESA_FORMAT_I_UINT16;
806 case PIPE_FORMAT_I32_UINT:
807 return MESA_FORMAT_I_UINT32;
808 case PIPE_FORMAT_I8_SINT:
809 return MESA_FORMAT_I_SINT8;
810 case PIPE_FORMAT_I16_SINT:
811 return MESA_FORMAT_I_SINT16;
812 case PIPE_FORMAT_I32_SINT:
813 return MESA_FORMAT_I_SINT32;
814
815 case PIPE_FORMAT_L8_UINT:
816 return MESA_FORMAT_L_UINT8;
817 case PIPE_FORMAT_L16_UINT:
818 return MESA_FORMAT_L_UINT16;
819 case PIPE_FORMAT_L32_UINT:
820 return MESA_FORMAT_L_UINT32;
821 case PIPE_FORMAT_L8_SINT:
822 return MESA_FORMAT_L_SINT8;
823 case PIPE_FORMAT_L16_SINT:
824 return MESA_FORMAT_L_SINT16;
825 case PIPE_FORMAT_L32_SINT:
826 return MESA_FORMAT_L_SINT32;
827
828 case PIPE_FORMAT_L8A8_UINT:
829 return MESA_FORMAT_LA_UINT8;
830 case PIPE_FORMAT_L16A16_UINT:
831 return MESA_FORMAT_LA_UINT16;
832 case PIPE_FORMAT_L32A32_UINT:
833 return MESA_FORMAT_LA_UINT32;
834 case PIPE_FORMAT_L8A8_SINT:
835 return MESA_FORMAT_LA_SINT8;
836 case PIPE_FORMAT_L16A16_SINT:
837 return MESA_FORMAT_LA_SINT16;
838 case PIPE_FORMAT_L32A32_SINT:
839 return MESA_FORMAT_LA_SINT32;
840
841 case PIPE_FORMAT_R8_SINT:
842 return MESA_FORMAT_R_SINT8;
843 case PIPE_FORMAT_R8G8_SINT:
844 return MESA_FORMAT_RG_SINT8;
845 case PIPE_FORMAT_R8G8B8_SINT:
846 return MESA_FORMAT_RGB_SINT8;
847 case PIPE_FORMAT_R8G8B8A8_SINT:
848 return MESA_FORMAT_RGBA_SINT8;
849
850 case PIPE_FORMAT_R16_SINT:
851 return MESA_FORMAT_R_SINT16;
852 case PIPE_FORMAT_R16G16_SINT:
853 return MESA_FORMAT_RG_SINT16;
854 case PIPE_FORMAT_R16G16B16_SINT:
855 return MESA_FORMAT_RGB_SINT16;
856 case PIPE_FORMAT_R16G16B16A16_SINT:
857 return MESA_FORMAT_RGBA_SINT16;
858
859 case PIPE_FORMAT_R32_SINT:
860 return MESA_FORMAT_R_SINT32;
861 case PIPE_FORMAT_R32G32_SINT:
862 return MESA_FORMAT_RG_SINT32;
863 case PIPE_FORMAT_R32G32B32_SINT:
864 return MESA_FORMAT_RGB_SINT32;
865 case PIPE_FORMAT_R32G32B32A32_SINT:
866 return MESA_FORMAT_RGBA_SINT32;
867
868 /* unsigned int formats */
869 case PIPE_FORMAT_R8_UINT:
870 return MESA_FORMAT_R_UINT8;
871 case PIPE_FORMAT_R8G8_UINT:
872 return MESA_FORMAT_RG_UINT8;
873 case PIPE_FORMAT_R8G8B8_UINT:
874 return MESA_FORMAT_RGB_UINT8;
875 case PIPE_FORMAT_R8G8B8A8_UINT:
876 return MESA_FORMAT_RGBA_UINT8;
877
878 case PIPE_FORMAT_R16_UINT:
879 return MESA_FORMAT_R_UINT16;
880 case PIPE_FORMAT_R16G16_UINT:
881 return MESA_FORMAT_RG_UINT16;
882 case PIPE_FORMAT_R16G16B16_UINT:
883 return MESA_FORMAT_RGB_UINT16;
884 case PIPE_FORMAT_R16G16B16A16_UINT:
885 return MESA_FORMAT_RGBA_UINT16;
886
887 case PIPE_FORMAT_R32_UINT:
888 return MESA_FORMAT_R_UINT32;
889 case PIPE_FORMAT_R32G32_UINT:
890 return MESA_FORMAT_RG_UINT32;
891 case PIPE_FORMAT_R32G32B32_UINT:
892 return MESA_FORMAT_RGB_UINT32;
893 case PIPE_FORMAT_R32G32B32A32_UINT:
894 return MESA_FORMAT_RGBA_UINT32;
895
896 case PIPE_FORMAT_RGTC1_UNORM:
897 return MESA_FORMAT_R_RGTC1_UNORM;
898 case PIPE_FORMAT_RGTC1_SNORM:
899 return MESA_FORMAT_R_RGTC1_SNORM;
900 case PIPE_FORMAT_RGTC2_UNORM:
901 return MESA_FORMAT_RG_RGTC2_UNORM;
902 case PIPE_FORMAT_RGTC2_SNORM:
903 return MESA_FORMAT_RG_RGTC2_SNORM;
904
905 case PIPE_FORMAT_LATC1_UNORM:
906 return MESA_FORMAT_L_LATC1_UNORM;
907 case PIPE_FORMAT_LATC1_SNORM:
908 return MESA_FORMAT_L_LATC1_SNORM;
909 case PIPE_FORMAT_LATC2_UNORM:
910 return MESA_FORMAT_LA_LATC2_UNORM;
911 case PIPE_FORMAT_LATC2_SNORM:
912 return MESA_FORMAT_LA_LATC2_SNORM;
913
914 case PIPE_FORMAT_ETC1_RGB8:
915 return MESA_FORMAT_ETC1_RGB8;
916
917 case PIPE_FORMAT_BPTC_RGBA_UNORM:
918 return MESA_FORMAT_BPTC_RGBA_UNORM;
919 case PIPE_FORMAT_BPTC_SRGBA:
920 return MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM;
921 case PIPE_FORMAT_BPTC_RGB_FLOAT:
922 return MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT;
923 case PIPE_FORMAT_BPTC_RGB_UFLOAT:
924 return MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT;
925
926 /* signed normalized formats */
927 case PIPE_FORMAT_R8_SNORM:
928 return MESA_FORMAT_R_SNORM8;
929 case PIPE_FORMAT_RG88_SNORM:
930 return MESA_FORMAT_R8G8_SNORM;
931 case PIPE_FORMAT_GR88_SNORM:
932 return MESA_FORMAT_G8R8_SNORM;
933 case PIPE_FORMAT_RGBA8888_SNORM:
934 return MESA_FORMAT_R8G8B8A8_SNORM;
935 case PIPE_FORMAT_ABGR8888_SNORM:
936 return MESA_FORMAT_A8B8G8R8_SNORM;
937
938 case PIPE_FORMAT_A8_SNORM:
939 return MESA_FORMAT_A_SNORM8;
940 case PIPE_FORMAT_L8_SNORM:
941 return MESA_FORMAT_L_SNORM8;
942 case PIPE_FORMAT_LA88_SNORM:
943 return MESA_FORMAT_L8A8_SNORM;
944 case PIPE_FORMAT_AL88_SNORM:
945 return MESA_FORMAT_A8L8_SNORM;
946 case PIPE_FORMAT_I8_SNORM:
947 return MESA_FORMAT_I_SNORM8;
948
949 case PIPE_FORMAT_R16_SNORM:
950 return MESA_FORMAT_R_SNORM16;
951 case PIPE_FORMAT_RG1616_SNORM:
952 return MESA_FORMAT_R16G16_SNORM;
953 case PIPE_FORMAT_GR1616_SNORM:
954 return MESA_FORMAT_G16R16_SNORM;
955 case PIPE_FORMAT_R16G16B16A16_SNORM:
956 return MESA_FORMAT_RGBA_SNORM16;
957
958 case PIPE_FORMAT_A16_SNORM:
959 return MESA_FORMAT_A_SNORM16;
960 case PIPE_FORMAT_L16_SNORM:
961 return MESA_FORMAT_L_SNORM16;
962 case PIPE_FORMAT_L16A16_SNORM:
963 return MESA_FORMAT_LA_SNORM16;
964 case PIPE_FORMAT_I16_SNORM:
965 return MESA_FORMAT_I_SNORM16;
966
967 case PIPE_FORMAT_R9G9B9E5_FLOAT:
968 return MESA_FORMAT_R9G9B9E5_FLOAT;
969 case PIPE_FORMAT_R11G11B10_FLOAT:
970 return MESA_FORMAT_R11G11B10_FLOAT;
971
972 case PIPE_FORMAT_B10G10R10A2_UINT:
973 return MESA_FORMAT_B10G10R10A2_UINT;
974 case PIPE_FORMAT_R10G10B10A2_UINT:
975 return MESA_FORMAT_R10G10B10A2_UINT;
976
977 case PIPE_FORMAT_B4G4R4X4_UNORM:
978 return MESA_FORMAT_B4G4R4X4_UNORM;
979 case PIPE_FORMAT_B5G5R5X1_UNORM:
980 return MESA_FORMAT_B5G5R5X1_UNORM;
981 case PIPE_FORMAT_X1B5G5R5_UNORM:
982 return MESA_FORMAT_X1B5G5R5_UNORM;
983 case PIPE_FORMAT_RGBX8888_SNORM:
984 return MESA_FORMAT_R8G8B8X8_SNORM;
985 case PIPE_FORMAT_XBGR8888_SNORM:
986 return MESA_FORMAT_X8B8G8R8_SNORM;
987 case PIPE_FORMAT_RGBX8888_SRGB:
988 return MESA_FORMAT_R8G8B8X8_SRGB;
989 case PIPE_FORMAT_XBGR8888_SRGB:
990 return MESA_FORMAT_X8B8G8R8_SRGB;
991 case PIPE_FORMAT_R8G8B8X8_UINT:
992 return MESA_FORMAT_RGBX_UINT8;
993 case PIPE_FORMAT_R8G8B8X8_SINT:
994 return MESA_FORMAT_RGBX_SINT8;
995 case PIPE_FORMAT_B10G10R10X2_UNORM:
996 return MESA_FORMAT_B10G10R10X2_UNORM;
997 case PIPE_FORMAT_R16G16B16X16_UNORM:
998 return MESA_FORMAT_RGBX_UNORM16;
999 case PIPE_FORMAT_R16G16B16X16_SNORM:
1000 return MESA_FORMAT_RGBX_SNORM16;
1001 case PIPE_FORMAT_R16G16B16X16_FLOAT:
1002 return MESA_FORMAT_RGBX_FLOAT16;
1003 case PIPE_FORMAT_R16G16B16X16_UINT:
1004 return MESA_FORMAT_RGBX_UINT16;
1005 case PIPE_FORMAT_R16G16B16X16_SINT:
1006 return MESA_FORMAT_RGBX_SINT16;
1007 case PIPE_FORMAT_R32G32B32X32_FLOAT:
1008 return MESA_FORMAT_RGBX_FLOAT32;
1009 case PIPE_FORMAT_R32G32B32X32_UINT:
1010 return MESA_FORMAT_RGBX_UINT32;
1011 case PIPE_FORMAT_R32G32B32X32_SINT:
1012 return MESA_FORMAT_RGBX_SINT32;
1013
1014 case PIPE_FORMAT_BGRX8888_SRGB:
1015 return MESA_FORMAT_B8G8R8X8_SRGB;
1016 case PIPE_FORMAT_XRGB8888_SRGB:
1017 return MESA_FORMAT_X8R8G8B8_SRGB;
1018
1019 case PIPE_FORMAT_ETC2_RGB8:
1020 return MESA_FORMAT_ETC2_RGB8;
1021 case PIPE_FORMAT_ETC2_SRGB8:
1022 return MESA_FORMAT_ETC2_SRGB8;
1023 case PIPE_FORMAT_ETC2_RGB8A1:
1024 return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
1025 case PIPE_FORMAT_ETC2_SRGB8A1:
1026 return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
1027 case PIPE_FORMAT_ETC2_RGBA8:
1028 return MESA_FORMAT_ETC2_RGBA8_EAC;
1029 case PIPE_FORMAT_ETC2_SRGBA8:
1030 return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC;
1031 case PIPE_FORMAT_ETC2_R11_UNORM:
1032 return MESA_FORMAT_ETC2_R11_EAC;
1033 case PIPE_FORMAT_ETC2_R11_SNORM:
1034 return MESA_FORMAT_ETC2_SIGNED_R11_EAC;
1035 case PIPE_FORMAT_ETC2_RG11_UNORM:
1036 return MESA_FORMAT_ETC2_RG11_EAC;
1037 case PIPE_FORMAT_ETC2_RG11_SNORM:
1038 return MESA_FORMAT_ETC2_SIGNED_RG11_EAC;
1039
1040 case PIPE_FORMAT_ASTC_4x4:
1041 return MESA_FORMAT_RGBA_ASTC_4x4;
1042 case PIPE_FORMAT_ASTC_5x4:
1043 return MESA_FORMAT_RGBA_ASTC_5x4;
1044 case PIPE_FORMAT_ASTC_5x5:
1045 return MESA_FORMAT_RGBA_ASTC_5x5;
1046 case PIPE_FORMAT_ASTC_6x5:
1047 return MESA_FORMAT_RGBA_ASTC_6x5;
1048 case PIPE_FORMAT_ASTC_6x6:
1049 return MESA_FORMAT_RGBA_ASTC_6x6;
1050 case PIPE_FORMAT_ASTC_8x5:
1051 return MESA_FORMAT_RGBA_ASTC_8x5;
1052 case PIPE_FORMAT_ASTC_8x6:
1053 return MESA_FORMAT_RGBA_ASTC_8x6;
1054 case PIPE_FORMAT_ASTC_8x8:
1055 return MESA_FORMAT_RGBA_ASTC_8x8;
1056 case PIPE_FORMAT_ASTC_10x5:
1057 return MESA_FORMAT_RGBA_ASTC_10x5;
1058 case PIPE_FORMAT_ASTC_10x6:
1059 return MESA_FORMAT_RGBA_ASTC_10x6;
1060 case PIPE_FORMAT_ASTC_10x8:
1061 return MESA_FORMAT_RGBA_ASTC_10x8;
1062 case PIPE_FORMAT_ASTC_10x10:
1063 return MESA_FORMAT_RGBA_ASTC_10x10;
1064 case PIPE_FORMAT_ASTC_12x10:
1065 return MESA_FORMAT_RGBA_ASTC_12x10;
1066 case PIPE_FORMAT_ASTC_12x12:
1067 return MESA_FORMAT_RGBA_ASTC_12x12;
1068
1069 case PIPE_FORMAT_ASTC_4x4_SRGB:
1070 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4;
1071 case PIPE_FORMAT_ASTC_5x4_SRGB:
1072 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4;
1073 case PIPE_FORMAT_ASTC_5x5_SRGB:
1074 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5;
1075 case PIPE_FORMAT_ASTC_6x5_SRGB:
1076 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5;
1077 case PIPE_FORMAT_ASTC_6x6_SRGB:
1078 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6;
1079 case PIPE_FORMAT_ASTC_8x5_SRGB:
1080 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5;
1081 case PIPE_FORMAT_ASTC_8x6_SRGB:
1082 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6;
1083 case PIPE_FORMAT_ASTC_8x8_SRGB:
1084 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8;
1085 case PIPE_FORMAT_ASTC_10x5_SRGB:
1086 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5;
1087 case PIPE_FORMAT_ASTC_10x6_SRGB:
1088 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6;
1089 case PIPE_FORMAT_ASTC_10x8_SRGB:
1090 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8;
1091 case PIPE_FORMAT_ASTC_10x10_SRGB:
1092 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10;
1093 case PIPE_FORMAT_ASTC_12x10_SRGB:
1094 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10;
1095 case PIPE_FORMAT_ASTC_12x12_SRGB:
1096 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12;
1097
1098 case PIPE_FORMAT_ATC_RGB:
1099 return MESA_FORMAT_ATC_RGB;
1100 case PIPE_FORMAT_ATC_RGBA_EXPLICIT:
1101 return MESA_FORMAT_ATC_RGBA_EXPLICIT;
1102 case PIPE_FORMAT_ATC_RGBA_INTERPOLATED:
1103 return MESA_FORMAT_ATC_RGBA_INTERPOLATED;
1104
1105 default:
1106 return MESA_FORMAT_NONE;
1107 }
1108 }
1109
1110 /**
1111 * Map GL texture formats to Gallium pipe formats.
1112 */
1113 struct format_mapping
1114 {
1115 GLenum glFormats[18]; /**< list of GLenum formats, 0-terminated */
1116 enum pipe_format pipeFormats[14]; /**< list of pipe formats, 0-terminated */
1117 };
1118
1119
1120 #define DEFAULT_RGBA_FORMATS \
1121 PIPE_FORMAT_R8G8B8A8_UNORM, \
1122 PIPE_FORMAT_B8G8R8A8_UNORM, \
1123 PIPE_FORMAT_A8R8G8B8_UNORM, \
1124 PIPE_FORMAT_A8B8G8R8_UNORM, \
1125 0
1126
1127 #define DEFAULT_RGB_FORMATS \
1128 PIPE_FORMAT_R8G8B8X8_UNORM, \
1129 PIPE_FORMAT_B8G8R8X8_UNORM, \
1130 PIPE_FORMAT_X8R8G8B8_UNORM, \
1131 PIPE_FORMAT_X8B8G8R8_UNORM, \
1132 PIPE_FORMAT_B5G6R5_UNORM, \
1133 DEFAULT_RGBA_FORMATS
1134
1135 #define DEFAULT_SRGBA_FORMATS \
1136 PIPE_FORMAT_R8G8B8A8_SRGB, \
1137 PIPE_FORMAT_B8G8R8A8_SRGB, \
1138 PIPE_FORMAT_A8R8G8B8_SRGB, \
1139 PIPE_FORMAT_A8B8G8R8_SRGB, \
1140 0
1141
1142 #define DEFAULT_DEPTH_FORMATS \
1143 PIPE_FORMAT_Z24X8_UNORM, \
1144 PIPE_FORMAT_X8Z24_UNORM, \
1145 PIPE_FORMAT_Z16_UNORM, \
1146 PIPE_FORMAT_Z24_UNORM_S8_UINT, \
1147 PIPE_FORMAT_S8_UINT_Z24_UNORM, \
1148 0
1149
1150 #define DEFAULT_SNORM8_RGBA_FORMATS \
1151 PIPE_FORMAT_R8G8B8A8_SNORM, \
1152 0
1153
1154 #define DEFAULT_UNORM16_RGBA_FORMATS \
1155 PIPE_FORMAT_R16G16B16A16_UNORM, \
1156 DEFAULT_RGBA_FORMATS
1157
1158
1159 /**
1160 * This table maps OpenGL texture format enums to Gallium pipe_format enums.
1161 * Multiple GL enums might map to multiple pipe_formats.
1162 * The first pipe format in the list that's supported is the one that's chosen.
1163 */
1164 static const struct format_mapping format_map[] = {
1165 /* Basic RGB, RGBA formats */
1166 {
1167 { GL_RGB10, 0 },
1168 { PIPE_FORMAT_R10G10B10X2_UNORM, PIPE_FORMAT_B10G10R10X2_UNORM,
1169 PIPE_FORMAT_R10G10B10A2_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
1170 DEFAULT_RGB_FORMATS }
1171 },
1172 {
1173 { GL_RGB10_A2, 0 },
1174 { PIPE_FORMAT_R10G10B10A2_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
1175 DEFAULT_RGBA_FORMATS }
1176 },
1177 {
1178 { 4, GL_RGBA, GL_RGBA8, 0 },
1179 { PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS }
1180 },
1181 {
1182 { GL_BGRA, 0 },
1183 { DEFAULT_RGBA_FORMATS }
1184 },
1185 {
1186 { 3, GL_RGB, GL_RGB8, 0 },
1187 { PIPE_FORMAT_R8G8B8X8_UNORM, DEFAULT_RGB_FORMATS }
1188 },
1189 {
1190 { GL_RGB12, GL_RGB16, 0 },
1191 { PIPE_FORMAT_R16G16B16X16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
1192 DEFAULT_RGB_FORMATS }
1193 },
1194 {
1195 { GL_RGBA12, GL_RGBA16, 0 },
1196 { PIPE_FORMAT_R16G16B16A16_UNORM, DEFAULT_RGBA_FORMATS }
1197 },
1198 {
1199 { GL_RGBA4, GL_RGBA2, 0 },
1200 { PIPE_FORMAT_B4G4R4A4_UNORM, PIPE_FORMAT_A4B4G4R4_UNORM,
1201 DEFAULT_RGBA_FORMATS }
1202 },
1203 {
1204 { GL_RGB5_A1, 0 },
1205 { PIPE_FORMAT_B5G5R5A1_UNORM, PIPE_FORMAT_A1B5G5R5_UNORM,
1206 DEFAULT_RGBA_FORMATS }
1207 },
1208 {
1209 { GL_R3_G3_B2, 0 },
1210 { PIPE_FORMAT_B2G3R3_UNORM, PIPE_FORMAT_B5G6R5_UNORM,
1211 PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGB_FORMATS }
1212 },
1213 {
1214 { GL_RGB4 },
1215 { PIPE_FORMAT_B4G4R4X4_UNORM, PIPE_FORMAT_B4G4R4A4_UNORM,
1216 PIPE_FORMAT_A4B4G4R4_UNORM,
1217 DEFAULT_RGB_FORMATS }
1218 },
1219 {
1220 { GL_RGB5 },
1221 { PIPE_FORMAT_B5G5R5X1_UNORM, PIPE_FORMAT_X1B5G5R5_UNORM,
1222 PIPE_FORMAT_B5G5R5A1_UNORM, PIPE_FORMAT_A1B5G5R5_UNORM,
1223 DEFAULT_RGB_FORMATS }
1224 },
1225 {
1226 { GL_RGB565 },
1227 { PIPE_FORMAT_B5G6R5_UNORM, DEFAULT_RGB_FORMATS }
1228 },
1229
1230 /* basic Alpha formats */
1231 {
1232 { GL_ALPHA12, GL_ALPHA16, 0 },
1233 { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
1234 PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
1235 },
1236 {
1237 { GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_COMPRESSED_ALPHA, 0 },
1238 { PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
1239 },
1240
1241 /* basic Luminance formats */
1242 {
1243 { GL_LUMINANCE12, GL_LUMINANCE16, 0 },
1244 { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
1245 PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
1246 },
1247 {
1248 { 1, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, 0 },
1249 { PIPE_FORMAT_L8_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGB_FORMATS }
1250 },
1251
1252 /* basic Luminance/Alpha formats */
1253 {
1254 { GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,
1255 GL_LUMINANCE16_ALPHA16, 0},
1256 { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
1257 PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
1258 },
1259 {
1260 { 2, GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, 0 },
1261 { PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
1262 },
1263 {
1264 { GL_LUMINANCE4_ALPHA4, 0 },
1265 { PIPE_FORMAT_L4A4_UNORM, PIPE_FORMAT_L8A8_UNORM,
1266 DEFAULT_RGBA_FORMATS }
1267 },
1268
1269 /* basic Intensity formats */
1270 {
1271 { GL_INTENSITY12, GL_INTENSITY16, 0 },
1272 { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
1273 PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
1274 },
1275 {
1276 { GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8,
1277 GL_COMPRESSED_INTENSITY, 0 },
1278 { PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
1279 },
1280
1281 /* YCbCr */
1282 {
1283 { GL_YCBCR_MESA, 0 },
1284 { PIPE_FORMAT_UYVY, PIPE_FORMAT_YUYV, 0 }
1285 },
1286
1287 /* compressed formats */ /* XXX PIPE_BIND_SAMPLER_VIEW only */
1288 {
1289 { GL_COMPRESSED_RGB, 0 },
1290 { PIPE_FORMAT_DXT1_RGB, DEFAULT_RGB_FORMATS }
1291 },
1292 {
1293 { GL_COMPRESSED_RGBA, 0 },
1294 { PIPE_FORMAT_DXT5_RGBA, DEFAULT_RGBA_FORMATS }
1295 },
1296 {
1297 { GL_RGB_S3TC, GL_RGB4_S3TC, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 0 },
1298 { PIPE_FORMAT_DXT1_RGB, 0 }
1299 },
1300 {
1301 { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0 },
1302 { PIPE_FORMAT_DXT1_RGBA, 0 }
1303 },
1304 {
1305 { GL_RGBA_S3TC, GL_RGBA4_S3TC, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0 },
1306 { PIPE_FORMAT_DXT3_RGBA, 0 }
1307 },
1308 {
1309 { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0 },
1310 { PIPE_FORMAT_DXT5_RGBA, 0 }
1311 },
1312
1313 #if 0
1314 {
1315 { GL_COMPRESSED_RGB_FXT1_3DFX, 0 },
1316 { PIPE_FORMAT_RGB_FXT1, 0 }
1317 },
1318 {
1319 { GL_COMPRESSED_RGBA_FXT1_3DFX, 0 },
1320 { PIPE_FORMAT_RGBA_FXT1, 0 }
1321 },
1322 #endif
1323
1324 /* Depth formats */
1325 {
1326 { GL_DEPTH_COMPONENT16, 0 },
1327 { PIPE_FORMAT_Z16_UNORM, DEFAULT_DEPTH_FORMATS }
1328 },
1329 {
1330 { GL_DEPTH_COMPONENT24, 0 },
1331 { PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM,
1332 DEFAULT_DEPTH_FORMATS }
1333 },
1334 {
1335 { GL_DEPTH_COMPONENT32, 0 },
1336 { PIPE_FORMAT_Z32_UNORM, DEFAULT_DEPTH_FORMATS }
1337 },
1338 {
1339 { GL_DEPTH_COMPONENT, 0 },
1340 { DEFAULT_DEPTH_FORMATS }
1341 },
1342 {
1343 { GL_DEPTH_COMPONENT32F, 0 },
1344 { PIPE_FORMAT_Z32_FLOAT, 0 }
1345 },
1346
1347 /* stencil formats */
1348 {
1349 { GL_STENCIL_INDEX, GL_STENCIL_INDEX1_EXT, GL_STENCIL_INDEX4_EXT,
1350 GL_STENCIL_INDEX8_EXT, GL_STENCIL_INDEX16_EXT, 0 },
1351 {
1352 PIPE_FORMAT_S8_UINT, PIPE_FORMAT_Z24_UNORM_S8_UINT,
1353 PIPE_FORMAT_S8_UINT_Z24_UNORM, 0
1354 }
1355 },
1356
1357 /* Depth / Stencil formats */
1358 {
1359 { GL_DEPTH_STENCIL_EXT, GL_DEPTH24_STENCIL8_EXT, 0 },
1360 { PIPE_FORMAT_Z24_UNORM_S8_UINT, PIPE_FORMAT_S8_UINT_Z24_UNORM, 0 }
1361 },
1362 {
1363 { GL_DEPTH32F_STENCIL8, 0 },
1364 { PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, 0 }
1365 },
1366
1367 /* sRGB formats */
1368 {
1369 { GL_SRGB_EXT, GL_SRGB8_EXT, 0 },
1370 { PIPE_FORMAT_R8G8B8X8_SRGB, PIPE_FORMAT_B8G8R8X8_SRGB,
1371 DEFAULT_SRGBA_FORMATS }
1372 },
1373 {
1374 { GL_SRGB_ALPHA_EXT, GL_SRGB8_ALPHA8_EXT, 0 },
1375 { PIPE_FORMAT_R8G8B8A8_SRGB, DEFAULT_SRGBA_FORMATS }
1376 },
1377 {
1378 { GL_COMPRESSED_SRGB_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 0 },
1379 { PIPE_FORMAT_DXT1_SRGB, PIPE_FORMAT_R8G8B8X8_SRGB,
1380 PIPE_FORMAT_B8G8R8X8_SRGB, DEFAULT_SRGBA_FORMATS }
1381 },
1382 {
1383 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0 },
1384 { PIPE_FORMAT_DXT1_SRGBA, 0 }
1385 },
1386 {
1387 { GL_COMPRESSED_SRGB_ALPHA_EXT,
1388 GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0 },
1389 { PIPE_FORMAT_DXT3_SRGBA, DEFAULT_SRGBA_FORMATS }
1390 },
1391 {
1392 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0 },
1393 { PIPE_FORMAT_DXT5_SRGBA, 0 }
1394 },
1395 {
1396 { GL_SLUMINANCE_ALPHA_EXT, GL_SLUMINANCE8_ALPHA8_EXT,
1397 GL_COMPRESSED_SLUMINANCE_ALPHA_EXT, 0 },
1398 { PIPE_FORMAT_L8A8_SRGB, DEFAULT_SRGBA_FORMATS }
1399 },
1400 {
1401 { GL_SLUMINANCE_EXT, GL_SLUMINANCE8_EXT, GL_COMPRESSED_SLUMINANCE_EXT,
1402 0 },
1403 { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS }
1404 },
1405 {
1406 { GL_SR8_EXT, 0 },
1407 { PIPE_FORMAT_R8_SRGB, 0 }
1408 },
1409
1410 /* 16-bit float formats */
1411 {
1412 { GL_RGBA16F_ARB, 0 },
1413 { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1414 },
1415 {
1416 { GL_RGB16F_ARB, 0 },
1417 { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R16G16B16X16_FLOAT,
1418 PIPE_FORMAT_R16G16B16A16_FLOAT,
1419 PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1420 },
1421 {
1422 { GL_LUMINANCE_ALPHA16F_ARB, 0 },
1423 { PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1424 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1425 },
1426 {
1427 { GL_ALPHA16F_ARB, 0 },
1428 { PIPE_FORMAT_A16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
1429 PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1430 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1431 },
1432 {
1433 { GL_INTENSITY16F_ARB, 0 },
1434 { PIPE_FORMAT_I16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
1435 PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1436 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1437 },
1438 {
1439 { GL_LUMINANCE16F_ARB, 0 },
1440 { PIPE_FORMAT_L16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
1441 PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1442 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1443 },
1444 {
1445 { GL_R16F, 0 },
1446 { PIPE_FORMAT_R16_FLOAT, PIPE_FORMAT_R16G16_FLOAT,
1447 PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1448 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1449 },
1450 {
1451 { GL_RG16F, 0 },
1452 { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1453 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1454 },
1455
1456 /* 32-bit float formats */
1457 {
1458 { GL_RGBA32F_ARB, 0 },
1459 { PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1460 },
1461 {
1462 { GL_RGB32F_ARB, 0 },
1463 { PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32X32_FLOAT,
1464 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1465 },
1466 {
1467 { GL_LUMINANCE_ALPHA32F_ARB, 0 },
1468 { PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1469 },
1470 {
1471 { GL_ALPHA32F_ARB, 0 },
1472 { PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1473 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1474 },
1475 {
1476 { GL_INTENSITY32F_ARB, 0 },
1477 { PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1478 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1479 },
1480 {
1481 { GL_LUMINANCE32F_ARB, 0 },
1482 { PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1483 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1484 },
1485 {
1486 { GL_R32F, 0 },
1487 { PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT,
1488 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1489 },
1490 {
1491 { GL_RG32F, 0 },
1492 { PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1493 },
1494
1495 /* R, RG formats */
1496 {
1497 { GL_RED, GL_R8, 0 },
1498 { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1499 },
1500 {
1501 { GL_RG, GL_RG8, 0 },
1502 { PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1503 },
1504 {
1505 { GL_R16, 0 },
1506 { PIPE_FORMAT_R16_UNORM, PIPE_FORMAT_R16G16_UNORM,
1507 DEFAULT_UNORM16_RGBA_FORMATS }
1508 },
1509 {
1510 { GL_RG16, 0 },
1511 { PIPE_FORMAT_R16G16_UNORM, DEFAULT_UNORM16_RGBA_FORMATS }
1512 },
1513
1514 /* compressed R, RG formats */
1515 {
1516 { GL_COMPRESSED_RED, GL_COMPRESSED_RED_RGTC1, 0 },
1517 { PIPE_FORMAT_RGTC1_UNORM, PIPE_FORMAT_R8_UNORM, DEFAULT_RGBA_FORMATS }
1518 },
1519 {
1520 { GL_COMPRESSED_SIGNED_RED_RGTC1, 0 },
1521 { PIPE_FORMAT_RGTC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1522 },
1523 {
1524 { GL_COMPRESSED_RG, GL_COMPRESSED_RG_RGTC2, 0 },
1525 { PIPE_FORMAT_RGTC2_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1526 },
1527 {
1528 { GL_COMPRESSED_SIGNED_RG_RGTC2, 0 },
1529 { PIPE_FORMAT_RGTC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1530 },
1531 {
1532 { GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_LATC1_EXT, 0 },
1533 { PIPE_FORMAT_LATC1_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGBA_FORMATS }
1534 },
1535 {
1536 { GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT, 0 },
1537 { PIPE_FORMAT_LATC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1538 },
1539 {
1540 { GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT,
1541 GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0 },
1542 { PIPE_FORMAT_LATC2_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
1543 },
1544 {
1545 { GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT, 0 },
1546 { PIPE_FORMAT_LATC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1547 },
1548
1549 /* ETC1 */
1550 {
1551 { GL_ETC1_RGB8_OES, 0 },
1552 { PIPE_FORMAT_ETC1_RGB8, 0 }
1553 },
1554
1555 /* ETC2 */
1556 {
1557 { GL_COMPRESSED_RGB8_ETC2, 0 },
1558 { PIPE_FORMAT_ETC2_RGB8, 0 }
1559 },
1560 {
1561 { GL_COMPRESSED_SRGB8_ETC2, 0 },
1562 { PIPE_FORMAT_ETC2_SRGB8, 0 }
1563 },
1564 {
1565 { GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 0 },
1566 { PIPE_FORMAT_ETC2_RGB8A1, 0 }
1567 },
1568 {
1569 { GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 0 },
1570 { PIPE_FORMAT_ETC2_SRGB8A1, 0 }
1571 },
1572 {
1573 { GL_COMPRESSED_RGBA8_ETC2_EAC, 0 },
1574 { PIPE_FORMAT_ETC2_RGBA8, 0 }
1575 },
1576 {
1577 { GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 0 },
1578 { PIPE_FORMAT_ETC2_SRGBA8, 0 }
1579 },
1580 {
1581 { GL_COMPRESSED_R11_EAC, 0 },
1582 { PIPE_FORMAT_ETC2_R11_UNORM, 0 }
1583 },
1584 {
1585 { GL_COMPRESSED_SIGNED_R11_EAC, 0 },
1586 { PIPE_FORMAT_ETC2_R11_SNORM, 0 }
1587 },
1588 {
1589 { GL_COMPRESSED_RG11_EAC, 0 },
1590 { PIPE_FORMAT_ETC2_RG11_UNORM, 0 }
1591 },
1592 {
1593 { GL_COMPRESSED_SIGNED_RG11_EAC, 0 },
1594 { PIPE_FORMAT_ETC2_RG11_SNORM, 0 }
1595 },
1596
1597 /* BPTC */
1598 {
1599 { GL_COMPRESSED_RGBA_BPTC_UNORM, 0 },
1600 { PIPE_FORMAT_BPTC_RGBA_UNORM, 0 },
1601 },
1602 {
1603 { GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM, 0 },
1604 { PIPE_FORMAT_BPTC_SRGBA, 0 },
1605 },
1606 {
1607 { GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT, 0 },
1608 { PIPE_FORMAT_BPTC_RGB_FLOAT, 0 },
1609 },
1610 {
1611 { GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT, 0 },
1612 { PIPE_FORMAT_BPTC_RGB_UFLOAT, 0 },
1613 },
1614
1615 /* ASTC */
1616 {
1617 { GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 0 },
1618 { PIPE_FORMAT_ASTC_4x4, 0},
1619 },
1620 {
1621 { GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 0 },
1622 { PIPE_FORMAT_ASTC_5x4, 0},
1623 },
1624 {
1625 { GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 0 },
1626 { PIPE_FORMAT_ASTC_5x5, 0},
1627 },
1628 {
1629 { GL_COMPRESSED_RGBA_ASTC_6x5_KHR, 0 },
1630 { PIPE_FORMAT_ASTC_6x5, 0},
1631 },
1632 {
1633 { GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 0 },
1634 { PIPE_FORMAT_ASTC_6x6, 0},
1635 },
1636 {
1637 { GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 0 },
1638 { PIPE_FORMAT_ASTC_8x5, 0},
1639 },
1640 {
1641 { GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 0 },
1642 { PIPE_FORMAT_ASTC_8x6, 0},
1643 },
1644 {
1645 { GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 0 },
1646 { PIPE_FORMAT_ASTC_8x8, 0},
1647 },
1648 {
1649 { GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 0 },
1650 { PIPE_FORMAT_ASTC_10x5, 0},
1651 },
1652 {
1653 { GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 0 },
1654 { PIPE_FORMAT_ASTC_10x6, 0},
1655 },
1656 {
1657 { GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 0 },
1658 { PIPE_FORMAT_ASTC_10x8, 0},
1659 },
1660 {
1661 { GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 0 },
1662 { PIPE_FORMAT_ASTC_10x10, 0},
1663 },
1664 {
1665 { GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 0 },
1666 { PIPE_FORMAT_ASTC_12x10, 0},
1667 },
1668 {
1669 { GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 0 },
1670 { PIPE_FORMAT_ASTC_12x12, 0},
1671 },
1672
1673 {
1674 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 0 },
1675 { PIPE_FORMAT_ASTC_4x4_SRGB, 0},
1676 },
1677 {
1678 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 0 },
1679 { PIPE_FORMAT_ASTC_5x4_SRGB, 0},
1680 },
1681 {
1682 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 0 },
1683 { PIPE_FORMAT_ASTC_5x5_SRGB, 0},
1684 },
1685 {
1686 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 0 },
1687 { PIPE_FORMAT_ASTC_6x5_SRGB, 0},
1688 },
1689 {
1690 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 0 },
1691 { PIPE_FORMAT_ASTC_6x6_SRGB, 0},
1692 },
1693 {
1694 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 0 },
1695 { PIPE_FORMAT_ASTC_8x5_SRGB, 0},
1696 },
1697 {
1698 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 0 },
1699 { PIPE_FORMAT_ASTC_8x6_SRGB, 0},
1700 },
1701 {
1702 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 0 },
1703 { PIPE_FORMAT_ASTC_8x8_SRGB, 0},
1704 },
1705 {
1706 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 0 },
1707 { PIPE_FORMAT_ASTC_10x5_SRGB, 0},
1708 },
1709 {
1710 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 0 },
1711 { PIPE_FORMAT_ASTC_10x6_SRGB, 0},
1712 },
1713 {
1714 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 0 },
1715 { PIPE_FORMAT_ASTC_10x8_SRGB, 0},
1716 },
1717 {
1718 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 0 },
1719 { PIPE_FORMAT_ASTC_10x10_SRGB, 0},
1720 },
1721 {
1722 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 0 },
1723 { PIPE_FORMAT_ASTC_12x10_SRGB, 0},
1724 },
1725 {
1726 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 0 },
1727 { PIPE_FORMAT_ASTC_12x12_SRGB, 0},
1728 },
1729
1730 /* signed/unsigned integer formats.
1731 */
1732 {
1733 { GL_RGBA_INTEGER_EXT,
1734 GL_BGRA_INTEGER_EXT,
1735 GL_RGBA8I_EXT, 0 },
1736 { PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1737 },
1738 {
1739 { GL_RGB_INTEGER_EXT,
1740 GL_BGR_INTEGER_EXT,
1741 GL_RGB8I_EXT,
1742 GL_BLUE_INTEGER_EXT, 0 },
1743 { PIPE_FORMAT_R8G8B8_SINT, PIPE_FORMAT_R8G8B8X8_SINT,
1744 PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1745 },
1746 {
1747 { GL_ALPHA_INTEGER_EXT,
1748 GL_ALPHA8I_EXT, 0 },
1749 { PIPE_FORMAT_A8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1750 },
1751 {
1752 { GL_ALPHA16I_EXT, 0 },
1753 { PIPE_FORMAT_A16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
1754 },
1755 {
1756 { GL_ALPHA32I_EXT, 0 },
1757 { PIPE_FORMAT_A32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1758 },
1759 {
1760 { GL_ALPHA8UI_EXT, 0 },
1761 { PIPE_FORMAT_A8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1762 },
1763 {
1764 { GL_ALPHA16UI_EXT, 0 },
1765 { PIPE_FORMAT_A16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1766 },
1767 {
1768 { GL_ALPHA32UI_EXT, 0 },
1769 { PIPE_FORMAT_A32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1770 },
1771 {
1772 { GL_INTENSITY8I_EXT, 0 },
1773 { PIPE_FORMAT_I8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1774 },
1775 {
1776 { GL_INTENSITY16I_EXT, 0 },
1777 { PIPE_FORMAT_I16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
1778 },
1779 {
1780 { GL_INTENSITY32I_EXT, 0 },
1781 { PIPE_FORMAT_I32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1782 },
1783 {
1784 { GL_INTENSITY8UI_EXT, 0 },
1785 { PIPE_FORMAT_I8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1786 },
1787 {
1788 { GL_INTENSITY16UI_EXT, 0 },
1789 { PIPE_FORMAT_I16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1790 },
1791 {
1792 { GL_INTENSITY32UI_EXT, 0 },
1793 { PIPE_FORMAT_I32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1794 },
1795 {
1796 { GL_LUMINANCE8I_EXT, 0 },
1797 { PIPE_FORMAT_L8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1798 },
1799 {
1800 { GL_LUMINANCE16I_EXT, 0 },
1801 { PIPE_FORMAT_L16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
1802 },
1803 {
1804 { GL_LUMINANCE32I_EXT, 0 },
1805 { PIPE_FORMAT_L32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1806 },
1807 {
1808 { GL_LUMINANCE_INTEGER_EXT,
1809 GL_LUMINANCE8UI_EXT, 0 },
1810 { PIPE_FORMAT_L8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1811 },
1812 {
1813 { GL_LUMINANCE16UI_EXT, 0 },
1814 { PIPE_FORMAT_L16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1815 },
1816 {
1817 { GL_LUMINANCE32UI_EXT, 0 },
1818 { PIPE_FORMAT_L32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1819 },
1820 {
1821 { GL_LUMINANCE_ALPHA_INTEGER_EXT,
1822 GL_LUMINANCE_ALPHA8I_EXT, 0 },
1823 { PIPE_FORMAT_L8A8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1824 },
1825 {
1826 { GL_LUMINANCE_ALPHA16I_EXT, 0 },
1827 { PIPE_FORMAT_L16A16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
1828 },
1829 {
1830 { GL_LUMINANCE_ALPHA32I_EXT, 0 },
1831 { PIPE_FORMAT_L32A32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1832 },
1833 {
1834 { GL_LUMINANCE_ALPHA8UI_EXT, 0 },
1835 { PIPE_FORMAT_L8A8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1836 },
1837 {
1838 { GL_LUMINANCE_ALPHA16UI_EXT, 0 },
1839 { PIPE_FORMAT_L16A16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1840 },
1841 {
1842 { GL_LUMINANCE_ALPHA32UI_EXT, 0 },
1843 { PIPE_FORMAT_L32A32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1844 },
1845 {
1846 { GL_RGB16I_EXT, 0 },
1847 { PIPE_FORMAT_R16G16B16_SINT, PIPE_FORMAT_R16G16B16X16_SINT,
1848 PIPE_FORMAT_R16G16B16A16_SINT, 0 },
1849 },
1850 {
1851 { GL_RGBA16I_EXT, 0 },
1852 { PIPE_FORMAT_R16G16B16A16_SINT, 0 },
1853 },
1854 {
1855 { GL_RGB32I_EXT, 0 },
1856 { PIPE_FORMAT_R32G32B32_SINT, PIPE_FORMAT_R32G32B32X32_SINT,
1857 PIPE_FORMAT_R32G32B32A32_SINT, 0 },
1858 },
1859 {
1860 { GL_RGBA32I_EXT, 0 },
1861 { PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1862 },
1863 {
1864 { GL_RGBA8UI_EXT, 0 },
1865 { PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1866 },
1867 {
1868 { GL_RGB8UI_EXT, 0 },
1869 { PIPE_FORMAT_R8G8B8_UINT, PIPE_FORMAT_R8G8B8X8_UINT,
1870 PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1871 },
1872 {
1873 { GL_RGB16UI_EXT, 0 },
1874 { PIPE_FORMAT_R16G16B16_UINT, PIPE_FORMAT_R16G16B16X16_UINT,
1875 PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1876 },
1877 {
1878 { GL_RGBA16UI_EXT, 0 },
1879 { PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1880 },
1881 {
1882 { GL_RGB32UI_EXT, 0},
1883 { PIPE_FORMAT_R32G32B32_UINT, PIPE_FORMAT_R32G32B32X32_UINT,
1884 PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1885 },
1886 {
1887 { GL_RGBA32UI_EXT, 0},
1888 { PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1889 },
1890 {
1891 { GL_R8I, GL_RED_INTEGER_EXT, 0},
1892 { PIPE_FORMAT_R8_SINT, 0},
1893 },
1894 {
1895 { GL_R16I, 0},
1896 { PIPE_FORMAT_R16_SINT, 0},
1897 },
1898 {
1899 { GL_R32I, 0},
1900 { PIPE_FORMAT_R32_SINT, 0},
1901 },
1902 {
1903 { GL_R8UI, 0},
1904 { PIPE_FORMAT_R8_UINT, 0},
1905 },
1906 {
1907 { GL_R16UI, 0},
1908 { PIPE_FORMAT_R16_UINT, 0},
1909 },
1910 {
1911 { GL_R32UI, 0},
1912 { PIPE_FORMAT_R32_UINT, 0},
1913 },
1914 {
1915 { GL_RG8I, GL_GREEN_INTEGER_EXT, 0},
1916 { PIPE_FORMAT_R8G8_SINT, 0},
1917 },
1918 {
1919 { GL_RG16I, 0},
1920 { PIPE_FORMAT_R16G16_SINT, 0},
1921 },
1922 {
1923 { GL_RG32I, 0},
1924 { PIPE_FORMAT_R32G32_SINT, 0},
1925 },
1926 {
1927 { GL_RG8UI, 0},
1928 { PIPE_FORMAT_R8G8_UINT, 0},
1929 },
1930 {
1931 { GL_RG16UI, 0},
1932 { PIPE_FORMAT_R16G16_UINT, 0},
1933 },
1934 {
1935 { GL_RG32UI, 0},
1936 { PIPE_FORMAT_R32G32_UINT, 0},
1937 },
1938 /* signed normalized formats */
1939 {
1940 { GL_RED_SNORM, GL_R8_SNORM, 0 },
1941 { PIPE_FORMAT_R8_SNORM, PIPE_FORMAT_R8G8_SNORM,
1942 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1943 },
1944 {
1945 { GL_R16_SNORM, 0 },
1946 { PIPE_FORMAT_R16_SNORM,
1947 PIPE_FORMAT_R16G16_SNORM,
1948 PIPE_FORMAT_R16G16B16A16_SNORM,
1949 PIPE_FORMAT_R8_SNORM,
1950 PIPE_FORMAT_R8G8_SNORM,
1951 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1952 },
1953 {
1954 { GL_RG_SNORM, GL_RG8_SNORM, 0 },
1955 { PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1956 },
1957 {
1958 { GL_RG16_SNORM, 0 },
1959 { PIPE_FORMAT_R16G16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1960 PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1961 },
1962 {
1963 { GL_RGB_SNORM, GL_RGB8_SNORM, 0 },
1964 { PIPE_FORMAT_R8G8B8X8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1965 },
1966 {
1967 { GL_RGBA_SNORM, GL_RGBA8_SNORM, 0 },
1968 { PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1969 },
1970 {
1971 { GL_RGB16_SNORM, 0 },
1972 { PIPE_FORMAT_R16G16B16X16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1973 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1974 },
1975 {
1976 { GL_RGBA16_SNORM, 0 },
1977 { PIPE_FORMAT_R16G16B16A16_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1978 },
1979 {
1980 { GL_ALPHA_SNORM, GL_ALPHA8_SNORM, 0 },
1981 { PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1982 },
1983 {
1984 { GL_ALPHA16_SNORM, 0 },
1985 { PIPE_FORMAT_A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1986 PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1987 },
1988 {
1989 { GL_LUMINANCE_SNORM, GL_LUMINANCE8_SNORM, 0 },
1990 { PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1991 },
1992 {
1993 { GL_LUMINANCE16_SNORM, 0 },
1994 { PIPE_FORMAT_L16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1995 PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1996 },
1997 {
1998 { GL_LUMINANCE_ALPHA_SNORM, GL_LUMINANCE8_ALPHA8_SNORM, 0 },
1999 { PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2000 },
2001 {
2002 { GL_LUMINANCE16_ALPHA16_SNORM, 0 },
2003 { PIPE_FORMAT_L16A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
2004 PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2005 },
2006 {
2007 { GL_INTENSITY_SNORM, GL_INTENSITY8_SNORM, 0 },
2008 { PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2009 },
2010 {
2011 { GL_INTENSITY16_SNORM, 0 },
2012 { PIPE_FORMAT_I16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
2013 PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2014 },
2015 {
2016 { GL_RGB9_E5, 0 },
2017 { PIPE_FORMAT_R9G9B9E5_FLOAT, 0 }
2018 },
2019 {
2020 { GL_R11F_G11F_B10F, 0 },
2021 { PIPE_FORMAT_R11G11B10_FLOAT, 0 }
2022 },
2023 {
2024 { GL_RGB10_A2UI, 0 },
2025 { PIPE_FORMAT_R10G10B10A2_UINT, PIPE_FORMAT_B10G10R10A2_UINT, 0 }
2026 },
2027 };
2028
2029
2030 /**
2031 * Return first supported format from the given list.
2032 * \param allow_dxt indicates whether it's OK to return a DXT format.
2033 */
2034 static enum pipe_format
2035 find_supported_format(struct pipe_screen *screen,
2036 const enum pipe_format formats[],
2037 enum pipe_texture_target target,
2038 unsigned sample_count,
2039 unsigned storage_sample_count,
2040 unsigned bindings,
2041 boolean allow_dxt)
2042 {
2043 uint i;
2044 for (i = 0; formats[i]; i++) {
2045 if (screen->is_format_supported(screen, formats[i], target,
2046 sample_count, storage_sample_count,
2047 bindings)) {
2048 if (!allow_dxt && util_format_is_s3tc(formats[i])) {
2049 /* we can't return a dxt format, continue searching */
2050 continue;
2051 }
2052
2053 return formats[i];
2054 }
2055 }
2056 return PIPE_FORMAT_NONE;
2057 }
2058
2059
2060 struct exact_format_mapping
2061 {
2062 GLenum format;
2063 GLenum type;
2064 enum pipe_format pformat;
2065 };
2066
2067 static const struct exact_format_mapping rgba8888_tbl[] =
2068 {
2069 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_ABGR8888_UNORM },
2070 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_ABGR8888_UNORM },
2071 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_RGBA8888_UNORM },
2072 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_RGBA8888_UNORM },
2073 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_ARGB8888_UNORM },
2074 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_BGRA8888_UNORM },
2075 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8A8_UNORM },
2076 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_A8B8G8R8_UNORM },
2077 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8A8_UNORM },
2078 { 0, 0, 0 }
2079 };
2080
2081 static const struct exact_format_mapping rgbx8888_tbl[] =
2082 {
2083 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_XBGR8888_UNORM },
2084 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_XBGR8888_UNORM },
2085 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_RGBX8888_UNORM },
2086 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_RGBX8888_UNORM },
2087 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_XRGB8888_UNORM },
2088 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_BGRX8888_UNORM },
2089 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8X8_UNORM },
2090 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_X8B8G8R8_UNORM },
2091 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8X8_UNORM },
2092 { 0, 0, 0 }
2093 };
2094
2095
2096 /**
2097 * For unsized/base internal formats, we may choose a convenient effective
2098 * internal format for {format, type}. If one exists, return that, otherwise
2099 * return PIPE_FORMAT_NONE.
2100 */
2101 static enum pipe_format
2102 find_exact_format(GLint internalFormat, GLenum format, GLenum type)
2103 {
2104 uint i;
2105 const struct exact_format_mapping* tbl;
2106
2107 if (format == GL_NONE || type == GL_NONE)
2108 return PIPE_FORMAT_NONE;
2109
2110 switch (internalFormat) {
2111 case 4:
2112 case GL_RGBA:
2113 tbl = rgba8888_tbl;
2114 break;
2115 case 3:
2116 case GL_RGB:
2117 tbl = rgbx8888_tbl;
2118 break;
2119 default:
2120 return PIPE_FORMAT_NONE;
2121 }
2122
2123 for (i = 0; tbl[i].format; i++)
2124 if (tbl[i].format == format && tbl[i].type == type)
2125 return tbl[i].pformat;
2126
2127 return PIPE_FORMAT_NONE;
2128 }
2129
2130
2131 /**
2132 * Given an OpenGL internalFormat value for a texture or surface, return
2133 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
2134 * This is called during glTexImage2D, for example.
2135 *
2136 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
2137 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
2138 * we want render-to-texture ability.
2139 *
2140 * \param internalFormat the user value passed to glTexImage2D
2141 * \param target one of PIPE_TEXTURE_x
2142 * \param bindings bitmask of PIPE_BIND_x flags.
2143 * \param allow_dxt indicates whether it's OK to return a DXT format. This
2144 * only matters when internalFormat names a generic or
2145 * specific compressed format. And that should only happen
2146 * when we're getting called from gl[Copy]TexImage().
2147 */
2148 enum pipe_format
2149 st_choose_format(struct st_context *st, GLenum internalFormat,
2150 GLenum format, GLenum type,
2151 enum pipe_texture_target target, unsigned sample_count,
2152 unsigned storage_sample_count,
2153 unsigned bindings, boolean allow_dxt)
2154 {
2155 struct pipe_screen *screen = st->pipe->screen;
2156 unsigned i;
2157 int j;
2158 enum pipe_format pf;
2159
2160 /* can't render to compressed formats at this time */
2161 if (_mesa_is_compressed_format(st->ctx, internalFormat)
2162 && (bindings & ~PIPE_BIND_SAMPLER_VIEW)) {
2163 return PIPE_FORMAT_NONE;
2164 }
2165
2166 /* search for exact matches */
2167 pf = find_exact_format(internalFormat, format, type);
2168 if (pf != PIPE_FORMAT_NONE &&
2169 screen->is_format_supported(screen, pf, target, sample_count,
2170 storage_sample_count, bindings)) {
2171 goto success;
2172 }
2173
2174 /* For an unsized GL_RGB but a 2_10_10_10 type, try to pick one of the
2175 * 2_10_10_10 formats. This is important for
2176 * GL_EXT_texture_type_2_10_10_10_EXT support, which says that these
2177 * formats are not color-renderable. Mesa's check for making those
2178 * non-color-renderable is based on our chosen format being 2101010.
2179 */
2180 if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
2181 if (internalFormat == GL_RGB)
2182 internalFormat = GL_RGB10;
2183 else if (internalFormat == GL_RGBA)
2184 internalFormat = GL_RGB10_A2;
2185 }
2186
2187 /* search table for internalFormat */
2188 for (i = 0; i < ARRAY_SIZE(format_map); i++) {
2189 const struct format_mapping *mapping = &format_map[i];
2190 for (j = 0; mapping->glFormats[j]; j++) {
2191 if (mapping->glFormats[j] == internalFormat) {
2192 /* Found the desired internal format. Find first pipe format
2193 * which is supported by the driver.
2194 */
2195 pf = find_supported_format(screen, mapping->pipeFormats,
2196 target, sample_count,
2197 storage_sample_count, bindings,
2198 allow_dxt);
2199 goto success;
2200 }
2201 }
2202 }
2203
2204 _mesa_problem(NULL, "unhandled format!\n");
2205 return PIPE_FORMAT_NONE;
2206
2207 success:
2208 if (0) {
2209 debug_printf("%s(fmt=%s, type=%s, intFmt=%s) = %s\n",
2210 __FUNCTION__,
2211 _mesa_enum_to_string(format),
2212 _mesa_enum_to_string(type),
2213 _mesa_enum_to_string(internalFormat),
2214 util_format_name(pf));
2215 }
2216 return pf;
2217 }
2218
2219
2220 /**
2221 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
2222 */
2223 enum pipe_format
2224 st_choose_renderbuffer_format(struct st_context *st,
2225 GLenum internalFormat, unsigned sample_count,
2226 unsigned storage_sample_count)
2227 {
2228 unsigned bindings;
2229 if (_mesa_is_depth_or_stencil_format(internalFormat))
2230 bindings = PIPE_BIND_DEPTH_STENCIL;
2231 else
2232 bindings = PIPE_BIND_RENDER_TARGET;
2233 return st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
2234 PIPE_TEXTURE_2D, sample_count,
2235 storage_sample_count, bindings, FALSE);
2236 }
2237
2238
2239 /**
2240 * Given an OpenGL user-requested format and type, and swapBytes state,
2241 * return the format which exactly matches those parameters, so that
2242 * a memcpy-based transfer can be done.
2243 *
2244 * If no format is supported, return PIPE_FORMAT_NONE.
2245 */
2246 enum pipe_format
2247 st_choose_matching_format(struct st_context *st, unsigned bind,
2248 GLenum format, GLenum type, GLboolean swapBytes)
2249 {
2250 struct pipe_screen *screen = st->pipe->screen;
2251 mesa_format mesa_format;
2252
2253 for (mesa_format = 1; mesa_format < MESA_FORMAT_COUNT; mesa_format++) {
2254 if (_mesa_is_format_srgb(mesa_format)) {
2255 continue;
2256 }
2257 if (_mesa_get_format_bits(mesa_format, GL_TEXTURE_INTENSITY_SIZE) > 0) {
2258 /* If `format` is GL_RED/GL_RED_INTEGER, then we might match some
2259 * intensity formats, which we don't want.
2260 */
2261 continue;
2262 }
2263
2264 if (_mesa_format_matches_format_and_type(mesa_format, format, type,
2265 swapBytes, NULL)) {
2266 enum pipe_format format =
2267 st_mesa_format_to_pipe_format(st, mesa_format);
2268
2269 if (format &&
2270 screen->is_format_supported(screen, format, PIPE_TEXTURE_2D,
2271 0, 0, bind)) {
2272 return format;
2273 }
2274 /* It's unlikely to find 2 matching Mesa formats. */
2275 break;
2276 }
2277 }
2278 return PIPE_FORMAT_NONE;
2279 }
2280
2281
2282 /**
2283 * Called via ctx->Driver.ChooseTextureFormat().
2284 */
2285 mesa_format
2286 st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
2287 GLint internalFormat,
2288 GLenum format, GLenum type)
2289 {
2290 struct st_context *st = st_context(ctx);
2291 enum pipe_format pFormat;
2292 mesa_format mFormat;
2293 unsigned bindings;
2294 bool is_renderbuffer = false;
2295 enum pipe_texture_target pTarget;
2296
2297 if (target == GL_RENDERBUFFER) {
2298 pTarget = PIPE_TEXTURE_2D;
2299 is_renderbuffer = true;
2300 } else {
2301 pTarget = gl_target_to_pipe(target);
2302 }
2303
2304 if (target == GL_TEXTURE_1D || target == GL_TEXTURE_1D_ARRAY) {
2305 /* We don't do compression for these texture targets because of
2306 * difficulty with sub-texture updates on non-block boundaries, etc.
2307 * So change the internal format request to an uncompressed format.
2308 */
2309 internalFormat =
2310 _mesa_generic_compressed_format_to_uncompressed_format(internalFormat);
2311 }
2312
2313 /* GL textures may wind up being render targets, but we don't know
2314 * that in advance. Specify potential render target flags now for formats
2315 * that we know should always be renderable.
2316 */
2317 bindings = PIPE_BIND_SAMPLER_VIEW;
2318 if (_mesa_is_depth_or_stencil_format(internalFormat))
2319 bindings |= PIPE_BIND_DEPTH_STENCIL;
2320 else if (is_renderbuffer || internalFormat == 3 || internalFormat == 4 ||
2321 internalFormat == GL_RGB || internalFormat == GL_RGBA ||
2322 internalFormat == GL_RGBA2 ||
2323 internalFormat == GL_RGB4 || internalFormat == GL_RGBA4 ||
2324 internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
2325 internalFormat == GL_BGRA ||
2326 internalFormat == GL_RGB16F ||
2327 internalFormat == GL_RGBA16F ||
2328 internalFormat == GL_RGB32F ||
2329 internalFormat == GL_RGBA32F)
2330 bindings |= PIPE_BIND_RENDER_TARGET;
2331
2332 /* GLES allows the driver to choose any format which matches
2333 * the format+type combo, because GLES only supports unsized internal
2334 * formats and expects the driver to choose whatever suits it.
2335 */
2336 if (_mesa_is_gles(ctx)) {
2337 GLenum baseFormat = _mesa_base_tex_format(ctx, internalFormat);
2338 GLenum basePackFormat = _mesa_base_pack_format(format);
2339 GLenum iformat = internalFormat;
2340
2341 /* Treat GL_BGRA as GL_RGBA. */
2342 if (iformat == GL_BGRA)
2343 iformat = GL_RGBA;
2344
2345 /* Check if the internalformat is unsized and compatible
2346 * with the "format".
2347 */
2348 if (iformat == baseFormat && iformat == basePackFormat) {
2349 pFormat = st_choose_matching_format(st, bindings, format, type,
2350 ctx->Unpack.SwapBytes);
2351
2352 if (pFormat != PIPE_FORMAT_NONE)
2353 return st_pipe_format_to_mesa_format(pFormat);
2354
2355 if (!is_renderbuffer) {
2356 /* try choosing format again, this time without render
2357 * target bindings.
2358 */
2359 pFormat = st_choose_matching_format(st, PIPE_BIND_SAMPLER_VIEW,
2360 format, type,
2361 ctx->Unpack.SwapBytes);
2362 if (pFormat != PIPE_FORMAT_NONE)
2363 return st_pipe_format_to_mesa_format(pFormat);
2364 }
2365 }
2366 }
2367
2368 pFormat = st_choose_format(st, internalFormat, format, type,
2369 pTarget, 0, 0, bindings, GL_TRUE);
2370
2371 if (pFormat == PIPE_FORMAT_NONE && !is_renderbuffer) {
2372 /* try choosing format again, this time without render target bindings */
2373 pFormat = st_choose_format(st, internalFormat, format, type,
2374 pTarget, 0, 0, PIPE_BIND_SAMPLER_VIEW,
2375 GL_TRUE);
2376 }
2377
2378 if (pFormat == PIPE_FORMAT_NONE) {
2379 mFormat = _mesa_glenum_to_compressed_format(internalFormat);
2380 if (st_compressed_format_fallback(st, mFormat))
2381 return mFormat;
2382
2383 /* no luck at all */
2384 return MESA_FORMAT_NONE;
2385 }
2386
2387 mFormat = st_pipe_format_to_mesa_format(pFormat);
2388
2389 /* Debugging aid */
2390 if (0) {
2391 debug_printf("%s(intFormat=%s, format=%s, type=%s) -> %s, %s\n",
2392 __func__,
2393 _mesa_enum_to_string(internalFormat),
2394 _mesa_enum_to_string(format),
2395 _mesa_enum_to_string(type),
2396 util_format_name(pFormat),
2397 _mesa_get_format_name(mFormat));
2398 }
2399
2400 return mFormat;
2401 }
2402
2403
2404 /**
2405 * Called via ctx->Driver.QueryInternalFormat().
2406 */
2407 static size_t
2408 st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
2409 GLenum internalFormat, int samples[16])
2410 {
2411 struct st_context *st = st_context(ctx);
2412 enum pipe_format format;
2413 unsigned i, bind, num_sample_counts = 0;
2414
2415 (void) target;
2416
2417 if (_mesa_is_depth_or_stencil_format(internalFormat))
2418 bind = PIPE_BIND_DEPTH_STENCIL;
2419 else
2420 bind = PIPE_BIND_RENDER_TARGET;
2421
2422 /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
2423 * formats.
2424 */
2425 if (!ctx->Extensions.EXT_sRGB) {
2426 internalFormat = _mesa_get_linear_internalformat(internalFormat);
2427 }
2428
2429 /* Set sample counts in descending order. */
2430 for (i = 16; i > 1; i--) {
2431 format = st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
2432 PIPE_TEXTURE_2D, i, i, bind, FALSE);
2433
2434 if (format != PIPE_FORMAT_NONE) {
2435 samples[num_sample_counts++] = i;
2436 }
2437 }
2438
2439 if (!num_sample_counts) {
2440 samples[num_sample_counts++] = 1;
2441 }
2442
2443 return num_sample_counts;
2444 }
2445
2446
2447 /**
2448 * ARB_internalformat_query2 driver hook.
2449 */
2450 void
2451 st_QueryInternalFormat(struct gl_context *ctx, GLenum target,
2452 GLenum internalFormat, GLenum pname, GLint *params)
2453 {
2454 struct st_context *st = st_context(ctx);
2455 /* The API entry-point gives us a temporary params buffer that is non-NULL
2456 * and guaranteed to have at least 16 elements.
2457 */
2458 assert(params != NULL);
2459
2460 switch (pname) {
2461 case GL_SAMPLES:
2462 st_QuerySamplesForFormat(ctx, target, internalFormat, params);
2463 break;
2464
2465 case GL_NUM_SAMPLE_COUNTS: {
2466 int samples[16];
2467 size_t num_samples;
2468 num_samples = st_QuerySamplesForFormat(ctx, target, internalFormat,
2469 samples);
2470 params[0] = (GLint) num_samples;
2471 break;
2472 }
2473 case GL_INTERNALFORMAT_PREFERRED: {
2474 params[0] = GL_NONE;
2475
2476 /* We need to resolve an internal format that is compatible with
2477 * the passed internal format, and optimal to the driver. By now,
2478 * we just validate that the passed internal format is supported by
2479 * the driver, and if so return the same internal format, otherwise
2480 * return GL_NONE.
2481 */
2482 unsigned bindings;
2483 if (_mesa_is_depth_or_stencil_format(internalFormat))
2484 bindings = PIPE_BIND_DEPTH_STENCIL;
2485 else
2486 bindings = PIPE_BIND_RENDER_TARGET;
2487 enum pipe_format pformat = st_choose_format(st,
2488 internalFormat,
2489 GL_NONE,
2490 GL_NONE,
2491 PIPE_TEXTURE_2D, 0, 0,
2492 bindings, FALSE);
2493 if (pformat)
2494 params[0] = internalFormat;
2495 break;
2496 }
2497 default:
2498 /* For the rest of the pnames, we call back the Mesa's default
2499 * function for drivers that don't implement ARB_internalformat_query2.
2500 */
2501 _mesa_query_internal_format_default(ctx, target, internalFormat, pname,
2502 params);
2503 }
2504 }
2505
2506
2507 /**
2508 * This is used for translating texture border color and the clear
2509 * color. For example, the clear color is interpreted according to
2510 * the renderbuffer's base format. For example, if clearing a
2511 * GL_LUMINANCE buffer, we'll return colorOut[0] = colorOut[1] =
2512 * colorOut[2] = colorIn[0].
2513 * Similarly for texture border colors.
2514 */
2515 void
2516 st_translate_color(const union gl_color_union *colorIn,
2517 union pipe_color_union *colorOut,
2518 GLenum baseFormat, GLboolean is_integer)
2519 {
2520 if (is_integer) {
2521 const int *in = colorIn->i;
2522 int *out = colorOut->i;
2523
2524 switch (baseFormat) {
2525 case GL_RED:
2526 out[0] = in[0];
2527 out[1] = 0;
2528 out[2] = 0;
2529 out[3] = 1;
2530 break;
2531 case GL_RG:
2532 out[0] = in[0];
2533 out[1] = in[1];
2534 out[2] = 0;
2535 out[3] = 1;
2536 break;
2537 case GL_RGB:
2538 out[0] = in[0];
2539 out[1] = in[1];
2540 out[2] = in[2];
2541 out[3] = 1;
2542 break;
2543 case GL_ALPHA:
2544 out[0] = out[1] = out[2] = 0;
2545 out[3] = in[3];
2546 break;
2547 case GL_LUMINANCE:
2548 out[0] = out[1] = out[2] = in[0];
2549 out[3] = 1;
2550 break;
2551 case GL_LUMINANCE_ALPHA:
2552 out[0] = out[1] = out[2] = in[0];
2553 out[3] = in[3];
2554 break;
2555 case GL_INTENSITY:
2556 out[0] = out[1] = out[2] = out[3] = in[0];
2557 break;
2558 default:
2559 COPY_4V(out, in);
2560 }
2561 }
2562 else {
2563 const float *in = colorIn->f;
2564 float *out = colorOut->f;
2565
2566 switch (baseFormat) {
2567 case GL_RED:
2568 out[0] = in[0];
2569 out[1] = 0.0F;
2570 out[2] = 0.0F;
2571 out[3] = 1.0F;
2572 break;
2573 case GL_RG:
2574 out[0] = in[0];
2575 out[1] = in[1];
2576 out[2] = 0.0F;
2577 out[3] = 1.0F;
2578 break;
2579 case GL_RGB:
2580 out[0] = in[0];
2581 out[1] = in[1];
2582 out[2] = in[2];
2583 out[3] = 1.0F;
2584 break;
2585 case GL_ALPHA:
2586 out[0] = out[1] = out[2] = 0.0F;
2587 out[3] = in[3];
2588 break;
2589 case GL_LUMINANCE:
2590 out[0] = out[1] = out[2] = in[0];
2591 out[3] = 1.0F;
2592 break;
2593 case GL_LUMINANCE_ALPHA:
2594 out[0] = out[1] = out[2] = in[0];
2595 out[3] = in[3];
2596 break;
2597 /* Stencil border is tricky on some hw. Help drivers a little here. */
2598 case GL_STENCIL_INDEX:
2599 case GL_INTENSITY:
2600 out[0] = out[1] = out[2] = out[3] = in[0];
2601 break;
2602 default:
2603 COPY_4V(out, in);
2604 }
2605 }
2606 }