st/mesa: add GL_DEPTH_COMPONENT32 fallback 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/texstore.h"
38 #include "main/image.h"
39 #include "main/macros.h"
40 #include "main/mfeatures.h"
41
42 #include "pipe/p_context.h"
43 #include "pipe/p_defines.h"
44 #include "pipe/p_screen.h"
45 #include "util/u_format.h"
46 #include "st_context.h"
47 #include "st_format.h"
48
49
50 static GLuint
51 format_max_bits(enum pipe_format format)
52 {
53 GLuint size = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0);
54
55 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 1));
56 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 2));
57 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3));
58 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0));
59 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1));
60 return size;
61 }
62
63
64 /**
65 * Return basic GL datatype for the given gallium format.
66 */
67 GLenum
68 st_format_datatype(enum pipe_format format)
69 {
70 const struct util_format_description *desc;
71
72 desc = util_format_description(format);
73 assert(desc);
74
75 if (desc->layout == UTIL_FORMAT_LAYOUT_PLAIN) {
76 if (format == PIPE_FORMAT_B5G5R5A1_UNORM ||
77 format == PIPE_FORMAT_B5G6R5_UNORM) {
78 return GL_UNSIGNED_SHORT;
79 }
80 else if (format == PIPE_FORMAT_Z24_UNORM_S8_USCALED ||
81 format == PIPE_FORMAT_S8_USCALED_Z24_UNORM ||
82 format == PIPE_FORMAT_Z24X8_UNORM ||
83 format == PIPE_FORMAT_X8Z24_UNORM) {
84 return GL_UNSIGNED_INT_24_8;
85 }
86 else {
87 const GLuint size = format_max_bits(format);
88 if (size == 8) {
89 if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
90 return GL_UNSIGNED_BYTE;
91 else
92 return GL_BYTE;
93 }
94 else if (size == 16) {
95 if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
96 return GL_UNSIGNED_SHORT;
97 else
98 return GL_SHORT;
99 }
100 else {
101 assert( size <= 32 );
102 if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
103 return GL_UNSIGNED_INT;
104 else
105 return GL_INT;
106 }
107 }
108 }
109 else if (format == PIPE_FORMAT_UYVY) {
110 return GL_UNSIGNED_SHORT;
111 }
112 else if (format == PIPE_FORMAT_YUYV) {
113 return GL_UNSIGNED_SHORT;
114 }
115 else {
116 /* probably a compressed format, unsupported anyway */
117 return GL_NONE;
118 }
119 }
120
121
122 /**
123 * Translate Mesa format to Gallium format.
124 */
125 enum pipe_format
126 st_mesa_format_to_pipe_format(gl_format mesaFormat)
127 {
128 switch (mesaFormat) {
129 case MESA_FORMAT_RGBA8888:
130 return PIPE_FORMAT_A8B8G8R8_UNORM;
131 case MESA_FORMAT_RGBA8888_REV:
132 return PIPE_FORMAT_R8G8B8A8_UNORM;
133 case MESA_FORMAT_ARGB8888:
134 return PIPE_FORMAT_B8G8R8A8_UNORM;
135 case MESA_FORMAT_ARGB8888_REV:
136 return PIPE_FORMAT_A8R8G8B8_UNORM;
137 case MESA_FORMAT_XRGB8888:
138 return PIPE_FORMAT_B8G8R8X8_UNORM;
139 case MESA_FORMAT_XRGB8888_REV:
140 return PIPE_FORMAT_X8R8G8B8_UNORM;
141 case MESA_FORMAT_ARGB1555:
142 return PIPE_FORMAT_B5G5R5A1_UNORM;
143 case MESA_FORMAT_ARGB4444:
144 return PIPE_FORMAT_B4G4R4A4_UNORM;
145 case MESA_FORMAT_RGB565:
146 return PIPE_FORMAT_B5G6R5_UNORM;
147 case MESA_FORMAT_RGB332:
148 return PIPE_FORMAT_B2G3R3_UNORM;
149 case MESA_FORMAT_ARGB2101010:
150 return PIPE_FORMAT_B10G10R10A2_UNORM;
151 case MESA_FORMAT_AL44:
152 return PIPE_FORMAT_L4A4_UNORM;
153 case MESA_FORMAT_AL88:
154 return PIPE_FORMAT_L8A8_UNORM;
155 case MESA_FORMAT_AL1616:
156 return PIPE_FORMAT_L16A16_UNORM;
157 case MESA_FORMAT_A8:
158 return PIPE_FORMAT_A8_UNORM;
159 case MESA_FORMAT_A16:
160 return PIPE_FORMAT_A16_UNORM;
161 case MESA_FORMAT_L8:
162 return PIPE_FORMAT_L8_UNORM;
163 case MESA_FORMAT_L16:
164 return PIPE_FORMAT_L16_UNORM;
165 case MESA_FORMAT_I8:
166 return PIPE_FORMAT_I8_UNORM;
167 case MESA_FORMAT_I16:
168 return PIPE_FORMAT_I16_UNORM;
169 case MESA_FORMAT_Z16:
170 return PIPE_FORMAT_Z16_UNORM;
171 case MESA_FORMAT_Z32:
172 return PIPE_FORMAT_Z32_UNORM;
173 case MESA_FORMAT_Z24_S8:
174 return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
175 case MESA_FORMAT_S8_Z24:
176 return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
177 case MESA_FORMAT_Z24_X8:
178 return PIPE_FORMAT_X8Z24_UNORM;
179 case MESA_FORMAT_X8_Z24:
180 return PIPE_FORMAT_Z24X8_UNORM;
181 case MESA_FORMAT_S8:
182 return PIPE_FORMAT_S8_USCALED;
183 case MESA_FORMAT_YCBCR:
184 return PIPE_FORMAT_UYVY;
185 #if FEATURE_texture_s3tc
186 case MESA_FORMAT_RGB_DXT1:
187 return PIPE_FORMAT_DXT1_RGB;
188 case MESA_FORMAT_RGBA_DXT1:
189 return PIPE_FORMAT_DXT1_RGBA;
190 case MESA_FORMAT_RGBA_DXT3:
191 return PIPE_FORMAT_DXT3_RGBA;
192 case MESA_FORMAT_RGBA_DXT5:
193 return PIPE_FORMAT_DXT5_RGBA;
194 #if FEATURE_EXT_texture_sRGB
195 case MESA_FORMAT_SRGB_DXT1:
196 return PIPE_FORMAT_DXT1_SRGB;
197 case MESA_FORMAT_SRGBA_DXT1:
198 return PIPE_FORMAT_DXT1_SRGBA;
199 case MESA_FORMAT_SRGBA_DXT3:
200 return PIPE_FORMAT_DXT3_SRGBA;
201 case MESA_FORMAT_SRGBA_DXT5:
202 return PIPE_FORMAT_DXT5_SRGBA;
203 #endif
204 #endif
205 #if FEATURE_EXT_texture_sRGB
206 case MESA_FORMAT_SLA8:
207 return PIPE_FORMAT_L8A8_SRGB;
208 case MESA_FORMAT_SL8:
209 return PIPE_FORMAT_L8_SRGB;
210 case MESA_FORMAT_SRGB8:
211 return PIPE_FORMAT_R8G8B8_SRGB;
212 case MESA_FORMAT_SRGBA8:
213 return PIPE_FORMAT_A8B8G8R8_SRGB;
214 case MESA_FORMAT_SARGB8:
215 return PIPE_FORMAT_B8G8R8A8_SRGB;
216 #endif
217 case MESA_FORMAT_RGBA_FLOAT32:
218 return PIPE_FORMAT_R32G32B32A32_FLOAT;
219 case MESA_FORMAT_RGBA_FLOAT16:
220 return PIPE_FORMAT_R16G16B16A16_FLOAT;
221 case MESA_FORMAT_RGB_FLOAT32:
222 return PIPE_FORMAT_R32G32B32_FLOAT;
223 case MESA_FORMAT_RGB_FLOAT16:
224 return PIPE_FORMAT_R16G16B16_FLOAT;
225 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
226 return PIPE_FORMAT_L32A32_FLOAT;
227 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
228 return PIPE_FORMAT_L16A16_FLOAT;
229 case MESA_FORMAT_LUMINANCE_FLOAT32:
230 return PIPE_FORMAT_L32_FLOAT;
231 case MESA_FORMAT_LUMINANCE_FLOAT16:
232 return PIPE_FORMAT_L16_FLOAT;
233 case MESA_FORMAT_ALPHA_FLOAT32:
234 return PIPE_FORMAT_A32_FLOAT;
235 case MESA_FORMAT_ALPHA_FLOAT16:
236 return PIPE_FORMAT_A16_FLOAT;
237 case MESA_FORMAT_INTENSITY_FLOAT32:
238 return PIPE_FORMAT_I32_FLOAT;
239 case MESA_FORMAT_INTENSITY_FLOAT16:
240 return PIPE_FORMAT_I16_FLOAT;
241 case MESA_FORMAT_R_FLOAT32:
242 return PIPE_FORMAT_R32_FLOAT;
243 case MESA_FORMAT_R_FLOAT16:
244 return PIPE_FORMAT_R16_FLOAT;
245 case MESA_FORMAT_RG_FLOAT32:
246 return PIPE_FORMAT_R32G32_FLOAT;
247 case MESA_FORMAT_RG_FLOAT16:
248 return PIPE_FORMAT_R16G16_FLOAT;
249
250 case MESA_FORMAT_R8:
251 return PIPE_FORMAT_R8_UNORM;
252 case MESA_FORMAT_R16:
253 return PIPE_FORMAT_R16_UNORM;
254 case MESA_FORMAT_RG88:
255 return PIPE_FORMAT_R8G8_UNORM;
256 case MESA_FORMAT_RG1616:
257 return PIPE_FORMAT_R16G16_UNORM;
258 case MESA_FORMAT_RGBA_16:
259 return PIPE_FORMAT_R16G16B16A16_UNORM;
260
261 /* signed int formats */
262 case MESA_FORMAT_RGBA_INT8:
263 return PIPE_FORMAT_R8G8B8A8_SSCALED;
264 case MESA_FORMAT_RGBA_INT16:
265 return PIPE_FORMAT_R16G16B16A16_SSCALED;
266 case MESA_FORMAT_RGBA_INT32:
267 return PIPE_FORMAT_R32G32B32A32_SSCALED;
268
269 /* unsigned int formats */
270 case MESA_FORMAT_RGBA_UINT8:
271 return PIPE_FORMAT_R8G8B8A8_USCALED;
272 case MESA_FORMAT_RGBA_UINT16:
273 return PIPE_FORMAT_R16G16B16A16_USCALED;
274 case MESA_FORMAT_RGBA_UINT32:
275 return PIPE_FORMAT_R32G32B32A32_USCALED;
276
277 case MESA_FORMAT_RED_RGTC1:
278 return PIPE_FORMAT_RGTC1_UNORM;
279 case MESA_FORMAT_SIGNED_RED_RGTC1:
280 return PIPE_FORMAT_RGTC1_SNORM;
281 case MESA_FORMAT_RG_RGTC2:
282 return PIPE_FORMAT_RGTC2_UNORM;
283 case MESA_FORMAT_SIGNED_RG_RGTC2:
284 return PIPE_FORMAT_RGTC2_SNORM;
285
286 case MESA_FORMAT_L_LATC1:
287 return PIPE_FORMAT_LATC1_UNORM;
288 case MESA_FORMAT_SIGNED_L_LATC1:
289 return PIPE_FORMAT_LATC1_SNORM;
290 case MESA_FORMAT_LA_LATC2:
291 return PIPE_FORMAT_LATC2_UNORM;
292 case MESA_FORMAT_SIGNED_LA_LATC2:
293 return PIPE_FORMAT_LATC2_SNORM;
294
295 /* signed normalized formats */
296 case MESA_FORMAT_SIGNED_R8:
297 return PIPE_FORMAT_R8_SNORM;
298 case MESA_FORMAT_SIGNED_RG88_REV:
299 return PIPE_FORMAT_R8G8_SNORM;
300 case MESA_FORMAT_SIGNED_RGBA8888_REV:
301 return PIPE_FORMAT_R8G8B8A8_SNORM;
302
303 case MESA_FORMAT_SIGNED_A8:
304 return PIPE_FORMAT_A8_SNORM;
305 case MESA_FORMAT_SIGNED_L8:
306 return PIPE_FORMAT_L8_SNORM;
307 case MESA_FORMAT_SIGNED_AL88:
308 return PIPE_FORMAT_L8A8_SNORM;
309 case MESA_FORMAT_SIGNED_I8:
310 return PIPE_FORMAT_I8_SNORM;
311
312 case MESA_FORMAT_SIGNED_R16:
313 return PIPE_FORMAT_R16_SNORM;
314 case MESA_FORMAT_SIGNED_GR1616:
315 return PIPE_FORMAT_R16G16_SNORM;
316 case MESA_FORMAT_SIGNED_RGBA_16:
317 return PIPE_FORMAT_R16G16B16A16_SNORM;
318
319 case MESA_FORMAT_SIGNED_A16:
320 return PIPE_FORMAT_A16_SNORM;
321 case MESA_FORMAT_SIGNED_L16:
322 return PIPE_FORMAT_L16_SNORM;
323 case MESA_FORMAT_SIGNED_AL1616:
324 return PIPE_FORMAT_L16A16_SNORM;
325 case MESA_FORMAT_SIGNED_I16:
326 return PIPE_FORMAT_I16_SNORM;
327
328 case MESA_FORMAT_RGB9_E5_FLOAT:
329 return PIPE_FORMAT_R9G9B9E5_FLOAT;
330 case MESA_FORMAT_R11_G11_B10_FLOAT:
331 return PIPE_FORMAT_R11G11B10_FLOAT;
332
333 default:
334 assert(0);
335 return PIPE_FORMAT_NONE;
336 }
337 }
338
339
340 /**
341 * Translate Gallium format to Mesa format.
342 */
343 gl_format
344 st_pipe_format_to_mesa_format(enum pipe_format format)
345 {
346 switch (format) {
347 case PIPE_FORMAT_A8B8G8R8_UNORM:
348 return MESA_FORMAT_RGBA8888;
349 case PIPE_FORMAT_R8G8B8A8_UNORM:
350 return MESA_FORMAT_RGBA8888_REV;
351 case PIPE_FORMAT_B8G8R8A8_UNORM:
352 return MESA_FORMAT_ARGB8888;
353 case PIPE_FORMAT_A8R8G8B8_UNORM:
354 return MESA_FORMAT_ARGB8888_REV;
355 case PIPE_FORMAT_B8G8R8X8_UNORM:
356 return MESA_FORMAT_XRGB8888;
357 case PIPE_FORMAT_X8R8G8B8_UNORM:
358 return MESA_FORMAT_XRGB8888_REV;
359 case PIPE_FORMAT_B5G5R5A1_UNORM:
360 return MESA_FORMAT_ARGB1555;
361 case PIPE_FORMAT_B4G4R4A4_UNORM:
362 return MESA_FORMAT_ARGB4444;
363 case PIPE_FORMAT_B5G6R5_UNORM:
364 return MESA_FORMAT_RGB565;
365 case PIPE_FORMAT_B2G3R3_UNORM:
366 return MESA_FORMAT_RGB332;
367 case PIPE_FORMAT_B10G10R10A2_UNORM:
368 return MESA_FORMAT_ARGB2101010;
369 case PIPE_FORMAT_L4A4_UNORM:
370 return MESA_FORMAT_AL44;
371 case PIPE_FORMAT_L8A8_UNORM:
372 return MESA_FORMAT_AL88;
373 case PIPE_FORMAT_L16A16_UNORM:
374 return MESA_FORMAT_AL1616;
375 case PIPE_FORMAT_A8_UNORM:
376 return MESA_FORMAT_A8;
377 case PIPE_FORMAT_A16_UNORM:
378 return MESA_FORMAT_A16;
379 case PIPE_FORMAT_L8_UNORM:
380 return MESA_FORMAT_L8;
381 case PIPE_FORMAT_L16_UNORM:
382 return MESA_FORMAT_L16;
383 case PIPE_FORMAT_I8_UNORM:
384 return MESA_FORMAT_I8;
385 case PIPE_FORMAT_I16_UNORM:
386 return MESA_FORMAT_I16;
387 case PIPE_FORMAT_S8_USCALED:
388 return MESA_FORMAT_S8;
389
390 case PIPE_FORMAT_R16G16B16A16_UNORM:
391 return MESA_FORMAT_RGBA_16;
392
393 case PIPE_FORMAT_Z16_UNORM:
394 return MESA_FORMAT_Z16;
395 case PIPE_FORMAT_Z32_UNORM:
396 return MESA_FORMAT_Z32;
397 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
398 return MESA_FORMAT_Z24_S8;
399 case PIPE_FORMAT_X8Z24_UNORM:
400 return MESA_FORMAT_Z24_X8;
401 case PIPE_FORMAT_Z24X8_UNORM:
402 return MESA_FORMAT_X8_Z24;
403 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
404 return MESA_FORMAT_S8_Z24;
405
406 case PIPE_FORMAT_UYVY:
407 return MESA_FORMAT_YCBCR;
408 case PIPE_FORMAT_YUYV:
409 return MESA_FORMAT_YCBCR_REV;
410
411 #if FEATURE_texture_s3tc
412 case PIPE_FORMAT_DXT1_RGB:
413 return MESA_FORMAT_RGB_DXT1;
414 case PIPE_FORMAT_DXT1_RGBA:
415 return MESA_FORMAT_RGBA_DXT1;
416 case PIPE_FORMAT_DXT3_RGBA:
417 return MESA_FORMAT_RGBA_DXT3;
418 case PIPE_FORMAT_DXT5_RGBA:
419 return MESA_FORMAT_RGBA_DXT5;
420 #if FEATURE_EXT_texture_sRGB
421 case PIPE_FORMAT_DXT1_SRGB:
422 return MESA_FORMAT_SRGB_DXT1;
423 case PIPE_FORMAT_DXT1_SRGBA:
424 return MESA_FORMAT_SRGBA_DXT1;
425 case PIPE_FORMAT_DXT3_SRGBA:
426 return MESA_FORMAT_SRGBA_DXT3;
427 case PIPE_FORMAT_DXT5_SRGBA:
428 return MESA_FORMAT_SRGBA_DXT5;
429 #endif
430 #endif
431
432 #if FEATURE_EXT_texture_sRGB
433 case PIPE_FORMAT_L8A8_SRGB:
434 return MESA_FORMAT_SLA8;
435 case PIPE_FORMAT_L8_SRGB:
436 return MESA_FORMAT_SL8;
437 case PIPE_FORMAT_R8G8B8_SRGB:
438 return MESA_FORMAT_SRGB8;
439 case PIPE_FORMAT_A8B8G8R8_SRGB:
440 return MESA_FORMAT_SRGBA8;
441 case PIPE_FORMAT_B8G8R8A8_SRGB:
442 return MESA_FORMAT_SARGB8;
443 #endif
444 case PIPE_FORMAT_R32G32B32A32_FLOAT:
445 return MESA_FORMAT_RGBA_FLOAT32;
446 case PIPE_FORMAT_R16G16B16A16_FLOAT:
447 return MESA_FORMAT_RGBA_FLOAT16;
448 case PIPE_FORMAT_R32G32B32_FLOAT:
449 return MESA_FORMAT_RGB_FLOAT32;
450 case PIPE_FORMAT_R16G16B16_FLOAT:
451 return MESA_FORMAT_RGB_FLOAT16;
452 case PIPE_FORMAT_L32A32_FLOAT:
453 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
454 case PIPE_FORMAT_L16A16_FLOAT:
455 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
456 case PIPE_FORMAT_L32_FLOAT:
457 return MESA_FORMAT_LUMINANCE_FLOAT32;
458 case PIPE_FORMAT_L16_FLOAT:
459 return MESA_FORMAT_LUMINANCE_FLOAT16;
460 case PIPE_FORMAT_A32_FLOAT:
461 return MESA_FORMAT_ALPHA_FLOAT32;
462 case PIPE_FORMAT_A16_FLOAT:
463 return MESA_FORMAT_ALPHA_FLOAT16;
464 case PIPE_FORMAT_I32_FLOAT:
465 return MESA_FORMAT_INTENSITY_FLOAT32;
466 case PIPE_FORMAT_I16_FLOAT:
467 return MESA_FORMAT_INTENSITY_FLOAT16;
468 case PIPE_FORMAT_R32_FLOAT:
469 return MESA_FORMAT_R_FLOAT32;
470 case PIPE_FORMAT_R16_FLOAT:
471 return MESA_FORMAT_R_FLOAT16;
472 case PIPE_FORMAT_R32G32_FLOAT:
473 return MESA_FORMAT_RG_FLOAT32;
474 case PIPE_FORMAT_R16G16_FLOAT:
475 return MESA_FORMAT_RG_FLOAT16;
476
477 case PIPE_FORMAT_R8_UNORM:
478 return MESA_FORMAT_R8;
479 case PIPE_FORMAT_R16_UNORM:
480 return MESA_FORMAT_R16;
481 case PIPE_FORMAT_R8G8_UNORM:
482 return MESA_FORMAT_RG88;
483 case PIPE_FORMAT_R16G16_UNORM:
484 return MESA_FORMAT_RG1616;
485
486 /* signed int formats */
487 case PIPE_FORMAT_R8G8B8A8_SSCALED:
488 return MESA_FORMAT_RGBA_INT8;
489 case PIPE_FORMAT_R16G16B16A16_SSCALED:
490 return MESA_FORMAT_RGBA_INT16;
491 case PIPE_FORMAT_R32G32B32A32_SSCALED:
492 return MESA_FORMAT_RGBA_INT32;
493
494 /* unsigned int formats */
495 case PIPE_FORMAT_R8G8B8A8_USCALED:
496 return MESA_FORMAT_RGBA_UINT8;
497 case PIPE_FORMAT_R16G16B16A16_USCALED:
498 return MESA_FORMAT_RGBA_UINT16;
499 case PIPE_FORMAT_R32G32B32A32_USCALED:
500 return MESA_FORMAT_RGBA_UINT32;
501
502 case PIPE_FORMAT_RGTC1_UNORM:
503 return MESA_FORMAT_RED_RGTC1;
504 case PIPE_FORMAT_RGTC1_SNORM:
505 return MESA_FORMAT_SIGNED_RED_RGTC1;
506 case PIPE_FORMAT_RGTC2_UNORM:
507 return MESA_FORMAT_RG_RGTC2;
508 case PIPE_FORMAT_RGTC2_SNORM:
509 return MESA_FORMAT_SIGNED_RG_RGTC2;
510
511 case PIPE_FORMAT_LATC1_UNORM:
512 return MESA_FORMAT_L_LATC1;
513 case PIPE_FORMAT_LATC1_SNORM:
514 return MESA_FORMAT_SIGNED_L_LATC1;
515 case PIPE_FORMAT_LATC2_UNORM:
516 return MESA_FORMAT_LA_LATC2;
517 case PIPE_FORMAT_LATC2_SNORM:
518 return MESA_FORMAT_SIGNED_LA_LATC2;
519
520 /* signed normalized formats */
521 case PIPE_FORMAT_R8_SNORM:
522 return MESA_FORMAT_SIGNED_R8;
523 case PIPE_FORMAT_R8G8_SNORM:
524 return MESA_FORMAT_SIGNED_RG88_REV;
525 case PIPE_FORMAT_R8G8B8A8_SNORM:
526 return MESA_FORMAT_SIGNED_RGBA8888_REV;
527
528 case PIPE_FORMAT_A8_SNORM:
529 return MESA_FORMAT_SIGNED_A8;
530 case PIPE_FORMAT_L8_SNORM:
531 return MESA_FORMAT_SIGNED_L8;
532 case PIPE_FORMAT_L8A8_SNORM:
533 return MESA_FORMAT_SIGNED_AL88;
534 case PIPE_FORMAT_I8_SNORM:
535 return MESA_FORMAT_SIGNED_I8;
536
537 case PIPE_FORMAT_R16_SNORM:
538 return MESA_FORMAT_SIGNED_R16;
539 case PIPE_FORMAT_R16G16_SNORM:
540 return MESA_FORMAT_SIGNED_GR1616;
541 case PIPE_FORMAT_R16G16B16A16_SNORM:
542 return MESA_FORMAT_SIGNED_RGBA_16;
543
544 case PIPE_FORMAT_A16_SNORM:
545 return MESA_FORMAT_SIGNED_A16;
546 case PIPE_FORMAT_L16_SNORM:
547 return MESA_FORMAT_SIGNED_L16;
548 case PIPE_FORMAT_L16A16_SNORM:
549 return MESA_FORMAT_SIGNED_AL1616;
550 case PIPE_FORMAT_I16_SNORM:
551 return MESA_FORMAT_SIGNED_I16;
552
553 case PIPE_FORMAT_R9G9B9E5_FLOAT:
554 return MESA_FORMAT_RGB9_E5_FLOAT;
555 case PIPE_FORMAT_R11G11B10_FLOAT:
556 return MESA_FORMAT_R11_G11_B10_FLOAT;
557
558 default:
559 assert(0);
560 return MESA_FORMAT_NONE;
561 }
562 }
563
564
565 /**
566 * Map GL texture formats to Gallium pipe formats.
567 */
568 struct format_mapping
569 {
570 GLenum glFormats[18]; /**< list of GLenum formats, 0-terminated */
571 enum pipe_format pipeFormats[10]; /**< list of pipe formats, 0-terminated */
572 };
573
574
575 #define DEFAULT_RGBA_FORMATS \
576 PIPE_FORMAT_B8G8R8A8_UNORM, \
577 PIPE_FORMAT_A8R8G8B8_UNORM, \
578 PIPE_FORMAT_A8B8G8R8_UNORM, \
579 PIPE_FORMAT_B5G6R5_UNORM, \
580 0
581
582 #define DEFAULT_RGB_FORMATS \
583 PIPE_FORMAT_B8G8R8X8_UNORM, \
584 PIPE_FORMAT_X8R8G8B8_UNORM, \
585 PIPE_FORMAT_X8B8G8R8_UNORM, \
586 PIPE_FORMAT_B8G8R8A8_UNORM, \
587 PIPE_FORMAT_A8R8G8B8_UNORM, \
588 PIPE_FORMAT_A8B8G8R8_UNORM, \
589 PIPE_FORMAT_B5G6R5_UNORM, \
590 0
591
592 #define DEFAULT_SRGBA_FORMATS \
593 PIPE_FORMAT_B8G8R8A8_SRGB, \
594 PIPE_FORMAT_A8R8G8B8_SRGB, \
595 PIPE_FORMAT_A8B8G8R8_SRGB, \
596 0
597
598 /**
599 * This table maps OpenGL texture format enums to Gallium pipe_format enums.
600 * Multiple GL enums might map to multiple pipe_formats.
601 * The first pipe format in the list that's supported is the one that's chosen.
602 */
603 static struct format_mapping format_map[] = {
604 /* Basic RGB, RGBA formats */
605 {
606 { GL_RGB10, GL_RGB10_A2, 0 },
607 { PIPE_FORMAT_B10G10R10A2_UNORM, 0 }
608 },
609 {
610 { 4, GL_RGBA, GL_RGBA8, 0 },
611 { DEFAULT_RGBA_FORMATS, 0 }
612 },
613 {
614 { GL_BGRA, 0 },
615 { PIPE_FORMAT_B8G8R8A8_UNORM, DEFAULT_RGB_FORMATS, 0 }
616 },
617 {
618 { 3, GL_RGB, GL_RGB8, 0 },
619 { DEFAULT_RGB_FORMATS, 0 }
620 },
621 {
622 { GL_RGB12, GL_RGB16, GL_RGBA12, GL_RGBA16, 0 },
623 { PIPE_FORMAT_R16G16B16A16_UNORM, DEFAULT_RGB_FORMATS, 0 }
624 },
625 {
626 { GL_RGBA4, GL_RGBA2, 0 },
627 { PIPE_FORMAT_B4G4R4A4_UNORM, DEFAULT_RGBA_FORMATS }
628 },
629 {
630 { GL_RGB5_A1, 0 },
631 { PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGBA_FORMATS, 0 }
632 },
633 {
634 { GL_R3_G3_B2, 0 },
635 { PIPE_FORMAT_B2G3R3_UNORM, PIPE_FORMAT_B5G6R5_UNORM,
636 PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGBA_FORMATS }
637 },
638 {
639 { GL_RGB5, GL_RGB4 },
640 { PIPE_FORMAT_B5G6R5_UNORM, PIPE_FORMAT_B5G5R5A1_UNORM,
641 DEFAULT_RGBA_FORMATS }
642 },
643
644 /* basic Alpha formats */
645 {
646 { GL_ALPHA12, GL_ALPHA16, 0 },
647 { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_A8_UNORM,
648 DEFAULT_RGBA_FORMATS }
649 },
650 {
651 { GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_COMPRESSED_ALPHA, 0 },
652 { PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
653 },
654
655 /* basic Luminance formats */
656 {
657 { GL_LUMINANCE12, GL_LUMINANCE16, 0 },
658 { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGBA_FORMATS, 0 }
659 },
660 {
661 { 1, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, 0 },
662 { PIPE_FORMAT_L8_UNORM, DEFAULT_RGBA_FORMATS }
663 },
664
665 /* basic Luminance/Alpha formats */
666 {
667 { GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,
668 GL_LUMINANCE16_ALPHA16, 0},
669 { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_L8A8_UNORM,
670 PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
671 },
672 {
673 { 2, GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, 0 },
674 { PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
675 },
676 {
677 { GL_LUMINANCE4_ALPHA4, 0 },
678 { PIPE_FORMAT_L4A4_UNORM, PIPE_FORMAT_L4A4_UNORM,
679 DEFAULT_RGBA_FORMATS }
680 },
681
682 /* basic Intensity formats */
683 {
684 { GL_INTENSITY12, GL_INTENSITY16, 0 },
685 { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
686 },
687 {
688 { GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8,
689 GL_COMPRESSED_INTENSITY, 0 },
690 { PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
691 },
692
693 /* YCbCr */
694 {
695 { GL_YCBCR_MESA, 0 },
696 { PIPE_FORMAT_UYVY, PIPE_FORMAT_YUYV, 0 }
697 },
698
699 /* compressed formats */ /* XXX PIPE_BIND_SAMPLER_VIEW only */
700 {
701 { GL_COMPRESSED_RGB, 0 },
702 { PIPE_FORMAT_DXT1_RGB, 0 }
703 },
704 {
705 { GL_COMPRESSED_RGBA, 0 },
706 { PIPE_FORMAT_DXT5_RGBA, 0 }
707 },
708 {
709 { GL_RGB_S3TC, GL_RGB4_S3TC, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 0 },
710 { PIPE_FORMAT_DXT1_RGB, 0 }
711 },
712 {
713 { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0 },
714 { PIPE_FORMAT_DXT1_RGBA, 0 }
715 },
716 {
717 { GL_RGBA_S3TC, GL_RGBA4_S3TC, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0 },
718 { PIPE_FORMAT_DXT3_RGBA, 0 }
719 },
720 {
721 { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0 },
722 { PIPE_FORMAT_DXT5_RGBA, 0 }
723 },
724
725 #if 0
726 {
727 { GL_COMPRESSED_RGB_FXT1_3DFX, 0 },
728 { PIPE_FORMAT_RGB_FXT1, 0 }
729 },
730 {
731 { GL_COMPRESSED_RGBA_FXT1_3DFX, 0 },
732 { PIPE_FORMAT_RGB_FXT1, 0 }
733 },
734 #endif
735
736 /* Depth formats */
737 {
738 { GL_DEPTH_COMPONENT16, 0 },
739 { PIPE_FORMAT_Z16_UNORM, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
740 PIPE_FORMAT_S8_USCALED_Z24_UNORM, PIPE_FORMAT_Z32_UNORM, 0 }
741 },
742 {
743 { GL_DEPTH_COMPONENT24, 0 },
744 { PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM,
745 PIPE_FORMAT_Z24_UNORM_S8_USCALED, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
746 PIPE_FORMAT_Z32_UNORM, 0 }
747 },
748 {
749 { GL_DEPTH_COMPONENT32, 0 },
750 { PIPE_FORMAT_Z32_UNORM,
751 PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM,
752 PIPE_FORMAT_Z16_UNORM,
753 PIPE_FORMAT_Z24_UNORM_S8_USCALED, PIPE_FORMAT_S8_USCALED_Z24_UNORM, 0 }
754 },
755 {
756 { GL_DEPTH_COMPONENT, 0 },
757 { PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM,
758 PIPE_FORMAT_Z32_UNORM, PIPE_FORMAT_Z16_UNORM,
759 PIPE_FORMAT_Z24_UNORM_S8_USCALED, PIPE_FORMAT_S8_USCALED_Z24_UNORM, 0 }
760 },
761
762 /* stencil formats */
763 {
764 { GL_STENCIL_INDEX, GL_STENCIL_INDEX1_EXT, GL_STENCIL_INDEX4_EXT,
765 GL_STENCIL_INDEX8_EXT, GL_STENCIL_INDEX16_EXT, 0 },
766 {
767 PIPE_FORMAT_S8_USCALED, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
768 PIPE_FORMAT_S8_USCALED_Z24_UNORM, 0
769 }
770 },
771
772 /* Depth / Stencil formats */
773 {
774 { GL_DEPTH_STENCIL_EXT, GL_DEPTH24_STENCIL8_EXT, 0 },
775 { PIPE_FORMAT_Z24_UNORM_S8_USCALED, PIPE_FORMAT_S8_USCALED_Z24_UNORM, 0 }
776 },
777
778 /* sRGB formats */
779 {
780 { GL_SRGB_EXT, GL_SRGB8_EXT, GL_SRGB_ALPHA_EXT, GL_SRGB8_ALPHA8_EXT, 0 },
781 { DEFAULT_SRGBA_FORMATS }
782 },
783 {
784 { GL_COMPRESSED_SRGB_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 0 },
785 { PIPE_FORMAT_DXT1_SRGB, DEFAULT_SRGBA_FORMATS }
786 },
787 {
788 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0 },
789 { PIPE_FORMAT_DXT1_SRGBA, 0 }
790 },
791 {
792 { GL_COMPRESSED_SRGB_ALPHA_EXT,
793 GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0 },
794 { PIPE_FORMAT_DXT3_SRGBA, DEFAULT_SRGBA_FORMATS }
795 },
796 {
797 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0 },
798 { PIPE_FORMAT_DXT5_SRGBA, 0 }
799 },
800 {
801 { GL_SLUMINANCE_ALPHA_EXT, GL_SLUMINANCE8_ALPHA8_EXT,
802 GL_COMPRESSED_SLUMINANCE_EXT, GL_COMPRESSED_SLUMINANCE_ALPHA_EXT, 0 },
803 { PIPE_FORMAT_L8A8_SRGB, DEFAULT_SRGBA_FORMATS }
804 },
805 {
806 { GL_SLUMINANCE_EXT, GL_SLUMINANCE8_EXT, 0 },
807 { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS }
808 },
809
810 /* 16-bit float formats */
811 {
812 { GL_RGBA16F_ARB, 0 },
813 { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
814 },
815 {
816 { GL_RGB16F_ARB, 0 },
817 { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
818 PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
819 },
820 {
821 { GL_LUMINANCE_ALPHA16F_ARB, 0 },
822 { PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
823 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
824 },
825 {
826 { GL_ALPHA16F_ARB, 0 },
827 { PIPE_FORMAT_A16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
828 PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
829 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
830 },
831 {
832 { GL_INTENSITY16F_ARB, 0 },
833 { PIPE_FORMAT_I16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
834 PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
835 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
836 },
837 {
838 { GL_LUMINANCE16F_ARB, 0 },
839 { PIPE_FORMAT_L16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
840 PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
841 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
842 },
843 {
844 { GL_R16F, 0 },
845 { PIPE_FORMAT_R16_FLOAT, PIPE_FORMAT_R16G16_FLOAT,
846 PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
847 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
848 },
849 {
850 { GL_RG16F, 0 },
851 { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
852 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
853 },
854
855 /* 32-bit float formats */
856 {
857 { GL_RGBA32F_ARB, 0 },
858 { PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
859 },
860 {
861 { GL_RGB32F_ARB, 0 },
862 { PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
863 PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
864 },
865 {
866 { GL_LUMINANCE_ALPHA32F_ARB, 0 },
867 { PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
868 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
869 },
870 {
871 { GL_ALPHA32F_ARB, 0 },
872 { PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
873 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_A16_FLOAT,
874 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
875 },
876 {
877 { GL_INTENSITY32F_ARB, 0 },
878 { PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
879 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_I16_FLOAT,
880 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
881 },
882 {
883 { GL_LUMINANCE32F_ARB, 0 },
884 { PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
885 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_L16_FLOAT,
886 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
887 },
888 {
889 { GL_R32F, 0 },
890 { PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT,
891 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16_FLOAT,
892 PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
893 },
894 {
895 { GL_RG32F, 0 },
896 { PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
897 PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
898 },
899
900 /* R, RG formats */
901 {
902 { GL_RED, GL_R8, 0 },
903 { PIPE_FORMAT_R8_UNORM, 0 }
904 },
905 {
906 { GL_RG, GL_RG8, 0 },
907 { PIPE_FORMAT_R8G8_UNORM, 0 }
908 },
909 {
910 { GL_R16, 0 },
911 { PIPE_FORMAT_R16_UNORM, 0 }
912 },
913 {
914 { GL_RG16, 0 },
915 { PIPE_FORMAT_R16G16_UNORM, 0 }
916 },
917
918 /* compressed R, RG formats */
919 {
920 { GL_COMPRESSED_RED, GL_COMPRESSED_RED_RGTC1, 0 },
921 { PIPE_FORMAT_RGTC1_UNORM, PIPE_FORMAT_R8_UNORM, 0 }
922 },
923 {
924 { GL_COMPRESSED_SIGNED_RED_RGTC1, 0 },
925 { PIPE_FORMAT_RGTC1_SNORM, 0 }
926 },
927 {
928 { GL_COMPRESSED_RG, GL_COMPRESSED_RG_RGTC2, 0 },
929 { PIPE_FORMAT_RGTC2_UNORM, PIPE_FORMAT_R8G8_UNORM, 0 }
930 },
931 {
932 { GL_COMPRESSED_SIGNED_RG_RGTC2, 0 },
933 { PIPE_FORMAT_RGTC2_SNORM, 0 }
934 },
935 {
936 { GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_LATC1_EXT, 0 },
937 { PIPE_FORMAT_LATC1_UNORM, PIPE_FORMAT_L8_UNORM, 0 }
938 },
939 {
940 { GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT, 0 },
941 { PIPE_FORMAT_LATC1_SNORM, 0 }
942 },
943 {
944 { GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT,
945 GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0 },
946 { PIPE_FORMAT_LATC2_UNORM, PIPE_FORMAT_L8A8_UNORM, 0 }
947 },
948 {
949 { GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT, 0 },
950 { PIPE_FORMAT_LATC2_SNORM, 0 }
951 },
952
953 /* signed/unsigned integer formats.
954 * XXX Mesa only has formats for RGBA signed/unsigned integer formats.
955 * If/when new formats are added this code should be updated.
956 */
957 {
958 { GL_RED_INTEGER_EXT,
959 GL_GREEN_INTEGER_EXT,
960 GL_BLUE_INTEGER_EXT,
961 GL_ALPHA_INTEGER_EXT,
962 GL_RGB_INTEGER_EXT,
963 GL_RGBA_INTEGER_EXT,
964 GL_BGR_INTEGER_EXT,
965 GL_BGRA_INTEGER_EXT,
966 GL_LUMINANCE_INTEGER_EXT,
967 GL_LUMINANCE_ALPHA_INTEGER_EXT,
968 GL_RGBA8I_EXT,
969 GL_RGB8I_EXT,
970 GL_ALPHA8I_EXT,
971 GL_INTENSITY8I_EXT,
972 GL_LUMINANCE8I_EXT,
973 GL_LUMINANCE_ALPHA8I_EXT, 0 },
974 { PIPE_FORMAT_R8G8B8A8_SSCALED, 0 }
975 },
976 {
977 {
978 GL_RGBA16I_EXT,
979 GL_RGB16I_EXT,
980 GL_ALPHA16I_EXT,
981 GL_INTENSITY16I_EXT,
982 GL_LUMINANCE16I_EXT,
983 GL_LUMINANCE_ALPHA16I_EXT, 0 },
984 { PIPE_FORMAT_R16G16B16A16_SSCALED, 0 },
985 },
986 {
987 {
988 GL_RGBA32I_EXT,
989 GL_RGB32I_EXT,
990 GL_ALPHA32I_EXT,
991 GL_INTENSITY32I_EXT,
992 GL_LUMINANCE32I_EXT,
993 GL_LUMINANCE_ALPHA32I_EXT, 0 },
994 { PIPE_FORMAT_R32G32B32A32_SSCALED, 0 }
995 },
996 {
997 {
998 GL_RGBA8UI_EXT,
999 GL_RGB8UI_EXT,
1000 GL_ALPHA8UI_EXT,
1001 GL_INTENSITY8UI_EXT,
1002 GL_LUMINANCE8UI_EXT,
1003 GL_LUMINANCE_ALPHA8UI_EXT, 0 },
1004 { PIPE_FORMAT_R8G8B8A8_USCALED, 0 }
1005 },
1006 {
1007 {
1008 GL_RGBA16UI_EXT,
1009 GL_RGB16UI_EXT,
1010 GL_ALPHA16UI_EXT,
1011 GL_INTENSITY16UI_EXT,
1012 GL_LUMINANCE16UI_EXT,
1013 GL_LUMINANCE_ALPHA16UI_EXT, 0 },
1014 { PIPE_FORMAT_R16G16B16A16_USCALED, 0 }
1015 },
1016 {
1017 {
1018 GL_RGBA32UI_EXT,
1019 GL_RGB32UI_EXT,
1020 GL_ALPHA32UI_EXT,
1021 GL_INTENSITY32UI_EXT,
1022 GL_LUMINANCE32UI_EXT,
1023 GL_LUMINANCE_ALPHA32UI_EXT, 0 },
1024 { PIPE_FORMAT_R32G32B32A32_USCALED, 0 }
1025 },
1026
1027 /* signed normalized formats */
1028 {
1029 { GL_RED_SNORM, GL_R8_SNORM, 0 },
1030 { PIPE_FORMAT_R8_SNORM, PIPE_FORMAT_R8G8_SNORM,
1031 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1032 },
1033 {
1034 { GL_R16_SNORM, 0 },
1035 { PIPE_FORMAT_R16_SNORM,
1036 PIPE_FORMAT_R16G16_SNORM,
1037 PIPE_FORMAT_R16G16B16A16_SNORM,
1038 PIPE_FORMAT_R8_SNORM,
1039 PIPE_FORMAT_R8G8_SNORM,
1040 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1041 },
1042 {
1043 { GL_RG_SNORM, GL_RG8_SNORM, 0 },
1044 { PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1045 },
1046 {
1047 { GL_RG16_SNORM, 0 },
1048 { PIPE_FORMAT_R16G16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1049 PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1050 },
1051 {
1052 { GL_RGB_SNORM, GL_RGB8_SNORM, GL_RGBA_SNORM, GL_RGBA8_SNORM, 0 },
1053 { PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1054 },
1055 {
1056 { GL_RGB16_SNORM, GL_RGBA16_SNORM, 0 },
1057 { PIPE_FORMAT_R16G16B16A16_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1058 },
1059 {
1060 { GL_ALPHA_SNORM, GL_ALPHA8_SNORM, 0 },
1061 { PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1062 },
1063 {
1064 { GL_ALPHA16_SNORM, 0 },
1065 { PIPE_FORMAT_A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1066 PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1067 },
1068 {
1069 { GL_LUMINANCE_SNORM, GL_LUMINANCE8_SNORM, 0 },
1070 { PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1071 },
1072 {
1073 { GL_LUMINANCE16_SNORM, 0 },
1074 { PIPE_FORMAT_L16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1075 PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1076 },
1077 {
1078 { GL_LUMINANCE_ALPHA_SNORM, GL_LUMINANCE8_ALPHA8_SNORM, 0 },
1079 { PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1080 },
1081 {
1082 { GL_LUMINANCE16_ALPHA16_SNORM, 0 },
1083 { PIPE_FORMAT_L16A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1084 PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1085 },
1086 {
1087 { GL_INTENSITY_SNORM, GL_INTENSITY8_SNORM, 0 },
1088 { PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1089 },
1090 {
1091 { GL_INTENSITY16_SNORM, 0 },
1092 { PIPE_FORMAT_I16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1093 PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1094 }
1095 };
1096
1097
1098 /**
1099 * Return first supported format from the given list.
1100 */
1101 static enum pipe_format
1102 find_supported_format(struct pipe_screen *screen,
1103 const enum pipe_format formats[],
1104 enum pipe_texture_target target,
1105 unsigned sample_count,
1106 unsigned tex_usage)
1107 {
1108 uint i;
1109 for (i = 0; formats[i]; i++) {
1110 if (screen->is_format_supported(screen, formats[i], target,
1111 sample_count, tex_usage)) {
1112 return formats[i];
1113 }
1114 }
1115 return PIPE_FORMAT_NONE;
1116 }
1117
1118
1119 /**
1120 * Given an OpenGL internalFormat value for a texture or surface, return
1121 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
1122 * This is called during glTexImage2D, for example.
1123 *
1124 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
1125 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
1126 * we want render-to-texture ability.
1127 *
1128 * \param internalFormat the user value passed to glTexImage2D
1129 * \param target one of PIPE_TEXTURE_x
1130 * \param bindings bitmask of PIPE_BIND_x flags.
1131 */
1132 enum pipe_format
1133 st_choose_format(struct pipe_screen *screen, GLenum internalFormat,
1134 enum pipe_texture_target target, unsigned sample_count,
1135 unsigned bindings)
1136 {
1137 GET_CURRENT_CONTEXT(ctx); /* XXX this should be a function parameter */
1138 int i, j;
1139
1140 /* can't render to compressed formats at this time */
1141 if (_mesa_is_compressed_format(ctx, internalFormat)
1142 && (bindings & ~PIPE_BIND_SAMPLER_VIEW)) {
1143 return PIPE_FORMAT_NONE;
1144 }
1145
1146 /* search table for internalFormat */
1147 for (i = 0; i < Elements(format_map); i++) {
1148 const struct format_mapping *mapping = &format_map[i];
1149 for (j = 0; mapping->glFormats[j]; j++) {
1150 if (mapping->glFormats[j] == internalFormat) {
1151 /* Found the desired internal format. Find first pipe format
1152 * which is supported by the driver.
1153 */
1154 return find_supported_format(screen, mapping->pipeFormats,
1155 target, sample_count, bindings);
1156 }
1157 }
1158 }
1159
1160 _mesa_problem(NULL, "unhandled format!\n");
1161 return PIPE_FORMAT_NONE;
1162 }
1163
1164
1165 /**
1166 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
1167 */
1168 enum pipe_format
1169 st_choose_renderbuffer_format(struct pipe_screen *screen,
1170 GLenum internalFormat, unsigned sample_count)
1171 {
1172 uint usage;
1173 if (_mesa_is_depth_or_stencil_format(internalFormat))
1174 usage = PIPE_BIND_DEPTH_STENCIL;
1175 else
1176 usage = PIPE_BIND_RENDER_TARGET;
1177 return st_choose_format(screen, internalFormat, PIPE_TEXTURE_2D,
1178 sample_count, usage);
1179 }
1180
1181
1182 /**
1183 * Called via ctx->Driver.chooseTextureFormat().
1184 */
1185 gl_format
1186 st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
1187 GLenum format, GLenum type, GLboolean renderable)
1188 {
1189 struct pipe_screen *screen = st_context(ctx)->pipe->screen;
1190 enum pipe_format pFormat;
1191 uint bindings;
1192
1193 (void) format;
1194 (void) type;
1195
1196 /* GL textures may wind up being render targets, but we don't know
1197 * that in advance. Specify potential render target flags now.
1198 */
1199 bindings = PIPE_BIND_SAMPLER_VIEW;
1200 if (renderable == GL_TRUE) {
1201 if (_mesa_is_depth_format(internalFormat) ||
1202 _mesa_is_depth_or_stencil_format(internalFormat))
1203 bindings |= PIPE_BIND_DEPTH_STENCIL;
1204 else
1205 bindings |= PIPE_BIND_RENDER_TARGET;
1206 }
1207
1208 pFormat = st_choose_format(screen, internalFormat,
1209 PIPE_TEXTURE_2D, 0, bindings);
1210
1211 if (pFormat == PIPE_FORMAT_NONE) {
1212 /* try choosing format again, this time without render target bindings */
1213 pFormat = st_choose_format(screen, internalFormat,
1214 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
1215 }
1216
1217 if (pFormat == PIPE_FORMAT_NONE) {
1218 /* no luck at all */
1219 return MESA_FORMAT_NONE;
1220 }
1221
1222 return st_pipe_format_to_mesa_format(pFormat);
1223 }
1224
1225 gl_format
1226 st_ChooseTextureFormat(struct gl_context *ctx, GLint internalFormat,
1227 GLenum format, GLenum type)
1228 {
1229 boolean want_renderable =
1230 internalFormat == 3 || internalFormat == 4 ||
1231 internalFormat == GL_RGB || internalFormat == GL_RGBA ||
1232 internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
1233 internalFormat == GL_BGRA;
1234
1235 return st_ChooseTextureFormat_renderable(ctx, internalFormat,
1236 format, type, want_renderable);
1237 }
1238
1239 /**
1240 * Test if a gallium format is equivalent to a GL format/type.
1241 */
1242 GLboolean
1243 st_equal_formats(enum pipe_format pFormat, GLenum format, GLenum type)
1244 {
1245 switch (pFormat) {
1246 case PIPE_FORMAT_A8B8G8R8_UNORM:
1247 return format == GL_RGBA && type == GL_UNSIGNED_BYTE;
1248 case PIPE_FORMAT_A8R8G8B8_UNORM:
1249 return format == GL_BGRA && type == GL_UNSIGNED_BYTE;
1250 case PIPE_FORMAT_B5G6R5_UNORM:
1251 return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5;
1252 /* XXX more combos... */
1253 default:
1254 return GL_FALSE;
1255 }
1256 }
1257
1258 GLboolean
1259 st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
1260 {
1261 if (format1 == format2)
1262 return GL_TRUE;
1263
1264 if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
1265 format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
1266 return GL_TRUE;
1267
1268 if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
1269 format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
1270 return GL_TRUE;
1271
1272 if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
1273 format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
1274 return GL_TRUE;
1275
1276 if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
1277 format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
1278 return GL_TRUE;
1279
1280 if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
1281 format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
1282 return GL_TRUE;
1283
1284 if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
1285 format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
1286 return GL_TRUE;
1287
1288 return GL_FALSE;
1289 }
1290
1291
1292
1293 /**
1294 * This is used for translating texture border color and the clear
1295 * color. For example, the clear color is interpreted according to
1296 * the renderbuffer's base format. For example, if clearing a
1297 * GL_LUMINANCE buffer, ClearColor[0] = luminance and ClearColor[1] =
1298 * alpha. Similarly for texture border colors.
1299 */
1300 void
1301 st_translate_color(const GLfloat colorIn[4], GLenum baseFormat,
1302 GLfloat colorOut[4])
1303 {
1304 switch (baseFormat) {
1305 case GL_RED:
1306 colorOut[0] = colorIn[0];
1307 colorOut[1] = 0.0F;
1308 colorOut[2] = 0.0F;
1309 colorOut[3] = 1.0F;
1310 break;
1311 case GL_RG:
1312 colorOut[0] = colorIn[0];
1313 colorOut[1] = colorIn[1];
1314 colorOut[2] = 0.0F;
1315 colorOut[3] = 1.0F;
1316 break;
1317 case GL_RGB:
1318 colorOut[0] = colorIn[0];
1319 colorOut[1] = colorIn[1];
1320 colorOut[2] = colorIn[2];
1321 colorOut[3] = 1.0F;
1322 break;
1323 case GL_ALPHA:
1324 colorOut[0] = colorOut[1] = colorOut[2] = 0.0;
1325 colorOut[3] = colorIn[3];
1326 break;
1327 case GL_LUMINANCE:
1328 colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
1329 colorOut[3] = 1.0;
1330 break;
1331 case GL_LUMINANCE_ALPHA:
1332 colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
1333 colorOut[3] = colorIn[3];
1334 break;
1335 case GL_INTENSITY:
1336 colorOut[0] = colorOut[1] = colorOut[2] = colorOut[3] = colorIn[0];
1337 break;
1338 default:
1339 COPY_4V(colorOut, colorIn);
1340 }
1341 }