mesa: change gl_format to mesa_format
[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/glformats.h"
38 #include "main/texgetimage.h"
39 #include "main/teximage.h"
40 #include "main/texstore.h"
41 #include "main/image.h"
42 #include "main/macros.h"
43
44 #include "pipe/p_context.h"
45 #include "pipe/p_defines.h"
46 #include "pipe/p_screen.h"
47 #include "util/u_format.h"
48 #include "st_cb_texture.h"
49 #include "st_context.h"
50 #include "st_format.h"
51
52
53 /**
54 * Translate Mesa format to Gallium format.
55 */
56 enum pipe_format
57 st_mesa_format_to_pipe_format(mesa_format mesaFormat)
58 {
59 switch (mesaFormat) {
60 case MESA_FORMAT_RGBA8888:
61 return PIPE_FORMAT_ABGR8888_UNORM;
62 case MESA_FORMAT_RGBA8888_REV:
63 return PIPE_FORMAT_RGBA8888_UNORM;
64 case MESA_FORMAT_ARGB8888:
65 return PIPE_FORMAT_BGRA8888_UNORM;
66 case MESA_FORMAT_ARGB8888_REV:
67 return PIPE_FORMAT_ARGB8888_UNORM;
68 case MESA_FORMAT_RGBX8888:
69 return PIPE_FORMAT_XBGR8888_UNORM;
70 case MESA_FORMAT_RGBX8888_REV:
71 return PIPE_FORMAT_RGBX8888_UNORM;
72 case MESA_FORMAT_XRGB8888:
73 return PIPE_FORMAT_BGRX8888_UNORM;
74 case MESA_FORMAT_XRGB8888_REV:
75 return PIPE_FORMAT_XRGB8888_UNORM;
76 case MESA_FORMAT_ARGB1555:
77 return PIPE_FORMAT_B5G5R5A1_UNORM;
78 case MESA_FORMAT_ARGB4444:
79 return PIPE_FORMAT_B4G4R4A4_UNORM;
80 case MESA_FORMAT_RGB565:
81 return PIPE_FORMAT_B5G6R5_UNORM;
82 case MESA_FORMAT_RGB332:
83 return PIPE_FORMAT_B2G3R3_UNORM;
84 case MESA_FORMAT_ARGB2101010:
85 return PIPE_FORMAT_B10G10R10A2_UNORM;
86 case MESA_FORMAT_AL44:
87 return PIPE_FORMAT_L4A4_UNORM;
88 case MESA_FORMAT_AL88:
89 return PIPE_FORMAT_L8A8_UNORM;
90 case MESA_FORMAT_AL1616:
91 return PIPE_FORMAT_L16A16_UNORM;
92 case MESA_FORMAT_A8:
93 return PIPE_FORMAT_A8_UNORM;
94 case MESA_FORMAT_A16:
95 return PIPE_FORMAT_A16_UNORM;
96 case MESA_FORMAT_L8:
97 return PIPE_FORMAT_L8_UNORM;
98 case MESA_FORMAT_L16:
99 return PIPE_FORMAT_L16_UNORM;
100 case MESA_FORMAT_I8:
101 return PIPE_FORMAT_I8_UNORM;
102 case MESA_FORMAT_I16:
103 return PIPE_FORMAT_I16_UNORM;
104 case MESA_FORMAT_Z16:
105 return PIPE_FORMAT_Z16_UNORM;
106 case MESA_FORMAT_Z32:
107 return PIPE_FORMAT_Z32_UNORM;
108 case MESA_FORMAT_Z24_S8:
109 return PIPE_FORMAT_S8_UINT_Z24_UNORM;
110 case MESA_FORMAT_S8_Z24:
111 return PIPE_FORMAT_Z24_UNORM_S8_UINT;
112 case MESA_FORMAT_Z24_X8:
113 return PIPE_FORMAT_X8Z24_UNORM;
114 case MESA_FORMAT_X8_Z24:
115 return PIPE_FORMAT_Z24X8_UNORM;
116 case MESA_FORMAT_S8:
117 return PIPE_FORMAT_S8_UINT;
118 case MESA_FORMAT_Z32_FLOAT:
119 return PIPE_FORMAT_Z32_FLOAT;
120 case MESA_FORMAT_Z32_FLOAT_X24S8:
121 return PIPE_FORMAT_Z32_FLOAT_S8X24_UINT;
122 case MESA_FORMAT_YCBCR:
123 return PIPE_FORMAT_UYVY;
124 case MESA_FORMAT_RGB_DXT1:
125 return PIPE_FORMAT_DXT1_RGB;
126 case MESA_FORMAT_RGBA_DXT1:
127 return PIPE_FORMAT_DXT1_RGBA;
128 case MESA_FORMAT_RGBA_DXT3:
129 return PIPE_FORMAT_DXT3_RGBA;
130 case MESA_FORMAT_RGBA_DXT5:
131 return PIPE_FORMAT_DXT5_RGBA;
132 case MESA_FORMAT_SRGB_DXT1:
133 return PIPE_FORMAT_DXT1_SRGB;
134 case MESA_FORMAT_SRGBA_DXT1:
135 return PIPE_FORMAT_DXT1_SRGBA;
136 case MESA_FORMAT_SRGBA_DXT3:
137 return PIPE_FORMAT_DXT3_SRGBA;
138 case MESA_FORMAT_SRGBA_DXT5:
139 return PIPE_FORMAT_DXT5_SRGBA;
140 case MESA_FORMAT_SLA8:
141 return PIPE_FORMAT_L8A8_SRGB;
142 case MESA_FORMAT_SL8:
143 return PIPE_FORMAT_L8_SRGB;
144 case MESA_FORMAT_SRGB8:
145 return PIPE_FORMAT_R8G8B8_SRGB;
146 case MESA_FORMAT_SRGBA8:
147 return PIPE_FORMAT_A8B8G8R8_SRGB;
148 case MESA_FORMAT_SARGB8:
149 return PIPE_FORMAT_B8G8R8A8_SRGB;
150 case MESA_FORMAT_RGBA_FLOAT32:
151 return PIPE_FORMAT_R32G32B32A32_FLOAT;
152 case MESA_FORMAT_RGBA_FLOAT16:
153 return PIPE_FORMAT_R16G16B16A16_FLOAT;
154 case MESA_FORMAT_RGB_FLOAT32:
155 return PIPE_FORMAT_R32G32B32_FLOAT;
156 case MESA_FORMAT_RGB_FLOAT16:
157 return PIPE_FORMAT_R16G16B16_FLOAT;
158 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
159 return PIPE_FORMAT_L32A32_FLOAT;
160 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
161 return PIPE_FORMAT_L16A16_FLOAT;
162 case MESA_FORMAT_LUMINANCE_FLOAT32:
163 return PIPE_FORMAT_L32_FLOAT;
164 case MESA_FORMAT_LUMINANCE_FLOAT16:
165 return PIPE_FORMAT_L16_FLOAT;
166 case MESA_FORMAT_ALPHA_FLOAT32:
167 return PIPE_FORMAT_A32_FLOAT;
168 case MESA_FORMAT_ALPHA_FLOAT16:
169 return PIPE_FORMAT_A16_FLOAT;
170 case MESA_FORMAT_INTENSITY_FLOAT32:
171 return PIPE_FORMAT_I32_FLOAT;
172 case MESA_FORMAT_INTENSITY_FLOAT16:
173 return PIPE_FORMAT_I16_FLOAT;
174 case MESA_FORMAT_R_FLOAT32:
175 return PIPE_FORMAT_R32_FLOAT;
176 case MESA_FORMAT_R_FLOAT16:
177 return PIPE_FORMAT_R16_FLOAT;
178 case MESA_FORMAT_RG_FLOAT32:
179 return PIPE_FORMAT_R32G32_FLOAT;
180 case MESA_FORMAT_RG_FLOAT16:
181 return PIPE_FORMAT_R16G16_FLOAT;
182
183 case MESA_FORMAT_R8:
184 return PIPE_FORMAT_R8_UNORM;
185 case MESA_FORMAT_R16:
186 return PIPE_FORMAT_R16_UNORM;
187 case MESA_FORMAT_GR88:
188 return PIPE_FORMAT_R8G8_UNORM;
189 case MESA_FORMAT_GR1616:
190 return PIPE_FORMAT_R16G16_UNORM;
191 case MESA_FORMAT_RGBA_16:
192 return PIPE_FORMAT_R16G16B16A16_UNORM;
193
194 /* signed int formats */
195 case MESA_FORMAT_ALPHA_UINT8:
196 return PIPE_FORMAT_A8_UINT;
197 case MESA_FORMAT_ALPHA_UINT16:
198 return PIPE_FORMAT_A16_UINT;
199 case MESA_FORMAT_ALPHA_UINT32:
200 return PIPE_FORMAT_A32_UINT;
201
202 case MESA_FORMAT_ALPHA_INT8:
203 return PIPE_FORMAT_A8_SINT;
204 case MESA_FORMAT_ALPHA_INT16:
205 return PIPE_FORMAT_A16_SINT;
206 case MESA_FORMAT_ALPHA_INT32:
207 return PIPE_FORMAT_A32_SINT;
208
209 case MESA_FORMAT_INTENSITY_UINT8:
210 return PIPE_FORMAT_I8_UINT;
211 case MESA_FORMAT_INTENSITY_UINT16:
212 return PIPE_FORMAT_I16_UINT;
213 case MESA_FORMAT_INTENSITY_UINT32:
214 return PIPE_FORMAT_I32_UINT;
215
216 case MESA_FORMAT_INTENSITY_INT8:
217 return PIPE_FORMAT_I8_SINT;
218 case MESA_FORMAT_INTENSITY_INT16:
219 return PIPE_FORMAT_I16_SINT;
220 case MESA_FORMAT_INTENSITY_INT32:
221 return PIPE_FORMAT_I32_SINT;
222
223 case MESA_FORMAT_LUMINANCE_UINT8:
224 return PIPE_FORMAT_L8_UINT;
225 case MESA_FORMAT_LUMINANCE_UINT16:
226 return PIPE_FORMAT_L16_UINT;
227 case MESA_FORMAT_LUMINANCE_UINT32:
228 return PIPE_FORMAT_L32_UINT;
229
230 case MESA_FORMAT_LUMINANCE_INT8:
231 return PIPE_FORMAT_L8_SINT;
232 case MESA_FORMAT_LUMINANCE_INT16:
233 return PIPE_FORMAT_L16_SINT;
234 case MESA_FORMAT_LUMINANCE_INT32:
235 return PIPE_FORMAT_L32_SINT;
236
237 case MESA_FORMAT_LUMINANCE_ALPHA_UINT8:
238 return PIPE_FORMAT_L8A8_UINT;
239 case MESA_FORMAT_LUMINANCE_ALPHA_UINT16:
240 return PIPE_FORMAT_L16A16_UINT;
241 case MESA_FORMAT_LUMINANCE_ALPHA_UINT32:
242 return PIPE_FORMAT_L32A32_UINT;
243
244 case MESA_FORMAT_LUMINANCE_ALPHA_INT8:
245 return PIPE_FORMAT_L8A8_SINT;
246 case MESA_FORMAT_LUMINANCE_ALPHA_INT16:
247 return PIPE_FORMAT_L16A16_SINT;
248 case MESA_FORMAT_LUMINANCE_ALPHA_INT32:
249 return PIPE_FORMAT_L32A32_SINT;
250
251 case MESA_FORMAT_R_INT8:
252 return PIPE_FORMAT_R8_SINT;
253 case MESA_FORMAT_RG_INT8:
254 return PIPE_FORMAT_R8G8_SINT;
255 case MESA_FORMAT_RGB_INT8:
256 return PIPE_FORMAT_R8G8B8_SINT;
257 case MESA_FORMAT_RGBA_INT8:
258 return PIPE_FORMAT_R8G8B8A8_SINT;
259 case MESA_FORMAT_R_INT16:
260 return PIPE_FORMAT_R16_SINT;
261 case MESA_FORMAT_RG_INT16:
262 return PIPE_FORMAT_R16G16_SINT;
263 case MESA_FORMAT_RGB_INT16:
264 return PIPE_FORMAT_R16G16B16_SINT;
265 case MESA_FORMAT_RGBA_INT16:
266 return PIPE_FORMAT_R16G16B16A16_SINT;
267 case MESA_FORMAT_R_INT32:
268 return PIPE_FORMAT_R32_SINT;
269 case MESA_FORMAT_RG_INT32:
270 return PIPE_FORMAT_R32G32_SINT;
271 case MESA_FORMAT_RGB_INT32:
272 return PIPE_FORMAT_R32G32B32_SINT;
273 case MESA_FORMAT_RGBA_INT32:
274 return PIPE_FORMAT_R32G32B32A32_SINT;
275
276 /* unsigned int formats */
277 case MESA_FORMAT_R_UINT8:
278 return PIPE_FORMAT_R8_UINT;
279 case MESA_FORMAT_RG_UINT8:
280 return PIPE_FORMAT_R8G8_UINT;
281 case MESA_FORMAT_RGB_UINT8:
282 return PIPE_FORMAT_R8G8B8_UINT;
283 case MESA_FORMAT_RGBA_UINT8:
284 return PIPE_FORMAT_R8G8B8A8_UINT;
285 case MESA_FORMAT_R_UINT16:
286 return PIPE_FORMAT_R16_UINT;
287 case MESA_FORMAT_RG_UINT16:
288 return PIPE_FORMAT_R16G16_UINT;
289 case MESA_FORMAT_RGB_UINT16:
290 return PIPE_FORMAT_R16G16B16_UINT;
291 case MESA_FORMAT_RGBA_UINT16:
292 return PIPE_FORMAT_R16G16B16A16_UINT;
293 case MESA_FORMAT_R_UINT32:
294 return PIPE_FORMAT_R32_UINT;
295 case MESA_FORMAT_RG_UINT32:
296 return PIPE_FORMAT_R32G32_UINT;
297 case MESA_FORMAT_RGB_UINT32:
298 return PIPE_FORMAT_R32G32B32_UINT;
299 case MESA_FORMAT_RGBA_UINT32:
300 return PIPE_FORMAT_R32G32B32A32_UINT;
301
302 case MESA_FORMAT_RED_RGTC1:
303 return PIPE_FORMAT_RGTC1_UNORM;
304 case MESA_FORMAT_SIGNED_RED_RGTC1:
305 return PIPE_FORMAT_RGTC1_SNORM;
306 case MESA_FORMAT_RG_RGTC2:
307 return PIPE_FORMAT_RGTC2_UNORM;
308 case MESA_FORMAT_SIGNED_RG_RGTC2:
309 return PIPE_FORMAT_RGTC2_SNORM;
310
311 case MESA_FORMAT_L_LATC1:
312 return PIPE_FORMAT_LATC1_UNORM;
313 case MESA_FORMAT_SIGNED_L_LATC1:
314 return PIPE_FORMAT_LATC1_SNORM;
315 case MESA_FORMAT_LA_LATC2:
316 return PIPE_FORMAT_LATC2_UNORM;
317 case MESA_FORMAT_SIGNED_LA_LATC2:
318 return PIPE_FORMAT_LATC2_SNORM;
319
320 case MESA_FORMAT_ETC1_RGB8:
321 return PIPE_FORMAT_ETC1_RGB8;
322
323 /* signed normalized formats */
324 case MESA_FORMAT_SIGNED_R8:
325 return PIPE_FORMAT_R8_SNORM;
326 case MESA_FORMAT_SIGNED_RG88_REV:
327 return PIPE_FORMAT_R8G8_SNORM;
328 case MESA_FORMAT_SIGNED_RGBA8888_REV:
329 return PIPE_FORMAT_R8G8B8A8_SNORM;
330
331 case MESA_FORMAT_SIGNED_A8:
332 return PIPE_FORMAT_A8_SNORM;
333 case MESA_FORMAT_SIGNED_L8:
334 return PIPE_FORMAT_L8_SNORM;
335 case MESA_FORMAT_SIGNED_AL88:
336 return PIPE_FORMAT_L8A8_SNORM;
337 case MESA_FORMAT_SIGNED_I8:
338 return PIPE_FORMAT_I8_SNORM;
339
340 case MESA_FORMAT_SIGNED_R16:
341 return PIPE_FORMAT_R16_SNORM;
342 case MESA_FORMAT_SIGNED_GR1616:
343 return PIPE_FORMAT_R16G16_SNORM;
344 case MESA_FORMAT_SIGNED_RGBA_16:
345 return PIPE_FORMAT_R16G16B16A16_SNORM;
346
347 case MESA_FORMAT_SIGNED_A16:
348 return PIPE_FORMAT_A16_SNORM;
349 case MESA_FORMAT_SIGNED_L16:
350 return PIPE_FORMAT_L16_SNORM;
351 case MESA_FORMAT_SIGNED_AL1616:
352 return PIPE_FORMAT_L16A16_SNORM;
353 case MESA_FORMAT_SIGNED_I16:
354 return PIPE_FORMAT_I16_SNORM;
355
356 case MESA_FORMAT_RGB9_E5_FLOAT:
357 return PIPE_FORMAT_R9G9B9E5_FLOAT;
358 case MESA_FORMAT_R11_G11_B10_FLOAT:
359 return PIPE_FORMAT_R11G11B10_FLOAT;
360 case MESA_FORMAT_ARGB2101010_UINT:
361 return PIPE_FORMAT_B10G10R10A2_UINT;
362 case MESA_FORMAT_ABGR2101010_UINT:
363 return PIPE_FORMAT_R10G10B10A2_UINT;
364
365 case MESA_FORMAT_XRGB4444_UNORM:
366 return PIPE_FORMAT_B4G4R4X4_UNORM;
367 case MESA_FORMAT_XRGB1555_UNORM:
368 return PIPE_FORMAT_B5G5R5X1_UNORM;
369 case MESA_FORMAT_XBGR8888_SNORM:
370 return PIPE_FORMAT_R8G8B8X8_SNORM;
371 case MESA_FORMAT_XBGR8888_SRGB:
372 return PIPE_FORMAT_R8G8B8X8_SRGB;
373 case MESA_FORMAT_XBGR8888_UINT:
374 return PIPE_FORMAT_R8G8B8X8_UINT;
375 case MESA_FORMAT_XBGR8888_SINT:
376 return PIPE_FORMAT_R8G8B8X8_SINT;
377 case MESA_FORMAT_XRGB2101010_UNORM:
378 return PIPE_FORMAT_B10G10R10X2_UNORM;
379 case MESA_FORMAT_XBGR16161616_UNORM:
380 return PIPE_FORMAT_R16G16B16X16_UNORM;
381 case MESA_FORMAT_XBGR16161616_SNORM:
382 return PIPE_FORMAT_R16G16B16X16_SNORM;
383 case MESA_FORMAT_XBGR16161616_FLOAT:
384 return PIPE_FORMAT_R16G16B16X16_FLOAT;
385 case MESA_FORMAT_XBGR16161616_UINT:
386 return PIPE_FORMAT_R16G16B16X16_UINT;
387 case MESA_FORMAT_XBGR16161616_SINT:
388 return PIPE_FORMAT_R16G16B16X16_SINT;
389 case MESA_FORMAT_XBGR32323232_FLOAT:
390 return PIPE_FORMAT_R32G32B32X32_FLOAT;
391 case MESA_FORMAT_XBGR32323232_UINT:
392 return PIPE_FORMAT_R32G32B32X32_UINT;
393 case MESA_FORMAT_XBGR32323232_SINT:
394 return PIPE_FORMAT_R32G32B32X32_SINT;
395
396 default:
397 return PIPE_FORMAT_NONE;
398 }
399 }
400
401
402 /**
403 * Translate Gallium format to Mesa format.
404 */
405 mesa_format
406 st_pipe_format_to_mesa_format(enum pipe_format format)
407 {
408 switch (format) {
409 case PIPE_FORMAT_ABGR8888_UNORM:
410 return MESA_FORMAT_RGBA8888;
411 case PIPE_FORMAT_RGBA8888_UNORM:
412 return MESA_FORMAT_RGBA8888_REV;
413 case PIPE_FORMAT_BGRA8888_UNORM:
414 return MESA_FORMAT_ARGB8888;
415 case PIPE_FORMAT_ARGB8888_UNORM:
416 return MESA_FORMAT_ARGB8888_REV;
417 case PIPE_FORMAT_XBGR8888_UNORM:
418 return MESA_FORMAT_RGBX8888;
419 case PIPE_FORMAT_RGBX8888_UNORM:
420 return MESA_FORMAT_RGBX8888_REV;
421 case PIPE_FORMAT_BGRX8888_UNORM:
422 return MESA_FORMAT_XRGB8888;
423 case PIPE_FORMAT_XRGB8888_UNORM:
424 return MESA_FORMAT_XRGB8888_REV;
425 case PIPE_FORMAT_B5G5R5A1_UNORM:
426 return MESA_FORMAT_ARGB1555;
427 case PIPE_FORMAT_B4G4R4A4_UNORM:
428 return MESA_FORMAT_ARGB4444;
429 case PIPE_FORMAT_B5G6R5_UNORM:
430 return MESA_FORMAT_RGB565;
431 case PIPE_FORMAT_B2G3R3_UNORM:
432 return MESA_FORMAT_RGB332;
433 case PIPE_FORMAT_B10G10R10A2_UNORM:
434 return MESA_FORMAT_ARGB2101010;
435 case PIPE_FORMAT_L4A4_UNORM:
436 return MESA_FORMAT_AL44;
437 case PIPE_FORMAT_L8A8_UNORM:
438 return MESA_FORMAT_AL88;
439 case PIPE_FORMAT_L16A16_UNORM:
440 return MESA_FORMAT_AL1616;
441 case PIPE_FORMAT_A8_UNORM:
442 return MESA_FORMAT_A8;
443 case PIPE_FORMAT_A16_UNORM:
444 return MESA_FORMAT_A16;
445 case PIPE_FORMAT_L8_UNORM:
446 return MESA_FORMAT_L8;
447 case PIPE_FORMAT_L16_UNORM:
448 return MESA_FORMAT_L16;
449 case PIPE_FORMAT_I8_UNORM:
450 return MESA_FORMAT_I8;
451 case PIPE_FORMAT_I16_UNORM:
452 return MESA_FORMAT_I16;
453 case PIPE_FORMAT_S8_UINT:
454 return MESA_FORMAT_S8;
455
456 case PIPE_FORMAT_R16G16B16A16_UNORM:
457 return MESA_FORMAT_RGBA_16;
458
459 case PIPE_FORMAT_Z16_UNORM:
460 return MESA_FORMAT_Z16;
461 case PIPE_FORMAT_Z32_UNORM:
462 return MESA_FORMAT_Z32;
463 case PIPE_FORMAT_S8_UINT_Z24_UNORM:
464 return MESA_FORMAT_Z24_S8;
465 case PIPE_FORMAT_X8Z24_UNORM:
466 return MESA_FORMAT_Z24_X8;
467 case PIPE_FORMAT_Z24X8_UNORM:
468 return MESA_FORMAT_X8_Z24;
469 case PIPE_FORMAT_Z24_UNORM_S8_UINT:
470 return MESA_FORMAT_S8_Z24;
471 case PIPE_FORMAT_Z32_FLOAT:
472 return MESA_FORMAT_Z32_FLOAT;
473 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
474 return MESA_FORMAT_Z32_FLOAT_X24S8;
475
476 case PIPE_FORMAT_UYVY:
477 return MESA_FORMAT_YCBCR;
478 case PIPE_FORMAT_YUYV:
479 return MESA_FORMAT_YCBCR_REV;
480
481 case PIPE_FORMAT_DXT1_RGB:
482 return MESA_FORMAT_RGB_DXT1;
483 case PIPE_FORMAT_DXT1_RGBA:
484 return MESA_FORMAT_RGBA_DXT1;
485 case PIPE_FORMAT_DXT3_RGBA:
486 return MESA_FORMAT_RGBA_DXT3;
487 case PIPE_FORMAT_DXT5_RGBA:
488 return MESA_FORMAT_RGBA_DXT5;
489 case PIPE_FORMAT_DXT1_SRGB:
490 return MESA_FORMAT_SRGB_DXT1;
491 case PIPE_FORMAT_DXT1_SRGBA:
492 return MESA_FORMAT_SRGBA_DXT1;
493 case PIPE_FORMAT_DXT3_SRGBA:
494 return MESA_FORMAT_SRGBA_DXT3;
495 case PIPE_FORMAT_DXT5_SRGBA:
496 return MESA_FORMAT_SRGBA_DXT5;
497 case PIPE_FORMAT_L8A8_SRGB:
498 return MESA_FORMAT_SLA8;
499 case PIPE_FORMAT_L8_SRGB:
500 return MESA_FORMAT_SL8;
501 case PIPE_FORMAT_R8G8B8_SRGB:
502 return MESA_FORMAT_SRGB8;
503 case PIPE_FORMAT_A8B8G8R8_SRGB:
504 return MESA_FORMAT_SRGBA8;
505 case PIPE_FORMAT_B8G8R8A8_SRGB:
506 return MESA_FORMAT_SARGB8;
507 case PIPE_FORMAT_R32G32B32A32_FLOAT:
508 return MESA_FORMAT_RGBA_FLOAT32;
509 case PIPE_FORMAT_R16G16B16A16_FLOAT:
510 return MESA_FORMAT_RGBA_FLOAT16;
511 case PIPE_FORMAT_R32G32B32_FLOAT:
512 return MESA_FORMAT_RGB_FLOAT32;
513 case PIPE_FORMAT_R16G16B16_FLOAT:
514 return MESA_FORMAT_RGB_FLOAT16;
515 case PIPE_FORMAT_L32A32_FLOAT:
516 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
517 case PIPE_FORMAT_L16A16_FLOAT:
518 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
519 case PIPE_FORMAT_L32_FLOAT:
520 return MESA_FORMAT_LUMINANCE_FLOAT32;
521 case PIPE_FORMAT_L16_FLOAT:
522 return MESA_FORMAT_LUMINANCE_FLOAT16;
523 case PIPE_FORMAT_A32_FLOAT:
524 return MESA_FORMAT_ALPHA_FLOAT32;
525 case PIPE_FORMAT_A16_FLOAT:
526 return MESA_FORMAT_ALPHA_FLOAT16;
527 case PIPE_FORMAT_I32_FLOAT:
528 return MESA_FORMAT_INTENSITY_FLOAT32;
529 case PIPE_FORMAT_I16_FLOAT:
530 return MESA_FORMAT_INTENSITY_FLOAT16;
531 case PIPE_FORMAT_R32_FLOAT:
532 return MESA_FORMAT_R_FLOAT32;
533 case PIPE_FORMAT_R16_FLOAT:
534 return MESA_FORMAT_R_FLOAT16;
535 case PIPE_FORMAT_R32G32_FLOAT:
536 return MESA_FORMAT_RG_FLOAT32;
537 case PIPE_FORMAT_R16G16_FLOAT:
538 return MESA_FORMAT_RG_FLOAT16;
539
540 case PIPE_FORMAT_R8_UNORM:
541 return MESA_FORMAT_R8;
542 case PIPE_FORMAT_R16_UNORM:
543 return MESA_FORMAT_R16;
544 case PIPE_FORMAT_R8G8_UNORM:
545 return MESA_FORMAT_GR88;
546 case PIPE_FORMAT_R16G16_UNORM:
547 return MESA_FORMAT_GR1616;
548
549 case PIPE_FORMAT_A8_UINT:
550 return MESA_FORMAT_ALPHA_UINT8;
551 case PIPE_FORMAT_A16_UINT:
552 return MESA_FORMAT_ALPHA_UINT16;
553 case PIPE_FORMAT_A32_UINT:
554 return MESA_FORMAT_ALPHA_UINT32;
555 case PIPE_FORMAT_A8_SINT:
556 return MESA_FORMAT_ALPHA_INT8;
557 case PIPE_FORMAT_A16_SINT:
558 return MESA_FORMAT_ALPHA_INT16;
559 case PIPE_FORMAT_A32_SINT:
560 return MESA_FORMAT_ALPHA_INT32;
561
562 case PIPE_FORMAT_I8_UINT:
563 return MESA_FORMAT_INTENSITY_UINT8;
564 case PIPE_FORMAT_I16_UINT:
565 return MESA_FORMAT_INTENSITY_UINT16;
566 case PIPE_FORMAT_I32_UINT:
567 return MESA_FORMAT_INTENSITY_UINT32;
568 case PIPE_FORMAT_I8_SINT:
569 return MESA_FORMAT_INTENSITY_INT8;
570 case PIPE_FORMAT_I16_SINT:
571 return MESA_FORMAT_INTENSITY_INT16;
572 case PIPE_FORMAT_I32_SINT:
573 return MESA_FORMAT_INTENSITY_INT32;
574
575 case PIPE_FORMAT_L8_UINT:
576 return MESA_FORMAT_LUMINANCE_UINT8;
577 case PIPE_FORMAT_L16_UINT:
578 return MESA_FORMAT_LUMINANCE_UINT16;
579 case PIPE_FORMAT_L32_UINT:
580 return MESA_FORMAT_LUMINANCE_UINT32;
581 case PIPE_FORMAT_L8_SINT:
582 return MESA_FORMAT_LUMINANCE_INT8;
583 case PIPE_FORMAT_L16_SINT:
584 return MESA_FORMAT_LUMINANCE_INT16;
585 case PIPE_FORMAT_L32_SINT:
586 return MESA_FORMAT_LUMINANCE_INT32;
587
588 case PIPE_FORMAT_L8A8_UINT:
589 return MESA_FORMAT_LUMINANCE_ALPHA_UINT8;
590 case PIPE_FORMAT_L16A16_UINT:
591 return MESA_FORMAT_LUMINANCE_ALPHA_UINT16;
592 case PIPE_FORMAT_L32A32_UINT:
593 return MESA_FORMAT_LUMINANCE_ALPHA_UINT32;
594 case PIPE_FORMAT_L8A8_SINT:
595 return MESA_FORMAT_LUMINANCE_ALPHA_INT8;
596 case PIPE_FORMAT_L16A16_SINT:
597 return MESA_FORMAT_LUMINANCE_ALPHA_INT16;
598 case PIPE_FORMAT_L32A32_SINT:
599 return MESA_FORMAT_LUMINANCE_ALPHA_INT32;
600
601 case PIPE_FORMAT_R8_SINT:
602 return MESA_FORMAT_R_INT8;
603 case PIPE_FORMAT_R8G8_SINT:
604 return MESA_FORMAT_RG_INT8;
605 case PIPE_FORMAT_R8G8B8_SINT:
606 return MESA_FORMAT_RGB_INT8;
607 case PIPE_FORMAT_R8G8B8A8_SINT:
608 return MESA_FORMAT_RGBA_INT8;
609
610 case PIPE_FORMAT_R16_SINT:
611 return MESA_FORMAT_R_INT16;
612 case PIPE_FORMAT_R16G16_SINT:
613 return MESA_FORMAT_RG_INT16;
614 case PIPE_FORMAT_R16G16B16_SINT:
615 return MESA_FORMAT_RGB_INT16;
616 case PIPE_FORMAT_R16G16B16A16_SINT:
617 return MESA_FORMAT_RGBA_INT16;
618
619 case PIPE_FORMAT_R32_SINT:
620 return MESA_FORMAT_R_INT32;
621 case PIPE_FORMAT_R32G32_SINT:
622 return MESA_FORMAT_RG_INT32;
623 case PIPE_FORMAT_R32G32B32_SINT:
624 return MESA_FORMAT_RGB_INT32;
625 case PIPE_FORMAT_R32G32B32A32_SINT:
626 return MESA_FORMAT_RGBA_INT32;
627
628 /* unsigned int formats */
629 case PIPE_FORMAT_R8_UINT:
630 return MESA_FORMAT_R_UINT8;
631 case PIPE_FORMAT_R8G8_UINT:
632 return MESA_FORMAT_RG_UINT8;
633 case PIPE_FORMAT_R8G8B8_UINT:
634 return MESA_FORMAT_RGB_UINT8;
635 case PIPE_FORMAT_R8G8B8A8_UINT:
636 return MESA_FORMAT_RGBA_UINT8;
637
638 case PIPE_FORMAT_R16_UINT:
639 return MESA_FORMAT_R_UINT16;
640 case PIPE_FORMAT_R16G16_UINT:
641 return MESA_FORMAT_RG_UINT16;
642 case PIPE_FORMAT_R16G16B16_UINT:
643 return MESA_FORMAT_RGB_UINT16;
644 case PIPE_FORMAT_R16G16B16A16_UINT:
645 return MESA_FORMAT_RGBA_UINT16;
646
647 case PIPE_FORMAT_R32_UINT:
648 return MESA_FORMAT_R_UINT32;
649 case PIPE_FORMAT_R32G32_UINT:
650 return MESA_FORMAT_RG_UINT32;
651 case PIPE_FORMAT_R32G32B32_UINT:
652 return MESA_FORMAT_RGB_UINT32;
653 case PIPE_FORMAT_R32G32B32A32_UINT:
654 return MESA_FORMAT_RGBA_UINT32;
655
656 case PIPE_FORMAT_RGTC1_UNORM:
657 return MESA_FORMAT_RED_RGTC1;
658 case PIPE_FORMAT_RGTC1_SNORM:
659 return MESA_FORMAT_SIGNED_RED_RGTC1;
660 case PIPE_FORMAT_RGTC2_UNORM:
661 return MESA_FORMAT_RG_RGTC2;
662 case PIPE_FORMAT_RGTC2_SNORM:
663 return MESA_FORMAT_SIGNED_RG_RGTC2;
664
665 case PIPE_FORMAT_LATC1_UNORM:
666 return MESA_FORMAT_L_LATC1;
667 case PIPE_FORMAT_LATC1_SNORM:
668 return MESA_FORMAT_SIGNED_L_LATC1;
669 case PIPE_FORMAT_LATC2_UNORM:
670 return MESA_FORMAT_LA_LATC2;
671 case PIPE_FORMAT_LATC2_SNORM:
672 return MESA_FORMAT_SIGNED_LA_LATC2;
673
674 case PIPE_FORMAT_ETC1_RGB8:
675 return MESA_FORMAT_ETC1_RGB8;
676
677 /* signed normalized formats */
678 case PIPE_FORMAT_R8_SNORM:
679 return MESA_FORMAT_SIGNED_R8;
680 case PIPE_FORMAT_R8G8_SNORM:
681 return MESA_FORMAT_SIGNED_RG88_REV;
682 case PIPE_FORMAT_R8G8B8A8_SNORM:
683 return MESA_FORMAT_SIGNED_RGBA8888_REV;
684
685 case PIPE_FORMAT_A8_SNORM:
686 return MESA_FORMAT_SIGNED_A8;
687 case PIPE_FORMAT_L8_SNORM:
688 return MESA_FORMAT_SIGNED_L8;
689 case PIPE_FORMAT_L8A8_SNORM:
690 return MESA_FORMAT_SIGNED_AL88;
691 case PIPE_FORMAT_I8_SNORM:
692 return MESA_FORMAT_SIGNED_I8;
693
694 case PIPE_FORMAT_R16_SNORM:
695 return MESA_FORMAT_SIGNED_R16;
696 case PIPE_FORMAT_R16G16_SNORM:
697 return MESA_FORMAT_SIGNED_GR1616;
698 case PIPE_FORMAT_R16G16B16A16_SNORM:
699 return MESA_FORMAT_SIGNED_RGBA_16;
700
701 case PIPE_FORMAT_A16_SNORM:
702 return MESA_FORMAT_SIGNED_A16;
703 case PIPE_FORMAT_L16_SNORM:
704 return MESA_FORMAT_SIGNED_L16;
705 case PIPE_FORMAT_L16A16_SNORM:
706 return MESA_FORMAT_SIGNED_AL1616;
707 case PIPE_FORMAT_I16_SNORM:
708 return MESA_FORMAT_SIGNED_I16;
709
710 case PIPE_FORMAT_R9G9B9E5_FLOAT:
711 return MESA_FORMAT_RGB9_E5_FLOAT;
712 case PIPE_FORMAT_R11G11B10_FLOAT:
713 return MESA_FORMAT_R11_G11_B10_FLOAT;
714
715 case PIPE_FORMAT_B10G10R10A2_UINT:
716 return MESA_FORMAT_ARGB2101010_UINT;
717 case PIPE_FORMAT_R10G10B10A2_UINT:
718 return MESA_FORMAT_ABGR2101010_UINT;
719
720 case PIPE_FORMAT_B4G4R4X4_UNORM:
721 return MESA_FORMAT_XRGB4444_UNORM;
722 case PIPE_FORMAT_B5G5R5X1_UNORM:
723 return MESA_FORMAT_XRGB1555_UNORM;
724 case PIPE_FORMAT_R8G8B8X8_SNORM:
725 return MESA_FORMAT_XBGR8888_SNORM;
726 case PIPE_FORMAT_R8G8B8X8_SRGB:
727 return MESA_FORMAT_XBGR8888_SRGB;
728 case PIPE_FORMAT_R8G8B8X8_UINT:
729 return MESA_FORMAT_XBGR8888_UINT;
730 case PIPE_FORMAT_R8G8B8X8_SINT:
731 return MESA_FORMAT_XBGR8888_SINT;
732 case PIPE_FORMAT_B10G10R10X2_UNORM:
733 return MESA_FORMAT_XRGB2101010_UNORM;
734 case PIPE_FORMAT_R16G16B16X16_UNORM:
735 return MESA_FORMAT_XBGR16161616_UNORM;
736 case PIPE_FORMAT_R16G16B16X16_SNORM:
737 return MESA_FORMAT_XBGR16161616_SNORM;
738 case PIPE_FORMAT_R16G16B16X16_FLOAT:
739 return MESA_FORMAT_XBGR16161616_FLOAT;
740 case PIPE_FORMAT_R16G16B16X16_UINT:
741 return MESA_FORMAT_XBGR16161616_UINT;
742 case PIPE_FORMAT_R16G16B16X16_SINT:
743 return MESA_FORMAT_XBGR16161616_SINT;
744 case PIPE_FORMAT_R32G32B32X32_FLOAT:
745 return MESA_FORMAT_XBGR32323232_FLOAT;
746 case PIPE_FORMAT_R32G32B32X32_UINT:
747 return MESA_FORMAT_XBGR32323232_UINT;
748 case PIPE_FORMAT_R32G32B32X32_SINT:
749 return MESA_FORMAT_XBGR32323232_SINT;
750
751 default:
752 assert(0);
753 return MESA_FORMAT_NONE;
754 }
755 }
756
757
758 /**
759 * Map GL texture formats to Gallium pipe formats.
760 */
761 struct format_mapping
762 {
763 GLenum glFormats[18]; /**< list of GLenum formats, 0-terminated */
764 enum pipe_format pipeFormats[13]; /**< list of pipe formats, 0-terminated */
765 };
766
767
768 #define DEFAULT_RGBA_FORMATS \
769 PIPE_FORMAT_B8G8R8A8_UNORM, \
770 PIPE_FORMAT_R8G8B8A8_UNORM, \
771 PIPE_FORMAT_A8R8G8B8_UNORM, \
772 PIPE_FORMAT_A8B8G8R8_UNORM, \
773 0
774
775 #define DEFAULT_RGB_FORMATS \
776 PIPE_FORMAT_B8G8R8X8_UNORM, \
777 PIPE_FORMAT_R8G8B8X8_UNORM, \
778 PIPE_FORMAT_X8R8G8B8_UNORM, \
779 PIPE_FORMAT_X8B8G8R8_UNORM, \
780 PIPE_FORMAT_B5G6R5_UNORM, \
781 DEFAULT_RGBA_FORMATS
782
783 #define DEFAULT_SRGBA_FORMATS \
784 PIPE_FORMAT_B8G8R8A8_SRGB, \
785 PIPE_FORMAT_A8R8G8B8_SRGB, \
786 PIPE_FORMAT_A8B8G8R8_SRGB, \
787 0
788
789 #define DEFAULT_DEPTH_FORMATS \
790 PIPE_FORMAT_Z24X8_UNORM, \
791 PIPE_FORMAT_X8Z24_UNORM, \
792 PIPE_FORMAT_Z16_UNORM, \
793 PIPE_FORMAT_Z24_UNORM_S8_UINT, \
794 PIPE_FORMAT_S8_UINT_Z24_UNORM, \
795 0
796
797 #define DEFAULT_SNORM8_RGBA_FORMATS \
798 PIPE_FORMAT_R8G8B8A8_SNORM, \
799 0
800
801 #define DEFAULT_UNORM16_RGBA_FORMATS \
802 PIPE_FORMAT_R16G16B16A16_UNORM, \
803 DEFAULT_RGBA_FORMATS
804
805
806 /**
807 * This table maps OpenGL texture format enums to Gallium pipe_format enums.
808 * Multiple GL enums might map to multiple pipe_formats.
809 * The first pipe format in the list that's supported is the one that's chosen.
810 */
811 static const struct format_mapping format_map[] = {
812 /* Basic RGB, RGBA formats */
813 {
814 { GL_RGB10, 0 },
815 { PIPE_FORMAT_B10G10R10X2_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
816 DEFAULT_RGB_FORMATS }
817 },
818 {
819 { GL_RGB10_A2, 0 },
820 { PIPE_FORMAT_B10G10R10A2_UNORM, DEFAULT_RGBA_FORMATS }
821 },
822 {
823 { 4, GL_RGBA, GL_RGBA8, 0 },
824 { PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS }
825 },
826 {
827 { GL_BGRA, 0 },
828 { PIPE_FORMAT_B8G8R8A8_UNORM, DEFAULT_RGBA_FORMATS }
829 },
830 {
831 { 3, GL_RGB, GL_RGB8, 0 },
832 { DEFAULT_RGB_FORMATS }
833 },
834 {
835 { GL_RGB12, GL_RGB16, 0 },
836 { PIPE_FORMAT_R16G16B16X16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
837 DEFAULT_RGB_FORMATS }
838 },
839 {
840 { GL_RGBA12, GL_RGBA16, 0 },
841 { PIPE_FORMAT_R16G16B16A16_UNORM, DEFAULT_RGBA_FORMATS }
842 },
843 {
844 { GL_RGBA4, GL_RGBA2, 0 },
845 { PIPE_FORMAT_B4G4R4A4_UNORM, DEFAULT_RGBA_FORMATS }
846 },
847 {
848 { GL_RGB5_A1, 0 },
849 { PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGBA_FORMATS }
850 },
851 {
852 { GL_R3_G3_B2, 0 },
853 { PIPE_FORMAT_B2G3R3_UNORM, PIPE_FORMAT_B5G6R5_UNORM,
854 PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGB_FORMATS }
855 },
856 {
857 { GL_RGB4 },
858 { PIPE_FORMAT_B4G4R4X4_UNORM, PIPE_FORMAT_B4G4R4A4_UNORM,
859 DEFAULT_RGB_FORMATS }
860 },
861 {
862 { GL_RGB5 },
863 { PIPE_FORMAT_B5G5R5X1_UNORM, PIPE_FORMAT_B5G5R5A1_UNORM,
864 DEFAULT_RGB_FORMATS }
865 },
866 {
867 { GL_RGB565 },
868 { PIPE_FORMAT_B5G6R5_UNORM, DEFAULT_RGB_FORMATS }
869 },
870
871 /* basic Alpha formats */
872 {
873 { GL_ALPHA12, GL_ALPHA16, 0 },
874 { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_A8_UNORM,
875 DEFAULT_RGBA_FORMATS }
876 },
877 {
878 { GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_COMPRESSED_ALPHA, 0 },
879 { PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
880 },
881
882 /* basic Luminance formats */
883 {
884 { GL_LUMINANCE12, GL_LUMINANCE16, 0 },
885 { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
886 },
887 {
888 { 1, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, 0 },
889 { PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
890 },
891
892 /* basic Luminance/Alpha formats */
893 {
894 { GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,
895 GL_LUMINANCE16_ALPHA16, 0},
896 { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_L8A8_UNORM,
897 DEFAULT_RGBA_FORMATS }
898 },
899 {
900 { 2, GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, 0 },
901 { PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
902 },
903 {
904 { GL_LUMINANCE4_ALPHA4, 0 },
905 { PIPE_FORMAT_L4A4_UNORM, PIPE_FORMAT_L8A8_UNORM,
906 DEFAULT_RGBA_FORMATS }
907 },
908
909 /* basic Intensity formats */
910 {
911 { GL_INTENSITY12, GL_INTENSITY16, 0 },
912 { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
913 },
914 {
915 { GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8,
916 GL_COMPRESSED_INTENSITY, 0 },
917 { PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
918 },
919
920 /* YCbCr */
921 {
922 { GL_YCBCR_MESA, 0 },
923 { PIPE_FORMAT_UYVY, PIPE_FORMAT_YUYV, 0 }
924 },
925
926 /* compressed formats */ /* XXX PIPE_BIND_SAMPLER_VIEW only */
927 {
928 { GL_COMPRESSED_RGB, 0 },
929 { PIPE_FORMAT_DXT1_RGB, DEFAULT_RGB_FORMATS }
930 },
931 {
932 { GL_COMPRESSED_RGBA, 0 },
933 { PIPE_FORMAT_DXT5_RGBA, DEFAULT_RGBA_FORMATS }
934 },
935 {
936 { GL_RGB_S3TC, GL_RGB4_S3TC, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 0 },
937 { PIPE_FORMAT_DXT1_RGB, 0 }
938 },
939 {
940 { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0 },
941 { PIPE_FORMAT_DXT1_RGBA, 0 }
942 },
943 {
944 { GL_RGBA_S3TC, GL_RGBA4_S3TC, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0 },
945 { PIPE_FORMAT_DXT3_RGBA, 0 }
946 },
947 {
948 { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0 },
949 { PIPE_FORMAT_DXT5_RGBA, 0 }
950 },
951
952 #if 0
953 {
954 { GL_COMPRESSED_RGB_FXT1_3DFX, 0 },
955 { PIPE_FORMAT_RGB_FXT1, 0 }
956 },
957 {
958 { GL_COMPRESSED_RGBA_FXT1_3DFX, 0 },
959 { PIPE_FORMAT_RGBA_FXT1, 0 }
960 },
961 #endif
962
963 /* Depth formats */
964 {
965 { GL_DEPTH_COMPONENT16, 0 },
966 { PIPE_FORMAT_Z16_UNORM, DEFAULT_DEPTH_FORMATS }
967 },
968 {
969 { GL_DEPTH_COMPONENT24, 0 },
970 { PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM,
971 DEFAULT_DEPTH_FORMATS }
972 },
973 {
974 { GL_DEPTH_COMPONENT32, 0 },
975 { PIPE_FORMAT_Z32_UNORM, DEFAULT_DEPTH_FORMATS }
976 },
977 {
978 { GL_DEPTH_COMPONENT, 0 },
979 { DEFAULT_DEPTH_FORMATS }
980 },
981 {
982 { GL_DEPTH_COMPONENT32F, 0 },
983 { PIPE_FORMAT_Z32_FLOAT, 0 }
984 },
985
986 /* stencil formats */
987 {
988 { GL_STENCIL_INDEX, GL_STENCIL_INDEX1_EXT, GL_STENCIL_INDEX4_EXT,
989 GL_STENCIL_INDEX8_EXT, GL_STENCIL_INDEX16_EXT, 0 },
990 {
991 PIPE_FORMAT_S8_UINT, PIPE_FORMAT_Z24_UNORM_S8_UINT,
992 PIPE_FORMAT_S8_UINT_Z24_UNORM, 0
993 }
994 },
995
996 /* Depth / Stencil formats */
997 {
998 { GL_DEPTH_STENCIL_EXT, GL_DEPTH24_STENCIL8_EXT, 0 },
999 { PIPE_FORMAT_Z24_UNORM_S8_UINT, PIPE_FORMAT_S8_UINT_Z24_UNORM, 0 }
1000 },
1001 {
1002 { GL_DEPTH32F_STENCIL8, 0 },
1003 { PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, 0 }
1004 },
1005
1006 /* sRGB formats */
1007 {
1008 { GL_SRGB_EXT, GL_SRGB8_EXT, 0 },
1009 { PIPE_FORMAT_R8G8B8X8_SRGB, DEFAULT_SRGBA_FORMATS }
1010 },
1011 {
1012 { GL_SRGB_ALPHA_EXT, GL_SRGB8_ALPHA8_EXT, 0 },
1013 { DEFAULT_SRGBA_FORMATS }
1014 },
1015 {
1016 { GL_COMPRESSED_SRGB_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 0 },
1017 { PIPE_FORMAT_DXT1_SRGB, PIPE_FORMAT_R8G8B8X8_SRGB,
1018 DEFAULT_SRGBA_FORMATS }
1019 },
1020 {
1021 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0 },
1022 { PIPE_FORMAT_DXT1_SRGBA, 0 }
1023 },
1024 {
1025 { GL_COMPRESSED_SRGB_ALPHA_EXT,
1026 GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0 },
1027 { PIPE_FORMAT_DXT3_SRGBA, DEFAULT_SRGBA_FORMATS }
1028 },
1029 {
1030 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0 },
1031 { PIPE_FORMAT_DXT5_SRGBA, 0 }
1032 },
1033 {
1034 { GL_SLUMINANCE_ALPHA_EXT, GL_SLUMINANCE8_ALPHA8_EXT,
1035 GL_COMPRESSED_SLUMINANCE_ALPHA_EXT, 0 },
1036 { PIPE_FORMAT_L8A8_SRGB, DEFAULT_SRGBA_FORMATS }
1037 },
1038 {
1039 { GL_SLUMINANCE_EXT, GL_SLUMINANCE8_EXT, GL_COMPRESSED_SLUMINANCE_EXT,
1040 0 },
1041 { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS }
1042 },
1043
1044 /* 16-bit float formats */
1045 {
1046 { GL_RGBA16F_ARB, 0 },
1047 { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1048 },
1049 {
1050 { GL_RGB16F_ARB, 0 },
1051 { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R16G16B16X16_FLOAT,
1052 PIPE_FORMAT_R16G16B16A16_FLOAT,
1053 PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1054 },
1055 {
1056 { GL_LUMINANCE_ALPHA16F_ARB, 0 },
1057 { PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1058 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1059 },
1060 {
1061 { GL_ALPHA16F_ARB, 0 },
1062 { PIPE_FORMAT_A16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
1063 PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1064 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1065 },
1066 {
1067 { GL_INTENSITY16F_ARB, 0 },
1068 { PIPE_FORMAT_I16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
1069 PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1070 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1071 },
1072 {
1073 { GL_LUMINANCE16F_ARB, 0 },
1074 { PIPE_FORMAT_L16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
1075 PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1076 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1077 },
1078 {
1079 { GL_R16F, 0 },
1080 { PIPE_FORMAT_R16_FLOAT, PIPE_FORMAT_R16G16_FLOAT,
1081 PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1082 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1083 },
1084 {
1085 { GL_RG16F, 0 },
1086 { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1087 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1088 },
1089
1090 /* 32-bit float formats */
1091 {
1092 { GL_RGBA32F_ARB, 0 },
1093 { PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1094 },
1095 {
1096 { GL_RGB32F_ARB, 0 },
1097 { PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32X32_FLOAT,
1098 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1099 },
1100 {
1101 { GL_LUMINANCE_ALPHA32F_ARB, 0 },
1102 { PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
1103 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1104 },
1105 {
1106 { GL_ALPHA32F_ARB, 0 },
1107 { PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1108 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_A16_FLOAT,
1109 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1110 },
1111 {
1112 { GL_INTENSITY32F_ARB, 0 },
1113 { PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1114 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_I16_FLOAT,
1115 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1116 },
1117 {
1118 { GL_LUMINANCE32F_ARB, 0 },
1119 { PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1120 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_L16_FLOAT,
1121 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1122 },
1123 {
1124 { GL_R32F, 0 },
1125 { PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT,
1126 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16_FLOAT,
1127 PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1128 },
1129 {
1130 { GL_RG32F, 0 },
1131 { PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
1132 PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1133 },
1134
1135 /* R, RG formats */
1136 {
1137 { GL_RED, GL_R8, 0 },
1138 { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1139 },
1140 {
1141 { GL_RG, GL_RG8, 0 },
1142 { PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1143 },
1144 {
1145 { GL_R16, 0 },
1146 { PIPE_FORMAT_R16_UNORM, PIPE_FORMAT_R16G16_UNORM,
1147 DEFAULT_UNORM16_RGBA_FORMATS }
1148 },
1149 {
1150 { GL_RG16, 0 },
1151 { PIPE_FORMAT_R16G16_UNORM, DEFAULT_UNORM16_RGBA_FORMATS }
1152 },
1153
1154 /* compressed R, RG formats */
1155 {
1156 { GL_COMPRESSED_RED, GL_COMPRESSED_RED_RGTC1, 0 },
1157 { PIPE_FORMAT_RGTC1_UNORM, PIPE_FORMAT_R8_UNORM, DEFAULT_RGBA_FORMATS }
1158 },
1159 {
1160 { GL_COMPRESSED_SIGNED_RED_RGTC1, 0 },
1161 { PIPE_FORMAT_RGTC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1162 },
1163 {
1164 { GL_COMPRESSED_RG, GL_COMPRESSED_RG_RGTC2, 0 },
1165 { PIPE_FORMAT_RGTC2_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1166 },
1167 {
1168 { GL_COMPRESSED_SIGNED_RG_RGTC2, 0 },
1169 { PIPE_FORMAT_RGTC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1170 },
1171 {
1172 { GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_LATC1_EXT, 0 },
1173 { PIPE_FORMAT_LATC1_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGBA_FORMATS }
1174 },
1175 {
1176 { GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT, 0 },
1177 { PIPE_FORMAT_LATC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1178 },
1179 {
1180 { GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT,
1181 GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0 },
1182 { PIPE_FORMAT_LATC2_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
1183 },
1184 {
1185 { GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT, 0 },
1186 { PIPE_FORMAT_LATC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1187 },
1188
1189 /* ETC1 */
1190 {
1191 { GL_ETC1_RGB8_OES, 0 },
1192 { PIPE_FORMAT_ETC1_RGB8, 0 }
1193 },
1194
1195 /* signed/unsigned integer formats.
1196 */
1197 {
1198 { GL_RGBA_INTEGER_EXT,
1199 GL_BGRA_INTEGER_EXT,
1200 GL_RGBA8I_EXT, 0 },
1201 { PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1202 },
1203 {
1204 { GL_RGB_INTEGER_EXT,
1205 GL_BGR_INTEGER_EXT,
1206 GL_RGB8I_EXT,
1207 GL_BLUE_INTEGER_EXT, 0 },
1208 { PIPE_FORMAT_R8G8B8_SINT, PIPE_FORMAT_R8G8B8X8_SINT,
1209 PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1210 },
1211 {
1212 { GL_ALPHA_INTEGER_EXT,
1213 GL_ALPHA8I_EXT, 0 },
1214 { PIPE_FORMAT_A8_SINT, 0 }
1215 },
1216 {
1217 { GL_ALPHA16I_EXT, 0 },
1218 { PIPE_FORMAT_A16_SINT, 0 }
1219 },
1220 {
1221 { GL_ALPHA32I_EXT, 0 },
1222 { PIPE_FORMAT_A32_SINT, 0 }
1223 },
1224 {
1225 { GL_ALPHA8UI_EXT, 0 },
1226 { PIPE_FORMAT_A8_UINT, 0 }
1227 },
1228 {
1229 { GL_ALPHA16UI_EXT, 0 },
1230 { PIPE_FORMAT_A16_UINT, 0 }
1231 },
1232 {
1233 { GL_ALPHA32UI_EXT, 0 },
1234 { PIPE_FORMAT_A32_UINT, 0 }
1235 },
1236 {
1237 { GL_INTENSITY8I_EXT, 0 },
1238 { PIPE_FORMAT_I8_SINT, 0 }
1239 },
1240 {
1241 { GL_INTENSITY16I_EXT, 0 },
1242 { PIPE_FORMAT_I16_SINT, 0 }
1243 },
1244 {
1245 { GL_INTENSITY32I_EXT, 0 },
1246 { PIPE_FORMAT_I32_SINT, 0 }
1247 },
1248 {
1249 { GL_INTENSITY8UI_EXT, 0 },
1250 { PIPE_FORMAT_I8_UINT, 0 }
1251 },
1252 {
1253 { GL_INTENSITY16UI_EXT, 0 },
1254 { PIPE_FORMAT_I16_UINT, 0 }
1255 },
1256 {
1257 { GL_INTENSITY32UI_EXT, 0 },
1258 { PIPE_FORMAT_I32_UINT, 0 }
1259 },
1260 {
1261 { GL_LUMINANCE8I_EXT, 0 },
1262 { PIPE_FORMAT_L8_SINT, 0 }
1263 },
1264 {
1265 { GL_LUMINANCE16I_EXT, 0 },
1266 { PIPE_FORMAT_L16_SINT, 0 }
1267 },
1268 {
1269 { GL_LUMINANCE32I_EXT, 0 },
1270 { PIPE_FORMAT_L32_SINT, 0 }
1271 },
1272 {
1273 { GL_LUMINANCE_INTEGER_EXT,
1274 GL_LUMINANCE8UI_EXT, 0 },
1275 { PIPE_FORMAT_L8_UINT, 0 }
1276 },
1277 {
1278 { GL_LUMINANCE16UI_EXT, 0 },
1279 { PIPE_FORMAT_L16_UINT, 0 }
1280 },
1281 {
1282 { GL_LUMINANCE32UI_EXT, 0 },
1283 { PIPE_FORMAT_L32_UINT, 0 }
1284 },
1285 {
1286 { GL_LUMINANCE_ALPHA_INTEGER_EXT,
1287 GL_LUMINANCE_ALPHA8I_EXT, 0 },
1288 { PIPE_FORMAT_L8A8_SINT, 0 }
1289 },
1290 {
1291 { GL_LUMINANCE_ALPHA16I_EXT, 0 },
1292 { PIPE_FORMAT_L16A16_SINT, 0 }
1293 },
1294 {
1295 { GL_LUMINANCE_ALPHA32I_EXT, 0 },
1296 { PIPE_FORMAT_L32A32_SINT, 0 }
1297 },
1298 {
1299 { GL_LUMINANCE_ALPHA8UI_EXT, 0 },
1300 { PIPE_FORMAT_L8A8_UINT, 0 }
1301 },
1302 {
1303 { GL_LUMINANCE_ALPHA16UI_EXT, 0 },
1304 { PIPE_FORMAT_L16A16_UINT, 0 }
1305 },
1306 {
1307 { GL_LUMINANCE_ALPHA32UI_EXT, 0 },
1308 { PIPE_FORMAT_L32A32_UINT, 0 }
1309 },
1310 {
1311 { GL_RGB16I_EXT, 0 },
1312 { PIPE_FORMAT_R16G16B16_SINT, PIPE_FORMAT_R16G16B16X16_SINT,
1313 PIPE_FORMAT_R16G16B16A16_SINT, 0 },
1314 },
1315 {
1316 { GL_RGBA16I_EXT, 0 },
1317 { PIPE_FORMAT_R16G16B16A16_SINT, 0 },
1318 },
1319 {
1320 { GL_RGB32I_EXT, 0 },
1321 { PIPE_FORMAT_R32G32B32_SINT, PIPE_FORMAT_R32G32B32X32_SINT,
1322 PIPE_FORMAT_R32G32B32A32_SINT, 0 },
1323 },
1324 {
1325 { GL_RGBA32I_EXT, 0 },
1326 { PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1327 },
1328 {
1329 { GL_RGBA8UI_EXT, 0 },
1330 { PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1331 },
1332 {
1333 { GL_RGB8UI_EXT, 0 },
1334 { PIPE_FORMAT_R8G8B8_UINT, PIPE_FORMAT_R8G8B8X8_UINT,
1335 PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1336 },
1337 {
1338 { GL_RGB16UI_EXT, 0 },
1339 { PIPE_FORMAT_R16G16B16_UINT, PIPE_FORMAT_R16G16B16X16_UINT,
1340 PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1341 },
1342 {
1343 { GL_RGBA16UI_EXT, 0 },
1344 { PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1345 },
1346 {
1347 { GL_RGB32UI_EXT, 0},
1348 { PIPE_FORMAT_R32G32B32_UINT, PIPE_FORMAT_R32G32B32X32_UINT,
1349 PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1350 },
1351 {
1352 { GL_RGBA32UI_EXT, 0},
1353 { PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1354 },
1355 {
1356 { GL_R8I, GL_RED_INTEGER_EXT, 0},
1357 { PIPE_FORMAT_R8_SINT, 0},
1358 },
1359 {
1360 { GL_R16I, 0},
1361 { PIPE_FORMAT_R16_SINT, 0},
1362 },
1363 {
1364 { GL_R32I, 0},
1365 { PIPE_FORMAT_R32_SINT, 0},
1366 },
1367 {
1368 { GL_R8UI, 0},
1369 { PIPE_FORMAT_R8_UINT, 0},
1370 },
1371 {
1372 { GL_R16UI, 0},
1373 { PIPE_FORMAT_R16_UINT, 0},
1374 },
1375 {
1376 { GL_R32UI, 0},
1377 { PIPE_FORMAT_R32_UINT, 0},
1378 },
1379 {
1380 { GL_RG8I, GL_GREEN_INTEGER_EXT, 0},
1381 { PIPE_FORMAT_R8G8_SINT, 0},
1382 },
1383 {
1384 { GL_RG16I, 0},
1385 { PIPE_FORMAT_R16G16_SINT, 0},
1386 },
1387 {
1388 { GL_RG32I, 0},
1389 { PIPE_FORMAT_R32G32_SINT, 0},
1390 },
1391 {
1392 { GL_RG8UI, 0},
1393 { PIPE_FORMAT_R8G8_UINT, 0},
1394 },
1395 {
1396 { GL_RG16UI, 0},
1397 { PIPE_FORMAT_R16G16_UINT, 0},
1398 },
1399 {
1400 { GL_RG32UI, 0},
1401 { PIPE_FORMAT_R32G32_UINT, 0},
1402 },
1403 /* signed normalized formats */
1404 {
1405 { GL_RED_SNORM, GL_R8_SNORM, 0 },
1406 { PIPE_FORMAT_R8_SNORM, PIPE_FORMAT_R8G8_SNORM,
1407 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1408 },
1409 {
1410 { GL_R16_SNORM, 0 },
1411 { PIPE_FORMAT_R16_SNORM,
1412 PIPE_FORMAT_R16G16_SNORM,
1413 PIPE_FORMAT_R16G16B16A16_SNORM,
1414 PIPE_FORMAT_R8_SNORM,
1415 PIPE_FORMAT_R8G8_SNORM,
1416 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1417 },
1418 {
1419 { GL_RG_SNORM, GL_RG8_SNORM, 0 },
1420 { PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1421 },
1422 {
1423 { GL_RG16_SNORM, 0 },
1424 { PIPE_FORMAT_R16G16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1425 PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1426 },
1427 {
1428 { GL_RGB_SNORM, GL_RGB8_SNORM, 0 },
1429 { PIPE_FORMAT_R8G8B8X8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1430 },
1431 {
1432 { GL_RGBA_SNORM, GL_RGBA8_SNORM, 0 },
1433 { PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1434 },
1435 {
1436 { GL_RGB16_SNORM, 0 },
1437 { PIPE_FORMAT_R16G16B16X16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1438 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1439 },
1440 {
1441 { GL_RGBA16_SNORM, 0 },
1442 { PIPE_FORMAT_R16G16B16A16_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1443 },
1444 {
1445 { GL_ALPHA_SNORM, GL_ALPHA8_SNORM, 0 },
1446 { PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1447 },
1448 {
1449 { GL_ALPHA16_SNORM, 0 },
1450 { PIPE_FORMAT_A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1451 PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1452 },
1453 {
1454 { GL_LUMINANCE_SNORM, GL_LUMINANCE8_SNORM, 0 },
1455 { PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1456 },
1457 {
1458 { GL_LUMINANCE16_SNORM, 0 },
1459 { PIPE_FORMAT_L16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1460 PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1461 },
1462 {
1463 { GL_LUMINANCE_ALPHA_SNORM, GL_LUMINANCE8_ALPHA8_SNORM, 0 },
1464 { PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1465 },
1466 {
1467 { GL_LUMINANCE16_ALPHA16_SNORM, 0 },
1468 { PIPE_FORMAT_L16A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1469 PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1470 },
1471 {
1472 { GL_INTENSITY_SNORM, GL_INTENSITY8_SNORM, 0 },
1473 { PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1474 },
1475 {
1476 { GL_INTENSITY16_SNORM, 0 },
1477 { PIPE_FORMAT_I16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1478 PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1479 },
1480 {
1481 { GL_RGB9_E5, 0 },
1482 { PIPE_FORMAT_R9G9B9E5_FLOAT, 0 }
1483 },
1484 {
1485 { GL_R11F_G11F_B10F, 0 },
1486 { PIPE_FORMAT_R11G11B10_FLOAT, 0 }
1487 },
1488 {
1489 { GL_RGB10_A2UI, 0 },
1490 { PIPE_FORMAT_R10G10B10A2_UINT, PIPE_FORMAT_B10G10R10A2_UINT, 0 }
1491 },
1492 };
1493
1494
1495 /**
1496 * Return first supported format from the given list.
1497 * \param allow_dxt indicates whether it's OK to return a DXT format.
1498 */
1499 static enum pipe_format
1500 find_supported_format(struct pipe_screen *screen,
1501 const enum pipe_format formats[],
1502 enum pipe_texture_target target,
1503 unsigned sample_count,
1504 unsigned tex_usage,
1505 boolean allow_dxt)
1506 {
1507 uint i;
1508 for (i = 0; formats[i]; i++) {
1509 if (screen->is_format_supported(screen, formats[i], target,
1510 sample_count, tex_usage)) {
1511 if (!allow_dxt && util_format_is_s3tc(formats[i])) {
1512 /* we can't return a dxt format, continue searching */
1513 continue;
1514 }
1515
1516 return formats[i];
1517 }
1518 }
1519 return PIPE_FORMAT_NONE;
1520 }
1521
1522 struct exact_format_mapping
1523 {
1524 GLenum format;
1525 GLenum type;
1526 enum pipe_format pformat;
1527 };
1528
1529 static const struct exact_format_mapping rgba8888_tbl[] =
1530 {
1531 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_ABGR8888_UNORM },
1532 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_ABGR8888_UNORM },
1533 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_RGBA8888_UNORM },
1534 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_RGBA8888_UNORM },
1535 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_ARGB8888_UNORM },
1536 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_BGRA8888_UNORM },
1537 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8A8_UNORM },
1538 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_A8B8G8R8_UNORM },
1539 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8A8_UNORM },
1540 { 0, 0, 0 }
1541 };
1542
1543 static const struct exact_format_mapping rgbx8888_tbl[] =
1544 {
1545 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_XBGR8888_UNORM },
1546 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_XBGR8888_UNORM },
1547 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_RGBX8888_UNORM },
1548 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_RGBX8888_UNORM },
1549 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_XRGB8888_UNORM },
1550 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_BGRX8888_UNORM },
1551 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8X8_UNORM },
1552 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_X8B8G8R8_UNORM },
1553 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8X8_UNORM },
1554 { 0, 0, 0 }
1555 };
1556
1557 static const struct exact_format_mapping rgba1010102_tbl[] =
1558 {
1559 { GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_B10G10R10A2_UNORM },
1560 /* No Mesa formats for these Gallium formats:
1561 { GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_R10G10B10A2_UNORM },
1562 { GL_ABGR_EXT, GL_UNSIGNED_INT_10_10_10_2, PIPE_FORMAT_R10G10B10A2_UNORM },
1563 { GL_ABGR_EXT, GL_UNSIGNED_INT, PIPE_FORMAT_R10G10B10A2_UNORM },
1564 */
1565 { 0, 0, 0 }
1566 };
1567
1568 /**
1569 * If there is an exact pipe_format match for {internalFormat, format, type}
1570 * return that, otherwise return PIPE_FORMAT_NONE so we can do fuzzy matching.
1571 */
1572 static enum pipe_format
1573 find_exact_format(GLint internalFormat, GLenum format, GLenum type)
1574 {
1575 uint i;
1576 const struct exact_format_mapping* tbl;
1577
1578 if (format == GL_NONE || type == GL_NONE)
1579 return PIPE_FORMAT_NONE;
1580
1581 switch (internalFormat) {
1582 case 4:
1583 case GL_RGBA:
1584 case GL_RGBA8:
1585 tbl = rgba8888_tbl;
1586 break;
1587 case 3:
1588 case GL_RGB:
1589 case GL_RGB8:
1590 tbl = rgbx8888_tbl;
1591 break;
1592 case GL_RGB10_A2:
1593 tbl = rgba1010102_tbl;
1594 break;
1595 default:
1596 return PIPE_FORMAT_NONE;
1597 }
1598
1599 for (i = 0; tbl[i].format; i++)
1600 if (tbl[i].format == format && tbl[i].type == type)
1601 return tbl[i].pformat;
1602
1603 return PIPE_FORMAT_NONE;
1604 }
1605
1606 /**
1607 * Given an OpenGL internalFormat value for a texture or surface, return
1608 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
1609 * This is called during glTexImage2D, for example.
1610 *
1611 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
1612 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
1613 * we want render-to-texture ability.
1614 *
1615 * \param internalFormat the user value passed to glTexImage2D
1616 * \param target one of PIPE_TEXTURE_x
1617 * \param bindings bitmask of PIPE_BIND_x flags.
1618 * \param allow_dxt indicates whether it's OK to return a DXT format. This
1619 * only matters when internalFormat names a generic or
1620 * specific compressed format. And that should only happen
1621 * when we're getting called from gl[Copy]TexImage().
1622 */
1623 enum pipe_format
1624 st_choose_format(struct st_context *st, GLenum internalFormat,
1625 GLenum format, GLenum type,
1626 enum pipe_texture_target target, unsigned sample_count,
1627 unsigned bindings, boolean allow_dxt)
1628 {
1629 struct pipe_screen *screen = st->pipe->screen;
1630 int i, j;
1631 enum pipe_format pf;
1632
1633 /* can't render to compressed formats at this time */
1634 if (_mesa_is_compressed_format(st->ctx, internalFormat)
1635 && (bindings & ~PIPE_BIND_SAMPLER_VIEW)) {
1636 return PIPE_FORMAT_NONE;
1637 }
1638
1639 /* search for exact matches */
1640 pf = find_exact_format(internalFormat, format, type);
1641 if (pf != PIPE_FORMAT_NONE &&
1642 screen->is_format_supported(screen, pf,
1643 target, sample_count, bindings))
1644 return pf;
1645
1646 /* search table for internalFormat */
1647 for (i = 0; i < Elements(format_map); i++) {
1648 const struct format_mapping *mapping = &format_map[i];
1649 for (j = 0; mapping->glFormats[j]; j++) {
1650 if (mapping->glFormats[j] == internalFormat) {
1651 /* Found the desired internal format. Find first pipe format
1652 * which is supported by the driver.
1653 */
1654 return find_supported_format(screen, mapping->pipeFormats,
1655 target, sample_count, bindings,
1656 allow_dxt);
1657 }
1658 }
1659 }
1660
1661 _mesa_problem(NULL, "unhandled format!\n");
1662 return PIPE_FORMAT_NONE;
1663 }
1664
1665
1666 /**
1667 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
1668 */
1669 enum pipe_format
1670 st_choose_renderbuffer_format(struct st_context *st,
1671 GLenum internalFormat, unsigned sample_count)
1672 {
1673 uint usage;
1674 if (_mesa_is_depth_or_stencil_format(internalFormat))
1675 usage = PIPE_BIND_DEPTH_STENCIL;
1676 else
1677 usage = PIPE_BIND_RENDER_TARGET;
1678 return st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
1679 PIPE_TEXTURE_2D, sample_count, usage, FALSE);
1680 }
1681
1682
1683 /**
1684 * Given an OpenGL user-requested format and type, and swapBytes state,
1685 * return the format which exactly matches those parameters, so that
1686 * a memcpy-based transfer can be done.
1687 *
1688 * If no format is supported, return PIPE_FORMAT_NONE.
1689 */
1690 enum pipe_format
1691 st_choose_matching_format(struct pipe_screen *screen, unsigned bind,
1692 GLenum format, GLenum type, GLboolean swapBytes)
1693 {
1694 mesa_format mesa_format;
1695
1696 for (mesa_format = 1; mesa_format < MESA_FORMAT_COUNT; mesa_format++) {
1697 if (_mesa_get_format_color_encoding(mesa_format) == GL_SRGB) {
1698 continue;
1699 }
1700
1701 if (_mesa_format_matches_format_and_type(mesa_format, format, type,
1702 swapBytes)) {
1703 enum pipe_format format = st_mesa_format_to_pipe_format(mesa_format);
1704
1705 if (format &&
1706 screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0,
1707 bind)) {
1708 return format;
1709 }
1710 /* It's unlikely to find 2 matching Mesa formats. */
1711 break;
1712 }
1713 }
1714 return PIPE_FORMAT_NONE;
1715 }
1716
1717
1718 /**
1719 * Called via ctx->Driver.ChooseTextureFormat().
1720 */
1721 mesa_format
1722 st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
1723 GLint internalFormat,
1724 GLenum format, GLenum type)
1725 {
1726 const boolean want_renderable =
1727 internalFormat == 3 || internalFormat == 4 ||
1728 internalFormat == GL_RGB || internalFormat == GL_RGBA ||
1729 internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
1730 internalFormat == GL_BGRA;
1731 struct st_context *st = st_context(ctx);
1732 enum pipe_format pFormat;
1733 unsigned bindings;
1734 enum pipe_texture_target pTarget = gl_target_to_pipe(target);
1735
1736 if (target == GL_TEXTURE_1D || target == GL_TEXTURE_1D_ARRAY) {
1737 /* We don't do compression for these texture targets because of
1738 * difficulty with sub-texture updates on non-block boundaries, etc.
1739 * So change the internal format request to an uncompressed format.
1740 */
1741 internalFormat =
1742 _mesa_generic_compressed_format_to_uncompressed_format(internalFormat);
1743 }
1744
1745 /* GL textures may wind up being render targets, but we don't know
1746 * that in advance. Specify potential render target flags now.
1747 */
1748 bindings = PIPE_BIND_SAMPLER_VIEW;
1749 if (want_renderable) {
1750 if (_mesa_is_depth_or_stencil_format(internalFormat))
1751 bindings |= PIPE_BIND_DEPTH_STENCIL;
1752 else
1753 bindings |= PIPE_BIND_RENDER_TARGET;
1754 }
1755
1756 /* GLES allows the driver to choose any format which matches
1757 * the format+type combo, because GLES only supports unsized internal
1758 * formats and expects the driver to choose whatever suits it.
1759 */
1760 if (_mesa_is_gles(ctx)) {
1761 GLenum baseFormat = _mesa_base_tex_format(ctx, internalFormat);
1762 GLenum basePackFormat = _mesa_base_pack_format(format);
1763 GLenum iformat = internalFormat;
1764
1765 /* Treat GL_BGRA as GL_RGBA. */
1766 if (iformat == GL_BGRA)
1767 iformat = GL_RGBA;
1768
1769 /* Check if the internalformat is unsized and compatible
1770 * with the "format".
1771 */
1772 if (iformat == baseFormat && iformat == basePackFormat) {
1773 pFormat = st_choose_matching_format(st->pipe->screen, bindings,
1774 format, type,
1775 ctx->Unpack.SwapBytes);
1776
1777 if (pFormat != PIPE_FORMAT_NONE)
1778 return st_pipe_format_to_mesa_format(pFormat);
1779
1780 /* try choosing format again, this time without render target bindings */
1781 pFormat = st_choose_matching_format(st->pipe->screen,
1782 PIPE_BIND_SAMPLER_VIEW,
1783 format, type,
1784 ctx->Unpack.SwapBytes);
1785 if (pFormat != PIPE_FORMAT_NONE)
1786 return st_pipe_format_to_mesa_format(pFormat);
1787 }
1788 }
1789
1790 pFormat = st_choose_format(st, internalFormat, format, type,
1791 pTarget, 0, bindings, ctx->Mesa_DXTn);
1792
1793 if (pFormat == PIPE_FORMAT_NONE) {
1794 /* try choosing format again, this time without render target bindings */
1795 pFormat = st_choose_format(st, internalFormat, format, type,
1796 pTarget, 0, PIPE_BIND_SAMPLER_VIEW,
1797 ctx->Mesa_DXTn);
1798 }
1799
1800 if (pFormat == PIPE_FORMAT_NONE) {
1801 /* no luck at all */
1802 return MESA_FORMAT_NONE;
1803 }
1804
1805 return st_pipe_format_to_mesa_format(pFormat);
1806 }
1807
1808
1809 /**
1810 * Called via ctx->Driver.ChooseTextureFormat().
1811 */
1812 size_t
1813 st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
1814 GLenum internalFormat, int samples[16])
1815 {
1816 struct st_context *st = st_context(ctx);
1817 enum pipe_format format;
1818 unsigned i, bind, num_sample_counts = 0;
1819
1820 (void) target;
1821
1822 if (_mesa_is_depth_or_stencil_format(internalFormat))
1823 bind = PIPE_BIND_DEPTH_STENCIL;
1824 else
1825 bind = PIPE_BIND_RENDER_TARGET;
1826
1827 /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
1828 * formats.
1829 */
1830 if (!ctx->Extensions.EXT_framebuffer_sRGB) {
1831 internalFormat = _mesa_get_linear_internalformat(internalFormat);
1832 }
1833
1834 /* Set sample counts in descending order. */
1835 for (i = 16; i > 1; i--) {
1836 format = st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
1837 PIPE_TEXTURE_2D, i, bind, FALSE);
1838
1839 if (format != PIPE_FORMAT_NONE) {
1840 samples[num_sample_counts++] = i;
1841 }
1842 }
1843
1844 if (!num_sample_counts) {
1845 samples[num_sample_counts++] = 1;
1846 }
1847
1848 return num_sample_counts;
1849 }
1850
1851
1852 /**
1853 * This is used for translating texture border color and the clear
1854 * color. For example, the clear color is interpreted according to
1855 * the renderbuffer's base format. For example, if clearing a
1856 * GL_LUMINANCE buffer, we'll return colorOut[0] = colorOut[1] =
1857 * colorOut[2] = colorIn[0].
1858 * Similarly for texture border colors.
1859 */
1860 void
1861 st_translate_color(const union gl_color_union *colorIn,
1862 union pipe_color_union *colorOut,
1863 GLenum baseFormat, GLboolean is_integer)
1864 {
1865 if (is_integer) {
1866 const int *in = colorIn->i;
1867 int *out = colorOut->i;
1868
1869 switch (baseFormat) {
1870 case GL_RED:
1871 out[0] = in[0];
1872 out[1] = 0;
1873 out[2] = 0;
1874 out[3] = 1;
1875 break;
1876 case GL_RG:
1877 out[0] = in[0];
1878 out[1] = in[1];
1879 out[2] = 0;
1880 out[3] = 1;
1881 break;
1882 case GL_RGB:
1883 out[0] = in[0];
1884 out[1] = in[1];
1885 out[2] = in[2];
1886 out[3] = 1;
1887 break;
1888 case GL_ALPHA:
1889 out[0] = out[1] = out[2] = 0;
1890 out[3] = in[3];
1891 break;
1892 case GL_LUMINANCE:
1893 out[0] = out[1] = out[2] = in[0];
1894 out[3] = 1;
1895 break;
1896 case GL_LUMINANCE_ALPHA:
1897 out[0] = out[1] = out[2] = in[0];
1898 out[3] = in[3];
1899 break;
1900 case GL_INTENSITY:
1901 out[0] = out[1] = out[2] = out[3] = in[0];
1902 break;
1903 default:
1904 COPY_4V(out, in);
1905 }
1906 }
1907 else {
1908 const float *in = colorIn->f;
1909 float *out = colorOut->f;
1910
1911 switch (baseFormat) {
1912 case GL_RED:
1913 out[0] = in[0];
1914 out[1] = 0.0F;
1915 out[2] = 0.0F;
1916 out[3] = 1.0F;
1917 break;
1918 case GL_RG:
1919 out[0] = in[0];
1920 out[1] = in[1];
1921 out[2] = 0.0F;
1922 out[3] = 1.0F;
1923 break;
1924 case GL_RGB:
1925 out[0] = in[0];
1926 out[1] = in[1];
1927 out[2] = in[2];
1928 out[3] = 1.0F;
1929 break;
1930 case GL_ALPHA:
1931 out[0] = out[1] = out[2] = 0.0F;
1932 out[3] = in[3];
1933 break;
1934 case GL_LUMINANCE:
1935 out[0] = out[1] = out[2] = in[0];
1936 out[3] = 1.0F;
1937 break;
1938 case GL_LUMINANCE_ALPHA:
1939 out[0] = out[1] = out[2] = in[0];
1940 out[3] = in[3];
1941 break;
1942 case GL_INTENSITY:
1943 out[0] = out[1] = out[2] = out[3] = in[0];
1944 break;
1945 default:
1946 COPY_4V(out, in);
1947 }
1948 }
1949 }