Merge remote branch 'origin/master' into nv50-compiler
[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
41 #include "pipe/p_context.h"
42 #include "pipe/p_defines.h"
43 #include "pipe/p_screen.h"
44 #include "util/u_format.h"
45 #include "st_context.h"
46 #include "st_format.h"
47
48
49 static GLuint
50 format_max_bits(enum pipe_format format)
51 {
52 GLuint size = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0);
53
54 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 1));
55 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 2));
56 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3));
57 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0));
58 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1));
59 return size;
60 }
61
62
63 /**
64 * Return basic GL datatype for the given gallium format.
65 */
66 GLenum
67 st_format_datatype(enum pipe_format format)
68 {
69 const struct util_format_description *desc;
70
71 desc = util_format_description(format);
72 assert(desc);
73
74 if (desc->layout == UTIL_FORMAT_LAYOUT_PLAIN) {
75 if (format == PIPE_FORMAT_B5G5R5A1_UNORM ||
76 format == PIPE_FORMAT_B5G6R5_UNORM) {
77 return GL_UNSIGNED_SHORT;
78 }
79 else if (format == PIPE_FORMAT_Z24_UNORM_S8_USCALED ||
80 format == PIPE_FORMAT_S8_USCALED_Z24_UNORM ||
81 format == PIPE_FORMAT_Z24X8_UNORM ||
82 format == PIPE_FORMAT_X8Z24_UNORM) {
83 return GL_UNSIGNED_INT_24_8;
84 }
85 else {
86 const GLuint size = format_max_bits(format);
87 if (size == 8) {
88 if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
89 return GL_UNSIGNED_BYTE;
90 else
91 return GL_BYTE;
92 }
93 else if (size == 16) {
94 if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
95 return GL_UNSIGNED_SHORT;
96 else
97 return GL_SHORT;
98 }
99 else {
100 assert( size <= 32 );
101 if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
102 return GL_UNSIGNED_INT;
103 else
104 return GL_INT;
105 }
106 }
107 }
108 else if (format == PIPE_FORMAT_UYVY) {
109 return GL_UNSIGNED_SHORT;
110 }
111 else if (format == PIPE_FORMAT_YUYV) {
112 return GL_UNSIGNED_SHORT;
113 }
114 else {
115 /* compressed format? */
116 assert(0);
117 }
118
119 assert(0);
120 return GL_NONE;
121 }
122
123
124 /**
125 * Translate Mesa format to Gallium format.
126 */
127 enum pipe_format
128 st_mesa_format_to_pipe_format(gl_format mesaFormat)
129 {
130 switch (mesaFormat) {
131 case MESA_FORMAT_RGBA8888:
132 return PIPE_FORMAT_A8B8G8R8_UNORM;
133 case MESA_FORMAT_RGBA8888_REV:
134 return PIPE_FORMAT_R8G8B8A8_UNORM;
135 case MESA_FORMAT_ARGB8888:
136 return PIPE_FORMAT_B8G8R8A8_UNORM;
137 case MESA_FORMAT_ARGB8888_REV:
138 return PIPE_FORMAT_A8R8G8B8_UNORM;
139 case MESA_FORMAT_XRGB8888:
140 return PIPE_FORMAT_B8G8R8X8_UNORM;
141 case MESA_FORMAT_XRGB8888_REV:
142 return PIPE_FORMAT_X8R8G8B8_UNORM;
143 case MESA_FORMAT_ARGB1555:
144 return PIPE_FORMAT_B5G5R5A1_UNORM;
145 case MESA_FORMAT_ARGB4444:
146 return PIPE_FORMAT_B4G4R4A4_UNORM;
147 case MESA_FORMAT_RGB565:
148 return PIPE_FORMAT_B5G6R5_UNORM;
149 case MESA_FORMAT_AL88:
150 return PIPE_FORMAT_L8A8_UNORM;
151 case MESA_FORMAT_A8:
152 return PIPE_FORMAT_A8_UNORM;
153 case MESA_FORMAT_L8:
154 return PIPE_FORMAT_L8_UNORM;
155 case MESA_FORMAT_I8:
156 return PIPE_FORMAT_I8_UNORM;
157 case MESA_FORMAT_Z16:
158 return PIPE_FORMAT_Z16_UNORM;
159 case MESA_FORMAT_Z32:
160 return PIPE_FORMAT_Z32_UNORM;
161 case MESA_FORMAT_Z24_S8:
162 return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
163 case MESA_FORMAT_S8_Z24:
164 return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
165 case MESA_FORMAT_Z24_X8:
166 return PIPE_FORMAT_X8Z24_UNORM;
167 case MESA_FORMAT_X8_Z24:
168 return PIPE_FORMAT_Z24X8_UNORM;
169 case MESA_FORMAT_YCBCR:
170 return PIPE_FORMAT_UYVY;
171 #if FEATURE_texture_s3tc
172 case MESA_FORMAT_RGB_DXT1:
173 return PIPE_FORMAT_DXT1_RGB;
174 case MESA_FORMAT_RGBA_DXT1:
175 return PIPE_FORMAT_DXT1_RGBA;
176 case MESA_FORMAT_RGBA_DXT3:
177 return PIPE_FORMAT_DXT3_RGBA;
178 case MESA_FORMAT_RGBA_DXT5:
179 return PIPE_FORMAT_DXT5_RGBA;
180 #if FEATURE_EXT_texture_sRGB
181 case MESA_FORMAT_SRGB_DXT1:
182 return PIPE_FORMAT_DXT1_SRGB;
183 case MESA_FORMAT_SRGBA_DXT1:
184 return PIPE_FORMAT_DXT1_SRGBA;
185 case MESA_FORMAT_SRGBA_DXT3:
186 return PIPE_FORMAT_DXT3_SRGBA;
187 case MESA_FORMAT_SRGBA_DXT5:
188 return PIPE_FORMAT_DXT5_SRGBA;
189 #endif
190 #endif
191 #if FEATURE_EXT_texture_sRGB
192 case MESA_FORMAT_SLA8:
193 return PIPE_FORMAT_L8A8_SRGB;
194 case MESA_FORMAT_SL8:
195 return PIPE_FORMAT_L8_SRGB;
196 case MESA_FORMAT_SRGB8:
197 return PIPE_FORMAT_R8G8B8_SRGB;
198 case MESA_FORMAT_SRGBA8:
199 return PIPE_FORMAT_A8B8G8R8_SRGB;
200 case MESA_FORMAT_SARGB8:
201 return PIPE_FORMAT_B8G8R8A8_SRGB;
202 #endif
203 default:
204 assert(0);
205 return PIPE_FORMAT_NONE;
206 }
207 }
208
209
210 /**
211 * Translate Gallium format to Mesa format.
212 */
213 gl_format
214 st_pipe_format_to_mesa_format(enum pipe_format format)
215 {
216 switch (format) {
217 case PIPE_FORMAT_A8B8G8R8_UNORM:
218 return MESA_FORMAT_RGBA8888;
219 case PIPE_FORMAT_R8G8B8A8_UNORM:
220 return MESA_FORMAT_RGBA8888_REV;
221 case PIPE_FORMAT_B8G8R8A8_UNORM:
222 return MESA_FORMAT_ARGB8888;
223 case PIPE_FORMAT_A8R8G8B8_UNORM:
224 return MESA_FORMAT_ARGB8888_REV;
225 case PIPE_FORMAT_B8G8R8X8_UNORM:
226 return MESA_FORMAT_XRGB8888;
227 case PIPE_FORMAT_X8R8G8B8_UNORM:
228 return MESA_FORMAT_XRGB8888_REV;
229 case PIPE_FORMAT_B5G5R5A1_UNORM:
230 return MESA_FORMAT_ARGB1555;
231 case PIPE_FORMAT_B4G4R4A4_UNORM:
232 return MESA_FORMAT_ARGB4444;
233 case PIPE_FORMAT_B5G6R5_UNORM:
234 return MESA_FORMAT_RGB565;
235 case PIPE_FORMAT_L8A8_UNORM:
236 return MESA_FORMAT_AL88;
237 case PIPE_FORMAT_A8_UNORM:
238 return MESA_FORMAT_A8;
239 case PIPE_FORMAT_L8_UNORM:
240 return MESA_FORMAT_L8;
241 case PIPE_FORMAT_I8_UNORM:
242 return MESA_FORMAT_I8;
243 case PIPE_FORMAT_S8_USCALED:
244 return MESA_FORMAT_S8;
245
246 case PIPE_FORMAT_R16G16B16A16_SNORM:
247 return MESA_FORMAT_SIGNED_RGBA_16;
248
249 case PIPE_FORMAT_Z16_UNORM:
250 return MESA_FORMAT_Z16;
251 case PIPE_FORMAT_Z32_UNORM:
252 return MESA_FORMAT_Z32;
253 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
254 return MESA_FORMAT_Z24_S8;
255 case PIPE_FORMAT_X8Z24_UNORM:
256 return MESA_FORMAT_Z24_X8;
257 case PIPE_FORMAT_Z24X8_UNORM:
258 return MESA_FORMAT_X8_Z24;
259 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
260 return MESA_FORMAT_S8_Z24;
261
262 case PIPE_FORMAT_UYVY:
263 return MESA_FORMAT_YCBCR;
264 case PIPE_FORMAT_YUYV:
265 return MESA_FORMAT_YCBCR_REV;
266
267 #if FEATURE_texture_s3tc
268 case PIPE_FORMAT_DXT1_RGB:
269 return MESA_FORMAT_RGB_DXT1;
270 case PIPE_FORMAT_DXT1_RGBA:
271 return MESA_FORMAT_RGBA_DXT1;
272 case PIPE_FORMAT_DXT3_RGBA:
273 return MESA_FORMAT_RGBA_DXT3;
274 case PIPE_FORMAT_DXT5_RGBA:
275 return MESA_FORMAT_RGBA_DXT5;
276 #if FEATURE_EXT_texture_sRGB
277 case PIPE_FORMAT_DXT1_SRGB:
278 return MESA_FORMAT_SRGB_DXT1;
279 case PIPE_FORMAT_DXT1_SRGBA:
280 return MESA_FORMAT_SRGBA_DXT1;
281 case PIPE_FORMAT_DXT3_SRGBA:
282 return MESA_FORMAT_SRGBA_DXT3;
283 case PIPE_FORMAT_DXT5_SRGBA:
284 return MESA_FORMAT_SRGBA_DXT5;
285 #endif
286 #endif
287
288 #if FEATURE_EXT_texture_sRGB
289 case PIPE_FORMAT_L8A8_SRGB:
290 return MESA_FORMAT_SLA8;
291 case PIPE_FORMAT_L8_SRGB:
292 return MESA_FORMAT_SL8;
293 case PIPE_FORMAT_R8G8B8_SRGB:
294 return MESA_FORMAT_SRGB8;
295 case PIPE_FORMAT_A8B8G8R8_SRGB:
296 return MESA_FORMAT_SRGBA8;
297 case PIPE_FORMAT_B8G8R8A8_SRGB:
298 return MESA_FORMAT_SARGB8;
299 #endif
300 default:
301 assert(0);
302 return MESA_FORMAT_NONE;
303 }
304 }
305
306
307 /**
308 * Return first supported format from the given list.
309 */
310 static enum pipe_format
311 find_supported_format(struct pipe_screen *screen,
312 const enum pipe_format formats[],
313 uint num_formats,
314 enum pipe_texture_target target,
315 unsigned sample_count,
316 unsigned tex_usage,
317 unsigned geom_flags)
318 {
319 uint i;
320 for (i = 0; i < num_formats; i++) {
321 if (screen->is_format_supported(screen, formats[i], target,
322 sample_count, tex_usage, geom_flags)) {
323 return formats[i];
324 }
325 }
326 return PIPE_FORMAT_NONE;
327 }
328
329
330 /**
331 * Find an RGBA format supported by the context/winsys.
332 */
333 static enum pipe_format
334 default_rgba_format(struct pipe_screen *screen,
335 enum pipe_texture_target target,
336 unsigned sample_count,
337 unsigned tex_usage,
338 unsigned geom_flags)
339 {
340 static const enum pipe_format colorFormats[] = {
341 PIPE_FORMAT_B8G8R8A8_UNORM,
342 PIPE_FORMAT_A8R8G8B8_UNORM,
343 PIPE_FORMAT_A8B8G8R8_UNORM,
344 PIPE_FORMAT_B5G6R5_UNORM
345 };
346 return find_supported_format(screen, colorFormats, Elements(colorFormats),
347 target, sample_count, tex_usage, geom_flags);
348 }
349
350
351 /**
352 * Find an RGB format supported by the context/winsys.
353 */
354 static enum pipe_format
355 default_rgb_format(struct pipe_screen *screen,
356 enum pipe_texture_target target,
357 unsigned sample_count,
358 unsigned tex_usage,
359 unsigned geom_flags)
360 {
361 static const enum pipe_format colorFormats[] = {
362 PIPE_FORMAT_B8G8R8X8_UNORM,
363 PIPE_FORMAT_X8R8G8B8_UNORM,
364 PIPE_FORMAT_X8B8G8R8_UNORM,
365 PIPE_FORMAT_B8G8R8A8_UNORM,
366 PIPE_FORMAT_A8R8G8B8_UNORM,
367 PIPE_FORMAT_A8B8G8R8_UNORM,
368 PIPE_FORMAT_B5G6R5_UNORM
369 };
370 return find_supported_format(screen, colorFormats, Elements(colorFormats),
371 target, sample_count, tex_usage, geom_flags);
372 }
373
374 /**
375 * Find an sRGBA format supported by the context/winsys.
376 */
377 static enum pipe_format
378 default_srgba_format(struct pipe_screen *screen,
379 enum pipe_texture_target target,
380 unsigned sample_count,
381 unsigned tex_usage,
382 unsigned geom_flags)
383 {
384 static const enum pipe_format colorFormats[] = {
385 PIPE_FORMAT_B8G8R8A8_SRGB,
386 PIPE_FORMAT_A8R8G8B8_SRGB,
387 PIPE_FORMAT_A8B8G8R8_SRGB,
388 };
389 return find_supported_format(screen, colorFormats, Elements(colorFormats),
390 target, sample_count, tex_usage, geom_flags);
391 }
392
393
394 /**
395 * Given an OpenGL internalFormat value for a texture or surface, return
396 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
397 * This is called during glTexImage2D, for example.
398 *
399 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
400 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
401 * we want render-to-texture ability.
402 *
403 * \param internalFormat the user value passed to glTexImage2D
404 * \param target one of PIPE_TEXTURE_x
405 * \param bindings bitmask of PIPE_BIND_x flags.
406 */
407 enum pipe_format
408 st_choose_format(struct pipe_screen *screen, GLenum internalFormat,
409 enum pipe_texture_target target, unsigned sample_count,
410 unsigned bindings)
411 {
412 unsigned geom_flags = 0; /* we don't care about POT vs. NPOT here, yet */
413
414 switch (internalFormat) {
415 case 4:
416 case GL_RGBA:
417 case GL_RGBA8:
418 case GL_RGB10_A2:
419 case GL_RGBA12:
420 return default_rgba_format( screen, target, sample_count, bindings,
421 geom_flags );
422 case 3:
423 case GL_RGB:
424 return default_rgb_format( screen, target, sample_count, bindings,
425 geom_flags );
426 case GL_RGBA16:
427 return default_rgba_format( screen, target, sample_count, bindings,
428 geom_flags );
429
430 case GL_RGBA4:
431 case GL_RGBA2:
432 if (screen->is_format_supported( screen, PIPE_FORMAT_B4G4R4A4_UNORM,
433 target, sample_count, bindings,
434 geom_flags ))
435 return PIPE_FORMAT_B4G4R4A4_UNORM;
436 return default_rgba_format( screen, target, sample_count, bindings,
437 geom_flags );
438
439 case GL_RGB5_A1:
440 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
441 target, sample_count, bindings,
442 geom_flags ))
443 return PIPE_FORMAT_B5G5R5A1_UNORM;
444 return default_rgba_format( screen, target, sample_count, bindings,
445 geom_flags );
446
447 case GL_RGB8:
448 case GL_RGB10:
449 case GL_RGB12:
450 case GL_RGB16:
451 return default_rgb_format( screen, target, sample_count, bindings,
452 geom_flags );
453
454 case GL_RGB5:
455 case GL_RGB4:
456 case GL_R3_G3_B2:
457 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G6R5_UNORM,
458 target, sample_count, bindings,
459 geom_flags ))
460 return PIPE_FORMAT_B5G6R5_UNORM;
461 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
462 target, sample_count, bindings,
463 geom_flags ))
464 return PIPE_FORMAT_B5G5R5A1_UNORM;
465 return default_rgba_format( screen, target, sample_count, bindings,
466 geom_flags );
467
468 case GL_ALPHA:
469 case GL_ALPHA4:
470 case GL_ALPHA8:
471 case GL_ALPHA12:
472 case GL_ALPHA16:
473 case GL_COMPRESSED_ALPHA:
474 if (screen->is_format_supported( screen, PIPE_FORMAT_A8_UNORM, target,
475 sample_count, bindings, geom_flags ))
476 return PIPE_FORMAT_A8_UNORM;
477 return default_rgba_format( screen, target, sample_count, bindings,
478 geom_flags );
479
480 case 1:
481 case GL_LUMINANCE:
482 case GL_LUMINANCE4:
483 case GL_LUMINANCE8:
484 case GL_LUMINANCE12:
485 case GL_LUMINANCE16:
486 case GL_COMPRESSED_LUMINANCE:
487 if (screen->is_format_supported( screen, PIPE_FORMAT_L8_UNORM, target,
488 sample_count, bindings, geom_flags ))
489 return PIPE_FORMAT_L8_UNORM;
490 return default_rgba_format( screen, target, sample_count, bindings,
491 geom_flags );
492
493 case 2:
494 case GL_LUMINANCE_ALPHA:
495 case GL_LUMINANCE4_ALPHA4:
496 case GL_LUMINANCE6_ALPHA2:
497 case GL_LUMINANCE8_ALPHA8:
498 case GL_LUMINANCE12_ALPHA4:
499 case GL_LUMINANCE12_ALPHA12:
500 case GL_LUMINANCE16_ALPHA16:
501 case GL_COMPRESSED_LUMINANCE_ALPHA:
502 if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_UNORM, target,
503 sample_count, bindings, geom_flags ))
504 return PIPE_FORMAT_L8A8_UNORM;
505 return default_rgba_format( screen, target, sample_count, bindings,
506 geom_flags );
507
508 case GL_INTENSITY:
509 case GL_INTENSITY4:
510 case GL_INTENSITY8:
511 case GL_INTENSITY12:
512 case GL_INTENSITY16:
513 case GL_COMPRESSED_INTENSITY:
514 if (screen->is_format_supported( screen, PIPE_FORMAT_I8_UNORM, target,
515 sample_count, bindings, geom_flags ))
516 return PIPE_FORMAT_I8_UNORM;
517 return default_rgba_format( screen, target, sample_count, bindings,
518 geom_flags );
519
520 case GL_YCBCR_MESA:
521 if (screen->is_format_supported(screen, PIPE_FORMAT_UYVY, target,
522 sample_count, bindings, geom_flags)) {
523 return PIPE_FORMAT_UYVY;
524 }
525 if (screen->is_format_supported(screen, PIPE_FORMAT_YUYV, target,
526 sample_count, bindings, geom_flags)) {
527 return PIPE_FORMAT_YUYV;
528 }
529 return PIPE_FORMAT_NONE;
530
531 case GL_COMPRESSED_RGB:
532 /* can only sample from compressed formats */
533 if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
534 return PIPE_FORMAT_NONE;
535 else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
536 target, sample_count, bindings,
537 geom_flags))
538 return PIPE_FORMAT_DXT1_RGB;
539 else
540 return default_rgb_format(screen, target, sample_count, bindings,
541 geom_flags);
542
543 case GL_COMPRESSED_RGBA:
544 /* can only sample from compressed formats */
545 if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
546 return PIPE_FORMAT_NONE;
547 else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
548 target, sample_count, bindings,
549 geom_flags))
550 return PIPE_FORMAT_DXT3_RGBA;
551 else
552 return default_rgba_format(screen, target, sample_count, bindings,
553 geom_flags);
554
555 case GL_RGB_S3TC:
556 case GL_RGB4_S3TC:
557 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
558 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
559 target, sample_count, bindings,
560 geom_flags))
561 return PIPE_FORMAT_DXT1_RGB;
562 else
563 return PIPE_FORMAT_NONE;
564
565 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
566 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGBA,
567 target, sample_count, bindings,
568 geom_flags))
569 return PIPE_FORMAT_DXT1_RGBA;
570 else
571 return PIPE_FORMAT_NONE;
572
573 case GL_RGBA_S3TC:
574 case GL_RGBA4_S3TC:
575 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
576 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
577 target, sample_count, bindings,
578 geom_flags))
579 return PIPE_FORMAT_DXT3_RGBA;
580 else
581 return PIPE_FORMAT_NONE;
582
583 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
584 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
585 target, sample_count, bindings,
586 geom_flags))
587 return PIPE_FORMAT_DXT5_RGBA;
588 else
589 return PIPE_FORMAT_NONE;
590
591 #if 0
592 case GL_COMPRESSED_RGB_FXT1_3DFX:
593 return PIPE_FORMAT_RGB_FXT1;
594 case GL_COMPRESSED_RGBA_FXT1_3DFX:
595 return PIPE_FORMAT_RGB_FXT1;
596 #endif
597
598 case GL_DEPTH_COMPONENT16:
599 if (screen->is_format_supported(screen, PIPE_FORMAT_Z16_UNORM, target,
600 sample_count, bindings, geom_flags))
601 return PIPE_FORMAT_Z16_UNORM;
602 /* fall-through */
603 case GL_DEPTH_COMPONENT24:
604 if (screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
605 target, sample_count, bindings, geom_flags))
606 return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
607 if (screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
608 target, sample_count, bindings, geom_flags))
609 return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
610 /* fall-through */
611 case GL_DEPTH_COMPONENT32:
612 if (screen->is_format_supported(screen, PIPE_FORMAT_Z32_UNORM, target,
613 sample_count, bindings, geom_flags))
614 return PIPE_FORMAT_Z32_UNORM;
615 /* fall-through */
616 case GL_DEPTH_COMPONENT:
617 {
618 static const enum pipe_format formats[] = {
619 PIPE_FORMAT_Z16_UNORM,
620 PIPE_FORMAT_Z32_UNORM,
621 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
622 PIPE_FORMAT_S8_USCALED_Z24_UNORM
623 };
624 return find_supported_format(screen, formats, Elements(formats),
625 target, sample_count, bindings, geom_flags);
626 }
627
628 case GL_STENCIL_INDEX:
629 case GL_STENCIL_INDEX1_EXT:
630 case GL_STENCIL_INDEX4_EXT:
631 case GL_STENCIL_INDEX8_EXT:
632 case GL_STENCIL_INDEX16_EXT:
633 {
634 static const enum pipe_format formats[] = {
635 PIPE_FORMAT_S8_USCALED,
636 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
637 PIPE_FORMAT_S8_USCALED_Z24_UNORM
638 };
639 return find_supported_format(screen, formats, Elements(formats),
640 target, sample_count, bindings, geom_flags);
641 }
642
643 case GL_DEPTH_STENCIL_EXT:
644 case GL_DEPTH24_STENCIL8_EXT:
645 {
646 static const enum pipe_format formats[] = {
647 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
648 PIPE_FORMAT_S8_USCALED_Z24_UNORM
649 };
650 return find_supported_format(screen, formats, Elements(formats),
651 target, sample_count, bindings, geom_flags);
652 }
653
654 case GL_SRGB_EXT:
655 case GL_SRGB8_EXT:
656 case GL_COMPRESSED_SRGB_EXT:
657 case GL_COMPRESSED_SRGB_ALPHA_EXT:
658 case GL_SRGB_ALPHA_EXT:
659 case GL_SRGB8_ALPHA8_EXT:
660 return default_srgba_format( screen, target, sample_count, bindings,
661 geom_flags );
662 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
663 return PIPE_FORMAT_DXT1_SRGB;
664 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
665 return PIPE_FORMAT_DXT1_SRGBA;
666 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
667 return PIPE_FORMAT_DXT3_SRGBA;
668 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
669 return PIPE_FORMAT_DXT5_SRGBA;
670
671 case GL_SLUMINANCE_ALPHA_EXT:
672 case GL_SLUMINANCE8_ALPHA8_EXT:
673 case GL_COMPRESSED_SLUMINANCE_EXT:
674 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
675 if (screen->is_format_supported(screen, PIPE_FORMAT_L8A8_SRGB, target,
676 sample_count, bindings, geom_flags))
677 return PIPE_FORMAT_L8A8_SRGB;
678 return default_srgba_format( screen, target, sample_count, bindings,
679 geom_flags );
680
681 case GL_SLUMINANCE_EXT:
682 case GL_SLUMINANCE8_EXT:
683 if (screen->is_format_supported(screen, PIPE_FORMAT_L8_SRGB, target,
684 sample_count, bindings, geom_flags))
685 return PIPE_FORMAT_L8_SRGB;
686 return default_srgba_format( screen, target, sample_count, bindings,
687 geom_flags );
688
689 default:
690 return PIPE_FORMAT_NONE;
691 }
692 }
693
694
695 /**
696 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
697 */
698 enum pipe_format
699 st_choose_renderbuffer_format(struct pipe_screen *screen,
700 GLenum internalFormat, unsigned sample_count)
701 {
702 uint usage;
703 if (_mesa_is_depth_or_stencil_format(internalFormat))
704 usage = PIPE_BIND_DEPTH_STENCIL;
705 else
706 usage = PIPE_BIND_RENDER_TARGET;
707 return st_choose_format(screen, internalFormat, PIPE_TEXTURE_2D,
708 sample_count, usage);
709 }
710
711
712 /**
713 * Called via ctx->Driver.chooseTextureFormat().
714 */
715 gl_format
716 st_ChooseTextureFormat(GLcontext *ctx, GLint internalFormat,
717 GLenum format, GLenum type)
718 {
719 struct pipe_screen *screen = st_context(ctx)->pipe->screen;
720 enum pipe_format pFormat;
721 uint bindings;
722
723 (void) format;
724 (void) type;
725
726 /* GL textures may wind up being render targets, but we don't know
727 * that in advance. Specify potential render target flags now.
728 */
729 if (_mesa_is_depth_format(internalFormat) ||
730 _mesa_is_depthstencil_format(internalFormat))
731 bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_DEPTH_STENCIL;
732 else
733 bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
734
735 pFormat = st_choose_format(screen, internalFormat,
736 PIPE_TEXTURE_2D, 0, bindings);
737
738 if (pFormat == PIPE_FORMAT_NONE) {
739 /* try choosing format again, this time without render target bindings */
740 pFormat = st_choose_format(screen, internalFormat,
741 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
742 }
743
744 if (pFormat == PIPE_FORMAT_NONE) {
745 /* no luck at all */
746 return MESA_FORMAT_NONE;
747 }
748
749 return st_pipe_format_to_mesa_format(pFormat);
750 }
751
752
753 /**
754 * Test if a gallium format is equivalent to a GL format/type.
755 */
756 GLboolean
757 st_equal_formats(enum pipe_format pFormat, GLenum format, GLenum type)
758 {
759 switch (pFormat) {
760 case PIPE_FORMAT_A8B8G8R8_UNORM:
761 return format == GL_RGBA && type == GL_UNSIGNED_BYTE;
762 case PIPE_FORMAT_A8R8G8B8_UNORM:
763 return format == GL_BGRA && type == GL_UNSIGNED_BYTE;
764 case PIPE_FORMAT_B5G6R5_UNORM:
765 return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5;
766 /* XXX more combos... */
767 default:
768 return GL_FALSE;
769 }
770 }
771
772 GLboolean
773 st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
774 {
775 if (format1 == format2)
776 return GL_TRUE;
777
778 if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
779 format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
780 return GL_TRUE;
781
782 if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
783 format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
784 return GL_TRUE;
785
786 if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
787 format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
788 return GL_TRUE;
789
790 if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
791 format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
792 return GL_TRUE;
793
794 if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
795 format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
796 return GL_TRUE;
797
798 if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
799 format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
800 return GL_TRUE;
801
802 return GL_FALSE;
803 }