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