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