st/mesa: added cases for GL_COMPRESSED_RED/RG in st_choose_format()
[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_RED:
551 case GL_COMPRESSED_RG:
552 case GL_COMPRESSED_RGB:
553 /* can only sample from compressed formats */
554 if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
555 return PIPE_FORMAT_NONE;
556 else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
557 target, sample_count, bindings,
558 geom_flags))
559 return PIPE_FORMAT_DXT1_RGB;
560 else
561 return default_rgb_format(screen, target, sample_count, bindings,
562 geom_flags);
563
564 case GL_COMPRESSED_RGBA:
565 /* can only sample from compressed formats */
566 if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
567 return PIPE_FORMAT_NONE;
568 else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
569 target, sample_count, bindings,
570 geom_flags))
571 return PIPE_FORMAT_DXT3_RGBA;
572 else
573 return default_rgba_format(screen, target, sample_count, bindings,
574 geom_flags);
575
576 case GL_RGB_S3TC:
577 case GL_RGB4_S3TC:
578 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
579 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
580 target, sample_count, bindings,
581 geom_flags))
582 return PIPE_FORMAT_DXT1_RGB;
583 else
584 return PIPE_FORMAT_NONE;
585
586 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
587 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGBA,
588 target, sample_count, bindings,
589 geom_flags))
590 return PIPE_FORMAT_DXT1_RGBA;
591 else
592 return PIPE_FORMAT_NONE;
593
594 case GL_RGBA_S3TC:
595 case GL_RGBA4_S3TC:
596 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
597 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
598 target, sample_count, bindings,
599 geom_flags))
600 return PIPE_FORMAT_DXT3_RGBA;
601 else
602 return PIPE_FORMAT_NONE;
603
604 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
605 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
606 target, sample_count, bindings,
607 geom_flags))
608 return PIPE_FORMAT_DXT5_RGBA;
609 else
610 return PIPE_FORMAT_NONE;
611
612 #if 0
613 case GL_COMPRESSED_RGB_FXT1_3DFX:
614 return PIPE_FORMAT_RGB_FXT1;
615 case GL_COMPRESSED_RGBA_FXT1_3DFX:
616 return PIPE_FORMAT_RGB_FXT1;
617 #endif
618
619 case GL_DEPTH_COMPONENT16:
620 if (screen->is_format_supported(screen, PIPE_FORMAT_Z16_UNORM, target,
621 sample_count, bindings, geom_flags))
622 return PIPE_FORMAT_Z16_UNORM;
623 /* fall-through */
624 case GL_DEPTH_COMPONENT24:
625 if (screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
626 target, sample_count, bindings, geom_flags))
627 return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
628 if (screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
629 target, sample_count, bindings, geom_flags))
630 return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
631 /* fall-through */
632 case GL_DEPTH_COMPONENT32:
633 if (screen->is_format_supported(screen, PIPE_FORMAT_Z32_UNORM, target,
634 sample_count, bindings, geom_flags))
635 return PIPE_FORMAT_Z32_UNORM;
636 /* fall-through */
637 case GL_DEPTH_COMPONENT:
638 {
639 static const enum pipe_format formats[] = {
640 PIPE_FORMAT_Z16_UNORM,
641 PIPE_FORMAT_Z32_UNORM,
642 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
643 PIPE_FORMAT_S8_USCALED_Z24_UNORM
644 };
645 return find_supported_format(screen, formats, Elements(formats),
646 target, sample_count, bindings, geom_flags);
647 }
648
649 case GL_STENCIL_INDEX:
650 case GL_STENCIL_INDEX1_EXT:
651 case GL_STENCIL_INDEX4_EXT:
652 case GL_STENCIL_INDEX8_EXT:
653 case GL_STENCIL_INDEX16_EXT:
654 {
655 static const enum pipe_format formats[] = {
656 PIPE_FORMAT_S8_USCALED,
657 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
658 PIPE_FORMAT_S8_USCALED_Z24_UNORM
659 };
660 return find_supported_format(screen, formats, Elements(formats),
661 target, sample_count, bindings, geom_flags);
662 }
663
664 case GL_DEPTH_STENCIL_EXT:
665 case GL_DEPTH24_STENCIL8_EXT:
666 {
667 static const enum pipe_format formats[] = {
668 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
669 PIPE_FORMAT_S8_USCALED_Z24_UNORM
670 };
671 return find_supported_format(screen, formats, Elements(formats),
672 target, sample_count, bindings, geom_flags);
673 }
674
675 case GL_SRGB_EXT:
676 case GL_SRGB8_EXT:
677 case GL_COMPRESSED_SRGB_EXT:
678 case GL_COMPRESSED_SRGB_ALPHA_EXT:
679 case GL_SRGB_ALPHA_EXT:
680 case GL_SRGB8_ALPHA8_EXT:
681 return default_srgba_format( screen, target, sample_count, bindings,
682 geom_flags );
683 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
684 return PIPE_FORMAT_DXT1_SRGB;
685 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
686 return PIPE_FORMAT_DXT1_SRGBA;
687 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
688 return PIPE_FORMAT_DXT3_SRGBA;
689 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
690 return PIPE_FORMAT_DXT5_SRGBA;
691
692 case GL_SLUMINANCE_ALPHA_EXT:
693 case GL_SLUMINANCE8_ALPHA8_EXT:
694 case GL_COMPRESSED_SLUMINANCE_EXT:
695 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
696 if (screen->is_format_supported(screen, PIPE_FORMAT_L8A8_SRGB, target,
697 sample_count, bindings, geom_flags))
698 return PIPE_FORMAT_L8A8_SRGB;
699 return default_srgba_format( screen, target, sample_count, bindings,
700 geom_flags );
701
702 case GL_SLUMINANCE_EXT:
703 case GL_SLUMINANCE8_EXT:
704 if (screen->is_format_supported(screen, PIPE_FORMAT_L8_SRGB, target,
705 sample_count, bindings, geom_flags))
706 return PIPE_FORMAT_L8_SRGB;
707 return default_srgba_format( screen, target, sample_count, bindings,
708 geom_flags );
709
710 case GL_RED:
711 case GL_R8:
712 if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
713 sample_count, bindings, geom_flags))
714 return PIPE_FORMAT_R8_UNORM;
715 return PIPE_FORMAT_NONE;
716 case GL_RG:
717 case GL_RG8:
718 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
719 sample_count, bindings, geom_flags))
720 return PIPE_FORMAT_R8G8_UNORM;
721 return PIPE_FORMAT_NONE;
722
723 case GL_R16:
724 if (screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM, target,
725 sample_count, bindings, geom_flags))
726 return PIPE_FORMAT_R16_UNORM;
727 return PIPE_FORMAT_NONE;
728
729 case GL_RG16:
730 if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM, target,
731 sample_count, bindings, geom_flags))
732 return PIPE_FORMAT_R16G16_UNORM;
733 return PIPE_FORMAT_NONE;
734
735 case GL_COMPRESSED_RED_RGTC1:
736 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_UNORM, target,
737 sample_count, bindings, geom_flags))
738 return PIPE_FORMAT_RGTC1_UNORM;
739 return PIPE_FORMAT_NONE;
740
741 case GL_COMPRESSED_SIGNED_RED_RGTC1:
742 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_SNORM, target,
743 sample_count, bindings, geom_flags))
744 return PIPE_FORMAT_RGTC1_SNORM;
745 return PIPE_FORMAT_NONE;
746
747 case GL_COMPRESSED_RG_RGTC2:
748 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_UNORM, target,
749 sample_count, bindings, geom_flags))
750 return PIPE_FORMAT_RGTC2_UNORM;
751 return PIPE_FORMAT_NONE;
752
753 case GL_COMPRESSED_SIGNED_RG_RGTC2:
754 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_SNORM, target,
755 sample_count, bindings, geom_flags))
756 return PIPE_FORMAT_RGTC2_SNORM;
757 return PIPE_FORMAT_NONE;
758
759 default:
760 return PIPE_FORMAT_NONE;
761 }
762 }
763
764
765 /**
766 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
767 */
768 enum pipe_format
769 st_choose_renderbuffer_format(struct pipe_screen *screen,
770 GLenum internalFormat, unsigned sample_count)
771 {
772 uint usage;
773 if (_mesa_is_depth_or_stencil_format(internalFormat))
774 usage = PIPE_BIND_DEPTH_STENCIL;
775 else
776 usage = PIPE_BIND_RENDER_TARGET;
777 return st_choose_format(screen, internalFormat, PIPE_TEXTURE_2D,
778 sample_count, usage);
779 }
780
781
782 /**
783 * Called via ctx->Driver.chooseTextureFormat().
784 */
785 gl_format
786 st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
787 GLenum format, GLenum type, GLboolean renderable)
788 {
789 struct pipe_screen *screen = st_context(ctx)->pipe->screen;
790 enum pipe_format pFormat;
791 uint bindings;
792
793 (void) format;
794 (void) type;
795
796 /* GL textures may wind up being render targets, but we don't know
797 * that in advance. Specify potential render target flags now.
798 */
799 bindings = PIPE_BIND_SAMPLER_VIEW;
800 if (renderable == GL_TRUE) {
801 if (_mesa_is_depth_format(internalFormat) ||
802 _mesa_is_depth_or_stencil_format(internalFormat))
803 bindings |= PIPE_BIND_DEPTH_STENCIL;
804 else
805 bindings |= PIPE_BIND_RENDER_TARGET;
806 }
807
808 pFormat = st_choose_format(screen, internalFormat,
809 PIPE_TEXTURE_2D, 0, bindings);
810
811 if (pFormat == PIPE_FORMAT_NONE) {
812 /* try choosing format again, this time without render target bindings */
813 pFormat = st_choose_format(screen, internalFormat,
814 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
815 }
816
817 if (pFormat == PIPE_FORMAT_NONE) {
818 /* no luck at all */
819 return MESA_FORMAT_NONE;
820 }
821
822 return st_pipe_format_to_mesa_format(pFormat);
823 }
824
825 gl_format
826 st_ChooseTextureFormat(struct gl_context *ctx, GLint internalFormat,
827 GLenum format, GLenum type)
828 {
829 return st_ChooseTextureFormat_renderable(ctx, internalFormat,
830 format, type, GL_TRUE);
831 }
832
833 /**
834 * Test if a gallium format is equivalent to a GL format/type.
835 */
836 GLboolean
837 st_equal_formats(enum pipe_format pFormat, GLenum format, GLenum type)
838 {
839 switch (pFormat) {
840 case PIPE_FORMAT_A8B8G8R8_UNORM:
841 return format == GL_RGBA && type == GL_UNSIGNED_BYTE;
842 case PIPE_FORMAT_A8R8G8B8_UNORM:
843 return format == GL_BGRA && type == GL_UNSIGNED_BYTE;
844 case PIPE_FORMAT_B5G6R5_UNORM:
845 return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5;
846 /* XXX more combos... */
847 default:
848 return GL_FALSE;
849 }
850 }
851
852 GLboolean
853 st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
854 {
855 if (format1 == format2)
856 return GL_TRUE;
857
858 if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
859 format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
860 return GL_TRUE;
861
862 if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
863 format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
864 return GL_TRUE;
865
866 if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
867 format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
868 return GL_TRUE;
869
870 if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
871 format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
872 return GL_TRUE;
873
874 if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
875 format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
876 return GL_TRUE;
877
878 if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
879 format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
880 return GL_TRUE;
881
882 return GL_FALSE;
883 }