1 /**************************************************************************
3 * Copyright 2007 VMware, Inc.
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 VMWARE 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/enums.h"
38 #include "main/formats.h"
39 #include "main/glformats.h"
40 #include "main/texcompress.h"
41 #include "main/texgetimage.h"
42 #include "main/teximage.h"
43 #include "main/texstore.h"
44 #include "main/image.h"
45 #include "main/macros.h"
46 #include "main/formatquery.h"
48 #include "pipe/p_context.h"
49 #include "pipe/p_defines.h"
50 #include "pipe/p_screen.h"
51 #include "util/format/u_format.h"
52 #include "st_cb_texture.h"
53 #include "st_context.h"
54 #include "st_format.h"
55 #include "st_texture.h"
59 * Translate Mesa format to Gallium format.
62 st_mesa_format_to_pipe_format(const struct st_context
*st
,
63 mesa_format mesaFormat
)
65 struct pipe_screen
*screen
= st
->pipe
->screen
;
67 /* The destination RGBA format mustn't be changed, because it's also
68 * a destination format of the unpack/decompression function.
70 if (mesaFormat
== MESA_FORMAT_ETC1_RGB8
&& !st
->has_etc1
)
71 return PIPE_FORMAT_R8G8B8A8_UNORM
;
73 /* ETC2 formats are emulated as uncompressed ones.
74 * The destination formats mustn't be changed, because they are also
75 * destination formats of the unpack/decompression function.
77 if (_mesa_is_format_etc2(mesaFormat
) && !st
->has_etc2
) {
78 bool has_bgra_srgb
= screen
->is_format_supported(screen
,
79 PIPE_FORMAT_B8G8R8A8_SRGB
,
80 PIPE_TEXTURE_2D
, 0, 0,
81 PIPE_BIND_SAMPLER_VIEW
);
84 case MESA_FORMAT_ETC2_RGB8
:
85 return PIPE_FORMAT_R8G8B8A8_UNORM
;
86 case MESA_FORMAT_ETC2_SRGB8
:
87 return has_bgra_srgb
? PIPE_FORMAT_B8G8R8A8_SRGB
: PIPE_FORMAT_R8G8B8A8_SRGB
;
88 case MESA_FORMAT_ETC2_RGBA8_EAC
:
89 return PIPE_FORMAT_R8G8B8A8_UNORM
;
90 case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC
:
91 return has_bgra_srgb
? PIPE_FORMAT_B8G8R8A8_SRGB
: PIPE_FORMAT_R8G8B8A8_SRGB
;
92 case MESA_FORMAT_ETC2_R11_EAC
:
93 return PIPE_FORMAT_R16_UNORM
;
94 case MESA_FORMAT_ETC2_RG11_EAC
:
95 return PIPE_FORMAT_R16G16_UNORM
;
96 case MESA_FORMAT_ETC2_SIGNED_R11_EAC
:
97 return PIPE_FORMAT_R16_SNORM
;
98 case MESA_FORMAT_ETC2_SIGNED_RG11_EAC
:
99 return PIPE_FORMAT_R16G16_SNORM
;
100 case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1
:
101 return PIPE_FORMAT_R8G8B8A8_UNORM
;
102 case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1
:
103 return has_bgra_srgb
? PIPE_FORMAT_B8G8R8A8_SRGB
: PIPE_FORMAT_R8G8B8A8_SRGB
;
105 unreachable("Unknown ETC2 format");
109 if (st_astc_format_fallback(st
, mesaFormat
)) {
110 if (_mesa_is_format_srgb(mesaFormat
))
111 return PIPE_FORMAT_R8G8B8A8_SRGB
;
113 return PIPE_FORMAT_R8G8B8A8_UNORM
;
121 * Translate Gallium format to Mesa format.
124 st_pipe_format_to_mesa_format(enum pipe_format format
)
126 mesa_format mf
= format
;
127 if (!_mesa_get_format_name(mf
))
128 return MESA_FORMAT_NONE
;
133 * Map GL texture formats to Gallium pipe formats.
135 struct format_mapping
137 GLenum glFormats
[18]; /**< list of GLenum formats, 0-terminated */
138 enum pipe_format pipeFormats
[14]; /**< list of pipe formats, 0-terminated */
142 #define DEFAULT_RGBA_FORMATS \
143 PIPE_FORMAT_R8G8B8A8_UNORM, \
144 PIPE_FORMAT_B8G8R8A8_UNORM, \
145 PIPE_FORMAT_A8R8G8B8_UNORM, \
146 PIPE_FORMAT_A8B8G8R8_UNORM, \
149 #define DEFAULT_RGB_FORMATS \
150 PIPE_FORMAT_R8G8B8X8_UNORM, \
151 PIPE_FORMAT_B8G8R8X8_UNORM, \
152 PIPE_FORMAT_X8R8G8B8_UNORM, \
153 PIPE_FORMAT_X8B8G8R8_UNORM, \
154 PIPE_FORMAT_B5G6R5_UNORM, \
157 #define DEFAULT_SRGBA_FORMATS \
158 PIPE_FORMAT_R8G8B8A8_SRGB, \
159 PIPE_FORMAT_B8G8R8A8_SRGB, \
160 PIPE_FORMAT_A8R8G8B8_SRGB, \
161 PIPE_FORMAT_A8B8G8R8_SRGB, \
164 #define DEFAULT_DEPTH_FORMATS \
165 PIPE_FORMAT_Z24X8_UNORM, \
166 PIPE_FORMAT_X8Z24_UNORM, \
167 PIPE_FORMAT_Z16_UNORM, \
168 PIPE_FORMAT_Z24_UNORM_S8_UINT, \
169 PIPE_FORMAT_S8_UINT_Z24_UNORM, \
172 #define DEFAULT_SNORM8_RGBA_FORMATS \
173 PIPE_FORMAT_R8G8B8A8_SNORM, \
176 #define DEFAULT_UNORM16_RGBA_FORMATS \
177 PIPE_FORMAT_R16G16B16A16_UNORM, \
182 * This table maps OpenGL texture format enums to Gallium pipe_format enums.
183 * Multiple GL enums might map to multiple pipe_formats.
184 * The first pipe format in the list that's supported is the one that's chosen.
186 static const struct format_mapping format_map
[] = {
187 /* Basic RGB, RGBA formats */
190 { PIPE_FORMAT_R10G10B10X2_UNORM
, PIPE_FORMAT_B10G10R10X2_UNORM
,
191 PIPE_FORMAT_R10G10B10A2_UNORM
, PIPE_FORMAT_B10G10R10A2_UNORM
,
192 DEFAULT_RGB_FORMATS
}
196 { PIPE_FORMAT_R10G10B10A2_UNORM
, PIPE_FORMAT_B10G10R10A2_UNORM
,
197 DEFAULT_RGBA_FORMATS
}
200 { 4, GL_RGBA
, GL_RGBA8
, 0 },
201 { PIPE_FORMAT_R8G8B8A8_UNORM
, DEFAULT_RGBA_FORMATS
}
205 { DEFAULT_RGBA_FORMATS
}
208 { 3, GL_RGB
, GL_RGB8
, 0 },
209 { PIPE_FORMAT_R8G8B8X8_UNORM
, DEFAULT_RGB_FORMATS
}
212 { GL_RGB12
, GL_RGB16
, 0 },
213 { PIPE_FORMAT_R16G16B16X16_UNORM
, PIPE_FORMAT_R16G16B16A16_UNORM
,
214 DEFAULT_RGB_FORMATS
}
217 { GL_RGBA12
, GL_RGBA16
, 0 },
218 { PIPE_FORMAT_R16G16B16A16_UNORM
, DEFAULT_RGBA_FORMATS
}
221 { GL_RGBA4
, GL_RGBA2
, 0 },
222 { PIPE_FORMAT_B4G4R4A4_UNORM
, PIPE_FORMAT_A4B4G4R4_UNORM
,
223 DEFAULT_RGBA_FORMATS
}
227 { PIPE_FORMAT_B5G5R5A1_UNORM
, PIPE_FORMAT_A1B5G5R5_UNORM
,
228 DEFAULT_RGBA_FORMATS
}
232 { PIPE_FORMAT_B2G3R3_UNORM
, PIPE_FORMAT_B5G6R5_UNORM
,
233 PIPE_FORMAT_B5G5R5A1_UNORM
, DEFAULT_RGB_FORMATS
}
237 { PIPE_FORMAT_B4G4R4X4_UNORM
, PIPE_FORMAT_B4G4R4A4_UNORM
,
238 PIPE_FORMAT_A4B4G4R4_UNORM
,
239 DEFAULT_RGB_FORMATS
}
243 { PIPE_FORMAT_B5G5R5X1_UNORM
, PIPE_FORMAT_X1B5G5R5_UNORM
,
244 PIPE_FORMAT_B5G5R5A1_UNORM
, PIPE_FORMAT_A1B5G5R5_UNORM
,
245 DEFAULT_RGB_FORMATS
}
249 { PIPE_FORMAT_B5G6R5_UNORM
, DEFAULT_RGB_FORMATS
}
252 /* basic Alpha formats */
254 { GL_ALPHA12
, GL_ALPHA16
, 0 },
255 { PIPE_FORMAT_A16_UNORM
, PIPE_FORMAT_R16G16B16A16_UNORM
,
256 PIPE_FORMAT_A8_UNORM
, DEFAULT_RGBA_FORMATS
}
259 { GL_ALPHA
, GL_ALPHA4
, GL_ALPHA8
, GL_COMPRESSED_ALPHA
, 0 },
260 { PIPE_FORMAT_A8_UNORM
, DEFAULT_RGBA_FORMATS
}
263 /* basic Luminance formats */
265 { GL_LUMINANCE12
, GL_LUMINANCE16
, 0 },
266 { PIPE_FORMAT_L16_UNORM
, PIPE_FORMAT_R16G16B16A16_UNORM
,
267 PIPE_FORMAT_L8_UNORM
, DEFAULT_RGB_FORMATS
}
270 { 1, GL_LUMINANCE
, GL_LUMINANCE4
, GL_LUMINANCE8
, 0 },
271 { PIPE_FORMAT_L8_UNORM
, PIPE_FORMAT_L8A8_UNORM
, DEFAULT_RGB_FORMATS
}
274 /* basic Luminance/Alpha formats */
276 { GL_LUMINANCE12_ALPHA4
, GL_LUMINANCE12_ALPHA12
,
277 GL_LUMINANCE16_ALPHA16
, 0},
278 { PIPE_FORMAT_L16A16_UNORM
, PIPE_FORMAT_R16G16B16A16_UNORM
,
279 PIPE_FORMAT_L8A8_UNORM
, DEFAULT_RGBA_FORMATS
}
282 { 2, GL_LUMINANCE_ALPHA
, GL_LUMINANCE6_ALPHA2
, GL_LUMINANCE8_ALPHA8
, 0 },
283 { PIPE_FORMAT_L8A8_UNORM
, DEFAULT_RGBA_FORMATS
}
286 { GL_LUMINANCE4_ALPHA4
, 0 },
287 { PIPE_FORMAT_L4A4_UNORM
, PIPE_FORMAT_L8A8_UNORM
,
288 DEFAULT_RGBA_FORMATS
}
291 /* basic Intensity formats */
293 { GL_INTENSITY12
, GL_INTENSITY16
, 0 },
294 { PIPE_FORMAT_I16_UNORM
, PIPE_FORMAT_R16G16B16A16_UNORM
,
295 PIPE_FORMAT_I8_UNORM
, DEFAULT_RGBA_FORMATS
}
298 { GL_INTENSITY
, GL_INTENSITY4
, GL_INTENSITY8
,
299 GL_COMPRESSED_INTENSITY
, 0 },
300 { PIPE_FORMAT_I8_UNORM
, DEFAULT_RGBA_FORMATS
}
305 { GL_YCBCR_MESA
, 0 },
306 { PIPE_FORMAT_UYVY
, PIPE_FORMAT_YUYV
, 0 }
309 /* compressed formats */ /* XXX PIPE_BIND_SAMPLER_VIEW only */
311 { GL_COMPRESSED_RGB
, 0 },
312 { PIPE_FORMAT_DXT1_RGB
, DEFAULT_RGB_FORMATS
}
315 { GL_COMPRESSED_RGBA
, 0 },
316 { PIPE_FORMAT_DXT5_RGBA
, DEFAULT_RGBA_FORMATS
}
319 { GL_RGB_S3TC
, GL_RGB4_S3TC
, GL_COMPRESSED_RGB_S3TC_DXT1_EXT
, 0 },
320 { PIPE_FORMAT_DXT1_RGB
, 0 }
323 { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
, 0 },
324 { PIPE_FORMAT_DXT1_RGBA
, 0 }
327 { GL_RGBA_S3TC
, GL_RGBA4_S3TC
, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
, 0 },
328 { PIPE_FORMAT_DXT3_RGBA
, 0 }
331 { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
, 0 },
332 { PIPE_FORMAT_DXT5_RGBA
, 0 }
336 { GL_COMPRESSED_RGB_FXT1_3DFX
, 0 },
337 { PIPE_FORMAT_FXT1_RGB
, 0 }
340 { GL_COMPRESSED_RGBA_FXT1_3DFX
, 0 },
341 { PIPE_FORMAT_FXT1_RGBA
, 0 }
346 { GL_DEPTH_COMPONENT16
, 0 },
347 { PIPE_FORMAT_Z16_UNORM
, DEFAULT_DEPTH_FORMATS
}
350 { GL_DEPTH_COMPONENT24
, 0 },
351 { PIPE_FORMAT_Z24X8_UNORM
, PIPE_FORMAT_X8Z24_UNORM
,
352 DEFAULT_DEPTH_FORMATS
}
355 { GL_DEPTH_COMPONENT32
, 0 },
356 { PIPE_FORMAT_Z32_UNORM
, DEFAULT_DEPTH_FORMATS
}
359 { GL_DEPTH_COMPONENT
, 0 },
360 { DEFAULT_DEPTH_FORMATS
}
363 { GL_DEPTH_COMPONENT32F
, 0 },
364 { PIPE_FORMAT_Z32_FLOAT
, 0 }
367 /* stencil formats */
369 { GL_STENCIL_INDEX
, GL_STENCIL_INDEX1_EXT
, GL_STENCIL_INDEX4_EXT
,
370 GL_STENCIL_INDEX8_EXT
, GL_STENCIL_INDEX16_EXT
, 0 },
372 PIPE_FORMAT_S8_UINT
, PIPE_FORMAT_Z24_UNORM_S8_UINT
,
373 PIPE_FORMAT_S8_UINT_Z24_UNORM
, 0
377 /* Depth / Stencil formats */
379 { GL_DEPTH_STENCIL_EXT
, GL_DEPTH24_STENCIL8_EXT
, 0 },
380 { PIPE_FORMAT_Z24_UNORM_S8_UINT
, PIPE_FORMAT_S8_UINT_Z24_UNORM
, 0 }
383 { GL_DEPTH32F_STENCIL8
, 0 },
384 { PIPE_FORMAT_Z32_FLOAT_S8X24_UINT
, 0 }
389 { GL_SRGB_EXT
, GL_SRGB8_EXT
, 0 },
390 { PIPE_FORMAT_R8G8B8X8_SRGB
, PIPE_FORMAT_B8G8R8X8_SRGB
,
391 DEFAULT_SRGBA_FORMATS
}
394 { GL_SRGB_ALPHA_EXT
, GL_SRGB8_ALPHA8_EXT
, 0 },
395 { PIPE_FORMAT_R8G8B8A8_SRGB
, DEFAULT_SRGBA_FORMATS
}
398 { GL_COMPRESSED_SRGB_EXT
, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
, 0 },
399 { PIPE_FORMAT_DXT1_SRGB
, PIPE_FORMAT_R8G8B8X8_SRGB
,
400 PIPE_FORMAT_B8G8R8X8_SRGB
, DEFAULT_SRGBA_FORMATS
}
403 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
, 0 },
404 { PIPE_FORMAT_DXT1_SRGBA
, 0 }
407 { GL_COMPRESSED_SRGB_ALPHA_EXT
,
408 GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
, 0 },
409 { PIPE_FORMAT_DXT3_SRGBA
, DEFAULT_SRGBA_FORMATS
}
412 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
, 0 },
413 { PIPE_FORMAT_DXT5_SRGBA
, 0 }
416 { GL_SLUMINANCE_ALPHA_EXT
, GL_SLUMINANCE8_ALPHA8_EXT
,
417 GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
, 0 },
418 { PIPE_FORMAT_L8A8_SRGB
, DEFAULT_SRGBA_FORMATS
}
421 { GL_SLUMINANCE_EXT
, GL_SLUMINANCE8_EXT
, GL_COMPRESSED_SLUMINANCE_EXT
,
423 { PIPE_FORMAT_L8_SRGB
, DEFAULT_SRGBA_FORMATS
}
427 { PIPE_FORMAT_R8_SRGB
, 0 }
430 /* 16-bit float formats */
432 { GL_RGBA16F_ARB
, 0 },
433 { PIPE_FORMAT_R16G16B16A16_FLOAT
, PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
436 { GL_RGB16F_ARB
, 0 },
437 { PIPE_FORMAT_R16G16B16_FLOAT
, PIPE_FORMAT_R16G16B16X16_FLOAT
,
438 PIPE_FORMAT_R16G16B16A16_FLOAT
,
439 PIPE_FORMAT_R32G32B32_FLOAT
, PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
442 { GL_LUMINANCE_ALPHA16F_ARB
, 0 },
443 { PIPE_FORMAT_L16A16_FLOAT
, PIPE_FORMAT_R16G16B16A16_FLOAT
,
444 PIPE_FORMAT_L32A32_FLOAT
, PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
447 { GL_ALPHA16F_ARB
, 0 },
448 { PIPE_FORMAT_A16_FLOAT
, PIPE_FORMAT_L16A16_FLOAT
,
449 PIPE_FORMAT_A32_FLOAT
, PIPE_FORMAT_R16G16B16A16_FLOAT
,
450 PIPE_FORMAT_L32A32_FLOAT
, PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
453 { GL_INTENSITY16F_ARB
, 0 },
454 { PIPE_FORMAT_I16_FLOAT
, PIPE_FORMAT_L16A16_FLOAT
,
455 PIPE_FORMAT_I32_FLOAT
, PIPE_FORMAT_R16G16B16A16_FLOAT
,
456 PIPE_FORMAT_L32A32_FLOAT
, PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
459 { GL_LUMINANCE16F_ARB
, 0 },
460 { PIPE_FORMAT_L16_FLOAT
, PIPE_FORMAT_L16A16_FLOAT
,
461 PIPE_FORMAT_L32_FLOAT
, PIPE_FORMAT_R16G16B16A16_FLOAT
,
462 PIPE_FORMAT_L32A32_FLOAT
, PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
466 { PIPE_FORMAT_R16_FLOAT
, PIPE_FORMAT_R16G16_FLOAT
,
467 PIPE_FORMAT_R32_FLOAT
, PIPE_FORMAT_R16G16B16A16_FLOAT
,
468 PIPE_FORMAT_R32G32_FLOAT
, PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
472 { PIPE_FORMAT_R16G16_FLOAT
, PIPE_FORMAT_R16G16B16A16_FLOAT
,
473 PIPE_FORMAT_R32G32_FLOAT
, PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
476 /* 32-bit float formats */
478 { GL_RGBA32F_ARB
, 0 },
479 { PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
482 { GL_RGB32F_ARB
, 0 },
483 { PIPE_FORMAT_R32G32B32_FLOAT
, PIPE_FORMAT_R32G32B32X32_FLOAT
,
484 PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
487 { GL_LUMINANCE_ALPHA32F_ARB
, 0 },
488 { PIPE_FORMAT_L32A32_FLOAT
, PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
491 { GL_ALPHA32F_ARB
, 0 },
492 { PIPE_FORMAT_A32_FLOAT
, PIPE_FORMAT_L32A32_FLOAT
,
493 PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
496 { GL_INTENSITY32F_ARB
, 0 },
497 { PIPE_FORMAT_I32_FLOAT
, PIPE_FORMAT_L32A32_FLOAT
,
498 PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
501 { GL_LUMINANCE32F_ARB
, 0 },
502 { PIPE_FORMAT_L32_FLOAT
, PIPE_FORMAT_L32A32_FLOAT
,
503 PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
507 { PIPE_FORMAT_R32_FLOAT
, PIPE_FORMAT_R32G32_FLOAT
,
508 PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
512 { PIPE_FORMAT_R32G32_FLOAT
, PIPE_FORMAT_R32G32B32A32_FLOAT
, 0 }
517 { GL_RED
, GL_R8
, 0 },
518 { PIPE_FORMAT_R8_UNORM
, PIPE_FORMAT_R8G8_UNORM
, DEFAULT_RGBA_FORMATS
}
521 { GL_RG
, GL_RG8
, 0 },
522 { PIPE_FORMAT_R8G8_UNORM
, DEFAULT_RGBA_FORMATS
}
526 { PIPE_FORMAT_R16_UNORM
, PIPE_FORMAT_R16G16_UNORM
,
527 DEFAULT_UNORM16_RGBA_FORMATS
}
531 { PIPE_FORMAT_R16G16_UNORM
, DEFAULT_UNORM16_RGBA_FORMATS
}
534 /* compressed R, RG formats */
536 { GL_COMPRESSED_RED
, GL_COMPRESSED_RED_RGTC1
, 0 },
537 { PIPE_FORMAT_RGTC1_UNORM
, PIPE_FORMAT_R8_UNORM
, DEFAULT_RGBA_FORMATS
}
540 { GL_COMPRESSED_SIGNED_RED_RGTC1
, 0 },
541 { PIPE_FORMAT_RGTC1_SNORM
, DEFAULT_SNORM8_RGBA_FORMATS
}
544 { GL_COMPRESSED_RG
, GL_COMPRESSED_RG_RGTC2
, 0 },
545 { PIPE_FORMAT_RGTC2_UNORM
, PIPE_FORMAT_R8G8_UNORM
, DEFAULT_RGBA_FORMATS
}
548 { GL_COMPRESSED_SIGNED_RG_RGTC2
, 0 },
549 { PIPE_FORMAT_RGTC2_SNORM
, DEFAULT_SNORM8_RGBA_FORMATS
}
552 { GL_COMPRESSED_LUMINANCE
, GL_COMPRESSED_LUMINANCE_LATC1_EXT
, 0 },
553 { PIPE_FORMAT_LATC1_UNORM
, PIPE_FORMAT_L8_UNORM
, DEFAULT_RGBA_FORMATS
}
556 { GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT
, 0 },
557 { PIPE_FORMAT_LATC1_SNORM
, DEFAULT_SNORM8_RGBA_FORMATS
}
560 { GL_COMPRESSED_LUMINANCE_ALPHA
, GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT
,
561 GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI
, 0 },
562 { PIPE_FORMAT_LATC2_UNORM
, PIPE_FORMAT_L8A8_UNORM
, DEFAULT_RGBA_FORMATS
}
565 { GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT
, 0 },
566 { PIPE_FORMAT_LATC2_SNORM
, DEFAULT_SNORM8_RGBA_FORMATS
}
571 { GL_ETC1_RGB8_OES
, 0 },
572 { PIPE_FORMAT_ETC1_RGB8
, 0 }
577 { GL_COMPRESSED_RGB8_ETC2
, 0 },
578 { PIPE_FORMAT_ETC2_RGB8
, 0 }
581 { GL_COMPRESSED_SRGB8_ETC2
, 0 },
582 { PIPE_FORMAT_ETC2_SRGB8
, 0 }
585 { GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
, 0 },
586 { PIPE_FORMAT_ETC2_RGB8A1
, 0 }
589 { GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
, 0 },
590 { PIPE_FORMAT_ETC2_SRGB8A1
, 0 }
593 { GL_COMPRESSED_RGBA8_ETC2_EAC
, 0 },
594 { PIPE_FORMAT_ETC2_RGBA8
, 0 }
597 { GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
, 0 },
598 { PIPE_FORMAT_ETC2_SRGBA8
, 0 }
601 { GL_COMPRESSED_R11_EAC
, 0 },
602 { PIPE_FORMAT_ETC2_R11_UNORM
, 0 }
605 { GL_COMPRESSED_SIGNED_R11_EAC
, 0 },
606 { PIPE_FORMAT_ETC2_R11_SNORM
, 0 }
609 { GL_COMPRESSED_RG11_EAC
, 0 },
610 { PIPE_FORMAT_ETC2_RG11_UNORM
, 0 }
613 { GL_COMPRESSED_SIGNED_RG11_EAC
, 0 },
614 { PIPE_FORMAT_ETC2_RG11_SNORM
, 0 }
619 { GL_COMPRESSED_RGBA_BPTC_UNORM
, 0 },
620 { PIPE_FORMAT_BPTC_RGBA_UNORM
, 0 },
623 { GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM
, 0 },
624 { PIPE_FORMAT_BPTC_SRGBA
, 0 },
627 { GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT
, 0 },
628 { PIPE_FORMAT_BPTC_RGB_FLOAT
, 0 },
631 { GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT
, 0 },
632 { PIPE_FORMAT_BPTC_RGB_UFLOAT
, 0 },
637 { GL_COMPRESSED_RGBA_ASTC_4x4_KHR
, 0 },
638 { PIPE_FORMAT_ASTC_4x4
, 0},
641 { GL_COMPRESSED_RGBA_ASTC_5x4_KHR
, 0 },
642 { PIPE_FORMAT_ASTC_5x4
, 0},
645 { GL_COMPRESSED_RGBA_ASTC_5x5_KHR
, 0 },
646 { PIPE_FORMAT_ASTC_5x5
, 0},
649 { GL_COMPRESSED_RGBA_ASTC_6x5_KHR
, 0 },
650 { PIPE_FORMAT_ASTC_6x5
, 0},
653 { GL_COMPRESSED_RGBA_ASTC_6x6_KHR
, 0 },
654 { PIPE_FORMAT_ASTC_6x6
, 0},
657 { GL_COMPRESSED_RGBA_ASTC_8x5_KHR
, 0 },
658 { PIPE_FORMAT_ASTC_8x5
, 0},
661 { GL_COMPRESSED_RGBA_ASTC_8x6_KHR
, 0 },
662 { PIPE_FORMAT_ASTC_8x6
, 0},
665 { GL_COMPRESSED_RGBA_ASTC_8x8_KHR
, 0 },
666 { PIPE_FORMAT_ASTC_8x8
, 0},
669 { GL_COMPRESSED_RGBA_ASTC_10x5_KHR
, 0 },
670 { PIPE_FORMAT_ASTC_10x5
, 0},
673 { GL_COMPRESSED_RGBA_ASTC_10x6_KHR
, 0 },
674 { PIPE_FORMAT_ASTC_10x6
, 0},
677 { GL_COMPRESSED_RGBA_ASTC_10x8_KHR
, 0 },
678 { PIPE_FORMAT_ASTC_10x8
, 0},
681 { GL_COMPRESSED_RGBA_ASTC_10x10_KHR
, 0 },
682 { PIPE_FORMAT_ASTC_10x10
, 0},
685 { GL_COMPRESSED_RGBA_ASTC_12x10_KHR
, 0 },
686 { PIPE_FORMAT_ASTC_12x10
, 0},
689 { GL_COMPRESSED_RGBA_ASTC_12x12_KHR
, 0 },
690 { PIPE_FORMAT_ASTC_12x12
, 0},
694 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR
, 0 },
695 { PIPE_FORMAT_ASTC_4x4_SRGB
, 0},
698 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR
, 0 },
699 { PIPE_FORMAT_ASTC_5x4_SRGB
, 0},
702 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR
, 0 },
703 { PIPE_FORMAT_ASTC_5x5_SRGB
, 0},
706 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR
, 0 },
707 { PIPE_FORMAT_ASTC_6x5_SRGB
, 0},
710 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR
, 0 },
711 { PIPE_FORMAT_ASTC_6x6_SRGB
, 0},
714 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR
, 0 },
715 { PIPE_FORMAT_ASTC_8x5_SRGB
, 0},
718 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR
, 0 },
719 { PIPE_FORMAT_ASTC_8x6_SRGB
, 0},
722 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR
, 0 },
723 { PIPE_FORMAT_ASTC_8x8_SRGB
, 0},
726 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR
, 0 },
727 { PIPE_FORMAT_ASTC_10x5_SRGB
, 0},
730 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR
, 0 },
731 { PIPE_FORMAT_ASTC_10x6_SRGB
, 0},
734 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR
, 0 },
735 { PIPE_FORMAT_ASTC_10x8_SRGB
, 0},
738 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR
, 0 },
739 { PIPE_FORMAT_ASTC_10x10_SRGB
, 0},
742 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR
, 0 },
743 { PIPE_FORMAT_ASTC_12x10_SRGB
, 0},
746 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR
, 0 },
747 { PIPE_FORMAT_ASTC_12x12_SRGB
, 0},
750 /* signed/unsigned integer formats.
753 { GL_RGBA_INTEGER_EXT
,
756 { PIPE_FORMAT_R8G8B8A8_SINT
, 0 }
759 { GL_RGB_INTEGER_EXT
,
762 GL_BLUE_INTEGER_EXT
, 0 },
763 { PIPE_FORMAT_R8G8B8_SINT
, PIPE_FORMAT_R8G8B8X8_SINT
,
764 PIPE_FORMAT_R8G8B8A8_SINT
, 0 }
767 { GL_ALPHA_INTEGER_EXT
,
769 { PIPE_FORMAT_A8_SINT
, PIPE_FORMAT_R8G8B8A8_SINT
, 0 }
772 { GL_ALPHA16I_EXT
, 0 },
773 { PIPE_FORMAT_A16_SINT
, PIPE_FORMAT_R16G16B16A16_SINT
, 0 }
776 { GL_ALPHA32I_EXT
, 0 },
777 { PIPE_FORMAT_A32_SINT
, PIPE_FORMAT_R32G32B32A32_SINT
, 0 }
780 { GL_ALPHA8UI_EXT
, 0 },
781 { PIPE_FORMAT_A8_UINT
, PIPE_FORMAT_R8G8B8A8_UINT
, 0 }
784 { GL_ALPHA16UI_EXT
, 0 },
785 { PIPE_FORMAT_A16_UINT
, PIPE_FORMAT_R16G16B16A16_UINT
, 0 }
788 { GL_ALPHA32UI_EXT
, 0 },
789 { PIPE_FORMAT_A32_UINT
, PIPE_FORMAT_R32G32B32A32_UINT
, 0 }
792 { GL_INTENSITY8I_EXT
, 0 },
793 { PIPE_FORMAT_I8_SINT
, PIPE_FORMAT_R8G8B8A8_SINT
, 0 }
796 { GL_INTENSITY16I_EXT
, 0 },
797 { PIPE_FORMAT_I16_SINT
, PIPE_FORMAT_R16G16B16A16_SINT
, 0 }
800 { GL_INTENSITY32I_EXT
, 0 },
801 { PIPE_FORMAT_I32_SINT
, PIPE_FORMAT_R32G32B32A32_SINT
, 0 }
804 { GL_INTENSITY8UI_EXT
, 0 },
805 { PIPE_FORMAT_I8_UINT
, PIPE_FORMAT_R8G8B8A8_UINT
, 0 }
808 { GL_INTENSITY16UI_EXT
, 0 },
809 { PIPE_FORMAT_I16_UINT
, PIPE_FORMAT_R16G16B16A16_UINT
, 0 }
812 { GL_INTENSITY32UI_EXT
, 0 },
813 { PIPE_FORMAT_I32_UINT
, PIPE_FORMAT_R32G32B32A32_UINT
, 0 }
816 { GL_LUMINANCE8I_EXT
, 0 },
817 { PIPE_FORMAT_L8_SINT
, PIPE_FORMAT_R8G8B8A8_SINT
, 0 }
820 { GL_LUMINANCE16I_EXT
, 0 },
821 { PIPE_FORMAT_L16_SINT
, PIPE_FORMAT_R16G16B16A16_SINT
, 0 }
824 { GL_LUMINANCE32I_EXT
, 0 },
825 { PIPE_FORMAT_L32_SINT
, PIPE_FORMAT_R32G32B32A32_SINT
, 0 }
828 { GL_LUMINANCE_INTEGER_EXT
,
829 GL_LUMINANCE8UI_EXT
, 0 },
830 { PIPE_FORMAT_L8_UINT
, PIPE_FORMAT_R8G8B8A8_UINT
, 0 }
833 { GL_LUMINANCE16UI_EXT
, 0 },
834 { PIPE_FORMAT_L16_UINT
, PIPE_FORMAT_R16G16B16A16_UINT
, 0 }
837 { GL_LUMINANCE32UI_EXT
, 0 },
838 { PIPE_FORMAT_L32_UINT
, PIPE_FORMAT_R32G32B32A32_UINT
, 0 }
841 { GL_LUMINANCE_ALPHA_INTEGER_EXT
,
842 GL_LUMINANCE_ALPHA8I_EXT
, 0 },
843 { PIPE_FORMAT_L8A8_SINT
, PIPE_FORMAT_R8G8B8A8_SINT
, 0 }
846 { GL_LUMINANCE_ALPHA16I_EXT
, 0 },
847 { PIPE_FORMAT_L16A16_SINT
, PIPE_FORMAT_R16G16B16A16_SINT
, 0 }
850 { GL_LUMINANCE_ALPHA32I_EXT
, 0 },
851 { PIPE_FORMAT_L32A32_SINT
, PIPE_FORMAT_R32G32B32A32_SINT
, 0 }
854 { GL_LUMINANCE_ALPHA8UI_EXT
, 0 },
855 { PIPE_FORMAT_L8A8_UINT
, PIPE_FORMAT_R8G8B8A8_UINT
, 0 }
858 { GL_LUMINANCE_ALPHA16UI_EXT
, 0 },
859 { PIPE_FORMAT_L16A16_UINT
, PIPE_FORMAT_R16G16B16A16_UINT
, 0 }
862 { GL_LUMINANCE_ALPHA32UI_EXT
, 0 },
863 { PIPE_FORMAT_L32A32_UINT
, PIPE_FORMAT_R32G32B32A32_UINT
, 0 }
866 { GL_RGB16I_EXT
, 0 },
867 { PIPE_FORMAT_R16G16B16_SINT
, PIPE_FORMAT_R16G16B16X16_SINT
,
868 PIPE_FORMAT_R16G16B16A16_SINT
, 0 },
871 { GL_RGBA16I_EXT
, 0 },
872 { PIPE_FORMAT_R16G16B16A16_SINT
, 0 },
875 { GL_RGB32I_EXT
, 0 },
876 { PIPE_FORMAT_R32G32B32_SINT
, PIPE_FORMAT_R32G32B32X32_SINT
,
877 PIPE_FORMAT_R32G32B32A32_SINT
, 0 },
880 { GL_RGBA32I_EXT
, 0 },
881 { PIPE_FORMAT_R32G32B32A32_SINT
, 0 }
884 { GL_RGBA8UI_EXT
, 0 },
885 { PIPE_FORMAT_R8G8B8A8_UINT
, 0 }
888 { GL_RGB8UI_EXT
, 0 },
889 { PIPE_FORMAT_R8G8B8_UINT
, PIPE_FORMAT_R8G8B8X8_UINT
,
890 PIPE_FORMAT_R8G8B8A8_UINT
, 0 }
893 { GL_RGB16UI_EXT
, 0 },
894 { PIPE_FORMAT_R16G16B16_UINT
, PIPE_FORMAT_R16G16B16X16_UINT
,
895 PIPE_FORMAT_R16G16B16A16_UINT
, 0 }
898 { GL_RGBA16UI_EXT
, 0 },
899 { PIPE_FORMAT_R16G16B16A16_UINT
, 0 }
902 { GL_RGB32UI_EXT
, 0},
903 { PIPE_FORMAT_R32G32B32_UINT
, PIPE_FORMAT_R32G32B32X32_UINT
,
904 PIPE_FORMAT_R32G32B32A32_UINT
, 0 }
907 { GL_RGBA32UI_EXT
, 0},
908 { PIPE_FORMAT_R32G32B32A32_UINT
, 0 }
911 { GL_R8I
, GL_RED_INTEGER_EXT
, 0},
912 { PIPE_FORMAT_R8_SINT
, 0},
916 { PIPE_FORMAT_R16_SINT
, 0},
920 { PIPE_FORMAT_R32_SINT
, 0},
924 { PIPE_FORMAT_R8_UINT
, 0},
928 { PIPE_FORMAT_R16_UINT
, 0},
932 { PIPE_FORMAT_R32_UINT
, 0},
935 { GL_RG8I
, GL_GREEN_INTEGER_EXT
, 0},
936 { PIPE_FORMAT_R8G8_SINT
, 0},
940 { PIPE_FORMAT_R16G16_SINT
, 0},
944 { PIPE_FORMAT_R32G32_SINT
, 0},
948 { PIPE_FORMAT_R8G8_UINT
, 0},
952 { PIPE_FORMAT_R16G16_UINT
, 0},
956 { PIPE_FORMAT_R32G32_UINT
, 0},
958 /* signed normalized formats */
960 { GL_RED_SNORM
, GL_R8_SNORM
, 0 },
961 { PIPE_FORMAT_R8_SNORM
, PIPE_FORMAT_R8G8_SNORM
,
962 PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
966 { PIPE_FORMAT_R16_SNORM
,
967 PIPE_FORMAT_R16G16_SNORM
,
968 PIPE_FORMAT_R16G16B16A16_SNORM
,
969 PIPE_FORMAT_R8_SNORM
,
970 PIPE_FORMAT_R8G8_SNORM
,
971 PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
974 { GL_RG_SNORM
, GL_RG8_SNORM
, 0 },
975 { PIPE_FORMAT_R8G8_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
978 { GL_RG16_SNORM
, 0 },
979 { PIPE_FORMAT_R16G16_SNORM
, PIPE_FORMAT_R16G16B16A16_SNORM
,
980 PIPE_FORMAT_R8G8_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
983 { GL_RGB_SNORM
, GL_RGB8_SNORM
, 0 },
984 { PIPE_FORMAT_R8G8B8X8_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
987 { GL_RGBA_SNORM
, GL_RGBA8_SNORM
, 0 },
988 { PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
991 { GL_RGB16_SNORM
, 0 },
992 { PIPE_FORMAT_R16G16B16X16_SNORM
, PIPE_FORMAT_R16G16B16A16_SNORM
,
993 PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
996 { GL_RGBA16_SNORM
, 0 },
997 { PIPE_FORMAT_R16G16B16A16_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
1000 { GL_ALPHA_SNORM
, GL_ALPHA8_SNORM
, 0 },
1001 { PIPE_FORMAT_A8_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
1004 { GL_ALPHA16_SNORM
, 0 },
1005 { PIPE_FORMAT_A16_SNORM
, PIPE_FORMAT_R16G16B16A16_SNORM
,
1006 PIPE_FORMAT_A8_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
1009 { GL_LUMINANCE_SNORM
, GL_LUMINANCE8_SNORM
, 0 },
1010 { PIPE_FORMAT_L8_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
1013 { GL_LUMINANCE16_SNORM
, 0 },
1014 { PIPE_FORMAT_L16_SNORM
, PIPE_FORMAT_R16G16B16A16_SNORM
,
1015 PIPE_FORMAT_L8_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
1018 { GL_LUMINANCE_ALPHA_SNORM
, GL_LUMINANCE8_ALPHA8_SNORM
, 0 },
1019 { PIPE_FORMAT_L8A8_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
1022 { GL_LUMINANCE16_ALPHA16_SNORM
, 0 },
1023 { PIPE_FORMAT_L16A16_SNORM
, PIPE_FORMAT_R16G16B16A16_SNORM
,
1024 PIPE_FORMAT_L8A8_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
1027 { GL_INTENSITY_SNORM
, GL_INTENSITY8_SNORM
, 0 },
1028 { PIPE_FORMAT_I8_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
1031 { GL_INTENSITY16_SNORM
, 0 },
1032 { PIPE_FORMAT_I16_SNORM
, PIPE_FORMAT_R16G16B16A16_SNORM
,
1033 PIPE_FORMAT_I8_SNORM
, PIPE_FORMAT_R8G8B8A8_SNORM
, 0 }
1037 { PIPE_FORMAT_R9G9B9E5_FLOAT
, 0 }
1040 { GL_R11F_G11F_B10F
, 0 },
1041 { PIPE_FORMAT_R11G11B10_FLOAT
, 0 }
1044 { GL_RGB10_A2UI
, 0 },
1045 { PIPE_FORMAT_R10G10B10A2_UINT
, PIPE_FORMAT_B10G10R10A2_UINT
, 0 }
1051 * Return first supported format from the given list.
1052 * \param allow_dxt indicates whether it's OK to return a DXT format.
1054 static enum pipe_format
1055 find_supported_format(struct pipe_screen
*screen
,
1056 const enum pipe_format formats
[],
1057 enum pipe_texture_target target
,
1058 unsigned sample_count
,
1059 unsigned storage_sample_count
,
1064 for (i
= 0; formats
[i
]; i
++) {
1065 if (screen
->is_format_supported(screen
, formats
[i
], target
,
1066 sample_count
, storage_sample_count
,
1068 if (!allow_dxt
&& util_format_is_s3tc(formats
[i
])) {
1069 /* we can't return a dxt format, continue searching */
1076 return PIPE_FORMAT_NONE
;
1080 * Given an OpenGL internalFormat value for a texture or surface, return
1081 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
1082 * This is called during glTexImage2D, for example.
1084 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
1085 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
1086 * we want render-to-texture ability.
1088 * \param internalFormat the user value passed to glTexImage2D
1089 * \param target one of PIPE_TEXTURE_x
1090 * \param bindings bitmask of PIPE_BIND_x flags.
1091 * \param allow_dxt indicates whether it's OK to return a DXT format. This
1092 * only matters when internalFormat names a generic or
1093 * specific compressed format. And that should only happen
1094 * when we're getting called from gl[Copy]TexImage().
1097 st_choose_format(struct st_context
*st
, GLenum internalFormat
,
1098 GLenum format
, GLenum type
,
1099 enum pipe_texture_target target
, unsigned sample_count
,
1100 unsigned storage_sample_count
,
1101 unsigned bindings
, bool swap_bytes
, bool allow_dxt
)
1103 struct pipe_screen
*screen
= st
->pipe
->screen
;
1106 enum pipe_format pf
;
1108 /* can't render to compressed formats at this time */
1109 if (_mesa_is_compressed_format(st
->ctx
, internalFormat
)
1110 && (bindings
& ~PIPE_BIND_SAMPLER_VIEW
)) {
1111 return PIPE_FORMAT_NONE
;
1114 /* If we have an unsized internalFormat, and the driver supports a format
1115 * that exactly matches format/type such that we can just memcpy, pick that
1116 * (unless the format wouldn't still be unorm, which is the expectation for
1119 if (_mesa_is_enum_format_unsized(internalFormat
) && format
!= 0 &&
1120 _mesa_is_type_unsigned(type
)) {
1121 pf
= st_choose_matching_format(st
, bindings
, format
, type
,
1124 if (pf
!= PIPE_FORMAT_NONE
&&
1125 screen
->is_format_supported(screen
, pf
, target
, sample_count
,
1126 storage_sample_count
, bindings
) &&
1127 _mesa_get_format_base_format(st_pipe_format_to_mesa_format(pf
)) ==
1133 /* For an unsized GL_RGB but a 2_10_10_10 type, try to pick one of the
1134 * 2_10_10_10 formats. This is important for
1135 * GL_EXT_texture_type_2_10_10_10_EXT support, which says that these
1136 * formats are not color-renderable. Mesa's check for making those
1137 * non-color-renderable is based on our chosen format being 2101010.
1139 if (type
== GL_UNSIGNED_INT_2_10_10_10_REV
) {
1140 if (internalFormat
== GL_RGB
)
1141 internalFormat
= GL_RGB10
;
1142 else if (internalFormat
== GL_RGBA
)
1143 internalFormat
= GL_RGB10_A2
;
1146 if (type
== GL_UNSIGNED_SHORT_5_5_5_1
) {
1147 if (internalFormat
== GL_RGB
)
1148 internalFormat
= GL_RGB5
;
1149 else if (internalFormat
== GL_RGBA
)
1150 internalFormat
= GL_RGB5_A1
;
1153 /* search table for internalFormat */
1154 for (i
= 0; i
< ARRAY_SIZE(format_map
); i
++) {
1155 const struct format_mapping
*mapping
= &format_map
[i
];
1156 for (j
= 0; mapping
->glFormats
[j
]; j
++) {
1157 if (mapping
->glFormats
[j
] == internalFormat
) {
1158 /* Found the desired internal format. Find first pipe format
1159 * which is supported by the driver.
1161 pf
= find_supported_format(screen
, mapping
->pipeFormats
,
1162 target
, sample_count
,
1163 storage_sample_count
, bindings
,
1170 _mesa_problem(NULL
, "unhandled format!\n");
1171 return PIPE_FORMAT_NONE
;
1175 debug_printf("%s(fmt=%s, type=%s, intFmt=%s) = %s\n",
1177 _mesa_enum_to_string(format
),
1178 _mesa_enum_to_string(type
),
1179 _mesa_enum_to_string(internalFormat
),
1180 util_format_name(pf
));
1187 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
1190 st_choose_renderbuffer_format(struct st_context
*st
,
1191 GLenum internalFormat
, unsigned sample_count
,
1192 unsigned storage_sample_count
)
1195 if (_mesa_is_depth_or_stencil_format(internalFormat
))
1196 bindings
= PIPE_BIND_DEPTH_STENCIL
;
1198 bindings
= PIPE_BIND_RENDER_TARGET
;
1199 return st_choose_format(st
, internalFormat
, GL_NONE
, GL_NONE
,
1200 PIPE_TEXTURE_2D
, sample_count
,
1201 storage_sample_count
, bindings
,
1207 * Given an OpenGL user-requested format and type, and swapBytes state,
1208 * return the format which exactly matches those parameters, so that
1209 * a memcpy-based transfer can be done.
1211 * If no format is supported, return PIPE_FORMAT_NONE.
1214 st_choose_matching_format(struct st_context
*st
, unsigned bind
,
1215 GLenum format
, GLenum type
, GLboolean swapBytes
)
1217 struct pipe_screen
*screen
= st
->pipe
->screen
;
1219 if (swapBytes
&& !_mesa_swap_bytes_in_type_enum(&type
))
1220 return PIPE_FORMAT_NONE
;
1222 mesa_format mesa_format
= _mesa_format_from_format_and_type(format
, type
);
1223 if (_mesa_format_is_mesa_array_format(mesa_format
))
1224 mesa_format
= _mesa_format_from_array_format(mesa_format
);
1225 if (mesa_format
!= MESA_FORMAT_NONE
) {
1226 enum pipe_format format
= st_mesa_format_to_pipe_format(st
, mesa_format
);
1227 if (format
!= PIPE_FORMAT_NONE
&&
1228 screen
->is_format_supported(screen
, format
, PIPE_TEXTURE_2D
, 0, 0, bind
))
1232 return PIPE_FORMAT_NONE
;
1237 * Called via ctx->Driver.ChooseTextureFormat().
1240 st_ChooseTextureFormat(struct gl_context
*ctx
, GLenum target
,
1241 GLint internalFormat
,
1242 GLenum format
, GLenum type
)
1244 struct st_context
*st
= st_context(ctx
);
1245 enum pipe_format pFormat
;
1246 mesa_format mFormat
;
1248 bool is_renderbuffer
= false;
1249 enum pipe_texture_target pTarget
;
1251 if (target
== GL_RENDERBUFFER
) {
1252 pTarget
= PIPE_TEXTURE_2D
;
1253 is_renderbuffer
= true;
1255 pTarget
= gl_target_to_pipe(target
);
1258 if (target
== GL_TEXTURE_1D
|| target
== GL_TEXTURE_1D_ARRAY
) {
1259 /* We don't do compression for these texture targets because of
1260 * difficulty with sub-texture updates on non-block boundaries, etc.
1261 * So change the internal format request to an uncompressed format.
1264 _mesa_generic_compressed_format_to_uncompressed_format(internalFormat
);
1267 /* GL textures may wind up being render targets, but we don't know
1268 * that in advance. Specify potential render target flags now for formats
1269 * that we know should always be renderable.
1271 bindings
= PIPE_BIND_SAMPLER_VIEW
;
1272 if (_mesa_is_depth_or_stencil_format(internalFormat
))
1273 bindings
|= PIPE_BIND_DEPTH_STENCIL
;
1274 else if (is_renderbuffer
|| internalFormat
== 3 || internalFormat
== 4 ||
1275 internalFormat
== GL_RGB
|| internalFormat
== GL_RGBA
||
1276 internalFormat
== GL_RGBA2
||
1277 internalFormat
== GL_RGB4
|| internalFormat
== GL_RGBA4
||
1278 internalFormat
== GL_RGB8
|| internalFormat
== GL_RGBA8
||
1279 internalFormat
== GL_BGRA
||
1280 internalFormat
== GL_RGB16F
||
1281 internalFormat
== GL_RGBA16F
||
1282 internalFormat
== GL_RGB32F
||
1283 internalFormat
== GL_RGBA32F
)
1284 bindings
|= PIPE_BIND_RENDER_TARGET
;
1286 /* GLES allows the driver to choose any format which matches
1287 * the format+type combo, because GLES only supports unsized internal
1288 * formats and expects the driver to choose whatever suits it.
1290 if (_mesa_is_gles(ctx
)) {
1291 GLenum baseFormat
= _mesa_base_tex_format(ctx
, internalFormat
);
1292 GLenum basePackFormat
= _mesa_base_pack_format(format
);
1293 GLenum iformat
= internalFormat
;
1295 /* Treat GL_BGRA as GL_RGBA. */
1296 if (iformat
== GL_BGRA
)
1299 /* Check if the internalformat is unsized and compatible
1300 * with the "format".
1302 if (iformat
== baseFormat
&& iformat
== basePackFormat
) {
1303 pFormat
= st_choose_matching_format(st
, bindings
, format
, type
,
1304 ctx
->Unpack
.SwapBytes
);
1306 if (pFormat
!= PIPE_FORMAT_NONE
)
1307 return st_pipe_format_to_mesa_format(pFormat
);
1309 if (!is_renderbuffer
) {
1310 /* try choosing format again, this time without render
1313 pFormat
= st_choose_matching_format(st
, PIPE_BIND_SAMPLER_VIEW
,
1315 ctx
->Unpack
.SwapBytes
);
1316 if (pFormat
!= PIPE_FORMAT_NONE
)
1317 return st_pipe_format_to_mesa_format(pFormat
);
1322 pFormat
= st_choose_format(st
, internalFormat
, format
, type
,
1323 pTarget
, 0, 0, bindings
,
1324 ctx
->Unpack
.SwapBytes
, true);
1326 if (pFormat
== PIPE_FORMAT_NONE
&& !is_renderbuffer
) {
1327 /* try choosing format again, this time without render target bindings */
1328 pFormat
= st_choose_format(st
, internalFormat
, format
, type
,
1329 pTarget
, 0, 0, PIPE_BIND_SAMPLER_VIEW
,
1330 ctx
->Unpack
.SwapBytes
, true);
1333 if (pFormat
== PIPE_FORMAT_NONE
) {
1334 mFormat
= _mesa_glenum_to_compressed_format(internalFormat
);
1335 if (st_compressed_format_fallback(st
, mFormat
))
1338 /* no luck at all */
1339 return MESA_FORMAT_NONE
;
1342 mFormat
= st_pipe_format_to_mesa_format(pFormat
);
1346 debug_printf("%s(intFormat=%s, format=%s, type=%s) -> %s, %s\n",
1348 _mesa_enum_to_string(internalFormat
),
1349 _mesa_enum_to_string(format
),
1350 _mesa_enum_to_string(type
),
1351 util_format_name(pFormat
),
1352 _mesa_get_format_name(mFormat
));
1360 * Called via ctx->Driver.QueryInternalFormat().
1363 st_QuerySamplesForFormat(struct gl_context
*ctx
, GLenum target
,
1364 GLenum internalFormat
, int samples
[16])
1366 struct st_context
*st
= st_context(ctx
);
1367 enum pipe_format format
;
1368 unsigned i
, bind
, num_sample_counts
= 0;
1372 if (_mesa_is_depth_or_stencil_format(internalFormat
))
1373 bind
= PIPE_BIND_DEPTH_STENCIL
;
1375 bind
= PIPE_BIND_RENDER_TARGET
;
1377 /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
1380 if (!ctx
->Extensions
.EXT_sRGB
) {
1381 internalFormat
= _mesa_get_linear_internalformat(internalFormat
);
1384 /* Set sample counts in descending order. */
1385 for (i
= 16; i
> 1; i
--) {
1386 format
= st_choose_format(st
, internalFormat
, GL_NONE
, GL_NONE
,
1387 PIPE_TEXTURE_2D
, i
, i
, bind
,
1390 if (format
!= PIPE_FORMAT_NONE
) {
1391 samples
[num_sample_counts
++] = i
;
1395 if (!num_sample_counts
) {
1396 samples
[num_sample_counts
++] = 1;
1399 return num_sample_counts
;
1404 * ARB_internalformat_query2 driver hook.
1407 st_QueryInternalFormat(struct gl_context
*ctx
, GLenum target
,
1408 GLenum internalFormat
, GLenum pname
, GLint
*params
)
1410 struct st_context
*st
= st_context(ctx
);
1411 /* The API entry-point gives us a temporary params buffer that is non-NULL
1412 * and guaranteed to have at least 16 elements.
1414 assert(params
!= NULL
);
1418 st_QuerySamplesForFormat(ctx
, target
, internalFormat
, params
);
1421 case GL_NUM_SAMPLE_COUNTS
: {
1424 num_samples
= st_QuerySamplesForFormat(ctx
, target
, internalFormat
,
1426 params
[0] = (GLint
) num_samples
;
1429 case GL_INTERNALFORMAT_PREFERRED
: {
1430 params
[0] = GL_NONE
;
1432 /* We need to resolve an internal format that is compatible with
1433 * the passed internal format, and optimal to the driver. By now,
1434 * we just validate that the passed internal format is supported by
1435 * the driver, and if so return the same internal format, otherwise
1439 if (_mesa_is_depth_or_stencil_format(internalFormat
))
1440 bindings
= PIPE_BIND_DEPTH_STENCIL
;
1442 bindings
= PIPE_BIND_RENDER_TARGET
;
1443 enum pipe_format pformat
= st_choose_format(st
,
1447 PIPE_TEXTURE_2D
, 0, 0,
1451 params
[0] = internalFormat
;
1455 /* For the rest of the pnames, we call back the Mesa's default
1456 * function for drivers that don't implement ARB_internalformat_query2.
1458 _mesa_query_internal_format_default(ctx
, target
, internalFormat
, pname
,
1465 * This is used for translating texture border color and the clear
1466 * color. For example, the clear color is interpreted according to
1467 * the renderbuffer's base format. For example, if clearing a
1468 * GL_LUMINANCE buffer, we'll return colorOut[0] = colorOut[1] =
1469 * colorOut[2] = colorIn[0].
1470 * Similarly for texture border colors.
1473 st_translate_color(const union gl_color_union
*colorIn
,
1474 union pipe_color_union
*colorOut
,
1475 GLenum baseFormat
, GLboolean is_integer
)
1478 const int *in
= colorIn
->i
;
1479 int *out
= colorOut
->i
;
1481 switch (baseFormat
) {
1501 out
[0] = out
[1] = out
[2] = 0;
1505 out
[0] = out
[1] = out
[2] = in
[0];
1508 case GL_LUMINANCE_ALPHA
:
1509 out
[0] = out
[1] = out
[2] = in
[0];
1513 out
[0] = out
[1] = out
[2] = out
[3] = in
[0];
1520 const float *in
= colorIn
->f
;
1521 float *out
= colorOut
->f
;
1523 switch (baseFormat
) {
1543 out
[0] = out
[1] = out
[2] = 0.0F
;
1547 out
[0] = out
[1] = out
[2] = in
[0];
1550 case GL_LUMINANCE_ALPHA
:
1551 out
[0] = out
[1] = out
[2] = in
[0];
1554 /* Stencil border is tricky on some hw. Help drivers a little here. */
1555 case GL_STENCIL_INDEX
:
1557 out
[0] = out
[1] = out
[2] = out
[3] = in
[0];