Merge remote branch 'origin/master' into pipe-video
[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 case GL_RGB16F_ARB:
958 {
959 static const enum pipe_format formats[] = {
960 PIPE_FORMAT_R16G16B16A16_FLOAT,
961 PIPE_FORMAT_R32G32B32A32_FLOAT
962 };
963 return find_supported_format(screen, formats, Elements(formats),
964 target, sample_count, bindings);
965 }
966 case GL_LUMINANCE_ALPHA16F_ARB:
967 {
968 static const enum pipe_format formats[] = {
969 PIPE_FORMAT_L16A16_FLOAT,
970 PIPE_FORMAT_R16G16B16A16_FLOAT,
971 PIPE_FORMAT_L32A32_FLOAT,
972 PIPE_FORMAT_R32G32B32A32_FLOAT
973 };
974 return find_supported_format(screen, formats, Elements(formats),
975 target, sample_count, bindings);
976 }
977 case GL_ALPHA16F_ARB:
978 {
979 static const enum pipe_format formats[] = {
980 PIPE_FORMAT_A16_FLOAT,
981 PIPE_FORMAT_L16A16_FLOAT,
982 PIPE_FORMAT_A32_FLOAT,
983 PIPE_FORMAT_R16G16B16A16_FLOAT,
984 PIPE_FORMAT_L32A32_FLOAT,
985 PIPE_FORMAT_R32G32B32A32_FLOAT
986 };
987 return find_supported_format(screen, formats, Elements(formats),
988 target, sample_count, bindings);
989 }
990 case GL_INTENSITY16F_ARB:
991 {
992 static const enum pipe_format formats[] = {
993 PIPE_FORMAT_I16_FLOAT,
994 PIPE_FORMAT_L16A16_FLOAT,
995 PIPE_FORMAT_I32_FLOAT,
996 PIPE_FORMAT_R16G16B16A16_FLOAT,
997 PIPE_FORMAT_L32A32_FLOAT,
998 PIPE_FORMAT_R32G32B32A32_FLOAT
999 };
1000 return find_supported_format(screen, formats, Elements(formats),
1001 target, sample_count, bindings);
1002 }
1003 case GL_LUMINANCE16F_ARB:
1004 {
1005 static const enum pipe_format formats[] = {
1006 PIPE_FORMAT_L16_FLOAT,
1007 PIPE_FORMAT_L16A16_FLOAT,
1008 PIPE_FORMAT_L32_FLOAT,
1009 PIPE_FORMAT_R16G16B16A16_FLOAT,
1010 PIPE_FORMAT_L32A32_FLOAT,
1011 PIPE_FORMAT_R32G32B32A32_FLOAT
1012 };
1013 return find_supported_format(screen, formats, Elements(formats),
1014 target, sample_count, bindings);
1015 }
1016 case GL_R16F:
1017 {
1018 static const enum pipe_format formats[] = {
1019 PIPE_FORMAT_R16_FLOAT,
1020 PIPE_FORMAT_R16G16_FLOAT,
1021 PIPE_FORMAT_R32_FLOAT,
1022 PIPE_FORMAT_R16G16B16A16_FLOAT,
1023 PIPE_FORMAT_R32G32_FLOAT,
1024 PIPE_FORMAT_R32G32B32A32_FLOAT
1025 };
1026 return find_supported_format(screen, formats, Elements(formats),
1027 target, sample_count, bindings);
1028 }
1029 case GL_RG16F:
1030 {
1031 static const enum pipe_format formats[] = {
1032 PIPE_FORMAT_R16G16_FLOAT,
1033 PIPE_FORMAT_R16G16B16A16_FLOAT,
1034 PIPE_FORMAT_R32G32_FLOAT,
1035 PIPE_FORMAT_R32G32B32A32_FLOAT
1036 };
1037 return find_supported_format(screen, formats, Elements(formats),
1038 target, sample_count, bindings);
1039 }
1040
1041 /* try a 32-bit format if available, otherwise fallback to a 16-bit one */
1042 case GL_RGBA32F_ARB:
1043 case GL_RGB32F_ARB:
1044 {
1045 static const enum pipe_format formats[] = {
1046 PIPE_FORMAT_R32G32B32A32_FLOAT,
1047 PIPE_FORMAT_R16G16B16A16_FLOAT
1048 };
1049 return find_supported_format(screen, formats, Elements(formats),
1050 target, sample_count, bindings);
1051 }
1052 case GL_LUMINANCE_ALPHA32F_ARB:
1053 {
1054 static const enum pipe_format formats[] = {
1055 PIPE_FORMAT_L32A32_FLOAT,
1056 PIPE_FORMAT_R32G32B32A32_FLOAT,
1057 PIPE_FORMAT_L16A16_FLOAT,
1058 PIPE_FORMAT_R16G16B16A16_FLOAT
1059 };
1060 return find_supported_format(screen, formats, Elements(formats),
1061 target, sample_count, bindings);
1062 }
1063 case GL_ALPHA32F_ARB:
1064 {
1065 static const enum pipe_format formats[] = {
1066 PIPE_FORMAT_A32_FLOAT,
1067 PIPE_FORMAT_L32A32_FLOAT,
1068 PIPE_FORMAT_R32G32B32A32_FLOAT,
1069 PIPE_FORMAT_A16_FLOAT,
1070 PIPE_FORMAT_L16A16_FLOAT,
1071 PIPE_FORMAT_R16G16B16A16_FLOAT
1072 };
1073 return find_supported_format(screen, formats, Elements(formats),
1074 target, sample_count, bindings);
1075 }
1076 case GL_INTENSITY32F_ARB:
1077 {
1078 static const enum pipe_format formats[] = {
1079 PIPE_FORMAT_I32_FLOAT,
1080 PIPE_FORMAT_L32A32_FLOAT,
1081 PIPE_FORMAT_R32G32B32A32_FLOAT,
1082 PIPE_FORMAT_I16_FLOAT,
1083 PIPE_FORMAT_L16A16_FLOAT,
1084 PIPE_FORMAT_R16G16B16A16_FLOAT
1085 };
1086 return find_supported_format(screen, formats, Elements(formats),
1087 target, sample_count, bindings);
1088 }
1089 case GL_LUMINANCE32F_ARB:
1090 {
1091 static const enum pipe_format formats[] = {
1092 PIPE_FORMAT_L32_FLOAT,
1093 PIPE_FORMAT_L32A32_FLOAT,
1094 PIPE_FORMAT_R32G32B32A32_FLOAT,
1095 PIPE_FORMAT_L16_FLOAT,
1096 PIPE_FORMAT_L16A16_FLOAT,
1097 PIPE_FORMAT_R16G16B16A16_FLOAT
1098 };
1099 return find_supported_format(screen, formats, Elements(formats),
1100 target, sample_count, bindings);
1101 }
1102 case GL_R32F:
1103 {
1104 static const enum pipe_format formats[] = {
1105 PIPE_FORMAT_R32_FLOAT,
1106 PIPE_FORMAT_R32G32_FLOAT,
1107 PIPE_FORMAT_R32G32B32A32_FLOAT,
1108 PIPE_FORMAT_R16_FLOAT,
1109 PIPE_FORMAT_R16G16_FLOAT,
1110 PIPE_FORMAT_R16G16B16A16_FLOAT
1111 };
1112 return find_supported_format(screen, formats, Elements(formats),
1113 target, sample_count, bindings);
1114 }
1115 case GL_RG32F:
1116 {
1117 static const enum pipe_format formats[] = {
1118 PIPE_FORMAT_R32G32_FLOAT,
1119 PIPE_FORMAT_R32G32B32A32_FLOAT,
1120 PIPE_FORMAT_R16G16_FLOAT,
1121 PIPE_FORMAT_R16G16B16A16_FLOAT
1122 };
1123 return find_supported_format(screen, formats, Elements(formats),
1124 target, sample_count, bindings);
1125 }
1126
1127 case GL_RED:
1128 case GL_R8:
1129 if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
1130 sample_count, bindings))
1131 return PIPE_FORMAT_R8_UNORM;
1132 return PIPE_FORMAT_NONE;
1133 case GL_RG:
1134 case GL_RG8:
1135 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
1136 sample_count, bindings))
1137 return PIPE_FORMAT_R8G8_UNORM;
1138 return PIPE_FORMAT_NONE;
1139
1140 case GL_R16:
1141 if (screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM, target,
1142 sample_count, bindings))
1143 return PIPE_FORMAT_R16_UNORM;
1144 return PIPE_FORMAT_NONE;
1145
1146 case GL_RG16:
1147 if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM, target,
1148 sample_count, bindings))
1149 return PIPE_FORMAT_R16G16_UNORM;
1150 return PIPE_FORMAT_NONE;
1151
1152 case GL_COMPRESSED_RED:
1153 case GL_COMPRESSED_RED_RGTC1:
1154 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_UNORM, target,
1155 sample_count, bindings))
1156 return PIPE_FORMAT_RGTC1_UNORM;
1157 if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
1158 sample_count, bindings))
1159 return PIPE_FORMAT_R8_UNORM;
1160 return PIPE_FORMAT_NONE;
1161
1162 case GL_COMPRESSED_SIGNED_RED_RGTC1:
1163 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_SNORM, target,
1164 sample_count, bindings))
1165 return PIPE_FORMAT_RGTC1_SNORM;
1166 return PIPE_FORMAT_NONE;
1167
1168 case GL_COMPRESSED_RG:
1169 case GL_COMPRESSED_RG_RGTC2:
1170 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_UNORM, target,
1171 sample_count, bindings))
1172 return PIPE_FORMAT_RGTC2_UNORM;
1173 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
1174 sample_count, bindings))
1175 return PIPE_FORMAT_R8G8_UNORM;
1176 return PIPE_FORMAT_NONE;
1177
1178 case GL_COMPRESSED_SIGNED_RG_RGTC2:
1179 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_SNORM, target,
1180 sample_count, bindings))
1181 return PIPE_FORMAT_RGTC2_SNORM;
1182 return PIPE_FORMAT_NONE;
1183
1184 case GL_COMPRESSED_LUMINANCE:
1185 case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
1186 if (screen->is_format_supported(screen, PIPE_FORMAT_LATC1_UNORM, target,
1187 sample_count, bindings))
1188 return PIPE_FORMAT_LATC1_UNORM;
1189 if (screen->is_format_supported(screen, PIPE_FORMAT_L8_UNORM, target,
1190 sample_count, bindings))
1191 return PIPE_FORMAT_L8_UNORM;
1192 return PIPE_FORMAT_NONE;
1193
1194 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
1195 if (screen->is_format_supported(screen, PIPE_FORMAT_LATC1_SNORM, target,
1196 sample_count, bindings))
1197 return PIPE_FORMAT_LATC1_SNORM;
1198 return PIPE_FORMAT_NONE;
1199
1200 case GL_COMPRESSED_LUMINANCE_ALPHA:
1201 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
1202 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
1203 if (screen->is_format_supported(screen, PIPE_FORMAT_LATC2_UNORM, target,
1204 sample_count, bindings))
1205 return PIPE_FORMAT_LATC2_UNORM;
1206 if (screen->is_format_supported(screen, PIPE_FORMAT_L8A8_UNORM, target,
1207 sample_count, bindings))
1208 return PIPE_FORMAT_L8A8_UNORM;
1209 return PIPE_FORMAT_NONE;
1210
1211 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
1212 if (screen->is_format_supported(screen, PIPE_FORMAT_LATC2_SNORM, target,
1213 sample_count, bindings))
1214 return PIPE_FORMAT_LATC2_SNORM;
1215 return PIPE_FORMAT_NONE;
1216
1217 /* signed/unsigned integer formats.
1218 * XXX Mesa only has formats for RGBA signed/unsigned integer formats.
1219 * If/when new formats are added this code should be updated.
1220 */
1221 case GL_RED_INTEGER_EXT:
1222 case GL_GREEN_INTEGER_EXT:
1223 case GL_BLUE_INTEGER_EXT:
1224 case GL_ALPHA_INTEGER_EXT:
1225 case GL_RGB_INTEGER_EXT:
1226 case GL_RGBA_INTEGER_EXT:
1227 case GL_BGR_INTEGER_EXT:
1228 case GL_BGRA_INTEGER_EXT:
1229 case GL_LUMINANCE_INTEGER_EXT:
1230 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1231 /* fall-through */
1232 case GL_RGBA8I_EXT:
1233 case GL_RGB8I_EXT:
1234 case GL_ALPHA8I_EXT:
1235 case GL_INTENSITY8I_EXT:
1236 case GL_LUMINANCE8I_EXT:
1237 case GL_LUMINANCE_ALPHA8I_EXT:
1238 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SSCALED,
1239 target,
1240 sample_count, bindings))
1241 return PIPE_FORMAT_R8G8B8A8_SSCALED;
1242 return PIPE_FORMAT_NONE;
1243 case GL_RGBA16I_EXT:
1244 case GL_RGB16I_EXT:
1245 case GL_ALPHA16I_EXT:
1246 case GL_INTENSITY16I_EXT:
1247 case GL_LUMINANCE16I_EXT:
1248 case GL_LUMINANCE_ALPHA16I_EXT:
1249 if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_SSCALED,
1250 target,
1251 sample_count, bindings))
1252 return PIPE_FORMAT_R16G16B16A16_SSCALED;
1253 return PIPE_FORMAT_NONE;
1254 case GL_RGBA32I_EXT:
1255 case GL_RGB32I_EXT:
1256 case GL_ALPHA32I_EXT:
1257 case GL_INTENSITY32I_EXT:
1258 case GL_LUMINANCE32I_EXT:
1259 case GL_LUMINANCE_ALPHA32I_EXT:
1260 /* xxx */
1261 if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_SSCALED,
1262 target,
1263 sample_count, bindings))
1264 return PIPE_FORMAT_R32G32B32A32_SSCALED;
1265 return PIPE_FORMAT_NONE;
1266
1267 case GL_RGBA8UI_EXT:
1268 case GL_RGB8UI_EXT:
1269 case GL_ALPHA8UI_EXT:
1270 case GL_INTENSITY8UI_EXT:
1271 case GL_LUMINANCE8UI_EXT:
1272 case GL_LUMINANCE_ALPHA8UI_EXT:
1273 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_USCALED,
1274 target,
1275 sample_count, bindings))
1276 return PIPE_FORMAT_R8G8B8A8_USCALED;
1277 return PIPE_FORMAT_NONE;
1278
1279 case GL_RGBA16UI_EXT:
1280 case GL_RGB16UI_EXT:
1281 case GL_ALPHA16UI_EXT:
1282 case GL_INTENSITY16UI_EXT:
1283 case GL_LUMINANCE16UI_EXT:
1284 case GL_LUMINANCE_ALPHA16UI_EXT:
1285 if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_USCALED,
1286 target,
1287 sample_count, bindings))
1288 return PIPE_FORMAT_R16G16B16A16_USCALED;
1289 return PIPE_FORMAT_NONE;
1290
1291 case GL_RGBA32UI_EXT:
1292 case GL_RGB32UI_EXT:
1293 case GL_ALPHA32UI_EXT:
1294 case GL_INTENSITY32UI_EXT:
1295 case GL_LUMINANCE32UI_EXT:
1296 case GL_LUMINANCE_ALPHA32UI_EXT:
1297 if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_USCALED,
1298 target,
1299 sample_count, bindings))
1300 return PIPE_FORMAT_R32G32B32A32_USCALED;
1301 return PIPE_FORMAT_NONE;
1302
1303 /* signed normalized formats */
1304 case GL_RED_SNORM:
1305 case GL_R8_SNORM:
1306 {
1307 static const enum pipe_format formats[] = {
1308 PIPE_FORMAT_R8_SNORM,
1309 PIPE_FORMAT_R8G8_SNORM,
1310 PIPE_FORMAT_R8G8B8A8_SNORM,
1311 };
1312 return find_supported_format(screen, formats, Elements(formats),
1313 target, sample_count, bindings);
1314 }
1315
1316 case GL_R16_SNORM:
1317 {
1318 static const enum pipe_format formats[] = {
1319 PIPE_FORMAT_R16_SNORM,
1320 PIPE_FORMAT_R16G16_SNORM,
1321 PIPE_FORMAT_R16G16B16A16_SNORM,
1322 PIPE_FORMAT_R8_SNORM,
1323 PIPE_FORMAT_R8G8_SNORM,
1324 PIPE_FORMAT_R8G8B8A8_SNORM,
1325 };
1326 return find_supported_format(screen, formats, Elements(formats),
1327 target, sample_count, bindings);
1328 }
1329
1330 case GL_RG_SNORM:
1331 case GL_RG8_SNORM:
1332 {
1333 static const enum pipe_format formats[] = {
1334 PIPE_FORMAT_R8G8_SNORM,
1335 PIPE_FORMAT_R8G8B8A8_SNORM,
1336 };
1337 return find_supported_format(screen, formats, Elements(formats),
1338 target, sample_count, bindings);
1339 }
1340
1341 case GL_RG16_SNORM:
1342 {
1343 static const enum pipe_format formats[] = {
1344 PIPE_FORMAT_R16G16_SNORM,
1345 PIPE_FORMAT_R16G16B16A16_SNORM,
1346 PIPE_FORMAT_R8G8_SNORM,
1347 PIPE_FORMAT_R8G8B8A8_SNORM,
1348 };
1349 return find_supported_format(screen, formats, Elements(formats),
1350 target, sample_count, bindings);
1351 }
1352
1353 case GL_RGB_SNORM:
1354 case GL_RGB8_SNORM:
1355 case GL_RGBA_SNORM:
1356 case GL_RGBA8_SNORM:
1357 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SNORM,
1358 target,
1359 sample_count, bindings))
1360 return PIPE_FORMAT_R8G8B8A8_SNORM;
1361 return PIPE_FORMAT_NONE;
1362
1363 case GL_RGB16_SNORM:
1364 case GL_RGBA16_SNORM:
1365 {
1366 static const enum pipe_format formats[] = {
1367 PIPE_FORMAT_R16G16B16A16_SNORM,
1368 PIPE_FORMAT_R8G8B8A8_SNORM,
1369 };
1370 return find_supported_format(screen, formats, Elements(formats),
1371 target, sample_count, bindings);
1372 }
1373
1374
1375 case GL_ALPHA_SNORM:
1376 case GL_ALPHA8_SNORM:
1377 {
1378 static const enum pipe_format formats[] = {
1379 PIPE_FORMAT_A8_SNORM,
1380 PIPE_FORMAT_R8G8B8A8_SNORM,
1381 };
1382 return find_supported_format(screen, formats, Elements(formats),
1383 target, sample_count, bindings);
1384 }
1385
1386 case GL_ALPHA16_SNORM:
1387 {
1388 static const enum pipe_format formats[] = {
1389 PIPE_FORMAT_A16_SNORM,
1390 PIPE_FORMAT_R16G16B16A16_SNORM,
1391 PIPE_FORMAT_A8_SNORM,
1392 PIPE_FORMAT_R8G8B8A8_SNORM,
1393 };
1394 return find_supported_format(screen, formats, Elements(formats),
1395 target, sample_count, bindings);
1396 }
1397
1398 case GL_LUMINANCE_SNORM:
1399 case GL_LUMINANCE8_SNORM:
1400 {
1401 static const enum pipe_format formats[] = {
1402 PIPE_FORMAT_L8_SNORM,
1403 PIPE_FORMAT_R8G8B8A8_SNORM,
1404 };
1405 return find_supported_format(screen, formats, Elements(formats),
1406 target, sample_count, bindings);
1407 }
1408
1409 case GL_LUMINANCE16_SNORM:
1410 {
1411 static const enum pipe_format formats[] = {
1412 PIPE_FORMAT_L16_SNORM,
1413 PIPE_FORMAT_R16G16B16A16_SNORM,
1414 PIPE_FORMAT_L8_SNORM,
1415 PIPE_FORMAT_R8G8B8A8_SNORM,
1416 };
1417 return find_supported_format(screen, formats, Elements(formats),
1418 target, sample_count, bindings);
1419 }
1420
1421 case GL_LUMINANCE_ALPHA_SNORM:
1422 case GL_LUMINANCE8_ALPHA8_SNORM:
1423 {
1424 static const enum pipe_format formats[] = {
1425 PIPE_FORMAT_L8A8_SNORM,
1426 PIPE_FORMAT_R8G8B8A8_SNORM,
1427 };
1428 return find_supported_format(screen, formats, Elements(formats),
1429 target, sample_count, bindings);
1430 }
1431
1432 case GL_LUMINANCE16_ALPHA16_SNORM:
1433 {
1434 static const enum pipe_format formats[] = {
1435 PIPE_FORMAT_L16A16_SNORM,
1436 PIPE_FORMAT_R16G16B16A16_SNORM,
1437 PIPE_FORMAT_L8A8_SNORM,
1438 PIPE_FORMAT_R8G8B8A8_SNORM,
1439 };
1440 return find_supported_format(screen, formats, Elements(formats),
1441 target, sample_count, bindings);
1442 }
1443
1444 case GL_INTENSITY_SNORM:
1445 case GL_INTENSITY8_SNORM:
1446 {
1447 static const enum pipe_format formats[] = {
1448 PIPE_FORMAT_I8_SNORM,
1449 PIPE_FORMAT_R8G8B8A8_SNORM,
1450 };
1451 return find_supported_format(screen, formats, Elements(formats),
1452 target, sample_count, bindings);
1453 }
1454
1455 case GL_INTENSITY16_SNORM:
1456 {
1457 static const enum pipe_format formats[] = {
1458 PIPE_FORMAT_I16_SNORM,
1459 PIPE_FORMAT_R16G16B16A16_SNORM,
1460 PIPE_FORMAT_I8_SNORM,
1461 PIPE_FORMAT_R8G8B8A8_SNORM,
1462 };
1463 return find_supported_format(screen, formats, Elements(formats),
1464 target, sample_count, bindings);
1465 }
1466
1467 default:
1468 return PIPE_FORMAT_NONE;
1469 }
1470 }
1471
1472
1473 /**
1474 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
1475 */
1476 enum pipe_format
1477 st_choose_renderbuffer_format(struct pipe_screen *screen,
1478 GLenum internalFormat, unsigned sample_count)
1479 {
1480 uint usage;
1481 if (_mesa_is_depth_or_stencil_format(internalFormat))
1482 usage = PIPE_BIND_DEPTH_STENCIL;
1483 else
1484 usage = PIPE_BIND_RENDER_TARGET;
1485 return st_choose_format(screen, internalFormat, PIPE_TEXTURE_2D,
1486 sample_count, usage);
1487 }
1488
1489
1490 /**
1491 * Called via ctx->Driver.chooseTextureFormat().
1492 */
1493 gl_format
1494 st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
1495 GLenum format, GLenum type, GLboolean renderable)
1496 {
1497 struct pipe_screen *screen = st_context(ctx)->pipe->screen;
1498 enum pipe_format pFormat;
1499 uint bindings;
1500
1501 (void) format;
1502 (void) type;
1503
1504 /* GL textures may wind up being render targets, but we don't know
1505 * that in advance. Specify potential render target flags now.
1506 */
1507 bindings = PIPE_BIND_SAMPLER_VIEW;
1508 if (renderable == GL_TRUE) {
1509 if (_mesa_is_depth_format(internalFormat) ||
1510 _mesa_is_depth_or_stencil_format(internalFormat))
1511 bindings |= PIPE_BIND_DEPTH_STENCIL;
1512 else
1513 bindings |= PIPE_BIND_RENDER_TARGET;
1514 }
1515
1516 pFormat = st_choose_format(screen, internalFormat,
1517 PIPE_TEXTURE_2D, 0, bindings);
1518
1519 if (pFormat == PIPE_FORMAT_NONE) {
1520 /* try choosing format again, this time without render target bindings */
1521 pFormat = st_choose_format(screen, internalFormat,
1522 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
1523 }
1524
1525 if (pFormat == PIPE_FORMAT_NONE) {
1526 /* no luck at all */
1527 return MESA_FORMAT_NONE;
1528 }
1529
1530 return st_pipe_format_to_mesa_format(pFormat);
1531 }
1532
1533 gl_format
1534 st_ChooseTextureFormat(struct gl_context *ctx, GLint internalFormat,
1535 GLenum format, GLenum type)
1536 {
1537 boolean want_renderable =
1538 internalFormat == 3 || internalFormat == 4 ||
1539 internalFormat == GL_RGB || internalFormat == GL_RGBA ||
1540 internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
1541 internalFormat == GL_BGRA;
1542
1543 return st_ChooseTextureFormat_renderable(ctx, internalFormat,
1544 format, type, want_renderable);
1545 }
1546
1547 /**
1548 * Test if a gallium format is equivalent to a GL format/type.
1549 */
1550 GLboolean
1551 st_equal_formats(enum pipe_format pFormat, GLenum format, GLenum type)
1552 {
1553 switch (pFormat) {
1554 case PIPE_FORMAT_A8B8G8R8_UNORM:
1555 return format == GL_RGBA && type == GL_UNSIGNED_BYTE;
1556 case PIPE_FORMAT_A8R8G8B8_UNORM:
1557 return format == GL_BGRA && type == GL_UNSIGNED_BYTE;
1558 case PIPE_FORMAT_B5G6R5_UNORM:
1559 return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5;
1560 /* XXX more combos... */
1561 default:
1562 return GL_FALSE;
1563 }
1564 }
1565
1566 GLboolean
1567 st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
1568 {
1569 if (format1 == format2)
1570 return GL_TRUE;
1571
1572 if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
1573 format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
1574 return GL_TRUE;
1575
1576 if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
1577 format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
1578 return GL_TRUE;
1579
1580 if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
1581 format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
1582 return GL_TRUE;
1583
1584 if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
1585 format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
1586 return GL_TRUE;
1587
1588 if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
1589 format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
1590 return GL_TRUE;
1591
1592 if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
1593 format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
1594 return GL_TRUE;
1595
1596 return GL_FALSE;
1597 }
1598
1599
1600
1601 /**
1602 * This is used for translating texture border color and the clear
1603 * color. For example, the clear color is interpreted according to
1604 * the renderbuffer's base format. For example, if clearing a
1605 * GL_LUMINANCE buffer, ClearColor[0] = luminance and ClearColor[1] =
1606 * alpha. Similarly for texture border colors.
1607 */
1608 void
1609 st_translate_color(const GLfloat colorIn[4], GLenum baseFormat,
1610 GLfloat colorOut[4])
1611 {
1612 switch (baseFormat) {
1613 case GL_RED:
1614 colorOut[0] = colorIn[0];
1615 colorOut[1] = 0.0F;
1616 colorOut[2] = 0.0F;
1617 colorOut[3] = 1.0F;
1618 break;
1619 case GL_RG:
1620 colorOut[0] = colorIn[0];
1621 colorOut[1] = colorIn[1];
1622 colorOut[2] = 0.0F;
1623 colorOut[3] = 1.0F;
1624 break;
1625 case GL_RGB:
1626 colorOut[0] = colorIn[0];
1627 colorOut[1] = colorIn[1];
1628 colorOut[2] = colorIn[2];
1629 colorOut[3] = 1.0F;
1630 break;
1631 case GL_ALPHA:
1632 colorOut[0] = colorOut[1] = colorOut[2] = 0.0;
1633 colorOut[3] = colorIn[3];
1634 break;
1635 case GL_LUMINANCE:
1636 colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
1637 colorOut[3] = 1.0;
1638 break;
1639 case GL_LUMINANCE_ALPHA:
1640 colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
1641 colorOut[3] = colorIn[3];
1642 break;
1643 case GL_INTENSITY:
1644 colorOut[0] = colorOut[1] = colorOut[2] = colorOut[3] = colorIn[0];
1645 break;
1646 default:
1647 COPY_4V(colorOut, colorIn);
1648 }
1649 }