Merge branch 'xa_branch'
[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 #define DEFAULT_DEPTH_FORMATS \
599 PIPE_FORMAT_Z24X8_UNORM, \
600 PIPE_FORMAT_X8Z24_UNORM, \
601 PIPE_FORMAT_Z16_UNORM, \
602 PIPE_FORMAT_Z24_UNORM_S8_USCALED, \
603 PIPE_FORMAT_S8_USCALED_Z24_UNORM, \
604 0
605
606 /**
607 * This table maps OpenGL texture format enums to Gallium pipe_format enums.
608 * Multiple GL enums might map to multiple pipe_formats.
609 * The first pipe format in the list that's supported is the one that's chosen.
610 */
611 static const struct format_mapping format_map[] = {
612 /* Basic RGB, RGBA formats */
613 {
614 { GL_RGB10, GL_RGB10_A2, 0 },
615 { PIPE_FORMAT_B10G10R10A2_UNORM, DEFAULT_RGBA_FORMATS }
616 },
617 {
618 { 4, GL_RGBA, GL_RGBA8, 0 },
619 { PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS }
620 },
621 {
622 { GL_BGRA, 0 },
623 { PIPE_FORMAT_B8G8R8A8_UNORM, DEFAULT_RGBA_FORMATS }
624 },
625 {
626 { 3, GL_RGB, GL_RGB8, 0 },
627 { DEFAULT_RGB_FORMATS }
628 },
629 {
630 { GL_RGB12, GL_RGB16, GL_RGBA12, GL_RGBA16, 0 },
631 { PIPE_FORMAT_R16G16B16A16_UNORM, DEFAULT_RGBA_FORMATS }
632 },
633 {
634 { GL_RGBA4, GL_RGBA2, 0 },
635 { PIPE_FORMAT_B4G4R4A4_UNORM, DEFAULT_RGBA_FORMATS }
636 },
637 {
638 { GL_RGB5_A1, 0 },
639 { PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGBA_FORMATS }
640 },
641 {
642 { GL_R3_G3_B2, 0 },
643 { PIPE_FORMAT_B2G3R3_UNORM, PIPE_FORMAT_B5G6R5_UNORM,
644 PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGBA_FORMATS }
645 },
646 {
647 { GL_RGB5, GL_RGB4 },
648 { PIPE_FORMAT_B5G6R5_UNORM, PIPE_FORMAT_B5G5R5A1_UNORM,
649 DEFAULT_RGBA_FORMATS }
650 },
651
652 /* basic Alpha formats */
653 {
654 { GL_ALPHA12, GL_ALPHA16, 0 },
655 { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_A8_UNORM,
656 DEFAULT_RGBA_FORMATS }
657 },
658 {
659 { GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_COMPRESSED_ALPHA, 0 },
660 { PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
661 },
662
663 /* basic Luminance formats */
664 {
665 { GL_LUMINANCE12, GL_LUMINANCE16, 0 },
666 { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
667 },
668 {
669 { 1, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, 0 },
670 { PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
671 },
672
673 /* basic Luminance/Alpha formats */
674 {
675 { GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,
676 GL_LUMINANCE16_ALPHA16, 0},
677 { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_L8A8_UNORM,
678 DEFAULT_RGBA_FORMATS }
679 },
680 {
681 { 2, GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, 0 },
682 { PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
683 },
684 {
685 { GL_LUMINANCE4_ALPHA4, 0 },
686 { PIPE_FORMAT_L4A4_UNORM, PIPE_FORMAT_L8A8_UNORM,
687 DEFAULT_RGBA_FORMATS }
688 },
689
690 /* basic Intensity formats */
691 {
692 { GL_INTENSITY12, GL_INTENSITY16, 0 },
693 { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
694 },
695 {
696 { GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8,
697 GL_COMPRESSED_INTENSITY, 0 },
698 { PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
699 },
700
701 /* YCbCr */
702 {
703 { GL_YCBCR_MESA, 0 },
704 { PIPE_FORMAT_UYVY, PIPE_FORMAT_YUYV, 0 }
705 },
706
707 /* compressed formats */ /* XXX PIPE_BIND_SAMPLER_VIEW only */
708 {
709 { GL_COMPRESSED_RGB, 0 },
710 { PIPE_FORMAT_DXT1_RGB, DEFAULT_RGB_FORMATS }
711 },
712 {
713 { GL_COMPRESSED_RGBA, 0 },
714 { PIPE_FORMAT_DXT5_RGBA, DEFAULT_RGBA_FORMATS }
715 },
716 {
717 { GL_RGB_S3TC, GL_RGB4_S3TC, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 0 },
718 { PIPE_FORMAT_DXT1_RGB, 0 }
719 },
720 {
721 { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0 },
722 { PIPE_FORMAT_DXT1_RGBA, 0 }
723 },
724 {
725 { GL_RGBA_S3TC, GL_RGBA4_S3TC, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0 },
726 { PIPE_FORMAT_DXT3_RGBA, 0 }
727 },
728 {
729 { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0 },
730 { PIPE_FORMAT_DXT5_RGBA, 0 }
731 },
732
733 #if 0
734 {
735 { GL_COMPRESSED_RGB_FXT1_3DFX, 0 },
736 { PIPE_FORMAT_RGB_FXT1, 0 }
737 },
738 {
739 { GL_COMPRESSED_RGBA_FXT1_3DFX, 0 },
740 { PIPE_FORMAT_RGBA_FXT1, 0 }
741 },
742 #endif
743
744 /* Depth formats */
745 {
746 { GL_DEPTH_COMPONENT16, 0 },
747 { PIPE_FORMAT_Z16_UNORM, DEFAULT_DEPTH_FORMATS }
748 },
749 {
750 { GL_DEPTH_COMPONENT24, 0 },
751 { PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM,
752 DEFAULT_DEPTH_FORMATS }
753 },
754 {
755 { GL_DEPTH_COMPONENT32, 0 },
756 { PIPE_FORMAT_Z32_UNORM, DEFAULT_DEPTH_FORMATS }
757 },
758 {
759 { GL_DEPTH_COMPONENT, 0 },
760 { DEFAULT_DEPTH_FORMATS }
761 },
762
763 /* stencil formats */
764 {
765 { GL_STENCIL_INDEX, GL_STENCIL_INDEX1_EXT, GL_STENCIL_INDEX4_EXT,
766 GL_STENCIL_INDEX8_EXT, GL_STENCIL_INDEX16_EXT, 0 },
767 {
768 PIPE_FORMAT_S8_USCALED, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
769 PIPE_FORMAT_S8_USCALED_Z24_UNORM, 0
770 }
771 },
772
773 /* Depth / Stencil formats */
774 {
775 { GL_DEPTH_STENCIL_EXT, GL_DEPTH24_STENCIL8_EXT, 0 },
776 { PIPE_FORMAT_Z24_UNORM_S8_USCALED, PIPE_FORMAT_S8_USCALED_Z24_UNORM, 0 }
777 },
778
779 /* sRGB formats */
780 {
781 { GL_SRGB_EXT, GL_SRGB8_EXT, GL_SRGB_ALPHA_EXT, GL_SRGB8_ALPHA8_EXT, 0 },
782 { DEFAULT_SRGBA_FORMATS }
783 },
784 {
785 { GL_COMPRESSED_SRGB_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 0 },
786 { PIPE_FORMAT_DXT1_SRGB, DEFAULT_SRGBA_FORMATS }
787 },
788 {
789 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0 },
790 { PIPE_FORMAT_DXT1_SRGBA, 0 }
791 },
792 {
793 { GL_COMPRESSED_SRGB_ALPHA_EXT,
794 GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0 },
795 { PIPE_FORMAT_DXT3_SRGBA, DEFAULT_SRGBA_FORMATS }
796 },
797 {
798 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0 },
799 { PIPE_FORMAT_DXT5_SRGBA, 0 }
800 },
801 {
802 { GL_SLUMINANCE_ALPHA_EXT, GL_SLUMINANCE8_ALPHA8_EXT,
803 GL_COMPRESSED_SLUMINANCE_EXT, GL_COMPRESSED_SLUMINANCE_ALPHA_EXT, 0 },
804 { PIPE_FORMAT_L8A8_SRGB, DEFAULT_SRGBA_FORMATS }
805 },
806 {
807 { GL_SLUMINANCE_EXT, GL_SLUMINANCE8_EXT, 0 },
808 { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS }
809 },
810
811 /* 16-bit float formats */
812 {
813 { GL_RGBA16F_ARB, 0 },
814 { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
815 },
816 {
817 { GL_RGB16F_ARB, 0 },
818 { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
819 PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
820 },
821 {
822 { GL_LUMINANCE_ALPHA16F_ARB, 0 },
823 { PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
824 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
825 },
826 {
827 { GL_ALPHA16F_ARB, 0 },
828 { PIPE_FORMAT_A16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
829 PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
830 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
831 },
832 {
833 { GL_INTENSITY16F_ARB, 0 },
834 { PIPE_FORMAT_I16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
835 PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
836 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
837 },
838 {
839 { GL_LUMINANCE16F_ARB, 0 },
840 { PIPE_FORMAT_L16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
841 PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
842 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
843 },
844 {
845 { GL_R16F, 0 },
846 { PIPE_FORMAT_R16_FLOAT, PIPE_FORMAT_R16G16_FLOAT,
847 PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
848 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
849 },
850 {
851 { GL_RG16F, 0 },
852 { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
853 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
854 },
855
856 /* 32-bit float formats */
857 {
858 { GL_RGBA32F_ARB, 0 },
859 { PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
860 },
861 {
862 { GL_RGB32F_ARB, 0 },
863 { PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
864 PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
865 },
866 {
867 { GL_LUMINANCE_ALPHA32F_ARB, 0 },
868 { PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
869 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
870 },
871 {
872 { GL_ALPHA32F_ARB, 0 },
873 { PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
874 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_A16_FLOAT,
875 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
876 },
877 {
878 { GL_INTENSITY32F_ARB, 0 },
879 { PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
880 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_I16_FLOAT,
881 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
882 },
883 {
884 { GL_LUMINANCE32F_ARB, 0 },
885 { PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
886 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_L16_FLOAT,
887 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
888 },
889 {
890 { GL_R32F, 0 },
891 { PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT,
892 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16_FLOAT,
893 PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
894 },
895 {
896 { GL_RG32F, 0 },
897 { PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
898 PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
899 },
900
901 /* R, RG formats */
902 {
903 { GL_RED, GL_R8, 0 },
904 { PIPE_FORMAT_R8_UNORM, 0 }
905 },
906 {
907 { GL_RG, GL_RG8, 0 },
908 { PIPE_FORMAT_R8G8_UNORM, 0 }
909 },
910 {
911 { GL_R16, 0 },
912 { PIPE_FORMAT_R16_UNORM, 0 }
913 },
914 {
915 { GL_RG16, 0 },
916 { PIPE_FORMAT_R16G16_UNORM, 0 }
917 },
918
919 /* compressed R, RG formats */
920 {
921 { GL_COMPRESSED_RED, GL_COMPRESSED_RED_RGTC1, 0 },
922 { PIPE_FORMAT_RGTC1_UNORM, PIPE_FORMAT_R8_UNORM, 0 }
923 },
924 {
925 { GL_COMPRESSED_SIGNED_RED_RGTC1, 0 },
926 { PIPE_FORMAT_RGTC1_SNORM, 0 }
927 },
928 {
929 { GL_COMPRESSED_RG, GL_COMPRESSED_RG_RGTC2, 0 },
930 { PIPE_FORMAT_RGTC2_UNORM, PIPE_FORMAT_R8G8_UNORM, 0 }
931 },
932 {
933 { GL_COMPRESSED_SIGNED_RG_RGTC2, 0 },
934 { PIPE_FORMAT_RGTC2_SNORM, 0 }
935 },
936 {
937 { GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_LATC1_EXT, 0 },
938 { PIPE_FORMAT_LATC1_UNORM, PIPE_FORMAT_L8_UNORM, 0 }
939 },
940 {
941 { GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT, 0 },
942 { PIPE_FORMAT_LATC1_SNORM, 0 }
943 },
944 {
945 { GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT,
946 GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0 },
947 { PIPE_FORMAT_LATC2_UNORM, PIPE_FORMAT_L8A8_UNORM, 0 }
948 },
949 {
950 { GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT, 0 },
951 { PIPE_FORMAT_LATC2_SNORM, 0 }
952 },
953
954 /* signed/unsigned integer formats.
955 * XXX Mesa only has formats for RGBA signed/unsigned integer formats.
956 * If/when new formats are added this code should be updated.
957 */
958 {
959 { GL_RED_INTEGER_EXT,
960 GL_GREEN_INTEGER_EXT,
961 GL_BLUE_INTEGER_EXT,
962 GL_ALPHA_INTEGER_EXT,
963 GL_RGB_INTEGER_EXT,
964 GL_RGBA_INTEGER_EXT,
965 GL_BGR_INTEGER_EXT,
966 GL_BGRA_INTEGER_EXT,
967 GL_LUMINANCE_INTEGER_EXT,
968 GL_LUMINANCE_ALPHA_INTEGER_EXT,
969 GL_RGBA8I_EXT,
970 GL_RGB8I_EXT,
971 GL_ALPHA8I_EXT,
972 GL_INTENSITY8I_EXT,
973 GL_LUMINANCE8I_EXT,
974 GL_LUMINANCE_ALPHA8I_EXT, 0 },
975 { PIPE_FORMAT_R8G8B8A8_SSCALED, 0 }
976 },
977 {
978 {
979 GL_RGBA16I_EXT,
980 GL_RGB16I_EXT,
981 GL_ALPHA16I_EXT,
982 GL_INTENSITY16I_EXT,
983 GL_LUMINANCE16I_EXT,
984 GL_LUMINANCE_ALPHA16I_EXT, 0 },
985 { PIPE_FORMAT_R16G16B16A16_SSCALED, 0 },
986 },
987 {
988 {
989 GL_RGBA32I_EXT,
990 GL_RGB32I_EXT,
991 GL_ALPHA32I_EXT,
992 GL_INTENSITY32I_EXT,
993 GL_LUMINANCE32I_EXT,
994 GL_LUMINANCE_ALPHA32I_EXT, 0 },
995 { PIPE_FORMAT_R32G32B32A32_SSCALED, 0 }
996 },
997 {
998 {
999 GL_RGBA8UI_EXT,
1000 GL_RGB8UI_EXT,
1001 GL_ALPHA8UI_EXT,
1002 GL_INTENSITY8UI_EXT,
1003 GL_LUMINANCE8UI_EXT,
1004 GL_LUMINANCE_ALPHA8UI_EXT, 0 },
1005 { PIPE_FORMAT_R8G8B8A8_USCALED, 0 }
1006 },
1007 {
1008 {
1009 GL_RGBA16UI_EXT,
1010 GL_RGB16UI_EXT,
1011 GL_ALPHA16UI_EXT,
1012 GL_INTENSITY16UI_EXT,
1013 GL_LUMINANCE16UI_EXT,
1014 GL_LUMINANCE_ALPHA16UI_EXT, 0 },
1015 { PIPE_FORMAT_R16G16B16A16_USCALED, 0 }
1016 },
1017 {
1018 {
1019 GL_RGBA32UI_EXT,
1020 GL_RGB32UI_EXT,
1021 GL_ALPHA32UI_EXT,
1022 GL_INTENSITY32UI_EXT,
1023 GL_LUMINANCE32UI_EXT,
1024 GL_LUMINANCE_ALPHA32UI_EXT, 0 },
1025 { PIPE_FORMAT_R32G32B32A32_USCALED, 0 }
1026 },
1027
1028 /* signed normalized formats */
1029 {
1030 { GL_RED_SNORM, GL_R8_SNORM, 0 },
1031 { PIPE_FORMAT_R8_SNORM, PIPE_FORMAT_R8G8_SNORM,
1032 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1033 },
1034 {
1035 { GL_R16_SNORM, 0 },
1036 { PIPE_FORMAT_R16_SNORM,
1037 PIPE_FORMAT_R16G16_SNORM,
1038 PIPE_FORMAT_R16G16B16A16_SNORM,
1039 PIPE_FORMAT_R8_SNORM,
1040 PIPE_FORMAT_R8G8_SNORM,
1041 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1042 },
1043 {
1044 { GL_RG_SNORM, GL_RG8_SNORM, 0 },
1045 { PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1046 },
1047 {
1048 { GL_RG16_SNORM, 0 },
1049 { PIPE_FORMAT_R16G16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1050 PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1051 },
1052 {
1053 { GL_RGB_SNORM, GL_RGB8_SNORM, GL_RGBA_SNORM, GL_RGBA8_SNORM, 0 },
1054 { PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1055 },
1056 {
1057 { GL_RGB16_SNORM, GL_RGBA16_SNORM, 0 },
1058 { PIPE_FORMAT_R16G16B16A16_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1059 },
1060 {
1061 { GL_ALPHA_SNORM, GL_ALPHA8_SNORM, 0 },
1062 { PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1063 },
1064 {
1065 { GL_ALPHA16_SNORM, 0 },
1066 { PIPE_FORMAT_A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1067 PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1068 },
1069 {
1070 { GL_LUMINANCE_SNORM, GL_LUMINANCE8_SNORM, 0 },
1071 { PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1072 },
1073 {
1074 { GL_LUMINANCE16_SNORM, 0 },
1075 { PIPE_FORMAT_L16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1076 PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1077 },
1078 {
1079 { GL_LUMINANCE_ALPHA_SNORM, GL_LUMINANCE8_ALPHA8_SNORM, 0 },
1080 { PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1081 },
1082 {
1083 { GL_LUMINANCE16_ALPHA16_SNORM, 0 },
1084 { PIPE_FORMAT_L16A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1085 PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1086 },
1087 {
1088 { GL_INTENSITY_SNORM, GL_INTENSITY8_SNORM, 0 },
1089 { PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1090 },
1091 {
1092 { GL_INTENSITY16_SNORM, 0 },
1093 { PIPE_FORMAT_I16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1094 PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1095 },
1096 {
1097 { GL_RGB9_E5, 0 },
1098 { PIPE_FORMAT_R9G9B9E5_FLOAT, 0 }
1099 },
1100 {
1101 { GL_R11F_G11F_B10F, 0 },
1102 { PIPE_FORMAT_R11G11B10_FLOAT, 0 }
1103 }
1104 };
1105
1106
1107 /**
1108 * Return first supported format from the given list.
1109 */
1110 static enum pipe_format
1111 find_supported_format(struct pipe_screen *screen,
1112 const enum pipe_format formats[],
1113 enum pipe_texture_target target,
1114 unsigned sample_count,
1115 unsigned tex_usage)
1116 {
1117 uint i;
1118 for (i = 0; formats[i]; i++) {
1119 if (screen->is_format_supported(screen, formats[i], target,
1120 sample_count, tex_usage)) {
1121 return formats[i];
1122 }
1123 }
1124 return PIPE_FORMAT_NONE;
1125 }
1126
1127 struct exact_format_mapping
1128 {
1129 GLenum format;
1130 GLenum type;
1131 enum pipe_format pformat;
1132 };
1133
1134 static const struct exact_format_mapping rgba8888_tbl[] =
1135 {
1136 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_A8B8G8R8_UNORM },
1137 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_A8B8G8R8_UNORM },
1138 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_R8G8B8A8_UNORM },
1139 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_R8G8B8A8_UNORM },
1140 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_A8R8G8B8_UNORM },
1141 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_B8G8R8A8_UNORM },
1142 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8A8_UNORM },
1143 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_A8B8G8R8_UNORM },
1144 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8A8_UNORM },
1145 { 0, 0, 0 }
1146 };
1147
1148 static const struct exact_format_mapping rgbx8888_tbl[] =
1149 {
1150 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_X8R8G8B8_UNORM },
1151 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_B8G8R8X8_UNORM },
1152 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8X8_UNORM },
1153 /* No Mesa formats for these Gallium formats:
1154 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_X8B8G8R8_UNORM },
1155 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_X8B8G8R8_UNORM },
1156 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_R8G8B8X8_UNORM },
1157 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_R8G8B8X8_UNORM },
1158 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8X8_UNORM },
1159 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_X8B8G8R8_UNORM },
1160 */
1161 { 0, 0, 0 }
1162 };
1163
1164 static const struct exact_format_mapping rgba1010102_tbl[] =
1165 {
1166 { GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_B10G10R10A2_UNORM },
1167 /* No Mesa formats for these Gallium formats:
1168 { GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_R10G10B10A2_UNORM },
1169 { GL_ABGR_EXT, GL_UNSIGNED_INT_10_10_10_2, PIPE_FORMAT_R10G10B10A2_UNORM },
1170 { GL_ABGR_EXT, GL_UNSIGNED_INT, PIPE_FORMAT_R10G10B10A2_UNORM },
1171 */
1172 { 0, 0, 0 }
1173 };
1174
1175 /**
1176 * If there is an exact pipe_format match for {internalFormat, format, type}
1177 * return that, otherwise return PIPE_FORMAT_NONE so we can do fuzzy matching.
1178 */
1179 static enum pipe_format
1180 find_exact_format(GLint internalFormat, GLenum format, GLenum type)
1181 {
1182 uint i;
1183 const struct exact_format_mapping* tbl;
1184
1185 if (format == GL_NONE || type == GL_NONE)
1186 return PIPE_FORMAT_NONE;
1187
1188 switch (internalFormat) {
1189 case 4:
1190 case GL_RGBA:
1191 case GL_RGBA8:
1192 tbl = rgba8888_tbl;
1193 break;
1194 case 3:
1195 case GL_RGB:
1196 case GL_RGB8:
1197 tbl = rgbx8888_tbl;
1198 break;
1199 case GL_RGB10_A2:
1200 tbl = rgba1010102_tbl;
1201 break;
1202 default:
1203 return PIPE_FORMAT_NONE;
1204 }
1205
1206 for (i = 0; tbl[i].format; i++)
1207 if (tbl[i].format == format && tbl[i].type == type)
1208 return tbl[i].pformat;
1209
1210 return PIPE_FORMAT_NONE;
1211 }
1212
1213 /**
1214 * Given an OpenGL internalFormat value for a texture or surface, return
1215 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
1216 * This is called during glTexImage2D, for example.
1217 *
1218 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
1219 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
1220 * we want render-to-texture ability.
1221 *
1222 * \param internalFormat the user value passed to glTexImage2D
1223 * \param target one of PIPE_TEXTURE_x
1224 * \param bindings bitmask of PIPE_BIND_x flags.
1225 */
1226 enum pipe_format
1227 st_choose_format(struct pipe_screen *screen, GLenum internalFormat,
1228 GLenum format, GLenum type,
1229 enum pipe_texture_target target, unsigned sample_count,
1230 unsigned bindings)
1231 {
1232 GET_CURRENT_CONTEXT(ctx); /* XXX this should be a function parameter */
1233 int i, j;
1234 enum pipe_format pf;
1235
1236 /* can't render to compressed formats at this time */
1237 if (_mesa_is_compressed_format(ctx, internalFormat)
1238 && (bindings & ~PIPE_BIND_SAMPLER_VIEW)) {
1239 return PIPE_FORMAT_NONE;
1240 }
1241
1242 /* search for exact matches */
1243 pf = find_exact_format(internalFormat, format, type);
1244 if (pf != PIPE_FORMAT_NONE &&
1245 screen->is_format_supported(screen, pf,
1246 target, sample_count, bindings))
1247 return pf;
1248
1249 /* search table for internalFormat */
1250 for (i = 0; i < Elements(format_map); i++) {
1251 const struct format_mapping *mapping = &format_map[i];
1252 for (j = 0; mapping->glFormats[j]; j++) {
1253 if (mapping->glFormats[j] == internalFormat) {
1254 /* Found the desired internal format. Find first pipe format
1255 * which is supported by the driver.
1256 */
1257 return find_supported_format(screen, mapping->pipeFormats,
1258 target, sample_count, bindings);
1259 }
1260 }
1261 }
1262
1263 _mesa_problem(NULL, "unhandled format!\n");
1264 return PIPE_FORMAT_NONE;
1265 }
1266
1267
1268 /**
1269 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
1270 */
1271 enum pipe_format
1272 st_choose_renderbuffer_format(struct pipe_screen *screen,
1273 GLenum internalFormat, unsigned sample_count)
1274 {
1275 uint usage;
1276 if (_mesa_is_depth_or_stencil_format(internalFormat))
1277 usage = PIPE_BIND_DEPTH_STENCIL;
1278 else
1279 usage = PIPE_BIND_RENDER_TARGET;
1280 return st_choose_format(screen, internalFormat, GL_NONE, GL_NONE, PIPE_TEXTURE_2D,
1281 sample_count, usage);
1282 }
1283
1284
1285 gl_format
1286 st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
1287 GLenum format, GLenum type, GLboolean renderable)
1288 {
1289 struct pipe_screen *screen = st_context(ctx)->pipe->screen;
1290 enum pipe_format pFormat;
1291 uint bindings;
1292
1293 (void) format;
1294 (void) type;
1295
1296 /* GL textures may wind up being render targets, but we don't know
1297 * that in advance. Specify potential render target flags now.
1298 */
1299 bindings = PIPE_BIND_SAMPLER_VIEW;
1300 if (renderable) {
1301 if (_mesa_is_depth_or_stencil_format(internalFormat))
1302 bindings |= PIPE_BIND_DEPTH_STENCIL;
1303 else
1304 bindings |= PIPE_BIND_RENDER_TARGET;
1305 }
1306
1307 pFormat = st_choose_format(screen, internalFormat, format, type,
1308 PIPE_TEXTURE_2D, 0, bindings);
1309
1310 if (pFormat == PIPE_FORMAT_NONE) {
1311 /* try choosing format again, this time without render target bindings */
1312 pFormat = st_choose_format(screen, internalFormat, format, type,
1313 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
1314 }
1315
1316 if (pFormat == PIPE_FORMAT_NONE) {
1317 /* no luck at all */
1318 return MESA_FORMAT_NONE;
1319 }
1320
1321 return st_pipe_format_to_mesa_format(pFormat);
1322 }
1323
1324
1325 /**
1326 * Called via ctx->Driver.ChooseTextureFormat().
1327 */
1328 gl_format
1329 st_ChooseTextureFormat(struct gl_context *ctx, GLint internalFormat,
1330 GLenum format, GLenum type)
1331 {
1332 boolean want_renderable =
1333 internalFormat == 3 || internalFormat == 4 ||
1334 internalFormat == GL_RGB || internalFormat == GL_RGBA ||
1335 internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
1336 internalFormat == GL_BGRA;
1337
1338 return st_ChooseTextureFormat_renderable(ctx, internalFormat,
1339 format, type, want_renderable);
1340 }
1341
1342 /**
1343 * Test if a gallium format is equivalent to a GL format/type.
1344 */
1345 GLboolean
1346 st_equal_formats(enum pipe_format pFormat, GLenum format, GLenum type)
1347 {
1348 switch (pFormat) {
1349 case PIPE_FORMAT_A8B8G8R8_UNORM:
1350 return format == GL_RGBA && type == GL_UNSIGNED_BYTE;
1351 case PIPE_FORMAT_A8R8G8B8_UNORM:
1352 return format == GL_BGRA && type == GL_UNSIGNED_BYTE;
1353 case PIPE_FORMAT_B5G6R5_UNORM:
1354 return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5;
1355 /* XXX more combos... */
1356 default:
1357 return GL_FALSE;
1358 }
1359 }
1360
1361 GLboolean
1362 st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
1363 {
1364 if (format1 == format2)
1365 return GL_TRUE;
1366
1367 if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
1368 format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
1369 return GL_TRUE;
1370
1371 if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
1372 format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
1373 return GL_TRUE;
1374
1375 if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
1376 format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
1377 return GL_TRUE;
1378
1379 if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
1380 format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
1381 return GL_TRUE;
1382
1383 if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
1384 format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
1385 return GL_TRUE;
1386
1387 if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
1388 format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
1389 return GL_TRUE;
1390
1391 return GL_FALSE;
1392 }
1393
1394
1395
1396 /**
1397 * This is used for translating texture border color and the clear
1398 * color. For example, the clear color is interpreted according to
1399 * the renderbuffer's base format. For example, if clearing a
1400 * GL_LUMINANCE buffer, ClearColor[0] = luminance and ClearColor[1] =
1401 * alpha. Similarly for texture border colors.
1402 */
1403 void
1404 st_translate_color(const GLfloat colorIn[4], GLenum baseFormat,
1405 GLfloat colorOut[4])
1406 {
1407 switch (baseFormat) {
1408 case GL_RED:
1409 colorOut[0] = colorIn[0];
1410 colorOut[1] = 0.0F;
1411 colorOut[2] = 0.0F;
1412 colorOut[3] = 1.0F;
1413 break;
1414 case GL_RG:
1415 colorOut[0] = colorIn[0];
1416 colorOut[1] = colorIn[1];
1417 colorOut[2] = 0.0F;
1418 colorOut[3] = 1.0F;
1419 break;
1420 case GL_RGB:
1421 colorOut[0] = colorIn[0];
1422 colorOut[1] = colorIn[1];
1423 colorOut[2] = colorIn[2];
1424 colorOut[3] = 1.0F;
1425 break;
1426 case GL_ALPHA:
1427 colorOut[0] = colorOut[1] = colorOut[2] = 0.0;
1428 colorOut[3] = colorIn[3];
1429 break;
1430 case GL_LUMINANCE:
1431 colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
1432 colorOut[3] = 1.0;
1433 break;
1434 case GL_LUMINANCE_ALPHA:
1435 colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
1436 colorOut[3] = colorIn[3];
1437 break;
1438 case GL_INTENSITY:
1439 colorOut[0] = colorOut[1] = colorOut[2] = colorOut[3] = colorIn[0];
1440 break;
1441 default:
1442 COPY_4V(colorOut, colorIn);
1443 }
1444 }