st/mesa: re-do binding flags in st_ChooseTextureFormat(), again
[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 * \param target one of PIPE_TEXTURE_x
393 * \param tex_usage either PIPE_BIND_RENDER_TARGET
394 * or PIPE_BIND_SAMPLER_VIEW
395 */
396 enum pipe_format
397 st_choose_format(struct pipe_screen *screen, GLenum internalFormat,
398 enum pipe_texture_target target, unsigned tex_usage)
399 {
400 unsigned geom_flags = 0;
401
402 switch (internalFormat) {
403 case 4:
404 case GL_RGBA:
405 case GL_COMPRESSED_RGBA:
406 case GL_RGBA8:
407 case GL_RGB10_A2:
408 case GL_RGBA12:
409 return default_rgba_format( screen, target, tex_usage, geom_flags );
410 case 3:
411 case GL_RGB:
412 case GL_COMPRESSED_RGB:
413 return default_rgb_format( screen, target, tex_usage, geom_flags );
414 case GL_RGBA16:
415 return default_rgba_format( screen, target, tex_usage, geom_flags );
416
417 case GL_RGBA4:
418 case GL_RGBA2:
419 if (screen->is_format_supported( screen, PIPE_FORMAT_B4G4R4A4_UNORM, target, tex_usage, geom_flags ))
420 return PIPE_FORMAT_B4G4R4A4_UNORM;
421 return default_rgba_format( screen, target, tex_usage, geom_flags );
422
423 case GL_RGB5_A1:
424 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM, target, tex_usage, geom_flags ))
425 return PIPE_FORMAT_B5G5R5A1_UNORM;
426 return default_rgba_format( screen, target, tex_usage, geom_flags );
427
428 case GL_RGB8:
429 case GL_RGB10:
430 case GL_RGB12:
431 case GL_RGB16:
432 return default_rgb_format( screen, target, tex_usage, geom_flags );
433
434 case GL_RGB5:
435 case GL_RGB4:
436 case GL_R3_G3_B2:
437 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G6R5_UNORM, target, tex_usage, geom_flags ))
438 return PIPE_FORMAT_B5G6R5_UNORM;
439 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM, target, tex_usage, geom_flags ))
440 return PIPE_FORMAT_B5G5R5A1_UNORM;
441 return default_rgba_format( screen, target, tex_usage, geom_flags );
442
443 case GL_ALPHA:
444 case GL_ALPHA4:
445 case GL_ALPHA8:
446 case GL_ALPHA12:
447 case GL_ALPHA16:
448 case GL_COMPRESSED_ALPHA:
449 if (screen->is_format_supported( screen, PIPE_FORMAT_A8_UNORM, target, tex_usage, geom_flags ))
450 return PIPE_FORMAT_A8_UNORM;
451 return default_rgba_format( screen, target, tex_usage, geom_flags );
452
453 case 1:
454 case GL_LUMINANCE:
455 case GL_LUMINANCE4:
456 case GL_LUMINANCE8:
457 case GL_LUMINANCE12:
458 case GL_LUMINANCE16:
459 case GL_COMPRESSED_LUMINANCE:
460 if (screen->is_format_supported( screen, PIPE_FORMAT_L8_UNORM, target, tex_usage, geom_flags ))
461 return PIPE_FORMAT_L8_UNORM;
462 return default_rgba_format( screen, target, tex_usage, geom_flags );
463
464 case 2:
465 case GL_LUMINANCE_ALPHA:
466 case GL_LUMINANCE4_ALPHA4:
467 case GL_LUMINANCE6_ALPHA2:
468 case GL_LUMINANCE8_ALPHA8:
469 case GL_LUMINANCE12_ALPHA4:
470 case GL_LUMINANCE12_ALPHA12:
471 case GL_LUMINANCE16_ALPHA16:
472 case GL_COMPRESSED_LUMINANCE_ALPHA:
473 if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_UNORM, target, tex_usage, geom_flags ))
474 return PIPE_FORMAT_L8A8_UNORM;
475 return default_rgba_format( screen, target, tex_usage, geom_flags );
476
477 case GL_INTENSITY:
478 case GL_INTENSITY4:
479 case GL_INTENSITY8:
480 case GL_INTENSITY12:
481 case GL_INTENSITY16:
482 case GL_COMPRESSED_INTENSITY:
483 if (screen->is_format_supported( screen, PIPE_FORMAT_I8_UNORM, target, tex_usage, geom_flags ))
484 return PIPE_FORMAT_I8_UNORM;
485 return default_rgba_format( screen, target, tex_usage, geom_flags );
486
487 case GL_YCBCR_MESA:
488 if (screen->is_format_supported(screen, PIPE_FORMAT_UYVY,
489 target, tex_usage, geom_flags)) {
490 return PIPE_FORMAT_UYVY;
491 }
492 if (screen->is_format_supported(screen, PIPE_FORMAT_YUYV,
493 target, tex_usage, geom_flags)) {
494 return PIPE_FORMAT_YUYV;
495 }
496 return PIPE_FORMAT_NONE;
497
498 case GL_RGB_S3TC:
499 case GL_RGB4_S3TC:
500 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
501 return PIPE_FORMAT_DXT1_RGB;
502
503 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
504 return PIPE_FORMAT_DXT1_RGBA;
505
506 case GL_RGBA_S3TC:
507 case GL_RGBA4_S3TC:
508 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
509 return PIPE_FORMAT_DXT3_RGBA;
510
511 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
512 return PIPE_FORMAT_DXT5_RGBA;
513
514 #if 0
515 case GL_COMPRESSED_RGB_FXT1_3DFX:
516 return PIPE_FORMAT_RGB_FXT1;
517 case GL_COMPRESSED_RGBA_FXT1_3DFX:
518 return PIPE_FORMAT_RGB_FXT1;
519 #endif
520
521 case GL_DEPTH_COMPONENT16:
522 if (screen->is_format_supported( screen, PIPE_FORMAT_Z16_UNORM, target, tex_usage, geom_flags ))
523 return PIPE_FORMAT_Z16_UNORM;
524 /* fall-through */
525 case GL_DEPTH_COMPONENT24:
526 if (screen->is_format_supported( screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED, target, tex_usage, geom_flags ))
527 return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
528 if (screen->is_format_supported( screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM, target, tex_usage, geom_flags ))
529 return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
530 /* fall-through */
531 case GL_DEPTH_COMPONENT32:
532 if (screen->is_format_supported( screen, PIPE_FORMAT_Z32_UNORM, target, tex_usage, geom_flags ))
533 return PIPE_FORMAT_Z32_UNORM;
534 /* fall-through */
535 case GL_DEPTH_COMPONENT:
536 {
537 static const enum pipe_format formats[] = {
538 PIPE_FORMAT_Z16_UNORM,
539 PIPE_FORMAT_Z32_UNORM,
540 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
541 PIPE_FORMAT_S8_USCALED_Z24_UNORM
542 };
543 return find_supported_format(screen, formats, Elements(formats),
544 target, tex_usage, geom_flags);
545 }
546
547 case GL_STENCIL_INDEX:
548 case GL_STENCIL_INDEX1_EXT:
549 case GL_STENCIL_INDEX4_EXT:
550 case GL_STENCIL_INDEX8_EXT:
551 case GL_STENCIL_INDEX16_EXT:
552 {
553 static const enum pipe_format formats[] = {
554 PIPE_FORMAT_S8_USCALED,
555 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
556 PIPE_FORMAT_S8_USCALED_Z24_UNORM
557 };
558 return find_supported_format(screen, formats, Elements(formats),
559 target, tex_usage, geom_flags);
560 }
561
562 case GL_DEPTH_STENCIL_EXT:
563 case GL_DEPTH24_STENCIL8_EXT:
564 {
565 static const enum pipe_format formats[] = {
566 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
567 PIPE_FORMAT_S8_USCALED_Z24_UNORM
568 };
569 return find_supported_format(screen, formats, Elements(formats),
570 target, tex_usage, geom_flags);
571 }
572
573 case GL_SRGB_EXT:
574 case GL_SRGB8_EXT:
575 case GL_COMPRESSED_SRGB_EXT:
576 case GL_COMPRESSED_SRGB_ALPHA_EXT:
577 case GL_SRGB_ALPHA_EXT:
578 case GL_SRGB8_ALPHA8_EXT:
579 return default_srgba_format( screen, target, tex_usage, geom_flags );
580 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
581 return PIPE_FORMAT_DXT1_SRGB;
582 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
583 return PIPE_FORMAT_DXT1_SRGBA;
584 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
585 return PIPE_FORMAT_DXT3_SRGBA;
586 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
587 return PIPE_FORMAT_DXT5_SRGBA;
588
589 case GL_SLUMINANCE_ALPHA_EXT:
590 case GL_SLUMINANCE8_ALPHA8_EXT:
591 case GL_COMPRESSED_SLUMINANCE_EXT:
592 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
593 if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_SRGB, target, tex_usage, geom_flags ))
594 return PIPE_FORMAT_L8A8_SRGB;
595 return default_srgba_format( screen, target, tex_usage, geom_flags );
596
597 case GL_SLUMINANCE_EXT:
598 case GL_SLUMINANCE8_EXT:
599 if (screen->is_format_supported( screen, PIPE_FORMAT_L8_SRGB, target, tex_usage, geom_flags ))
600 return PIPE_FORMAT_L8_SRGB;
601 return default_srgba_format( screen, target, tex_usage, geom_flags );
602
603 default:
604 return PIPE_FORMAT_NONE;
605 }
606 }
607
608
609 static GLboolean
610 is_depth_or_stencil_format(GLenum internalFormat)
611 {
612 switch (internalFormat) {
613 case GL_DEPTH_COMPONENT:
614 case GL_DEPTH_COMPONENT16:
615 case GL_DEPTH_COMPONENT24:
616 case GL_DEPTH_COMPONENT32:
617 case GL_STENCIL_INDEX:
618 case GL_STENCIL_INDEX1_EXT:
619 case GL_STENCIL_INDEX4_EXT:
620 case GL_STENCIL_INDEX8_EXT:
621 case GL_STENCIL_INDEX16_EXT:
622 case GL_DEPTH_STENCIL_EXT:
623 case GL_DEPTH24_STENCIL8_EXT:
624 return GL_TRUE;
625 default:
626 return GL_FALSE;
627 }
628 }
629
630 /**
631 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
632 */
633 enum pipe_format
634 st_choose_renderbuffer_format(struct pipe_screen *screen,
635 GLenum internalFormat)
636 {
637 uint usage;
638 if (is_depth_or_stencil_format(internalFormat))
639 usage = PIPE_BIND_DEPTH_STENCIL;
640 else
641 usage = PIPE_BIND_RENDER_TARGET;
642 return st_choose_format(screen, internalFormat, PIPE_TEXTURE_2D, usage);
643 }
644
645
646 /**
647 * Called via ctx->Driver.chooseTextureFormat().
648 */
649 gl_format
650 st_ChooseTextureFormat(GLcontext *ctx, GLint internalFormat,
651 GLenum format, GLenum type)
652 {
653 enum pipe_format pFormat;
654 uint bindings;
655
656 (void) format;
657 (void) type;
658
659 /* GL textures may wind up being render targets, but we don't know
660 * that in advance. Specify potential render target flags now.
661 */
662 if (_mesa_is_depth_format(internalFormat) ||
663 _mesa_is_depthstencil_format(internalFormat))
664 bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_DEPTH_STENCIL;
665 else
666 bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
667
668 pFormat = st_choose_format(ctx->st->pipe->screen, internalFormat,
669 PIPE_TEXTURE_2D, bindings);
670
671 if (pFormat == PIPE_FORMAT_NONE) {
672 /* try choosing format again, this time without render target bindings */
673 pFormat = st_choose_format(ctx->st->pipe->screen, internalFormat,
674 PIPE_TEXTURE_2D, PIPE_BIND_SAMPLER_VIEW);
675 }
676
677 if (pFormat == PIPE_FORMAT_NONE) {
678 /* no luck at all */
679 return MESA_FORMAT_NONE;
680 }
681
682 return st_pipe_format_to_mesa_format(pFormat);
683 }
684
685
686 /**
687 * Test if a gallium format is equivalent to a GL format/type.
688 */
689 GLboolean
690 st_equal_formats(enum pipe_format pFormat, GLenum format, GLenum type)
691 {
692 switch (pFormat) {
693 case PIPE_FORMAT_A8B8G8R8_UNORM:
694 return format == GL_RGBA && type == GL_UNSIGNED_BYTE;
695 case PIPE_FORMAT_A8R8G8B8_UNORM:
696 return format == GL_BGRA && type == GL_UNSIGNED_BYTE;
697 case PIPE_FORMAT_B5G6R5_UNORM:
698 return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5;
699 /* XXX more combos... */
700 default:
701 return GL_FALSE;
702 }
703 }