Merge remote branch 'origin/master' into lp-setup-llvm
[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_S8:
170 return PIPE_FORMAT_S8_USCALED;
171 case MESA_FORMAT_YCBCR:
172 return PIPE_FORMAT_UYVY;
173 #if FEATURE_texture_s3tc
174 case MESA_FORMAT_RGB_DXT1:
175 return PIPE_FORMAT_DXT1_RGB;
176 case MESA_FORMAT_RGBA_DXT1:
177 return PIPE_FORMAT_DXT1_RGBA;
178 case MESA_FORMAT_RGBA_DXT3:
179 return PIPE_FORMAT_DXT3_RGBA;
180 case MESA_FORMAT_RGBA_DXT5:
181 return PIPE_FORMAT_DXT5_RGBA;
182 #if FEATURE_EXT_texture_sRGB
183 case MESA_FORMAT_SRGB_DXT1:
184 return PIPE_FORMAT_DXT1_SRGB;
185 case MESA_FORMAT_SRGBA_DXT1:
186 return PIPE_FORMAT_DXT1_SRGBA;
187 case MESA_FORMAT_SRGBA_DXT3:
188 return PIPE_FORMAT_DXT3_SRGBA;
189 case MESA_FORMAT_SRGBA_DXT5:
190 return PIPE_FORMAT_DXT5_SRGBA;
191 #endif
192 #endif
193 #if FEATURE_EXT_texture_sRGB
194 case MESA_FORMAT_SLA8:
195 return PIPE_FORMAT_L8A8_SRGB;
196 case MESA_FORMAT_SL8:
197 return PIPE_FORMAT_L8_SRGB;
198 case MESA_FORMAT_SRGB8:
199 return PIPE_FORMAT_R8G8B8_SRGB;
200 case MESA_FORMAT_SRGBA8:
201 return PIPE_FORMAT_A8B8G8R8_SRGB;
202 case MESA_FORMAT_SARGB8:
203 return PIPE_FORMAT_B8G8R8A8_SRGB;
204 #endif
205 case MESA_FORMAT_R8:
206 return PIPE_FORMAT_R8_UNORM;
207 case MESA_FORMAT_R16:
208 return PIPE_FORMAT_R16_UNORM;
209 case MESA_FORMAT_RG88:
210 return PIPE_FORMAT_R8G8_UNORM;
211 case MESA_FORMAT_RG1616:
212 return PIPE_FORMAT_R16G16_UNORM;
213 default:
214 assert(0);
215 return PIPE_FORMAT_NONE;
216 }
217 }
218
219
220 /**
221 * Translate Gallium format to Mesa format.
222 */
223 gl_format
224 st_pipe_format_to_mesa_format(enum pipe_format format)
225 {
226 switch (format) {
227 case PIPE_FORMAT_A8B8G8R8_UNORM:
228 return MESA_FORMAT_RGBA8888;
229 case PIPE_FORMAT_R8G8B8A8_UNORM:
230 return MESA_FORMAT_RGBA8888_REV;
231 case PIPE_FORMAT_B8G8R8A8_UNORM:
232 return MESA_FORMAT_ARGB8888;
233 case PIPE_FORMAT_A8R8G8B8_UNORM:
234 return MESA_FORMAT_ARGB8888_REV;
235 case PIPE_FORMAT_B8G8R8X8_UNORM:
236 return MESA_FORMAT_XRGB8888;
237 case PIPE_FORMAT_X8R8G8B8_UNORM:
238 return MESA_FORMAT_XRGB8888_REV;
239 case PIPE_FORMAT_B5G5R5A1_UNORM:
240 return MESA_FORMAT_ARGB1555;
241 case PIPE_FORMAT_B4G4R4A4_UNORM:
242 return MESA_FORMAT_ARGB4444;
243 case PIPE_FORMAT_B5G6R5_UNORM:
244 return MESA_FORMAT_RGB565;
245 case PIPE_FORMAT_L8A8_UNORM:
246 return MESA_FORMAT_AL88;
247 case PIPE_FORMAT_A8_UNORM:
248 return MESA_FORMAT_A8;
249 case PIPE_FORMAT_L8_UNORM:
250 return MESA_FORMAT_L8;
251 case PIPE_FORMAT_I8_UNORM:
252 return MESA_FORMAT_I8;
253 case PIPE_FORMAT_S8_USCALED:
254 return MESA_FORMAT_S8;
255
256 case PIPE_FORMAT_R16G16B16A16_SNORM:
257 return MESA_FORMAT_SIGNED_RGBA_16;
258
259 case PIPE_FORMAT_Z16_UNORM:
260 return MESA_FORMAT_Z16;
261 case PIPE_FORMAT_Z32_UNORM:
262 return MESA_FORMAT_Z32;
263 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
264 return MESA_FORMAT_Z24_S8;
265 case PIPE_FORMAT_X8Z24_UNORM:
266 return MESA_FORMAT_Z24_X8;
267 case PIPE_FORMAT_Z24X8_UNORM:
268 return MESA_FORMAT_X8_Z24;
269 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
270 return MESA_FORMAT_S8_Z24;
271
272 case PIPE_FORMAT_UYVY:
273 return MESA_FORMAT_YCBCR;
274 case PIPE_FORMAT_YUYV:
275 return MESA_FORMAT_YCBCR_REV;
276
277 #if FEATURE_texture_s3tc
278 case PIPE_FORMAT_DXT1_RGB:
279 return MESA_FORMAT_RGB_DXT1;
280 case PIPE_FORMAT_DXT1_RGBA:
281 return MESA_FORMAT_RGBA_DXT1;
282 case PIPE_FORMAT_DXT3_RGBA:
283 return MESA_FORMAT_RGBA_DXT3;
284 case PIPE_FORMAT_DXT5_RGBA:
285 return MESA_FORMAT_RGBA_DXT5;
286 #if FEATURE_EXT_texture_sRGB
287 case PIPE_FORMAT_DXT1_SRGB:
288 return MESA_FORMAT_SRGB_DXT1;
289 case PIPE_FORMAT_DXT1_SRGBA:
290 return MESA_FORMAT_SRGBA_DXT1;
291 case PIPE_FORMAT_DXT3_SRGBA:
292 return MESA_FORMAT_SRGBA_DXT3;
293 case PIPE_FORMAT_DXT5_SRGBA:
294 return MESA_FORMAT_SRGBA_DXT5;
295 #endif
296 #endif
297
298 #if FEATURE_EXT_texture_sRGB
299 case PIPE_FORMAT_L8A8_SRGB:
300 return MESA_FORMAT_SLA8;
301 case PIPE_FORMAT_L8_SRGB:
302 return MESA_FORMAT_SL8;
303 case PIPE_FORMAT_R8G8B8_SRGB:
304 return MESA_FORMAT_SRGB8;
305 case PIPE_FORMAT_A8B8G8R8_SRGB:
306 return MESA_FORMAT_SRGBA8;
307 case PIPE_FORMAT_B8G8R8A8_SRGB:
308 return MESA_FORMAT_SARGB8;
309 #endif
310
311 case PIPE_FORMAT_R8_UNORM:
312 return MESA_FORMAT_R8;
313 case PIPE_FORMAT_R16_UNORM:
314 return MESA_FORMAT_R16;
315 case PIPE_FORMAT_R8G8_UNORM:
316 return MESA_FORMAT_RG88;
317 case PIPE_FORMAT_R16G16_UNORM:
318 return MESA_FORMAT_RG1616;
319 default:
320 assert(0);
321 return MESA_FORMAT_NONE;
322 }
323 }
324
325
326 /**
327 * Return first supported format from the given list.
328 */
329 static enum pipe_format
330 find_supported_format(struct pipe_screen *screen,
331 const enum pipe_format formats[],
332 uint num_formats,
333 enum pipe_texture_target target,
334 unsigned sample_count,
335 unsigned tex_usage,
336 unsigned geom_flags)
337 {
338 uint i;
339 for (i = 0; i < num_formats; i++) {
340 if (screen->is_format_supported(screen, formats[i], target,
341 sample_count, tex_usage, geom_flags)) {
342 return formats[i];
343 }
344 }
345 return PIPE_FORMAT_NONE;
346 }
347
348
349 /**
350 * Find an RGBA format supported by the context/winsys.
351 */
352 static enum pipe_format
353 default_rgba_format(struct pipe_screen *screen,
354 enum pipe_texture_target target,
355 unsigned sample_count,
356 unsigned tex_usage,
357 unsigned geom_flags)
358 {
359 static const enum pipe_format colorFormats[] = {
360 PIPE_FORMAT_B8G8R8A8_UNORM,
361 PIPE_FORMAT_A8R8G8B8_UNORM,
362 PIPE_FORMAT_A8B8G8R8_UNORM,
363 PIPE_FORMAT_B5G6R5_UNORM
364 };
365 return find_supported_format(screen, colorFormats, Elements(colorFormats),
366 target, sample_count, tex_usage, geom_flags);
367 }
368
369
370 /**
371 * Find an RGB format supported by the context/winsys.
372 */
373 static enum pipe_format
374 default_rgb_format(struct pipe_screen *screen,
375 enum pipe_texture_target target,
376 unsigned sample_count,
377 unsigned tex_usage,
378 unsigned geom_flags)
379 {
380 static const enum pipe_format colorFormats[] = {
381 PIPE_FORMAT_B8G8R8X8_UNORM,
382 PIPE_FORMAT_X8R8G8B8_UNORM,
383 PIPE_FORMAT_X8B8G8R8_UNORM,
384 PIPE_FORMAT_B8G8R8A8_UNORM,
385 PIPE_FORMAT_A8R8G8B8_UNORM,
386 PIPE_FORMAT_A8B8G8R8_UNORM,
387 PIPE_FORMAT_B5G6R5_UNORM
388 };
389 return find_supported_format(screen, colorFormats, Elements(colorFormats),
390 target, sample_count, tex_usage, geom_flags);
391 }
392
393 /**
394 * Find an sRGBA format supported by the context/winsys.
395 */
396 static enum pipe_format
397 default_srgba_format(struct pipe_screen *screen,
398 enum pipe_texture_target target,
399 unsigned sample_count,
400 unsigned tex_usage,
401 unsigned geom_flags)
402 {
403 static const enum pipe_format colorFormats[] = {
404 PIPE_FORMAT_B8G8R8A8_SRGB,
405 PIPE_FORMAT_A8R8G8B8_SRGB,
406 PIPE_FORMAT_A8B8G8R8_SRGB,
407 };
408 return find_supported_format(screen, colorFormats, Elements(colorFormats),
409 target, sample_count, tex_usage, geom_flags);
410 }
411
412
413 /**
414 * Given an OpenGL internalFormat value for a texture or surface, return
415 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
416 * This is called during glTexImage2D, for example.
417 *
418 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
419 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
420 * we want render-to-texture ability.
421 *
422 * \param internalFormat the user value passed to glTexImage2D
423 * \param target one of PIPE_TEXTURE_x
424 * \param bindings bitmask of PIPE_BIND_x flags.
425 */
426 enum pipe_format
427 st_choose_format(struct pipe_screen *screen, GLenum internalFormat,
428 enum pipe_texture_target target, unsigned sample_count,
429 unsigned bindings)
430 {
431 unsigned geom_flags = 0; /* we don't care about POT vs. NPOT here, yet */
432
433 switch (internalFormat) {
434 case 4:
435 case GL_RGBA:
436 case GL_RGBA8:
437 case GL_RGB10_A2:
438 case GL_RGBA12:
439 return default_rgba_format( screen, target, sample_count, bindings,
440 geom_flags );
441 case 3:
442 case GL_RGB:
443 return default_rgb_format( screen, target, sample_count, bindings,
444 geom_flags );
445 case GL_RGBA16:
446 return default_rgba_format( screen, target, sample_count, bindings,
447 geom_flags );
448
449 case GL_RGBA4:
450 case GL_RGBA2:
451 if (screen->is_format_supported( screen, PIPE_FORMAT_B4G4R4A4_UNORM,
452 target, sample_count, bindings,
453 geom_flags ))
454 return PIPE_FORMAT_B4G4R4A4_UNORM;
455 return default_rgba_format( screen, target, sample_count, bindings,
456 geom_flags );
457
458 case GL_RGB5_A1:
459 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
460 target, sample_count, bindings,
461 geom_flags ))
462 return PIPE_FORMAT_B5G5R5A1_UNORM;
463 return default_rgba_format( screen, target, sample_count, bindings,
464 geom_flags );
465
466 case GL_RGB8:
467 case GL_RGB10:
468 case GL_RGB12:
469 case GL_RGB16:
470 return default_rgb_format( screen, target, sample_count, bindings,
471 geom_flags );
472
473 case GL_RGB5:
474 case GL_RGB4:
475 case GL_R3_G3_B2:
476 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G6R5_UNORM,
477 target, sample_count, bindings,
478 geom_flags ))
479 return PIPE_FORMAT_B5G6R5_UNORM;
480 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
481 target, sample_count, bindings,
482 geom_flags ))
483 return PIPE_FORMAT_B5G5R5A1_UNORM;
484 return default_rgba_format( screen, target, sample_count, bindings,
485 geom_flags );
486
487 case GL_ALPHA:
488 case GL_ALPHA4:
489 case GL_ALPHA8:
490 case GL_ALPHA12:
491 case GL_ALPHA16:
492 case GL_COMPRESSED_ALPHA:
493 if (screen->is_format_supported( screen, PIPE_FORMAT_A8_UNORM, target,
494 sample_count, bindings, geom_flags ))
495 return PIPE_FORMAT_A8_UNORM;
496 return default_rgba_format( screen, target, sample_count, bindings,
497 geom_flags );
498
499 case 1:
500 case GL_LUMINANCE:
501 case GL_LUMINANCE4:
502 case GL_LUMINANCE8:
503 case GL_LUMINANCE12:
504 case GL_LUMINANCE16:
505 case GL_COMPRESSED_LUMINANCE:
506 if (screen->is_format_supported( screen, PIPE_FORMAT_L8_UNORM, target,
507 sample_count, bindings, geom_flags ))
508 return PIPE_FORMAT_L8_UNORM;
509 return default_rgba_format( screen, target, sample_count, bindings,
510 geom_flags );
511
512 case 2:
513 case GL_LUMINANCE_ALPHA:
514 case GL_LUMINANCE4_ALPHA4:
515 case GL_LUMINANCE6_ALPHA2:
516 case GL_LUMINANCE8_ALPHA8:
517 case GL_LUMINANCE12_ALPHA4:
518 case GL_LUMINANCE12_ALPHA12:
519 case GL_LUMINANCE16_ALPHA16:
520 case GL_COMPRESSED_LUMINANCE_ALPHA:
521 if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_UNORM, target,
522 sample_count, bindings, geom_flags ))
523 return PIPE_FORMAT_L8A8_UNORM;
524 return default_rgba_format( screen, target, sample_count, bindings,
525 geom_flags );
526
527 case GL_INTENSITY:
528 case GL_INTENSITY4:
529 case GL_INTENSITY8:
530 case GL_INTENSITY12:
531 case GL_INTENSITY16:
532 case GL_COMPRESSED_INTENSITY:
533 if (screen->is_format_supported( screen, PIPE_FORMAT_I8_UNORM, target,
534 sample_count, bindings, geom_flags ))
535 return PIPE_FORMAT_I8_UNORM;
536 return default_rgba_format( screen, target, sample_count, bindings,
537 geom_flags );
538
539 case GL_YCBCR_MESA:
540 if (screen->is_format_supported(screen, PIPE_FORMAT_UYVY, target,
541 sample_count, bindings, geom_flags)) {
542 return PIPE_FORMAT_UYVY;
543 }
544 if (screen->is_format_supported(screen, PIPE_FORMAT_YUYV, target,
545 sample_count, bindings, geom_flags)) {
546 return PIPE_FORMAT_YUYV;
547 }
548 return PIPE_FORMAT_NONE;
549
550 case GL_COMPRESSED_RGB:
551 /* can only sample from compressed formats */
552 if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
553 return PIPE_FORMAT_NONE;
554 else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
555 target, sample_count, bindings,
556 geom_flags))
557 return PIPE_FORMAT_DXT1_RGB;
558 else
559 return default_rgb_format(screen, target, sample_count, bindings,
560 geom_flags);
561
562 case GL_COMPRESSED_RGBA:
563 /* can only sample from compressed formats */
564 if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
565 return PIPE_FORMAT_NONE;
566 else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
567 target, sample_count, bindings,
568 geom_flags))
569 return PIPE_FORMAT_DXT3_RGBA;
570 else
571 return default_rgba_format(screen, target, sample_count, bindings,
572 geom_flags);
573
574 case GL_RGB_S3TC:
575 case GL_RGB4_S3TC:
576 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
577 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
578 target, sample_count, bindings,
579 geom_flags))
580 return PIPE_FORMAT_DXT1_RGB;
581 else
582 return PIPE_FORMAT_NONE;
583
584 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
585 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGBA,
586 target, sample_count, bindings,
587 geom_flags))
588 return PIPE_FORMAT_DXT1_RGBA;
589 else
590 return PIPE_FORMAT_NONE;
591
592 case GL_RGBA_S3TC:
593 case GL_RGBA4_S3TC:
594 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
595 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
596 target, sample_count, bindings,
597 geom_flags))
598 return PIPE_FORMAT_DXT3_RGBA;
599 else
600 return PIPE_FORMAT_NONE;
601
602 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
603 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
604 target, sample_count, bindings,
605 geom_flags))
606 return PIPE_FORMAT_DXT5_RGBA;
607 else
608 return PIPE_FORMAT_NONE;
609
610 #if 0
611 case GL_COMPRESSED_RGB_FXT1_3DFX:
612 return PIPE_FORMAT_RGB_FXT1;
613 case GL_COMPRESSED_RGBA_FXT1_3DFX:
614 return PIPE_FORMAT_RGB_FXT1;
615 #endif
616
617 case GL_DEPTH_COMPONENT16:
618 if (screen->is_format_supported(screen, PIPE_FORMAT_Z16_UNORM, target,
619 sample_count, bindings, geom_flags))
620 return PIPE_FORMAT_Z16_UNORM;
621 /* fall-through */
622 case GL_DEPTH_COMPONENT24:
623 if (screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
624 target, sample_count, bindings, geom_flags))
625 return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
626 if (screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
627 target, sample_count, bindings, geom_flags))
628 return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
629 /* fall-through */
630 case GL_DEPTH_COMPONENT32:
631 if (screen->is_format_supported(screen, PIPE_FORMAT_Z32_UNORM, target,
632 sample_count, bindings, geom_flags))
633 return PIPE_FORMAT_Z32_UNORM;
634 /* fall-through */
635 case GL_DEPTH_COMPONENT:
636 {
637 static const enum pipe_format formats[] = {
638 PIPE_FORMAT_Z16_UNORM,
639 PIPE_FORMAT_Z32_UNORM,
640 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
641 PIPE_FORMAT_S8_USCALED_Z24_UNORM
642 };
643 return find_supported_format(screen, formats, Elements(formats),
644 target, sample_count, bindings, geom_flags);
645 }
646
647 case GL_STENCIL_INDEX:
648 case GL_STENCIL_INDEX1_EXT:
649 case GL_STENCIL_INDEX4_EXT:
650 case GL_STENCIL_INDEX8_EXT:
651 case GL_STENCIL_INDEX16_EXT:
652 {
653 static const enum pipe_format formats[] = {
654 PIPE_FORMAT_S8_USCALED,
655 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
656 PIPE_FORMAT_S8_USCALED_Z24_UNORM
657 };
658 return find_supported_format(screen, formats, Elements(formats),
659 target, sample_count, bindings, geom_flags);
660 }
661
662 case GL_DEPTH_STENCIL_EXT:
663 case GL_DEPTH24_STENCIL8_EXT:
664 {
665 static const enum pipe_format formats[] = {
666 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
667 PIPE_FORMAT_S8_USCALED_Z24_UNORM
668 };
669 return find_supported_format(screen, formats, Elements(formats),
670 target, sample_count, bindings, geom_flags);
671 }
672
673 case GL_SRGB_EXT:
674 case GL_SRGB8_EXT:
675 case GL_COMPRESSED_SRGB_EXT:
676 case GL_COMPRESSED_SRGB_ALPHA_EXT:
677 case GL_SRGB_ALPHA_EXT:
678 case GL_SRGB8_ALPHA8_EXT:
679 return default_srgba_format( screen, target, sample_count, bindings,
680 geom_flags );
681 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
682 return PIPE_FORMAT_DXT1_SRGB;
683 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
684 return PIPE_FORMAT_DXT1_SRGBA;
685 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
686 return PIPE_FORMAT_DXT3_SRGBA;
687 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
688 return PIPE_FORMAT_DXT5_SRGBA;
689
690 case GL_SLUMINANCE_ALPHA_EXT:
691 case GL_SLUMINANCE8_ALPHA8_EXT:
692 case GL_COMPRESSED_SLUMINANCE_EXT:
693 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
694 if (screen->is_format_supported(screen, PIPE_FORMAT_L8A8_SRGB, target,
695 sample_count, bindings, geom_flags))
696 return PIPE_FORMAT_L8A8_SRGB;
697 return default_srgba_format( screen, target, sample_count, bindings,
698 geom_flags );
699
700 case GL_SLUMINANCE_EXT:
701 case GL_SLUMINANCE8_EXT:
702 if (screen->is_format_supported(screen, PIPE_FORMAT_L8_SRGB, target,
703 sample_count, bindings, geom_flags))
704 return PIPE_FORMAT_L8_SRGB;
705 return default_srgba_format( screen, target, sample_count, bindings,
706 geom_flags );
707
708 case GL_RED:
709 case GL_R8:
710 if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
711 sample_count, bindings, geom_flags))
712 return PIPE_FORMAT_R8_UNORM;
713 return PIPE_FORMAT_NONE;
714 case GL_RG:
715 case GL_RG8:
716 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
717 sample_count, bindings, geom_flags))
718 return PIPE_FORMAT_R8G8_UNORM;
719 return PIPE_FORMAT_NONE;
720
721 case GL_R16:
722 if (screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM, target,
723 sample_count, bindings, geom_flags))
724 return PIPE_FORMAT_R16_UNORM;
725 return PIPE_FORMAT_NONE;
726
727 case GL_RG16:
728 if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM, target,
729 sample_count, bindings, geom_flags))
730 return PIPE_FORMAT_R16G16_UNORM;
731 return PIPE_FORMAT_NONE;
732
733 case GL_COMPRESSED_RED_RGTC1:
734 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_UNORM, target,
735 sample_count, bindings, geom_flags))
736 return PIPE_FORMAT_RGTC1_UNORM;
737 return PIPE_FORMAT_NONE;
738
739 case GL_COMPRESSED_SIGNED_RED_RGTC1:
740 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_SNORM, target,
741 sample_count, bindings, geom_flags))
742 return PIPE_FORMAT_RGTC1_SNORM;
743 return PIPE_FORMAT_NONE;
744
745 case GL_COMPRESSED_RG_RGTC2:
746 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_UNORM, target,
747 sample_count, bindings, geom_flags))
748 return PIPE_FORMAT_RGTC2_UNORM;
749 return PIPE_FORMAT_NONE;
750
751 case GL_COMPRESSED_SIGNED_RG_RGTC2:
752 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_SNORM, target,
753 sample_count, bindings, geom_flags))
754 return PIPE_FORMAT_RGTC2_SNORM;
755 return PIPE_FORMAT_NONE;
756
757 default:
758 return PIPE_FORMAT_NONE;
759 }
760 }
761
762
763 /**
764 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
765 */
766 enum pipe_format
767 st_choose_renderbuffer_format(struct pipe_screen *screen,
768 GLenum internalFormat, unsigned sample_count)
769 {
770 uint usage;
771 if (_mesa_is_depth_or_stencil_format(internalFormat))
772 usage = PIPE_BIND_DEPTH_STENCIL;
773 else
774 usage = PIPE_BIND_RENDER_TARGET;
775 return st_choose_format(screen, internalFormat, PIPE_TEXTURE_2D,
776 sample_count, usage);
777 }
778
779
780 /**
781 * Called via ctx->Driver.chooseTextureFormat().
782 */
783 gl_format
784 st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
785 GLenum format, GLenum type, GLboolean renderable)
786 {
787 struct pipe_screen *screen = st_context(ctx)->pipe->screen;
788 enum pipe_format pFormat;
789 uint bindings;
790
791 (void) format;
792 (void) type;
793
794 /* GL textures may wind up being render targets, but we don't know
795 * that in advance. Specify potential render target flags now.
796 */
797 bindings = PIPE_BIND_SAMPLER_VIEW;
798 if (renderable == GL_TRUE) {
799 if (_mesa_is_depth_format(internalFormat) ||
800 _mesa_is_depth_or_stencil_format(internalFormat))
801 bindings |= PIPE_BIND_DEPTH_STENCIL;
802 else
803 bindings |= PIPE_BIND_RENDER_TARGET;
804 }
805
806 pFormat = st_choose_format(screen, internalFormat,
807 PIPE_TEXTURE_2D, 0, bindings);
808
809 if (pFormat == PIPE_FORMAT_NONE) {
810 /* try choosing format again, this time without render target bindings */
811 pFormat = st_choose_format(screen, internalFormat,
812 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
813 }
814
815 if (pFormat == PIPE_FORMAT_NONE) {
816 /* no luck at all */
817 return MESA_FORMAT_NONE;
818 }
819
820 return st_pipe_format_to_mesa_format(pFormat);
821 }
822
823 gl_format
824 st_ChooseTextureFormat(struct gl_context *ctx, GLint internalFormat,
825 GLenum format, GLenum type)
826 {
827 return st_ChooseTextureFormat_renderable(ctx, internalFormat,
828 format, type, GL_TRUE);
829 }
830
831 /**
832 * Test if a gallium format is equivalent to a GL format/type.
833 */
834 GLboolean
835 st_equal_formats(enum pipe_format pFormat, GLenum format, GLenum type)
836 {
837 switch (pFormat) {
838 case PIPE_FORMAT_A8B8G8R8_UNORM:
839 return format == GL_RGBA && type == GL_UNSIGNED_BYTE;
840 case PIPE_FORMAT_A8R8G8B8_UNORM:
841 return format == GL_BGRA && type == GL_UNSIGNED_BYTE;
842 case PIPE_FORMAT_B5G6R5_UNORM:
843 return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5;
844 /* XXX more combos... */
845 default:
846 return GL_FALSE;
847 }
848 }
849
850 GLboolean
851 st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
852 {
853 if (format1 == format2)
854 return GL_TRUE;
855
856 if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
857 format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
858 return GL_TRUE;
859
860 if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
861 format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
862 return GL_TRUE;
863
864 if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
865 format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
866 return GL_TRUE;
867
868 if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
869 format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
870 return GL_TRUE;
871
872 if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
873 format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
874 return GL_TRUE;
875
876 if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
877 format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
878 return GL_TRUE;
879
880 return GL_FALSE;
881 }