st/mesa: choose 3-component float formats before 4-component 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 default:
329 assert(0);
330 return PIPE_FORMAT_NONE;
331 }
332 }
333
334
335 /**
336 * Translate Gallium format to Mesa format.
337 */
338 gl_format
339 st_pipe_format_to_mesa_format(enum pipe_format format)
340 {
341 switch (format) {
342 case PIPE_FORMAT_A8B8G8R8_UNORM:
343 return MESA_FORMAT_RGBA8888;
344 case PIPE_FORMAT_R8G8B8A8_UNORM:
345 return MESA_FORMAT_RGBA8888_REV;
346 case PIPE_FORMAT_B8G8R8A8_UNORM:
347 return MESA_FORMAT_ARGB8888;
348 case PIPE_FORMAT_A8R8G8B8_UNORM:
349 return MESA_FORMAT_ARGB8888_REV;
350 case PIPE_FORMAT_B8G8R8X8_UNORM:
351 return MESA_FORMAT_XRGB8888;
352 case PIPE_FORMAT_X8R8G8B8_UNORM:
353 return MESA_FORMAT_XRGB8888_REV;
354 case PIPE_FORMAT_B5G5R5A1_UNORM:
355 return MESA_FORMAT_ARGB1555;
356 case PIPE_FORMAT_B4G4R4A4_UNORM:
357 return MESA_FORMAT_ARGB4444;
358 case PIPE_FORMAT_B5G6R5_UNORM:
359 return MESA_FORMAT_RGB565;
360 case PIPE_FORMAT_B2G3R3_UNORM:
361 return MESA_FORMAT_RGB332;
362 case PIPE_FORMAT_B10G10R10A2_UNORM:
363 return MESA_FORMAT_ARGB2101010;
364 case PIPE_FORMAT_L4A4_UNORM:
365 return MESA_FORMAT_AL44;
366 case PIPE_FORMAT_L8A8_UNORM:
367 return MESA_FORMAT_AL88;
368 case PIPE_FORMAT_L16A16_UNORM:
369 return MESA_FORMAT_AL1616;
370 case PIPE_FORMAT_A8_UNORM:
371 return MESA_FORMAT_A8;
372 case PIPE_FORMAT_A16_UNORM:
373 return MESA_FORMAT_A16;
374 case PIPE_FORMAT_L8_UNORM:
375 return MESA_FORMAT_L8;
376 case PIPE_FORMAT_L16_UNORM:
377 return MESA_FORMAT_L16;
378 case PIPE_FORMAT_I8_UNORM:
379 return MESA_FORMAT_I8;
380 case PIPE_FORMAT_I16_UNORM:
381 return MESA_FORMAT_I16;
382 case PIPE_FORMAT_S8_USCALED:
383 return MESA_FORMAT_S8;
384
385 case PIPE_FORMAT_R16G16B16A16_UNORM:
386 return MESA_FORMAT_RGBA_16;
387
388 case PIPE_FORMAT_Z16_UNORM:
389 return MESA_FORMAT_Z16;
390 case PIPE_FORMAT_Z32_UNORM:
391 return MESA_FORMAT_Z32;
392 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
393 return MESA_FORMAT_Z24_S8;
394 case PIPE_FORMAT_X8Z24_UNORM:
395 return MESA_FORMAT_Z24_X8;
396 case PIPE_FORMAT_Z24X8_UNORM:
397 return MESA_FORMAT_X8_Z24;
398 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
399 return MESA_FORMAT_S8_Z24;
400
401 case PIPE_FORMAT_UYVY:
402 return MESA_FORMAT_YCBCR;
403 case PIPE_FORMAT_YUYV:
404 return MESA_FORMAT_YCBCR_REV;
405
406 #if FEATURE_texture_s3tc
407 case PIPE_FORMAT_DXT1_RGB:
408 return MESA_FORMAT_RGB_DXT1;
409 case PIPE_FORMAT_DXT1_RGBA:
410 return MESA_FORMAT_RGBA_DXT1;
411 case PIPE_FORMAT_DXT3_RGBA:
412 return MESA_FORMAT_RGBA_DXT3;
413 case PIPE_FORMAT_DXT5_RGBA:
414 return MESA_FORMAT_RGBA_DXT5;
415 #if FEATURE_EXT_texture_sRGB
416 case PIPE_FORMAT_DXT1_SRGB:
417 return MESA_FORMAT_SRGB_DXT1;
418 case PIPE_FORMAT_DXT1_SRGBA:
419 return MESA_FORMAT_SRGBA_DXT1;
420 case PIPE_FORMAT_DXT3_SRGBA:
421 return MESA_FORMAT_SRGBA_DXT3;
422 case PIPE_FORMAT_DXT5_SRGBA:
423 return MESA_FORMAT_SRGBA_DXT5;
424 #endif
425 #endif
426
427 #if FEATURE_EXT_texture_sRGB
428 case PIPE_FORMAT_L8A8_SRGB:
429 return MESA_FORMAT_SLA8;
430 case PIPE_FORMAT_L8_SRGB:
431 return MESA_FORMAT_SL8;
432 case PIPE_FORMAT_R8G8B8_SRGB:
433 return MESA_FORMAT_SRGB8;
434 case PIPE_FORMAT_A8B8G8R8_SRGB:
435 return MESA_FORMAT_SRGBA8;
436 case PIPE_FORMAT_B8G8R8A8_SRGB:
437 return MESA_FORMAT_SARGB8;
438 #endif
439 case PIPE_FORMAT_R32G32B32A32_FLOAT:
440 return MESA_FORMAT_RGBA_FLOAT32;
441 case PIPE_FORMAT_R16G16B16A16_FLOAT:
442 return MESA_FORMAT_RGBA_FLOAT16;
443 case PIPE_FORMAT_R32G32B32_FLOAT:
444 return MESA_FORMAT_RGB_FLOAT32;
445 case PIPE_FORMAT_R16G16B16_FLOAT:
446 return MESA_FORMAT_RGB_FLOAT16;
447 case PIPE_FORMAT_L32A32_FLOAT:
448 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
449 case PIPE_FORMAT_L16A16_FLOAT:
450 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
451 case PIPE_FORMAT_L32_FLOAT:
452 return MESA_FORMAT_LUMINANCE_FLOAT32;
453 case PIPE_FORMAT_L16_FLOAT:
454 return MESA_FORMAT_LUMINANCE_FLOAT16;
455 case PIPE_FORMAT_A32_FLOAT:
456 return MESA_FORMAT_ALPHA_FLOAT32;
457 case PIPE_FORMAT_A16_FLOAT:
458 return MESA_FORMAT_ALPHA_FLOAT16;
459 case PIPE_FORMAT_I32_FLOAT:
460 return MESA_FORMAT_INTENSITY_FLOAT32;
461 case PIPE_FORMAT_I16_FLOAT:
462 return MESA_FORMAT_INTENSITY_FLOAT16;
463 case PIPE_FORMAT_R32_FLOAT:
464 return MESA_FORMAT_R_FLOAT32;
465 case PIPE_FORMAT_R16_FLOAT:
466 return MESA_FORMAT_R_FLOAT16;
467 case PIPE_FORMAT_R32G32_FLOAT:
468 return MESA_FORMAT_RG_FLOAT32;
469 case PIPE_FORMAT_R16G16_FLOAT:
470 return MESA_FORMAT_RG_FLOAT16;
471
472 case PIPE_FORMAT_R8_UNORM:
473 return MESA_FORMAT_R8;
474 case PIPE_FORMAT_R16_UNORM:
475 return MESA_FORMAT_R16;
476 case PIPE_FORMAT_R8G8_UNORM:
477 return MESA_FORMAT_RG88;
478 case PIPE_FORMAT_R16G16_UNORM:
479 return MESA_FORMAT_RG1616;
480
481 /* signed int formats */
482 case PIPE_FORMAT_R8G8B8A8_SSCALED:
483 return MESA_FORMAT_RGBA_INT8;
484 case PIPE_FORMAT_R16G16B16A16_SSCALED:
485 return MESA_FORMAT_RGBA_INT16;
486 case PIPE_FORMAT_R32G32B32A32_SSCALED:
487 return MESA_FORMAT_RGBA_INT32;
488
489 /* unsigned int formats */
490 case PIPE_FORMAT_R8G8B8A8_USCALED:
491 return MESA_FORMAT_RGBA_UINT8;
492 case PIPE_FORMAT_R16G16B16A16_USCALED:
493 return MESA_FORMAT_RGBA_UINT16;
494 case PIPE_FORMAT_R32G32B32A32_USCALED:
495 return MESA_FORMAT_RGBA_UINT32;
496
497 case PIPE_FORMAT_RGTC1_UNORM:
498 return MESA_FORMAT_RED_RGTC1;
499 case PIPE_FORMAT_RGTC1_SNORM:
500 return MESA_FORMAT_SIGNED_RED_RGTC1;
501 case PIPE_FORMAT_RGTC2_UNORM:
502 return MESA_FORMAT_RG_RGTC2;
503 case PIPE_FORMAT_RGTC2_SNORM:
504 return MESA_FORMAT_SIGNED_RG_RGTC2;
505
506 case PIPE_FORMAT_LATC1_UNORM:
507 return MESA_FORMAT_L_LATC1;
508 case PIPE_FORMAT_LATC1_SNORM:
509 return MESA_FORMAT_SIGNED_L_LATC1;
510 case PIPE_FORMAT_LATC2_UNORM:
511 return MESA_FORMAT_LA_LATC2;
512 case PIPE_FORMAT_LATC2_SNORM:
513 return MESA_FORMAT_SIGNED_LA_LATC2;
514
515 /* signed normalized formats */
516 case PIPE_FORMAT_R8_SNORM:
517 return MESA_FORMAT_SIGNED_R8;
518 case PIPE_FORMAT_R8G8_SNORM:
519 return MESA_FORMAT_SIGNED_RG88_REV;
520 case PIPE_FORMAT_R8G8B8A8_SNORM:
521 return MESA_FORMAT_SIGNED_RGBA8888_REV;
522
523 case PIPE_FORMAT_A8_SNORM:
524 return MESA_FORMAT_SIGNED_A8;
525 case PIPE_FORMAT_L8_SNORM:
526 return MESA_FORMAT_SIGNED_L8;
527 case PIPE_FORMAT_L8A8_SNORM:
528 return MESA_FORMAT_SIGNED_AL88;
529 case PIPE_FORMAT_I8_SNORM:
530 return MESA_FORMAT_SIGNED_I8;
531
532 case PIPE_FORMAT_R16_SNORM:
533 return MESA_FORMAT_SIGNED_R16;
534 case PIPE_FORMAT_R16G16_SNORM:
535 return MESA_FORMAT_SIGNED_GR1616;
536 case PIPE_FORMAT_R16G16B16A16_SNORM:
537 return MESA_FORMAT_SIGNED_RGBA_16;
538
539 case PIPE_FORMAT_A16_SNORM:
540 return MESA_FORMAT_SIGNED_A16;
541 case PIPE_FORMAT_L16_SNORM:
542 return MESA_FORMAT_SIGNED_L16;
543 case PIPE_FORMAT_L16A16_SNORM:
544 return MESA_FORMAT_SIGNED_AL1616;
545 case PIPE_FORMAT_I16_SNORM:
546 return MESA_FORMAT_SIGNED_I16;
547
548 default:
549 assert(0);
550 return MESA_FORMAT_NONE;
551 }
552 }
553
554
555 /**
556 * Return first supported format from the given list.
557 */
558 static enum pipe_format
559 find_supported_format(struct pipe_screen *screen,
560 const enum pipe_format formats[],
561 uint num_formats,
562 enum pipe_texture_target target,
563 unsigned sample_count,
564 unsigned tex_usage)
565 {
566 uint i;
567 for (i = 0; i < num_formats; i++) {
568 if (screen->is_format_supported(screen, formats[i], target,
569 sample_count, tex_usage)) {
570 return formats[i];
571 }
572 }
573 return PIPE_FORMAT_NONE;
574 }
575
576
577 /**
578 * Find an RGBA format supported by the context/winsys.
579 */
580 static enum pipe_format
581 default_rgba_format(struct pipe_screen *screen,
582 enum pipe_texture_target target,
583 unsigned sample_count,
584 unsigned tex_usage)
585 {
586 static const enum pipe_format colorFormats[] = {
587 PIPE_FORMAT_B8G8R8A8_UNORM,
588 PIPE_FORMAT_A8R8G8B8_UNORM,
589 PIPE_FORMAT_A8B8G8R8_UNORM,
590 PIPE_FORMAT_B5G6R5_UNORM
591 };
592 return find_supported_format(screen, colorFormats, Elements(colorFormats),
593 target, sample_count, tex_usage);
594 }
595
596
597 /**
598 * Find an RGB format supported by the context/winsys.
599 */
600 static enum pipe_format
601 default_rgb_format(struct pipe_screen *screen,
602 enum pipe_texture_target target,
603 unsigned sample_count,
604 unsigned tex_usage)
605 {
606 static const enum pipe_format colorFormats[] = {
607 PIPE_FORMAT_B8G8R8X8_UNORM,
608 PIPE_FORMAT_X8R8G8B8_UNORM,
609 PIPE_FORMAT_X8B8G8R8_UNORM,
610 PIPE_FORMAT_B8G8R8A8_UNORM,
611 PIPE_FORMAT_A8R8G8B8_UNORM,
612 PIPE_FORMAT_A8B8G8R8_UNORM,
613 PIPE_FORMAT_B5G6R5_UNORM
614 };
615 return find_supported_format(screen, colorFormats, Elements(colorFormats),
616 target, sample_count, tex_usage);
617 }
618
619 /**
620 * Find an sRGBA format supported by the context/winsys.
621 */
622 static enum pipe_format
623 default_srgba_format(struct pipe_screen *screen,
624 enum pipe_texture_target target,
625 unsigned sample_count,
626 unsigned tex_usage)
627 {
628 static const enum pipe_format colorFormats[] = {
629 PIPE_FORMAT_B8G8R8A8_SRGB,
630 PIPE_FORMAT_A8R8G8B8_SRGB,
631 PIPE_FORMAT_A8B8G8R8_SRGB,
632 };
633 return find_supported_format(screen, colorFormats, Elements(colorFormats),
634 target, sample_count, tex_usage);
635 }
636
637
638 /**
639 * Given an OpenGL internalFormat value for a texture or surface, return
640 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
641 * This is called during glTexImage2D, for example.
642 *
643 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
644 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
645 * we want render-to-texture ability.
646 *
647 * \param internalFormat the user value passed to glTexImage2D
648 * \param target one of PIPE_TEXTURE_x
649 * \param bindings bitmask of PIPE_BIND_x flags.
650 */
651 enum pipe_format
652 st_choose_format(struct pipe_screen *screen, GLenum internalFormat,
653 enum pipe_texture_target target, unsigned sample_count,
654 unsigned bindings)
655 {
656
657 switch (internalFormat) {
658 case GL_RGB10:
659 case GL_RGB10_A2:
660 if (screen->is_format_supported( screen, PIPE_FORMAT_B10G10R10A2_UNORM,
661 target, sample_count, bindings))
662 return PIPE_FORMAT_B10G10R10A2_UNORM;
663 /* Pass through. */
664 case 4:
665 case GL_RGBA:
666 case GL_RGBA8:
667 return default_rgba_format( screen, target, sample_count, bindings);
668
669 case GL_BGRA:
670 if (screen->is_format_supported( screen, PIPE_FORMAT_B8G8R8A8_UNORM,
671 target, sample_count, bindings))
672 return PIPE_FORMAT_B8G8R8A8_UNORM;
673 return default_rgba_format( screen, target, sample_count, bindings);
674
675 case 3:
676 case GL_RGB:
677 case GL_RGB8:
678 return default_rgb_format( screen, target, sample_count, bindings);
679
680 case GL_RGB12:
681 case GL_RGB16:
682 case GL_RGBA12:
683 case GL_RGBA16:
684 if (screen->is_format_supported( screen, PIPE_FORMAT_R16G16B16A16_UNORM,
685 target, sample_count, bindings))
686 return PIPE_FORMAT_R16G16B16A16_UNORM;
687 return default_rgba_format( screen, target, sample_count, bindings);
688
689 case GL_RGBA4:
690 case GL_RGBA2:
691 if (screen->is_format_supported( screen, PIPE_FORMAT_B4G4R4A4_UNORM,
692 target, sample_count, bindings))
693 return PIPE_FORMAT_B4G4R4A4_UNORM;
694 return default_rgba_format( screen, target, sample_count, bindings);
695
696 case GL_RGB5_A1:
697 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
698 target, sample_count, bindings))
699 return PIPE_FORMAT_B5G5R5A1_UNORM;
700 return default_rgba_format( screen, target, sample_count, bindings);
701
702 case GL_R3_G3_B2:
703 if (screen->is_format_supported( screen, PIPE_FORMAT_B2G3R3_UNORM,
704 target, sample_count, bindings))
705 return PIPE_FORMAT_B2G3R3_UNORM;
706 /* Pass through. */
707 case GL_RGB5:
708 case GL_RGB4:
709 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G6R5_UNORM,
710 target, sample_count, bindings))
711 return PIPE_FORMAT_B5G6R5_UNORM;
712 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
713 target, sample_count, bindings))
714 return PIPE_FORMAT_B5G5R5A1_UNORM;
715 return default_rgba_format( screen, target, sample_count, bindings);
716
717 case GL_ALPHA12:
718 case GL_ALPHA16:
719 if (screen->is_format_supported( screen, PIPE_FORMAT_A16_UNORM, target,
720 sample_count, bindings))
721 return PIPE_FORMAT_A16_UNORM;
722 /* Pass through. */
723 case GL_ALPHA:
724 case GL_ALPHA4:
725 case GL_ALPHA8:
726 case GL_COMPRESSED_ALPHA:
727 if (screen->is_format_supported( screen, PIPE_FORMAT_A8_UNORM, target,
728 sample_count, bindings))
729 return PIPE_FORMAT_A8_UNORM;
730 return default_rgba_format( screen, target, sample_count, bindings);
731
732 case GL_LUMINANCE12:
733 case GL_LUMINANCE16:
734 if (screen->is_format_supported( screen, PIPE_FORMAT_L16_UNORM, target,
735 sample_count, bindings))
736 return PIPE_FORMAT_L16_UNORM;
737 /* Pass through. */
738 case 1:
739 case GL_LUMINANCE:
740 case GL_LUMINANCE4:
741 case GL_LUMINANCE8:
742 if (screen->is_format_supported( screen, PIPE_FORMAT_L8_UNORM, target,
743 sample_count, bindings))
744 return PIPE_FORMAT_L8_UNORM;
745 return default_rgba_format( screen, target, sample_count, bindings);
746
747 case GL_LUMINANCE12_ALPHA4:
748 case GL_LUMINANCE12_ALPHA12:
749 case GL_LUMINANCE16_ALPHA16:
750 if (screen->is_format_supported( screen, PIPE_FORMAT_L16A16_UNORM, target,
751 sample_count, bindings))
752 return PIPE_FORMAT_L16A16_UNORM;
753 /* Pass through. */
754 case 2:
755 case GL_LUMINANCE_ALPHA:
756 case GL_LUMINANCE6_ALPHA2:
757 case GL_LUMINANCE8_ALPHA8:
758 if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_UNORM, target,
759 sample_count, bindings))
760 return PIPE_FORMAT_L8A8_UNORM;
761 return default_rgba_format( screen, target, sample_count, bindings);
762
763 case GL_LUMINANCE4_ALPHA4:
764 if (screen->is_format_supported( screen, PIPE_FORMAT_L4A4_UNORM, target,
765 sample_count, bindings))
766 return PIPE_FORMAT_L4A4_UNORM;
767 if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_UNORM, target,
768 sample_count, bindings))
769 return PIPE_FORMAT_L8A8_UNORM;
770 return default_rgba_format( screen, target, sample_count, bindings);
771
772 case GL_INTENSITY12:
773 case GL_INTENSITY16:
774 if (screen->is_format_supported( screen, PIPE_FORMAT_I16_UNORM, target,
775 sample_count, bindings))
776 return PIPE_FORMAT_I16_UNORM;
777 /* Pass through. */
778 case GL_INTENSITY:
779 case GL_INTENSITY4:
780 case GL_INTENSITY8:
781 case GL_COMPRESSED_INTENSITY:
782 if (screen->is_format_supported( screen, PIPE_FORMAT_I8_UNORM, target,
783 sample_count, bindings))
784 return PIPE_FORMAT_I8_UNORM;
785 return default_rgba_format( screen, target, sample_count, bindings);
786
787 case GL_YCBCR_MESA:
788 if (screen->is_format_supported(screen, PIPE_FORMAT_UYVY, target,
789 sample_count, bindings)) {
790 return PIPE_FORMAT_UYVY;
791 }
792 if (screen->is_format_supported(screen, PIPE_FORMAT_YUYV, target,
793 sample_count, bindings)) {
794 return PIPE_FORMAT_YUYV;
795 }
796 return PIPE_FORMAT_NONE;
797
798 case GL_COMPRESSED_RGB:
799 /* can only sample from compressed formats */
800 if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
801 return PIPE_FORMAT_NONE;
802 else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
803 target, sample_count, bindings))
804 return PIPE_FORMAT_DXT1_RGB;
805 else
806 return default_rgb_format(screen, target, sample_count, bindings);
807
808 case GL_COMPRESSED_RGBA:
809 /* can only sample from compressed formats */
810 if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
811 return PIPE_FORMAT_NONE;
812 else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
813 target, sample_count, bindings))
814 return PIPE_FORMAT_DXT3_RGBA;
815 else
816 return default_rgba_format(screen, target, sample_count, bindings);
817
818 case GL_RGB_S3TC:
819 case GL_RGB4_S3TC:
820 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
821 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
822 target, sample_count, bindings))
823 return PIPE_FORMAT_DXT1_RGB;
824 else
825 return PIPE_FORMAT_NONE;
826
827 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
828 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGBA,
829 target, sample_count, bindings))
830 return PIPE_FORMAT_DXT1_RGBA;
831 else
832 return PIPE_FORMAT_NONE;
833
834 case GL_RGBA_S3TC:
835 case GL_RGBA4_S3TC:
836 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
837 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
838 target, sample_count, bindings))
839 return PIPE_FORMAT_DXT3_RGBA;
840 else
841 return PIPE_FORMAT_NONE;
842
843 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
844 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
845 target, sample_count, bindings))
846 return PIPE_FORMAT_DXT5_RGBA;
847 else
848 return PIPE_FORMAT_NONE;
849
850 #if 0
851 case GL_COMPRESSED_RGB_FXT1_3DFX:
852 return PIPE_FORMAT_RGB_FXT1;
853 case GL_COMPRESSED_RGBA_FXT1_3DFX:
854 return PIPE_FORMAT_RGB_FXT1;
855 #endif
856
857 case GL_DEPTH_COMPONENT16:
858 if (screen->is_format_supported(screen, PIPE_FORMAT_Z16_UNORM, target,
859 sample_count, bindings))
860 return PIPE_FORMAT_Z16_UNORM;
861 /* fall-through */
862 case GL_DEPTH_COMPONENT24:
863 if (screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
864 target, sample_count, bindings))
865 return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
866 if (screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
867 target, sample_count, bindings))
868 return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
869 /* fall-through */
870 case GL_DEPTH_COMPONENT32:
871 if (screen->is_format_supported(screen, PIPE_FORMAT_Z32_UNORM, target,
872 sample_count, bindings))
873 return PIPE_FORMAT_Z32_UNORM;
874 /* fall-through */
875 case GL_DEPTH_COMPONENT:
876 {
877 static const enum pipe_format formats[] = {
878 PIPE_FORMAT_Z32_UNORM,
879 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
880 PIPE_FORMAT_S8_USCALED_Z24_UNORM,
881 PIPE_FORMAT_Z16_UNORM
882 };
883 return find_supported_format(screen, formats, Elements(formats),
884 target, sample_count, bindings);
885 }
886
887 case GL_STENCIL_INDEX:
888 case GL_STENCIL_INDEX1_EXT:
889 case GL_STENCIL_INDEX4_EXT:
890 case GL_STENCIL_INDEX8_EXT:
891 case GL_STENCIL_INDEX16_EXT:
892 {
893 static const enum pipe_format formats[] = {
894 PIPE_FORMAT_S8_USCALED,
895 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
896 PIPE_FORMAT_S8_USCALED_Z24_UNORM
897 };
898 return find_supported_format(screen, formats, Elements(formats),
899 target, sample_count, bindings);
900 }
901
902 case GL_DEPTH_STENCIL_EXT:
903 case GL_DEPTH24_STENCIL8_EXT:
904 {
905 static const enum pipe_format formats[] = {
906 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
907 PIPE_FORMAT_S8_USCALED_Z24_UNORM
908 };
909 return find_supported_format(screen, formats, Elements(formats),
910 target, sample_count, bindings);
911 }
912
913 case GL_SRGB_EXT:
914 case GL_SRGB8_EXT:
915 case GL_SRGB_ALPHA_EXT:
916 case GL_SRGB8_ALPHA8_EXT:
917 return default_srgba_format( screen, target, sample_count, bindings);
918
919 case GL_COMPRESSED_SRGB_EXT:
920 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
921 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_SRGB, target,
922 sample_count, bindings))
923 return PIPE_FORMAT_DXT1_SRGB;
924 return default_srgba_format( screen, target, sample_count, bindings);
925
926 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
927 return PIPE_FORMAT_DXT1_SRGBA;
928
929 case GL_COMPRESSED_SRGB_ALPHA_EXT:
930 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
931 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_SRGBA, target,
932 sample_count, bindings))
933 return PIPE_FORMAT_DXT3_SRGBA;
934 return default_srgba_format( screen, target, sample_count, bindings);
935
936 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
937 return PIPE_FORMAT_DXT5_SRGBA;
938
939 case GL_SLUMINANCE_ALPHA_EXT:
940 case GL_SLUMINANCE8_ALPHA8_EXT:
941 case GL_COMPRESSED_SLUMINANCE_EXT:
942 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
943 if (screen->is_format_supported(screen, PIPE_FORMAT_L8A8_SRGB, target,
944 sample_count, bindings))
945 return PIPE_FORMAT_L8A8_SRGB;
946 return default_srgba_format( screen, target, sample_count, bindings);
947
948 case GL_SLUMINANCE_EXT:
949 case GL_SLUMINANCE8_EXT:
950 if (screen->is_format_supported(screen, PIPE_FORMAT_L8_SRGB, target,
951 sample_count, bindings))
952 return PIPE_FORMAT_L8_SRGB;
953 return default_srgba_format( screen, target, sample_count, bindings);
954
955 /* prefer formats in order of data size, choosing 16-bit ones if equal sized */
956 case GL_RGBA16F_ARB:
957 {
958 static const enum pipe_format formats[] = {
959 PIPE_FORMAT_R16G16B16A16_FLOAT,
960 PIPE_FORMAT_R32G32B32A32_FLOAT
961 };
962 return find_supported_format(screen, formats, Elements(formats),
963 target, sample_count, bindings);
964 }
965 case GL_RGB16F_ARB:
966 {
967 static const enum pipe_format formats[] = {
968 PIPE_FORMAT_R16G16B16_FLOAT,
969 PIPE_FORMAT_R16G16B16A16_FLOAT,
970 PIPE_FORMAT_R32G32B32_FLOAT,
971 PIPE_FORMAT_R32G32B32A32_FLOAT
972 };
973 return find_supported_format(screen, formats, Elements(formats),
974 target, sample_count, bindings);
975 }
976 case GL_LUMINANCE_ALPHA16F_ARB:
977 {
978 static const enum pipe_format formats[] = {
979 PIPE_FORMAT_L16A16_FLOAT,
980 PIPE_FORMAT_R16G16B16A16_FLOAT,
981 PIPE_FORMAT_L32A32_FLOAT,
982 PIPE_FORMAT_R32G32B32A32_FLOAT
983 };
984 return find_supported_format(screen, formats, Elements(formats),
985 target, sample_count, bindings);
986 }
987 case GL_ALPHA16F_ARB:
988 {
989 static const enum pipe_format formats[] = {
990 PIPE_FORMAT_A16_FLOAT,
991 PIPE_FORMAT_L16A16_FLOAT,
992 PIPE_FORMAT_A32_FLOAT,
993 PIPE_FORMAT_R16G16B16A16_FLOAT,
994 PIPE_FORMAT_L32A32_FLOAT,
995 PIPE_FORMAT_R32G32B32A32_FLOAT
996 };
997 return find_supported_format(screen, formats, Elements(formats),
998 target, sample_count, bindings);
999 }
1000 case GL_INTENSITY16F_ARB:
1001 {
1002 static const enum pipe_format formats[] = {
1003 PIPE_FORMAT_I16_FLOAT,
1004 PIPE_FORMAT_L16A16_FLOAT,
1005 PIPE_FORMAT_I32_FLOAT,
1006 PIPE_FORMAT_R16G16B16A16_FLOAT,
1007 PIPE_FORMAT_L32A32_FLOAT,
1008 PIPE_FORMAT_R32G32B32A32_FLOAT
1009 };
1010 return find_supported_format(screen, formats, Elements(formats),
1011 target, sample_count, bindings);
1012 }
1013 case GL_LUMINANCE16F_ARB:
1014 {
1015 static const enum pipe_format formats[] = {
1016 PIPE_FORMAT_L16_FLOAT,
1017 PIPE_FORMAT_L16A16_FLOAT,
1018 PIPE_FORMAT_L32_FLOAT,
1019 PIPE_FORMAT_R16G16B16A16_FLOAT,
1020 PIPE_FORMAT_L32A32_FLOAT,
1021 PIPE_FORMAT_R32G32B32A32_FLOAT
1022 };
1023 return find_supported_format(screen, formats, Elements(formats),
1024 target, sample_count, bindings);
1025 }
1026 case GL_R16F:
1027 {
1028 static const enum pipe_format formats[] = {
1029 PIPE_FORMAT_R16_FLOAT,
1030 PIPE_FORMAT_R16G16_FLOAT,
1031 PIPE_FORMAT_R32_FLOAT,
1032 PIPE_FORMAT_R16G16B16A16_FLOAT,
1033 PIPE_FORMAT_R32G32_FLOAT,
1034 PIPE_FORMAT_R32G32B32A32_FLOAT
1035 };
1036 return find_supported_format(screen, formats, Elements(formats),
1037 target, sample_count, bindings);
1038 }
1039 case GL_RG16F:
1040 {
1041 static const enum pipe_format formats[] = {
1042 PIPE_FORMAT_R16G16_FLOAT,
1043 PIPE_FORMAT_R16G16B16A16_FLOAT,
1044 PIPE_FORMAT_R32G32_FLOAT,
1045 PIPE_FORMAT_R32G32B32A32_FLOAT
1046 };
1047 return find_supported_format(screen, formats, Elements(formats),
1048 target, sample_count, bindings);
1049 }
1050
1051 /* try a 32-bit format if available, otherwise fallback to a 16-bit one */
1052 case GL_RGBA32F_ARB:
1053 {
1054 static const enum pipe_format formats[] = {
1055 PIPE_FORMAT_R32G32B32A32_FLOAT,
1056 PIPE_FORMAT_R16G16B16A16_FLOAT
1057 };
1058 return find_supported_format(screen, formats, Elements(formats),
1059 target, sample_count, bindings);
1060 }
1061 case GL_RGB32F_ARB:
1062 {
1063 static const enum pipe_format formats[] = {
1064 PIPE_FORMAT_R32G32B32_FLOAT,
1065 PIPE_FORMAT_R32G32B32A32_FLOAT,
1066 PIPE_FORMAT_R16G16B16A16_FLOAT
1067 };
1068 return find_supported_format(screen, formats, Elements(formats),
1069 target, sample_count, bindings);
1070 }
1071 case GL_LUMINANCE_ALPHA32F_ARB:
1072 {
1073 static const enum pipe_format formats[] = {
1074 PIPE_FORMAT_L32A32_FLOAT,
1075 PIPE_FORMAT_R32G32B32A32_FLOAT,
1076 PIPE_FORMAT_L16A16_FLOAT,
1077 PIPE_FORMAT_R16G16B16A16_FLOAT
1078 };
1079 return find_supported_format(screen, formats, Elements(formats),
1080 target, sample_count, bindings);
1081 }
1082 case GL_ALPHA32F_ARB:
1083 {
1084 static const enum pipe_format formats[] = {
1085 PIPE_FORMAT_A32_FLOAT,
1086 PIPE_FORMAT_L32A32_FLOAT,
1087 PIPE_FORMAT_R32G32B32A32_FLOAT,
1088 PIPE_FORMAT_A16_FLOAT,
1089 PIPE_FORMAT_L16A16_FLOAT,
1090 PIPE_FORMAT_R16G16B16A16_FLOAT
1091 };
1092 return find_supported_format(screen, formats, Elements(formats),
1093 target, sample_count, bindings);
1094 }
1095 case GL_INTENSITY32F_ARB:
1096 {
1097 static const enum pipe_format formats[] = {
1098 PIPE_FORMAT_I32_FLOAT,
1099 PIPE_FORMAT_L32A32_FLOAT,
1100 PIPE_FORMAT_R32G32B32A32_FLOAT,
1101 PIPE_FORMAT_I16_FLOAT,
1102 PIPE_FORMAT_L16A16_FLOAT,
1103 PIPE_FORMAT_R16G16B16A16_FLOAT
1104 };
1105 return find_supported_format(screen, formats, Elements(formats),
1106 target, sample_count, bindings);
1107 }
1108 case GL_LUMINANCE32F_ARB:
1109 {
1110 static const enum pipe_format formats[] = {
1111 PIPE_FORMAT_L32_FLOAT,
1112 PIPE_FORMAT_L32A32_FLOAT,
1113 PIPE_FORMAT_R32G32B32A32_FLOAT,
1114 PIPE_FORMAT_L16_FLOAT,
1115 PIPE_FORMAT_L16A16_FLOAT,
1116 PIPE_FORMAT_R16G16B16A16_FLOAT
1117 };
1118 return find_supported_format(screen, formats, Elements(formats),
1119 target, sample_count, bindings);
1120 }
1121 case GL_R32F:
1122 {
1123 static const enum pipe_format formats[] = {
1124 PIPE_FORMAT_R32_FLOAT,
1125 PIPE_FORMAT_R32G32_FLOAT,
1126 PIPE_FORMAT_R32G32B32A32_FLOAT,
1127 PIPE_FORMAT_R16_FLOAT,
1128 PIPE_FORMAT_R16G16_FLOAT,
1129 PIPE_FORMAT_R16G16B16A16_FLOAT
1130 };
1131 return find_supported_format(screen, formats, Elements(formats),
1132 target, sample_count, bindings);
1133 }
1134 case GL_RG32F:
1135 {
1136 static const enum pipe_format formats[] = {
1137 PIPE_FORMAT_R32G32_FLOAT,
1138 PIPE_FORMAT_R32G32B32A32_FLOAT,
1139 PIPE_FORMAT_R16G16_FLOAT,
1140 PIPE_FORMAT_R16G16B16A16_FLOAT
1141 };
1142 return find_supported_format(screen, formats, Elements(formats),
1143 target, sample_count, bindings);
1144 }
1145
1146 case GL_RED:
1147 case GL_R8:
1148 if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
1149 sample_count, bindings))
1150 return PIPE_FORMAT_R8_UNORM;
1151 return PIPE_FORMAT_NONE;
1152 case GL_RG:
1153 case GL_RG8:
1154 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
1155 sample_count, bindings))
1156 return PIPE_FORMAT_R8G8_UNORM;
1157 return PIPE_FORMAT_NONE;
1158
1159 case GL_R16:
1160 if (screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM, target,
1161 sample_count, bindings))
1162 return PIPE_FORMAT_R16_UNORM;
1163 return PIPE_FORMAT_NONE;
1164
1165 case GL_RG16:
1166 if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM, target,
1167 sample_count, bindings))
1168 return PIPE_FORMAT_R16G16_UNORM;
1169 return PIPE_FORMAT_NONE;
1170
1171 case GL_COMPRESSED_RED:
1172 case GL_COMPRESSED_RED_RGTC1:
1173 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_UNORM, target,
1174 sample_count, bindings))
1175 return PIPE_FORMAT_RGTC1_UNORM;
1176 if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
1177 sample_count, bindings))
1178 return PIPE_FORMAT_R8_UNORM;
1179 return PIPE_FORMAT_NONE;
1180
1181 case GL_COMPRESSED_SIGNED_RED_RGTC1:
1182 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_SNORM, target,
1183 sample_count, bindings))
1184 return PIPE_FORMAT_RGTC1_SNORM;
1185 return PIPE_FORMAT_NONE;
1186
1187 case GL_COMPRESSED_RG:
1188 case GL_COMPRESSED_RG_RGTC2:
1189 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_UNORM, target,
1190 sample_count, bindings))
1191 return PIPE_FORMAT_RGTC2_UNORM;
1192 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
1193 sample_count, bindings))
1194 return PIPE_FORMAT_R8G8_UNORM;
1195 return PIPE_FORMAT_NONE;
1196
1197 case GL_COMPRESSED_SIGNED_RG_RGTC2:
1198 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_SNORM, target,
1199 sample_count, bindings))
1200 return PIPE_FORMAT_RGTC2_SNORM;
1201 return PIPE_FORMAT_NONE;
1202
1203 case GL_COMPRESSED_LUMINANCE:
1204 case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
1205 if (screen->is_format_supported(screen, PIPE_FORMAT_LATC1_UNORM, target,
1206 sample_count, bindings))
1207 return PIPE_FORMAT_LATC1_UNORM;
1208 if (screen->is_format_supported(screen, PIPE_FORMAT_L8_UNORM, target,
1209 sample_count, bindings))
1210 return PIPE_FORMAT_L8_UNORM;
1211 return PIPE_FORMAT_NONE;
1212
1213 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
1214 if (screen->is_format_supported(screen, PIPE_FORMAT_LATC1_SNORM, target,
1215 sample_count, bindings))
1216 return PIPE_FORMAT_LATC1_SNORM;
1217 return PIPE_FORMAT_NONE;
1218
1219 case GL_COMPRESSED_LUMINANCE_ALPHA:
1220 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
1221 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
1222 if (screen->is_format_supported(screen, PIPE_FORMAT_LATC2_UNORM, target,
1223 sample_count, bindings))
1224 return PIPE_FORMAT_LATC2_UNORM;
1225 if (screen->is_format_supported(screen, PIPE_FORMAT_L8A8_UNORM, target,
1226 sample_count, bindings))
1227 return PIPE_FORMAT_L8A8_UNORM;
1228 return PIPE_FORMAT_NONE;
1229
1230 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
1231 if (screen->is_format_supported(screen, PIPE_FORMAT_LATC2_SNORM, target,
1232 sample_count, bindings))
1233 return PIPE_FORMAT_LATC2_SNORM;
1234 return PIPE_FORMAT_NONE;
1235
1236 /* signed/unsigned integer formats.
1237 * XXX Mesa only has formats for RGBA signed/unsigned integer formats.
1238 * If/when new formats are added this code should be updated.
1239 */
1240 case GL_RED_INTEGER_EXT:
1241 case GL_GREEN_INTEGER_EXT:
1242 case GL_BLUE_INTEGER_EXT:
1243 case GL_ALPHA_INTEGER_EXT:
1244 case GL_RGB_INTEGER_EXT:
1245 case GL_RGBA_INTEGER_EXT:
1246 case GL_BGR_INTEGER_EXT:
1247 case GL_BGRA_INTEGER_EXT:
1248 case GL_LUMINANCE_INTEGER_EXT:
1249 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1250 /* fall-through */
1251 case GL_RGBA8I_EXT:
1252 case GL_RGB8I_EXT:
1253 case GL_ALPHA8I_EXT:
1254 case GL_INTENSITY8I_EXT:
1255 case GL_LUMINANCE8I_EXT:
1256 case GL_LUMINANCE_ALPHA8I_EXT:
1257 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SSCALED,
1258 target,
1259 sample_count, bindings))
1260 return PIPE_FORMAT_R8G8B8A8_SSCALED;
1261 return PIPE_FORMAT_NONE;
1262 case GL_RGBA16I_EXT:
1263 case GL_RGB16I_EXT:
1264 case GL_ALPHA16I_EXT:
1265 case GL_INTENSITY16I_EXT:
1266 case GL_LUMINANCE16I_EXT:
1267 case GL_LUMINANCE_ALPHA16I_EXT:
1268 if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_SSCALED,
1269 target,
1270 sample_count, bindings))
1271 return PIPE_FORMAT_R16G16B16A16_SSCALED;
1272 return PIPE_FORMAT_NONE;
1273 case GL_RGBA32I_EXT:
1274 case GL_RGB32I_EXT:
1275 case GL_ALPHA32I_EXT:
1276 case GL_INTENSITY32I_EXT:
1277 case GL_LUMINANCE32I_EXT:
1278 case GL_LUMINANCE_ALPHA32I_EXT:
1279 /* xxx */
1280 if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_SSCALED,
1281 target,
1282 sample_count, bindings))
1283 return PIPE_FORMAT_R32G32B32A32_SSCALED;
1284 return PIPE_FORMAT_NONE;
1285
1286 case GL_RGBA8UI_EXT:
1287 case GL_RGB8UI_EXT:
1288 case GL_ALPHA8UI_EXT:
1289 case GL_INTENSITY8UI_EXT:
1290 case GL_LUMINANCE8UI_EXT:
1291 case GL_LUMINANCE_ALPHA8UI_EXT:
1292 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_USCALED,
1293 target,
1294 sample_count, bindings))
1295 return PIPE_FORMAT_R8G8B8A8_USCALED;
1296 return PIPE_FORMAT_NONE;
1297
1298 case GL_RGBA16UI_EXT:
1299 case GL_RGB16UI_EXT:
1300 case GL_ALPHA16UI_EXT:
1301 case GL_INTENSITY16UI_EXT:
1302 case GL_LUMINANCE16UI_EXT:
1303 case GL_LUMINANCE_ALPHA16UI_EXT:
1304 if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_USCALED,
1305 target,
1306 sample_count, bindings))
1307 return PIPE_FORMAT_R16G16B16A16_USCALED;
1308 return PIPE_FORMAT_NONE;
1309
1310 case GL_RGBA32UI_EXT:
1311 case GL_RGB32UI_EXT:
1312 case GL_ALPHA32UI_EXT:
1313 case GL_INTENSITY32UI_EXT:
1314 case GL_LUMINANCE32UI_EXT:
1315 case GL_LUMINANCE_ALPHA32UI_EXT:
1316 if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_USCALED,
1317 target,
1318 sample_count, bindings))
1319 return PIPE_FORMAT_R32G32B32A32_USCALED;
1320 return PIPE_FORMAT_NONE;
1321
1322 /* signed normalized formats */
1323 case GL_RED_SNORM:
1324 case GL_R8_SNORM:
1325 {
1326 static const enum pipe_format formats[] = {
1327 PIPE_FORMAT_R8_SNORM,
1328 PIPE_FORMAT_R8G8_SNORM,
1329 PIPE_FORMAT_R8G8B8A8_SNORM,
1330 };
1331 return find_supported_format(screen, formats, Elements(formats),
1332 target, sample_count, bindings);
1333 }
1334
1335 case GL_R16_SNORM:
1336 {
1337 static const enum pipe_format formats[] = {
1338 PIPE_FORMAT_R16_SNORM,
1339 PIPE_FORMAT_R16G16_SNORM,
1340 PIPE_FORMAT_R16G16B16A16_SNORM,
1341 PIPE_FORMAT_R8_SNORM,
1342 PIPE_FORMAT_R8G8_SNORM,
1343 PIPE_FORMAT_R8G8B8A8_SNORM,
1344 };
1345 return find_supported_format(screen, formats, Elements(formats),
1346 target, sample_count, bindings);
1347 }
1348
1349 case GL_RG_SNORM:
1350 case GL_RG8_SNORM:
1351 {
1352 static const enum pipe_format formats[] = {
1353 PIPE_FORMAT_R8G8_SNORM,
1354 PIPE_FORMAT_R8G8B8A8_SNORM,
1355 };
1356 return find_supported_format(screen, formats, Elements(formats),
1357 target, sample_count, bindings);
1358 }
1359
1360 case GL_RG16_SNORM:
1361 {
1362 static const enum pipe_format formats[] = {
1363 PIPE_FORMAT_R16G16_SNORM,
1364 PIPE_FORMAT_R16G16B16A16_SNORM,
1365 PIPE_FORMAT_R8G8_SNORM,
1366 PIPE_FORMAT_R8G8B8A8_SNORM,
1367 };
1368 return find_supported_format(screen, formats, Elements(formats),
1369 target, sample_count, bindings);
1370 }
1371
1372 case GL_RGB_SNORM:
1373 case GL_RGB8_SNORM:
1374 case GL_RGBA_SNORM:
1375 case GL_RGBA8_SNORM:
1376 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SNORM,
1377 target,
1378 sample_count, bindings))
1379 return PIPE_FORMAT_R8G8B8A8_SNORM;
1380 return PIPE_FORMAT_NONE;
1381
1382 case GL_RGB16_SNORM:
1383 case GL_RGBA16_SNORM:
1384 {
1385 static const enum pipe_format formats[] = {
1386 PIPE_FORMAT_R16G16B16A16_SNORM,
1387 PIPE_FORMAT_R8G8B8A8_SNORM,
1388 };
1389 return find_supported_format(screen, formats, Elements(formats),
1390 target, sample_count, bindings);
1391 }
1392
1393
1394 case GL_ALPHA_SNORM:
1395 case GL_ALPHA8_SNORM:
1396 {
1397 static const enum pipe_format formats[] = {
1398 PIPE_FORMAT_A8_SNORM,
1399 PIPE_FORMAT_R8G8B8A8_SNORM,
1400 };
1401 return find_supported_format(screen, formats, Elements(formats),
1402 target, sample_count, bindings);
1403 }
1404
1405 case GL_ALPHA16_SNORM:
1406 {
1407 static const enum pipe_format formats[] = {
1408 PIPE_FORMAT_A16_SNORM,
1409 PIPE_FORMAT_R16G16B16A16_SNORM,
1410 PIPE_FORMAT_A8_SNORM,
1411 PIPE_FORMAT_R8G8B8A8_SNORM,
1412 };
1413 return find_supported_format(screen, formats, Elements(formats),
1414 target, sample_count, bindings);
1415 }
1416
1417 case GL_LUMINANCE_SNORM:
1418 case GL_LUMINANCE8_SNORM:
1419 {
1420 static const enum pipe_format formats[] = {
1421 PIPE_FORMAT_L8_SNORM,
1422 PIPE_FORMAT_R8G8B8A8_SNORM,
1423 };
1424 return find_supported_format(screen, formats, Elements(formats),
1425 target, sample_count, bindings);
1426 }
1427
1428 case GL_LUMINANCE16_SNORM:
1429 {
1430 static const enum pipe_format formats[] = {
1431 PIPE_FORMAT_L16_SNORM,
1432 PIPE_FORMAT_R16G16B16A16_SNORM,
1433 PIPE_FORMAT_L8_SNORM,
1434 PIPE_FORMAT_R8G8B8A8_SNORM,
1435 };
1436 return find_supported_format(screen, formats, Elements(formats),
1437 target, sample_count, bindings);
1438 }
1439
1440 case GL_LUMINANCE_ALPHA_SNORM:
1441 case GL_LUMINANCE8_ALPHA8_SNORM:
1442 {
1443 static const enum pipe_format formats[] = {
1444 PIPE_FORMAT_L8A8_SNORM,
1445 PIPE_FORMAT_R8G8B8A8_SNORM,
1446 };
1447 return find_supported_format(screen, formats, Elements(formats),
1448 target, sample_count, bindings);
1449 }
1450
1451 case GL_LUMINANCE16_ALPHA16_SNORM:
1452 {
1453 static const enum pipe_format formats[] = {
1454 PIPE_FORMAT_L16A16_SNORM,
1455 PIPE_FORMAT_R16G16B16A16_SNORM,
1456 PIPE_FORMAT_L8A8_SNORM,
1457 PIPE_FORMAT_R8G8B8A8_SNORM,
1458 };
1459 return find_supported_format(screen, formats, Elements(formats),
1460 target, sample_count, bindings);
1461 }
1462
1463 case GL_INTENSITY_SNORM:
1464 case GL_INTENSITY8_SNORM:
1465 {
1466 static const enum pipe_format formats[] = {
1467 PIPE_FORMAT_I8_SNORM,
1468 PIPE_FORMAT_R8G8B8A8_SNORM,
1469 };
1470 return find_supported_format(screen, formats, Elements(formats),
1471 target, sample_count, bindings);
1472 }
1473
1474 case GL_INTENSITY16_SNORM:
1475 {
1476 static const enum pipe_format formats[] = {
1477 PIPE_FORMAT_I16_SNORM,
1478 PIPE_FORMAT_R16G16B16A16_SNORM,
1479 PIPE_FORMAT_I8_SNORM,
1480 PIPE_FORMAT_R8G8B8A8_SNORM,
1481 };
1482 return find_supported_format(screen, formats, Elements(formats),
1483 target, sample_count, bindings);
1484 }
1485
1486 default:
1487 return PIPE_FORMAT_NONE;
1488 }
1489 }
1490
1491
1492 /**
1493 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
1494 */
1495 enum pipe_format
1496 st_choose_renderbuffer_format(struct pipe_screen *screen,
1497 GLenum internalFormat, unsigned sample_count)
1498 {
1499 uint usage;
1500 if (_mesa_is_depth_or_stencil_format(internalFormat))
1501 usage = PIPE_BIND_DEPTH_STENCIL;
1502 else
1503 usage = PIPE_BIND_RENDER_TARGET;
1504 return st_choose_format(screen, internalFormat, PIPE_TEXTURE_2D,
1505 sample_count, usage);
1506 }
1507
1508
1509 /**
1510 * Called via ctx->Driver.chooseTextureFormat().
1511 */
1512 gl_format
1513 st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
1514 GLenum format, GLenum type, GLboolean renderable)
1515 {
1516 struct pipe_screen *screen = st_context(ctx)->pipe->screen;
1517 enum pipe_format pFormat;
1518 uint bindings;
1519
1520 (void) format;
1521 (void) type;
1522
1523 /* GL textures may wind up being render targets, but we don't know
1524 * that in advance. Specify potential render target flags now.
1525 */
1526 bindings = PIPE_BIND_SAMPLER_VIEW;
1527 if (renderable == GL_TRUE) {
1528 if (_mesa_is_depth_format(internalFormat) ||
1529 _mesa_is_depth_or_stencil_format(internalFormat))
1530 bindings |= PIPE_BIND_DEPTH_STENCIL;
1531 else
1532 bindings |= PIPE_BIND_RENDER_TARGET;
1533 }
1534
1535 pFormat = st_choose_format(screen, internalFormat,
1536 PIPE_TEXTURE_2D, 0, bindings);
1537
1538 if (pFormat == PIPE_FORMAT_NONE) {
1539 /* try choosing format again, this time without render target bindings */
1540 pFormat = st_choose_format(screen, internalFormat,
1541 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
1542 }
1543
1544 if (pFormat == PIPE_FORMAT_NONE) {
1545 /* no luck at all */
1546 return MESA_FORMAT_NONE;
1547 }
1548
1549 return st_pipe_format_to_mesa_format(pFormat);
1550 }
1551
1552 gl_format
1553 st_ChooseTextureFormat(struct gl_context *ctx, GLint internalFormat,
1554 GLenum format, GLenum type)
1555 {
1556 boolean want_renderable =
1557 internalFormat == 3 || internalFormat == 4 ||
1558 internalFormat == GL_RGB || internalFormat == GL_RGBA ||
1559 internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
1560 internalFormat == GL_BGRA;
1561
1562 return st_ChooseTextureFormat_renderable(ctx, internalFormat,
1563 format, type, want_renderable);
1564 }
1565
1566 /**
1567 * Test if a gallium format is equivalent to a GL format/type.
1568 */
1569 GLboolean
1570 st_equal_formats(enum pipe_format pFormat, GLenum format, GLenum type)
1571 {
1572 switch (pFormat) {
1573 case PIPE_FORMAT_A8B8G8R8_UNORM:
1574 return format == GL_RGBA && type == GL_UNSIGNED_BYTE;
1575 case PIPE_FORMAT_A8R8G8B8_UNORM:
1576 return format == GL_BGRA && type == GL_UNSIGNED_BYTE;
1577 case PIPE_FORMAT_B5G6R5_UNORM:
1578 return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5;
1579 /* XXX more combos... */
1580 default:
1581 return GL_FALSE;
1582 }
1583 }
1584
1585 GLboolean
1586 st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
1587 {
1588 if (format1 == format2)
1589 return GL_TRUE;
1590
1591 if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
1592 format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
1593 return GL_TRUE;
1594
1595 if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
1596 format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
1597 return GL_TRUE;
1598
1599 if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
1600 format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
1601 return GL_TRUE;
1602
1603 if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
1604 format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
1605 return GL_TRUE;
1606
1607 if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
1608 format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
1609 return GL_TRUE;
1610
1611 if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
1612 format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
1613 return GL_TRUE;
1614
1615 return GL_FALSE;
1616 }
1617
1618
1619
1620 /**
1621 * This is used for translating texture border color and the clear
1622 * color. For example, the clear color is interpreted according to
1623 * the renderbuffer's base format. For example, if clearing a
1624 * GL_LUMINANCE buffer, ClearColor[0] = luminance and ClearColor[1] =
1625 * alpha. Similarly for texture border colors.
1626 */
1627 void
1628 st_translate_color(const GLfloat colorIn[4], GLenum baseFormat,
1629 GLfloat colorOut[4])
1630 {
1631 switch (baseFormat) {
1632 case GL_RED:
1633 colorOut[0] = colorIn[0];
1634 colorOut[1] = 0.0F;
1635 colorOut[2] = 0.0F;
1636 colorOut[3] = 1.0F;
1637 break;
1638 case GL_RG:
1639 colorOut[0] = colorIn[0];
1640 colorOut[1] = colorIn[1];
1641 colorOut[2] = 0.0F;
1642 colorOut[3] = 1.0F;
1643 break;
1644 case GL_RGB:
1645 colorOut[0] = colorIn[0];
1646 colorOut[1] = colorIn[1];
1647 colorOut[2] = colorIn[2];
1648 colorOut[3] = 1.0F;
1649 break;
1650 case GL_ALPHA:
1651 colorOut[0] = colorOut[1] = colorOut[2] = 0.0;
1652 colorOut[3] = colorIn[3];
1653 break;
1654 case GL_LUMINANCE:
1655 colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
1656 colorOut[3] = 1.0;
1657 break;
1658 case GL_LUMINANCE_ALPHA:
1659 colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
1660 colorOut[3] = colorIn[3];
1661 break;
1662 case GL_INTENSITY:
1663 colorOut[0] = colorOut[1] = colorOut[2] = colorOut[3] = colorIn[0];
1664 break;
1665 default:
1666 COPY_4V(colorOut, colorIn);
1667 }
1668 }