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