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