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
;
213 case MESA_FORMAT_RGBA_16
:
214 return PIPE_FORMAT_R16G16B16A16_UNORM
;
216 /* signed int formats */
217 case MESA_FORMAT_RGBA_INT8
:
218 return PIPE_FORMAT_R8G8B8A8_SSCALED
;
219 case MESA_FORMAT_RGBA_INT16
:
220 return PIPE_FORMAT_R16G16B16A16_SSCALED
;
221 case MESA_FORMAT_RGBA_INT32
:
222 return PIPE_FORMAT_R32G32B32A32_SSCALED
;
224 /* unsigned int formats */
225 case MESA_FORMAT_RGBA_UINT8
:
226 return PIPE_FORMAT_R8G8B8A8_USCALED
;
227 case MESA_FORMAT_RGBA_UINT16
:
228 return PIPE_FORMAT_R16G16B16A16_USCALED
;
229 case MESA_FORMAT_RGBA_UINT32
:
230 return PIPE_FORMAT_R32G32B32A32_USCALED
;
234 return PIPE_FORMAT_NONE
;
240 * Translate Gallium format to Mesa format.
243 st_pipe_format_to_mesa_format(enum pipe_format format
)
246 case PIPE_FORMAT_A8B8G8R8_UNORM
:
247 return MESA_FORMAT_RGBA8888
;
248 case PIPE_FORMAT_R8G8B8A8_UNORM
:
249 return MESA_FORMAT_RGBA8888_REV
;
250 case PIPE_FORMAT_B8G8R8A8_UNORM
:
251 return MESA_FORMAT_ARGB8888
;
252 case PIPE_FORMAT_A8R8G8B8_UNORM
:
253 return MESA_FORMAT_ARGB8888_REV
;
254 case PIPE_FORMAT_B8G8R8X8_UNORM
:
255 return MESA_FORMAT_XRGB8888
;
256 case PIPE_FORMAT_X8R8G8B8_UNORM
:
257 return MESA_FORMAT_XRGB8888_REV
;
258 case PIPE_FORMAT_B5G5R5A1_UNORM
:
259 return MESA_FORMAT_ARGB1555
;
260 case PIPE_FORMAT_B4G4R4A4_UNORM
:
261 return MESA_FORMAT_ARGB4444
;
262 case PIPE_FORMAT_B5G6R5_UNORM
:
263 return MESA_FORMAT_RGB565
;
264 case PIPE_FORMAT_L8A8_UNORM
:
265 return MESA_FORMAT_AL88
;
266 case PIPE_FORMAT_A8_UNORM
:
267 return MESA_FORMAT_A8
;
268 case PIPE_FORMAT_L8_UNORM
:
269 return MESA_FORMAT_L8
;
270 case PIPE_FORMAT_I8_UNORM
:
271 return MESA_FORMAT_I8
;
272 case PIPE_FORMAT_S8_USCALED
:
273 return MESA_FORMAT_S8
;
275 case PIPE_FORMAT_R16G16B16A16_UNORM
:
276 return MESA_FORMAT_RGBA_16
;
277 case PIPE_FORMAT_R16G16B16A16_SNORM
:
278 return MESA_FORMAT_SIGNED_RGBA_16
;
280 case PIPE_FORMAT_Z16_UNORM
:
281 return MESA_FORMAT_Z16
;
282 case PIPE_FORMAT_Z32_UNORM
:
283 return MESA_FORMAT_Z32
;
284 case PIPE_FORMAT_S8_USCALED_Z24_UNORM
:
285 return MESA_FORMAT_Z24_S8
;
286 case PIPE_FORMAT_X8Z24_UNORM
:
287 return MESA_FORMAT_Z24_X8
;
288 case PIPE_FORMAT_Z24X8_UNORM
:
289 return MESA_FORMAT_X8_Z24
;
290 case PIPE_FORMAT_Z24_UNORM_S8_USCALED
:
291 return MESA_FORMAT_S8_Z24
;
293 case PIPE_FORMAT_UYVY
:
294 return MESA_FORMAT_YCBCR
;
295 case PIPE_FORMAT_YUYV
:
296 return MESA_FORMAT_YCBCR_REV
;
298 #if FEATURE_texture_s3tc
299 case PIPE_FORMAT_DXT1_RGB
:
300 return MESA_FORMAT_RGB_DXT1
;
301 case PIPE_FORMAT_DXT1_RGBA
:
302 return MESA_FORMAT_RGBA_DXT1
;
303 case PIPE_FORMAT_DXT3_RGBA
:
304 return MESA_FORMAT_RGBA_DXT3
;
305 case PIPE_FORMAT_DXT5_RGBA
:
306 return MESA_FORMAT_RGBA_DXT5
;
307 #if FEATURE_EXT_texture_sRGB
308 case PIPE_FORMAT_DXT1_SRGB
:
309 return MESA_FORMAT_SRGB_DXT1
;
310 case PIPE_FORMAT_DXT1_SRGBA
:
311 return MESA_FORMAT_SRGBA_DXT1
;
312 case PIPE_FORMAT_DXT3_SRGBA
:
313 return MESA_FORMAT_SRGBA_DXT3
;
314 case PIPE_FORMAT_DXT5_SRGBA
:
315 return MESA_FORMAT_SRGBA_DXT5
;
319 #if FEATURE_EXT_texture_sRGB
320 case PIPE_FORMAT_L8A8_SRGB
:
321 return MESA_FORMAT_SLA8
;
322 case PIPE_FORMAT_L8_SRGB
:
323 return MESA_FORMAT_SL8
;
324 case PIPE_FORMAT_R8G8B8_SRGB
:
325 return MESA_FORMAT_SRGB8
;
326 case PIPE_FORMAT_A8B8G8R8_SRGB
:
327 return MESA_FORMAT_SRGBA8
;
328 case PIPE_FORMAT_B8G8R8A8_SRGB
:
329 return MESA_FORMAT_SARGB8
;
332 case PIPE_FORMAT_R8_UNORM
:
333 return MESA_FORMAT_R8
;
334 case PIPE_FORMAT_R16_UNORM
:
335 return MESA_FORMAT_R16
;
336 case PIPE_FORMAT_R8G8_UNORM
:
337 return MESA_FORMAT_RG88
;
338 case PIPE_FORMAT_R16G16_UNORM
:
339 return MESA_FORMAT_RG1616
;
341 /* signed int formats */
342 case PIPE_FORMAT_R8G8B8A8_SSCALED
:
343 return MESA_FORMAT_RGBA_INT8
;
344 case PIPE_FORMAT_R16G16B16A16_SSCALED
:
345 return MESA_FORMAT_RGBA_INT16
;
346 case PIPE_FORMAT_R32G32B32A32_SSCALED
:
347 return MESA_FORMAT_RGBA_INT32
;
349 /* unsigned int formats */
350 case PIPE_FORMAT_R8G8B8A8_USCALED
:
351 return MESA_FORMAT_RGBA_UINT8
;
352 case PIPE_FORMAT_R16G16B16A16_USCALED
:
353 return MESA_FORMAT_RGBA_UINT16
;
354 case PIPE_FORMAT_R32G32B32A32_USCALED
:
355 return MESA_FORMAT_RGBA_UINT32
;
359 return MESA_FORMAT_NONE
;
365 * Return first supported format from the given list.
367 static enum pipe_format
368 find_supported_format(struct pipe_screen
*screen
,
369 const enum pipe_format formats
[],
371 enum pipe_texture_target target
,
372 unsigned sample_count
,
377 for (i
= 0; i
< num_formats
; i
++) {
378 if (screen
->is_format_supported(screen
, formats
[i
], target
,
379 sample_count
, tex_usage
, geom_flags
)) {
383 return PIPE_FORMAT_NONE
;
388 * Find an RGBA format supported by the context/winsys.
390 static enum pipe_format
391 default_rgba_format(struct pipe_screen
*screen
,
392 enum pipe_texture_target target
,
393 unsigned sample_count
,
397 static const enum pipe_format colorFormats
[] = {
398 PIPE_FORMAT_B8G8R8A8_UNORM
,
399 PIPE_FORMAT_A8R8G8B8_UNORM
,
400 PIPE_FORMAT_A8B8G8R8_UNORM
,
401 PIPE_FORMAT_B5G6R5_UNORM
403 return find_supported_format(screen
, colorFormats
, Elements(colorFormats
),
404 target
, sample_count
, tex_usage
, geom_flags
);
409 * Find an RGB format supported by the context/winsys.
411 static enum pipe_format
412 default_rgb_format(struct pipe_screen
*screen
,
413 enum pipe_texture_target target
,
414 unsigned sample_count
,
418 static const enum pipe_format colorFormats
[] = {
419 PIPE_FORMAT_B8G8R8X8_UNORM
,
420 PIPE_FORMAT_X8R8G8B8_UNORM
,
421 PIPE_FORMAT_X8B8G8R8_UNORM
,
422 PIPE_FORMAT_B8G8R8A8_UNORM
,
423 PIPE_FORMAT_A8R8G8B8_UNORM
,
424 PIPE_FORMAT_A8B8G8R8_UNORM
,
425 PIPE_FORMAT_B5G6R5_UNORM
427 return find_supported_format(screen
, colorFormats
, Elements(colorFormats
),
428 target
, sample_count
, tex_usage
, geom_flags
);
432 * Find an sRGBA format supported by the context/winsys.
434 static enum pipe_format
435 default_srgba_format(struct pipe_screen
*screen
,
436 enum pipe_texture_target target
,
437 unsigned sample_count
,
441 static const enum pipe_format colorFormats
[] = {
442 PIPE_FORMAT_B8G8R8A8_SRGB
,
443 PIPE_FORMAT_A8R8G8B8_SRGB
,
444 PIPE_FORMAT_A8B8G8R8_SRGB
,
446 return find_supported_format(screen
, colorFormats
, Elements(colorFormats
),
447 target
, sample_count
, tex_usage
, geom_flags
);
452 * Given an OpenGL internalFormat value for a texture or surface, return
453 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
454 * This is called during glTexImage2D, for example.
456 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
457 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
458 * we want render-to-texture ability.
460 * \param internalFormat the user value passed to glTexImage2D
461 * \param target one of PIPE_TEXTURE_x
462 * \param bindings bitmask of PIPE_BIND_x flags.
465 st_choose_format(struct pipe_screen
*screen
, GLenum internalFormat
,
466 enum pipe_texture_target target
, unsigned sample_count
,
469 unsigned geom_flags
= 0; /* we don't care about POT vs. NPOT here, yet */
471 switch (internalFormat
) {
476 return default_rgba_format( screen
, target
, sample_count
, bindings
,
481 return default_rgb_format( screen
, target
, sample_count
, bindings
,
485 if (screen
->is_format_supported( screen
, PIPE_FORMAT_R16G16B16A16_UNORM
,
486 target
, sample_count
, bindings
,
488 return PIPE_FORMAT_R16G16B16A16_UNORM
;
489 return default_rgba_format( screen
, target
, sample_count
, bindings
,
494 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B4G4R4A4_UNORM
,
495 target
, sample_count
, bindings
,
497 return PIPE_FORMAT_B4G4R4A4_UNORM
;
498 return default_rgba_format( screen
, target
, sample_count
, bindings
,
502 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B5G5R5A1_UNORM
,
503 target
, sample_count
, bindings
,
505 return PIPE_FORMAT_B5G5R5A1_UNORM
;
506 return default_rgba_format( screen
, target
, sample_count
, bindings
,
513 return default_rgb_format( screen
, target
, sample_count
, bindings
,
519 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B5G6R5_UNORM
,
520 target
, sample_count
, bindings
,
522 return PIPE_FORMAT_B5G6R5_UNORM
;
523 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B5G5R5A1_UNORM
,
524 target
, sample_count
, bindings
,
526 return PIPE_FORMAT_B5G5R5A1_UNORM
;
527 return default_rgba_format( screen
, target
, sample_count
, bindings
,
535 case GL_COMPRESSED_ALPHA
:
536 if (screen
->is_format_supported( screen
, PIPE_FORMAT_A8_UNORM
, target
,
537 sample_count
, bindings
, geom_flags
))
538 return PIPE_FORMAT_A8_UNORM
;
539 return default_rgba_format( screen
, target
, sample_count
, bindings
,
548 case GL_COMPRESSED_LUMINANCE
:
549 if (screen
->is_format_supported( screen
, PIPE_FORMAT_L8_UNORM
, target
,
550 sample_count
, bindings
, geom_flags
))
551 return PIPE_FORMAT_L8_UNORM
;
552 return default_rgba_format( screen
, target
, sample_count
, bindings
,
556 case GL_LUMINANCE_ALPHA
:
557 case GL_LUMINANCE4_ALPHA4
:
558 case GL_LUMINANCE6_ALPHA2
:
559 case GL_LUMINANCE8_ALPHA8
:
560 case GL_LUMINANCE12_ALPHA4
:
561 case GL_LUMINANCE12_ALPHA12
:
562 case GL_LUMINANCE16_ALPHA16
:
563 case GL_COMPRESSED_LUMINANCE_ALPHA
:
564 if (screen
->is_format_supported( screen
, PIPE_FORMAT_L8A8_UNORM
, target
,
565 sample_count
, bindings
, geom_flags
))
566 return PIPE_FORMAT_L8A8_UNORM
;
567 return default_rgba_format( screen
, target
, sample_count
, bindings
,
575 case GL_COMPRESSED_INTENSITY
:
576 if (screen
->is_format_supported( screen
, PIPE_FORMAT_I8_UNORM
, target
,
577 sample_count
, bindings
, geom_flags
))
578 return PIPE_FORMAT_I8_UNORM
;
579 return default_rgba_format( screen
, target
, sample_count
, bindings
,
583 if (screen
->is_format_supported(screen
, PIPE_FORMAT_UYVY
, target
,
584 sample_count
, bindings
, geom_flags
)) {
585 return PIPE_FORMAT_UYVY
;
587 if (screen
->is_format_supported(screen
, PIPE_FORMAT_YUYV
, target
,
588 sample_count
, bindings
, geom_flags
)) {
589 return PIPE_FORMAT_YUYV
;
591 return PIPE_FORMAT_NONE
;
593 case GL_COMPRESSED_RED
:
594 case GL_COMPRESSED_RG
:
595 case GL_COMPRESSED_RGB
:
596 /* can only sample from compressed formats */
597 if (bindings
& ~PIPE_BIND_SAMPLER_VIEW
)
598 return PIPE_FORMAT_NONE
;
599 else if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT1_RGB
,
600 target
, sample_count
, bindings
,
602 return PIPE_FORMAT_DXT1_RGB
;
604 return default_rgb_format(screen
, target
, sample_count
, bindings
,
607 case GL_COMPRESSED_RGBA
:
608 /* can only sample from compressed formats */
609 if (bindings
& ~PIPE_BIND_SAMPLER_VIEW
)
610 return PIPE_FORMAT_NONE
;
611 else if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT3_RGBA
,
612 target
, sample_count
, bindings
,
614 return PIPE_FORMAT_DXT3_RGBA
;
616 return default_rgba_format(screen
, target
, sample_count
, bindings
,
621 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
622 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT1_RGB
,
623 target
, sample_count
, bindings
,
625 return PIPE_FORMAT_DXT1_RGB
;
627 return PIPE_FORMAT_NONE
;
629 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
630 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT1_RGBA
,
631 target
, sample_count
, bindings
,
633 return PIPE_FORMAT_DXT1_RGBA
;
635 return PIPE_FORMAT_NONE
;
639 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
640 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT3_RGBA
,
641 target
, sample_count
, bindings
,
643 return PIPE_FORMAT_DXT3_RGBA
;
645 return PIPE_FORMAT_NONE
;
647 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
648 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT5_RGBA
,
649 target
, sample_count
, bindings
,
651 return PIPE_FORMAT_DXT5_RGBA
;
653 return PIPE_FORMAT_NONE
;
656 case GL_COMPRESSED_RGB_FXT1_3DFX
:
657 return PIPE_FORMAT_RGB_FXT1
;
658 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
659 return PIPE_FORMAT_RGB_FXT1
;
662 case GL_DEPTH_COMPONENT16
:
663 if (screen
->is_format_supported(screen
, PIPE_FORMAT_Z16_UNORM
, target
,
664 sample_count
, bindings
, geom_flags
))
665 return PIPE_FORMAT_Z16_UNORM
;
667 case GL_DEPTH_COMPONENT24
:
668 if (screen
->is_format_supported(screen
, PIPE_FORMAT_Z24_UNORM_S8_USCALED
,
669 target
, sample_count
, bindings
, geom_flags
))
670 return PIPE_FORMAT_Z24_UNORM_S8_USCALED
;
671 if (screen
->is_format_supported(screen
, PIPE_FORMAT_S8_USCALED_Z24_UNORM
,
672 target
, sample_count
, bindings
, geom_flags
))
673 return PIPE_FORMAT_S8_USCALED_Z24_UNORM
;
675 case GL_DEPTH_COMPONENT32
:
676 if (screen
->is_format_supported(screen
, PIPE_FORMAT_Z32_UNORM
, target
,
677 sample_count
, bindings
, geom_flags
))
678 return PIPE_FORMAT_Z32_UNORM
;
680 case GL_DEPTH_COMPONENT
:
682 static const enum pipe_format formats
[] = {
683 PIPE_FORMAT_Z16_UNORM
,
684 PIPE_FORMAT_Z32_UNORM
,
685 PIPE_FORMAT_Z24_UNORM_S8_USCALED
,
686 PIPE_FORMAT_S8_USCALED_Z24_UNORM
688 return find_supported_format(screen
, formats
, Elements(formats
),
689 target
, sample_count
, bindings
, geom_flags
);
692 case GL_STENCIL_INDEX
:
693 case GL_STENCIL_INDEX1_EXT
:
694 case GL_STENCIL_INDEX4_EXT
:
695 case GL_STENCIL_INDEX8_EXT
:
696 case GL_STENCIL_INDEX16_EXT
:
698 static const enum pipe_format formats
[] = {
699 PIPE_FORMAT_S8_USCALED
,
700 PIPE_FORMAT_Z24_UNORM_S8_USCALED
,
701 PIPE_FORMAT_S8_USCALED_Z24_UNORM
703 return find_supported_format(screen
, formats
, Elements(formats
),
704 target
, sample_count
, bindings
, geom_flags
);
707 case GL_DEPTH_STENCIL_EXT
:
708 case GL_DEPTH24_STENCIL8_EXT
:
710 static const enum pipe_format formats
[] = {
711 PIPE_FORMAT_Z24_UNORM_S8_USCALED
,
712 PIPE_FORMAT_S8_USCALED_Z24_UNORM
714 return find_supported_format(screen
, formats
, Elements(formats
),
715 target
, sample_count
, bindings
, geom_flags
);
720 case GL_COMPRESSED_SRGB_EXT
:
721 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
722 case GL_SRGB_ALPHA_EXT
:
723 case GL_SRGB8_ALPHA8_EXT
:
724 return default_srgba_format( screen
, target
, sample_count
, bindings
,
726 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
727 return PIPE_FORMAT_DXT1_SRGB
;
728 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
729 return PIPE_FORMAT_DXT1_SRGBA
;
730 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
731 return PIPE_FORMAT_DXT3_SRGBA
;
732 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
733 return PIPE_FORMAT_DXT5_SRGBA
;
735 case GL_SLUMINANCE_ALPHA_EXT
:
736 case GL_SLUMINANCE8_ALPHA8_EXT
:
737 case GL_COMPRESSED_SLUMINANCE_EXT
:
738 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
739 if (screen
->is_format_supported(screen
, PIPE_FORMAT_L8A8_SRGB
, target
,
740 sample_count
, bindings
, geom_flags
))
741 return PIPE_FORMAT_L8A8_SRGB
;
742 return default_srgba_format( screen
, target
, sample_count
, bindings
,
745 case GL_SLUMINANCE_EXT
:
746 case GL_SLUMINANCE8_EXT
:
747 if (screen
->is_format_supported(screen
, PIPE_FORMAT_L8_SRGB
, target
,
748 sample_count
, bindings
, geom_flags
))
749 return PIPE_FORMAT_L8_SRGB
;
750 return default_srgba_format( screen
, target
, sample_count
, bindings
,
755 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R8_UNORM
, target
,
756 sample_count
, bindings
, geom_flags
))
757 return PIPE_FORMAT_R8_UNORM
;
758 return PIPE_FORMAT_NONE
;
761 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R8G8_UNORM
, target
,
762 sample_count
, bindings
, geom_flags
))
763 return PIPE_FORMAT_R8G8_UNORM
;
764 return PIPE_FORMAT_NONE
;
767 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R16_UNORM
, target
,
768 sample_count
, bindings
, geom_flags
))
769 return PIPE_FORMAT_R16_UNORM
;
770 return PIPE_FORMAT_NONE
;
773 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R16G16_UNORM
, target
,
774 sample_count
, bindings
, geom_flags
))
775 return PIPE_FORMAT_R16G16_UNORM
;
776 return PIPE_FORMAT_NONE
;
778 case GL_COMPRESSED_RED_RGTC1
:
779 if (screen
->is_format_supported(screen
, PIPE_FORMAT_RGTC1_UNORM
, target
,
780 sample_count
, bindings
, geom_flags
))
781 return PIPE_FORMAT_RGTC1_UNORM
;
782 return PIPE_FORMAT_NONE
;
784 case GL_COMPRESSED_SIGNED_RED_RGTC1
:
785 if (screen
->is_format_supported(screen
, PIPE_FORMAT_RGTC1_SNORM
, target
,
786 sample_count
, bindings
, geom_flags
))
787 return PIPE_FORMAT_RGTC1_SNORM
;
788 return PIPE_FORMAT_NONE
;
790 case GL_COMPRESSED_RG_RGTC2
:
791 if (screen
->is_format_supported(screen
, PIPE_FORMAT_RGTC2_UNORM
, target
,
792 sample_count
, bindings
, geom_flags
))
793 return PIPE_FORMAT_RGTC2_UNORM
;
794 return PIPE_FORMAT_NONE
;
796 case GL_COMPRESSED_SIGNED_RG_RGTC2
:
797 if (screen
->is_format_supported(screen
, PIPE_FORMAT_RGTC2_SNORM
, target
,
798 sample_count
, bindings
, geom_flags
))
799 return PIPE_FORMAT_RGTC2_SNORM
;
800 return PIPE_FORMAT_NONE
;
802 /* signed/unsigned integer formats.
803 * XXX Mesa only has formats for RGBA signed/unsigned integer formats.
804 * If/when new formats are added this code should be updated.
806 case GL_RED_INTEGER_EXT
:
807 case GL_GREEN_INTEGER_EXT
:
808 case GL_BLUE_INTEGER_EXT
:
809 case GL_ALPHA_INTEGER_EXT
:
810 case GL_RGB_INTEGER_EXT
:
811 case GL_RGBA_INTEGER_EXT
:
812 case GL_BGR_INTEGER_EXT
:
813 case GL_BGRA_INTEGER_EXT
:
814 case GL_LUMINANCE_INTEGER_EXT
:
815 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
820 case GL_INTENSITY8I_EXT
:
821 case GL_LUMINANCE8I_EXT
:
822 case GL_LUMINANCE_ALPHA8I_EXT
:
823 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R8G8B8A8_SSCALED
,
825 sample_count
, bindings
, geom_flags
))
826 return PIPE_FORMAT_R8G8B8A8_SSCALED
;
827 return PIPE_FORMAT_NONE
;
830 case GL_ALPHA16I_EXT
:
831 case GL_INTENSITY16I_EXT
:
832 case GL_LUMINANCE16I_EXT
:
833 case GL_LUMINANCE_ALPHA16I_EXT
:
834 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R16G16B16A16_SSCALED
,
836 sample_count
, bindings
, geom_flags
))
837 return PIPE_FORMAT_R16G16B16A16_SSCALED
;
838 return PIPE_FORMAT_NONE
;
841 case GL_ALPHA32I_EXT
:
842 case GL_INTENSITY32I_EXT
:
843 case GL_LUMINANCE32I_EXT
:
844 case GL_LUMINANCE_ALPHA32I_EXT
:
846 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R32G32B32A32_SSCALED
,
848 sample_count
, bindings
, geom_flags
))
849 return PIPE_FORMAT_R32G32B32A32_SSCALED
;
850 return PIPE_FORMAT_NONE
;
854 case GL_ALPHA8UI_EXT
:
855 case GL_INTENSITY8UI_EXT
:
856 case GL_LUMINANCE8UI_EXT
:
857 case GL_LUMINANCE_ALPHA8UI_EXT
:
858 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R8G8B8A8_USCALED
,
860 sample_count
, bindings
, geom_flags
))
861 return PIPE_FORMAT_R8G8B8A8_USCALED
;
862 return PIPE_FORMAT_NONE
;
864 case GL_RGBA16UI_EXT
:
866 case GL_ALPHA16UI_EXT
:
867 case GL_INTENSITY16UI_EXT
:
868 case GL_LUMINANCE16UI_EXT
:
869 case GL_LUMINANCE_ALPHA16UI_EXT
:
870 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R16G16B16A16_USCALED
,
872 sample_count
, bindings
, geom_flags
))
873 return PIPE_FORMAT_R16G16B16A16_USCALED
;
874 return PIPE_FORMAT_NONE
;
876 case GL_RGBA32UI_EXT
:
878 case GL_ALPHA32UI_EXT
:
879 case GL_INTENSITY32UI_EXT
:
880 case GL_LUMINANCE32UI_EXT
:
881 case GL_LUMINANCE_ALPHA32UI_EXT
:
882 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R32G32B32A32_USCALED
,
884 sample_count
, bindings
, geom_flags
))
885 return PIPE_FORMAT_R32G32B32A32_USCALED
;
886 return PIPE_FORMAT_NONE
;
889 return PIPE_FORMAT_NONE
;
895 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
898 st_choose_renderbuffer_format(struct pipe_screen
*screen
,
899 GLenum internalFormat
, unsigned sample_count
)
902 if (_mesa_is_depth_or_stencil_format(internalFormat
))
903 usage
= PIPE_BIND_DEPTH_STENCIL
;
905 usage
= PIPE_BIND_RENDER_TARGET
;
906 return st_choose_format(screen
, internalFormat
, PIPE_TEXTURE_2D
,
907 sample_count
, usage
);
912 * Called via ctx->Driver.chooseTextureFormat().
915 st_ChooseTextureFormat_renderable(struct gl_context
*ctx
, GLint internalFormat
,
916 GLenum format
, GLenum type
, GLboolean renderable
)
918 struct pipe_screen
*screen
= st_context(ctx
)->pipe
->screen
;
919 enum pipe_format pFormat
;
925 /* GL textures may wind up being render targets, but we don't know
926 * that in advance. Specify potential render target flags now.
928 bindings
= PIPE_BIND_SAMPLER_VIEW
;
929 if (renderable
== GL_TRUE
) {
930 if (_mesa_is_depth_format(internalFormat
) ||
931 _mesa_is_depth_or_stencil_format(internalFormat
))
932 bindings
|= PIPE_BIND_DEPTH_STENCIL
;
934 bindings
|= PIPE_BIND_RENDER_TARGET
;
937 pFormat
= st_choose_format(screen
, internalFormat
,
938 PIPE_TEXTURE_2D
, 0, bindings
);
940 if (pFormat
== PIPE_FORMAT_NONE
) {
941 /* try choosing format again, this time without render target bindings */
942 pFormat
= st_choose_format(screen
, internalFormat
,
943 PIPE_TEXTURE_2D
, 0, PIPE_BIND_SAMPLER_VIEW
);
946 if (pFormat
== PIPE_FORMAT_NONE
) {
948 return MESA_FORMAT_NONE
;
951 return st_pipe_format_to_mesa_format(pFormat
);
955 st_ChooseTextureFormat(struct gl_context
*ctx
, GLint internalFormat
,
956 GLenum format
, GLenum type
)
958 return st_ChooseTextureFormat_renderable(ctx
, internalFormat
,
959 format
, type
, GL_TRUE
);
963 * Test if a gallium format is equivalent to a GL format/type.
966 st_equal_formats(enum pipe_format pFormat
, GLenum format
, GLenum type
)
969 case PIPE_FORMAT_A8B8G8R8_UNORM
:
970 return format
== GL_RGBA
&& type
== GL_UNSIGNED_BYTE
;
971 case PIPE_FORMAT_A8R8G8B8_UNORM
:
972 return format
== GL_BGRA
&& type
== GL_UNSIGNED_BYTE
;
973 case PIPE_FORMAT_B5G6R5_UNORM
:
974 return format
== GL_RGB
&& type
== GL_UNSIGNED_SHORT_5_6_5
;
975 /* XXX more combos... */
982 st_sampler_compat_formats(enum pipe_format format1
, enum pipe_format format2
)
984 if (format1
== format2
)
987 if (format1
== PIPE_FORMAT_B8G8R8A8_UNORM
&&
988 format2
== PIPE_FORMAT_B8G8R8X8_UNORM
)
991 if (format1
== PIPE_FORMAT_B8G8R8X8_UNORM
&&
992 format2
== PIPE_FORMAT_B8G8R8A8_UNORM
)
995 if (format1
== PIPE_FORMAT_A8B8G8R8_UNORM
&&
996 format2
== PIPE_FORMAT_X8B8G8R8_UNORM
)
999 if (format1
== PIPE_FORMAT_X8B8G8R8_UNORM
&&
1000 format2
== PIPE_FORMAT_A8B8G8R8_UNORM
)
1003 if (format1
== PIPE_FORMAT_A8R8G8B8_UNORM
&&
1004 format2
== PIPE_FORMAT_X8R8G8B8_UNORM
)
1007 if (format1
== PIPE_FORMAT_X8R8G8B8_UNORM
&&
1008 format2
== PIPE_FORMAT_A8R8G8B8_UNORM
)