1 /**************************************************************************
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * Copyright (c) 2008-2010 VMware, Inc.
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:
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial portions
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.
27 **************************************************************************/
31 * Mesa / Gallium format conversion and format selection code.
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"
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"
50 format_max_bits(enum pipe_format format
)
52 GLuint size
= util_format_get_component_bits(format
, UTIL_FORMAT_COLORSPACE_RGB
, 0);
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));
64 * Return basic GL datatype for the given gallium format.
67 st_format_datatype(enum pipe_format format
)
69 const struct util_format_description
*desc
;
71 desc
= util_format_description(format
);
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
;
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
;
86 const GLuint size
= format_max_bits(format
);
88 if (desc
->channel
[0].type
== UTIL_FORMAT_TYPE_UNSIGNED
)
89 return GL_UNSIGNED_BYTE
;
93 else if (size
== 16) {
94 if (desc
->channel
[0].type
== UTIL_FORMAT_TYPE_UNSIGNED
)
95 return GL_UNSIGNED_SHORT
;
100 assert( size
<= 32 );
101 if (desc
->channel
[0].type
== UTIL_FORMAT_TYPE_UNSIGNED
)
102 return GL_UNSIGNED_INT
;
108 else if (format
== PIPE_FORMAT_UYVY
) {
109 return GL_UNSIGNED_SHORT
;
111 else if (format
== PIPE_FORMAT_YUYV
) {
112 return GL_UNSIGNED_SHORT
;
115 /* compressed format? */
125 * Translate Mesa format to Gallium format.
128 st_mesa_format_to_pipe_format(gl_format mesaFormat
)
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
;
152 return PIPE_FORMAT_A8_UNORM
;
154 return PIPE_FORMAT_L8_UNORM
;
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
;
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
;
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
;
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
;
215 return PIPE_FORMAT_NONE
;
221 * Translate Gallium format to Mesa format.
224 st_pipe_format_to_mesa_format(enum pipe_format 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
;
256 case PIPE_FORMAT_R16G16B16A16_SNORM
:
257 return MESA_FORMAT_SIGNED_RGBA_16
;
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
;
272 case PIPE_FORMAT_UYVY
:
273 return MESA_FORMAT_YCBCR
;
274 case PIPE_FORMAT_YUYV
:
275 return MESA_FORMAT_YCBCR_REV
;
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
;
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
;
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
;
321 return MESA_FORMAT_NONE
;
327 * Return first supported format from the given list.
329 static enum pipe_format
330 find_supported_format(struct pipe_screen
*screen
,
331 const enum pipe_format formats
[],
333 enum pipe_texture_target target
,
334 unsigned sample_count
,
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
)) {
345 return PIPE_FORMAT_NONE
;
350 * Find an RGBA format supported by the context/winsys.
352 static enum pipe_format
353 default_rgba_format(struct pipe_screen
*screen
,
354 enum pipe_texture_target target
,
355 unsigned sample_count
,
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
365 return find_supported_format(screen
, colorFormats
, Elements(colorFormats
),
366 target
, sample_count
, tex_usage
, geom_flags
);
371 * Find an RGB format supported by the context/winsys.
373 static enum pipe_format
374 default_rgb_format(struct pipe_screen
*screen
,
375 enum pipe_texture_target target
,
376 unsigned sample_count
,
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
389 return find_supported_format(screen
, colorFormats
, Elements(colorFormats
),
390 target
, sample_count
, tex_usage
, geom_flags
);
394 * Find an sRGBA format supported by the context/winsys.
396 static enum pipe_format
397 default_srgba_format(struct pipe_screen
*screen
,
398 enum pipe_texture_target target
,
399 unsigned sample_count
,
403 static const enum pipe_format colorFormats
[] = {
404 PIPE_FORMAT_B8G8R8A8_SRGB
,
405 PIPE_FORMAT_A8R8G8B8_SRGB
,
406 PIPE_FORMAT_A8B8G8R8_SRGB
,
408 return find_supported_format(screen
, colorFormats
, Elements(colorFormats
),
409 target
, sample_count
, tex_usage
, geom_flags
);
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.
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.
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.
427 st_choose_format(struct pipe_screen
*screen
, GLenum internalFormat
,
428 enum pipe_texture_target target
, unsigned sample_count
,
431 unsigned geom_flags
= 0; /* we don't care about POT vs. NPOT here, yet */
433 switch (internalFormat
) {
439 return default_rgba_format( screen
, target
, sample_count
, bindings
,
443 return default_rgb_format( screen
, target
, sample_count
, bindings
,
446 return default_rgba_format( screen
, target
, sample_count
, bindings
,
451 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B4G4R4A4_UNORM
,
452 target
, sample_count
, bindings
,
454 return PIPE_FORMAT_B4G4R4A4_UNORM
;
455 return default_rgba_format( screen
, target
, sample_count
, bindings
,
459 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B5G5R5A1_UNORM
,
460 target
, sample_count
, bindings
,
462 return PIPE_FORMAT_B5G5R5A1_UNORM
;
463 return default_rgba_format( screen
, target
, sample_count
, bindings
,
470 return default_rgb_format( screen
, target
, sample_count
, bindings
,
476 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B5G6R5_UNORM
,
477 target
, sample_count
, bindings
,
479 return PIPE_FORMAT_B5G6R5_UNORM
;
480 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B5G5R5A1_UNORM
,
481 target
, sample_count
, bindings
,
483 return PIPE_FORMAT_B5G5R5A1_UNORM
;
484 return default_rgba_format( screen
, target
, sample_count
, bindings
,
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
,
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
,
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
,
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
,
540 if (screen
->is_format_supported(screen
, PIPE_FORMAT_UYVY
, target
,
541 sample_count
, bindings
, geom_flags
)) {
542 return PIPE_FORMAT_UYVY
;
544 if (screen
->is_format_supported(screen
, PIPE_FORMAT_YUYV
, target
,
545 sample_count
, bindings
, geom_flags
)) {
546 return PIPE_FORMAT_YUYV
;
548 return PIPE_FORMAT_NONE
;
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
,
559 return PIPE_FORMAT_DXT1_RGB
;
561 return default_rgb_format(screen
, target
, sample_count
, bindings
,
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
,
571 return PIPE_FORMAT_DXT3_RGBA
;
573 return default_rgba_format(screen
, target
, sample_count
, bindings
,
578 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
579 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT1_RGB
,
580 target
, sample_count
, bindings
,
582 return PIPE_FORMAT_DXT1_RGB
;
584 return PIPE_FORMAT_NONE
;
586 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
587 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT1_RGBA
,
588 target
, sample_count
, bindings
,
590 return PIPE_FORMAT_DXT1_RGBA
;
592 return PIPE_FORMAT_NONE
;
596 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
597 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT3_RGBA
,
598 target
, sample_count
, bindings
,
600 return PIPE_FORMAT_DXT3_RGBA
;
602 return PIPE_FORMAT_NONE
;
604 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
605 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT5_RGBA
,
606 target
, sample_count
, bindings
,
608 return PIPE_FORMAT_DXT5_RGBA
;
610 return PIPE_FORMAT_NONE
;
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
;
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
;
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
;
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
;
637 case GL_DEPTH_COMPONENT
:
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
645 return find_supported_format(screen
, formats
, Elements(formats
),
646 target
, sample_count
, bindings
, geom_flags
);
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
:
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
660 return find_supported_format(screen
, formats
, Elements(formats
),
661 target
, sample_count
, bindings
, geom_flags
);
664 case GL_DEPTH_STENCIL_EXT
:
665 case GL_DEPTH24_STENCIL8_EXT
:
667 static const enum pipe_format formats
[] = {
668 PIPE_FORMAT_Z24_UNORM_S8_USCALED
,
669 PIPE_FORMAT_S8_USCALED_Z24_UNORM
671 return find_supported_format(screen
, formats
, Elements(formats
),
672 target
, sample_count
, bindings
, geom_flags
);
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
,
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
;
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
,
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
,
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
760 return PIPE_FORMAT_NONE
;
766 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
769 st_choose_renderbuffer_format(struct pipe_screen
*screen
,
770 GLenum internalFormat
, unsigned sample_count
)
773 if (_mesa_is_depth_or_stencil_format(internalFormat
))
774 usage
= PIPE_BIND_DEPTH_STENCIL
;
776 usage
= PIPE_BIND_RENDER_TARGET
;
777 return st_choose_format(screen
, internalFormat
, PIPE_TEXTURE_2D
,
778 sample_count
, usage
);
783 * Called via ctx->Driver.chooseTextureFormat().
786 st_ChooseTextureFormat_renderable(struct gl_context
*ctx
, GLint internalFormat
,
787 GLenum format
, GLenum type
, GLboolean renderable
)
789 struct pipe_screen
*screen
= st_context(ctx
)->pipe
->screen
;
790 enum pipe_format pFormat
;
796 /* GL textures may wind up being render targets, but we don't know
797 * that in advance. Specify potential render target flags now.
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
;
805 bindings
|= PIPE_BIND_RENDER_TARGET
;
808 pFormat
= st_choose_format(screen
, internalFormat
,
809 PIPE_TEXTURE_2D
, 0, bindings
);
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
);
817 if (pFormat
== PIPE_FORMAT_NONE
) {
819 return MESA_FORMAT_NONE
;
822 return st_pipe_format_to_mesa_format(pFormat
);
826 st_ChooseTextureFormat(struct gl_context
*ctx
, GLint internalFormat
,
827 GLenum format
, GLenum type
)
829 return st_ChooseTextureFormat_renderable(ctx
, internalFormat
,
830 format
, type
, GL_TRUE
);
834 * Test if a gallium format is equivalent to a GL format/type.
837 st_equal_formats(enum pipe_format pFormat
, GLenum format
, GLenum type
)
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... */
853 st_sampler_compat_formats(enum pipe_format format1
, enum pipe_format format2
)
855 if (format1
== format2
)
858 if (format1
== PIPE_FORMAT_B8G8R8A8_UNORM
&&
859 format2
== PIPE_FORMAT_B8G8R8X8_UNORM
)
862 if (format1
== PIPE_FORMAT_B8G8R8X8_UNORM
&&
863 format2
== PIPE_FORMAT_B8G8R8A8_UNORM
)
866 if (format1
== PIPE_FORMAT_A8B8G8R8_UNORM
&&
867 format2
== PIPE_FORMAT_X8B8G8R8_UNORM
)
870 if (format1
== PIPE_FORMAT_X8B8G8R8_UNORM
&&
871 format2
== PIPE_FORMAT_A8B8G8R8_UNORM
)
874 if (format1
== PIPE_FORMAT_A8R8G8B8_UNORM
&&
875 format2
== PIPE_FORMAT_X8R8G8B8_UNORM
)
878 if (format1
== PIPE_FORMAT_X8R8G8B8_UNORM
&&
879 format2
== PIPE_FORMAT_A8R8G8B8_UNORM
)