mesa/st: Add mapping of MESA_FORMAT_RGB_SNORM16 to gallium.
[mesa.git] / src / mesa / state_tracker / st_format.c
1 /**************************************************************************
2 *
3 * Copyright 2007 VMware, Inc.
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 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.
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/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"
47
48 #include "pipe/p_context.h"
49 #include "pipe/p_defines.h"
50 #include "pipe/p_screen.h"
51 #include "util/u_format.h"
52 #include "st_cb_texture.h"
53 #include "st_context.h"
54 #include "st_format.h"
55 #include "st_texture.h"
56
57
58 /**
59 * Translate Mesa format to Gallium format.
60 */
61 enum pipe_format
62 st_mesa_format_to_pipe_format(const struct st_context *st,
63 mesa_format mesaFormat)
64 {
65 struct pipe_screen *screen = st->pipe->screen;
66 bool has_bgra_srgb = screen->is_format_supported(screen,
67 PIPE_FORMAT_B8G8R8A8_SRGB,
68 PIPE_TEXTURE_2D, 0, 0,
69 PIPE_BIND_SAMPLER_VIEW);
70
71 switch (mesaFormat) {
72 case MESA_FORMAT_A8B8G8R8_UNORM:
73 return PIPE_FORMAT_ABGR8888_UNORM;
74 case MESA_FORMAT_RGB_UNORM8:
75 return PIPE_FORMAT_R8G8B8_UNORM;
76 case MESA_FORMAT_R8G8B8A8_UNORM:
77 return PIPE_FORMAT_RGBA8888_UNORM;
78 case MESA_FORMAT_B8G8R8A8_UNORM:
79 return PIPE_FORMAT_BGRA8888_UNORM;
80 case MESA_FORMAT_A8R8G8B8_UNORM:
81 return PIPE_FORMAT_ARGB8888_UNORM;
82 case MESA_FORMAT_X8B8G8R8_UNORM:
83 return PIPE_FORMAT_XBGR8888_UNORM;
84 case MESA_FORMAT_R8G8B8X8_UNORM:
85 return PIPE_FORMAT_RGBX8888_UNORM;
86 case MESA_FORMAT_B8G8R8X8_UNORM:
87 return PIPE_FORMAT_BGRX8888_UNORM;
88 case MESA_FORMAT_X8R8G8B8_UNORM:
89 return PIPE_FORMAT_XRGB8888_UNORM;
90 case MESA_FORMAT_B5G5R5A1_UNORM:
91 return PIPE_FORMAT_B5G5R5A1_UNORM;
92 case MESA_FORMAT_A1B5G5R5_UNORM:
93 return PIPE_FORMAT_A1B5G5R5_UNORM;
94 case MESA_FORMAT_B4G4R4A4_UNORM:
95 return PIPE_FORMAT_B4G4R4A4_UNORM;
96 case MESA_FORMAT_A4B4G4R4_UNORM:
97 return PIPE_FORMAT_A4B4G4R4_UNORM;
98 case MESA_FORMAT_B5G6R5_UNORM:
99 return PIPE_FORMAT_B5G6R5_UNORM;
100 case MESA_FORMAT_B2G3R3_UNORM:
101 return PIPE_FORMAT_B2G3R3_UNORM;
102 case MESA_FORMAT_B10G10R10A2_UNORM:
103 return PIPE_FORMAT_B10G10R10A2_UNORM;
104 case MESA_FORMAT_R10G10B10A2_UNORM:
105 return PIPE_FORMAT_R10G10B10A2_UNORM;
106 case MESA_FORMAT_R10G10B10X2_UNORM:
107 return PIPE_FORMAT_R10G10B10X2_UNORM;
108 case MESA_FORMAT_L4A4_UNORM:
109 return PIPE_FORMAT_L4A4_UNORM;
110 case MESA_FORMAT_A_UNORM8:
111 return PIPE_FORMAT_A8_UNORM;
112 case MESA_FORMAT_A_UNORM16:
113 return PIPE_FORMAT_A16_UNORM;
114 case MESA_FORMAT_L_UNORM8:
115 return PIPE_FORMAT_L8_UNORM;
116 case MESA_FORMAT_L_UNORM16:
117 return PIPE_FORMAT_L16_UNORM;
118 case MESA_FORMAT_LA_UNORM8:
119 return PIPE_FORMAT_L8A8_UNORM;
120 case MESA_FORMAT_LA_UNORM16:
121 return PIPE_FORMAT_L16A16_UNORM;
122 case MESA_FORMAT_I_UNORM8:
123 return PIPE_FORMAT_I8_UNORM;
124 case MESA_FORMAT_I_UNORM16:
125 return PIPE_FORMAT_I16_UNORM;
126 case MESA_FORMAT_Z_UNORM16:
127 return PIPE_FORMAT_Z16_UNORM;
128 case MESA_FORMAT_Z_UNORM32:
129 return PIPE_FORMAT_Z32_UNORM;
130 case MESA_FORMAT_S8_UINT_Z24_UNORM:
131 return PIPE_FORMAT_S8_UINT_Z24_UNORM;
132 case MESA_FORMAT_Z24_UNORM_S8_UINT:
133 return PIPE_FORMAT_Z24_UNORM_S8_UINT;
134 case MESA_FORMAT_X8_UINT_Z24_UNORM:
135 return PIPE_FORMAT_X8Z24_UNORM;
136 case MESA_FORMAT_Z24_UNORM_X8_UINT:
137 return PIPE_FORMAT_Z24X8_UNORM;
138 case MESA_FORMAT_S_UINT8:
139 return PIPE_FORMAT_S8_UINT;
140 case MESA_FORMAT_Z_FLOAT32:
141 return PIPE_FORMAT_Z32_FLOAT;
142 case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
143 return PIPE_FORMAT_Z32_FLOAT_S8X24_UINT;
144 case MESA_FORMAT_YCBCR:
145 return PIPE_FORMAT_UYVY;
146 case MESA_FORMAT_YCBCR_REV:
147 return PIPE_FORMAT_YUYV;
148 case MESA_FORMAT_RGB_DXT1:
149 return PIPE_FORMAT_DXT1_RGB;
150 case MESA_FORMAT_RGBA_DXT1:
151 return PIPE_FORMAT_DXT1_RGBA;
152 case MESA_FORMAT_RGBA_DXT3:
153 return PIPE_FORMAT_DXT3_RGBA;
154 case MESA_FORMAT_RGBA_DXT5:
155 return PIPE_FORMAT_DXT5_RGBA;
156 case MESA_FORMAT_SRGB_DXT1:
157 return PIPE_FORMAT_DXT1_SRGB;
158 case MESA_FORMAT_SRGBA_DXT1:
159 return PIPE_FORMAT_DXT1_SRGBA;
160 case MESA_FORMAT_SRGBA_DXT3:
161 return PIPE_FORMAT_DXT3_SRGBA;
162 case MESA_FORMAT_SRGBA_DXT5:
163 return PIPE_FORMAT_DXT5_SRGBA;
164 case MESA_FORMAT_L_SRGB8:
165 return PIPE_FORMAT_L8_SRGB;
166 case MESA_FORMAT_LA_SRGB8:
167 return PIPE_FORMAT_L8A8_SRGB;
168 case MESA_FORMAT_R_SRGB8:
169 return PIPE_FORMAT_R8_SRGB;
170 case MESA_FORMAT_BGR_SRGB8:
171 return PIPE_FORMAT_R8G8B8_SRGB;
172 case MESA_FORMAT_A8B8G8R8_SRGB:
173 return PIPE_FORMAT_ABGR8888_SRGB;
174 case MESA_FORMAT_R8G8B8A8_SRGB:
175 return PIPE_FORMAT_RGBA8888_SRGB;
176 case MESA_FORMAT_B8G8R8A8_SRGB:
177 return PIPE_FORMAT_BGRA8888_SRGB;
178 case MESA_FORMAT_A8R8G8B8_SRGB:
179 return PIPE_FORMAT_ARGB8888_SRGB;
180 case MESA_FORMAT_RGBA_FLOAT32:
181 return PIPE_FORMAT_R32G32B32A32_FLOAT;
182 case MESA_FORMAT_RGBA_FLOAT16:
183 return PIPE_FORMAT_R16G16B16A16_FLOAT;
184 case MESA_FORMAT_RGB_FLOAT32:
185 return PIPE_FORMAT_R32G32B32_FLOAT;
186 case MESA_FORMAT_RGB_FLOAT16:
187 return PIPE_FORMAT_R16G16B16_FLOAT;
188 case MESA_FORMAT_LA_FLOAT32:
189 return PIPE_FORMAT_L32A32_FLOAT;
190 case MESA_FORMAT_LA_FLOAT16:
191 return PIPE_FORMAT_L16A16_FLOAT;
192 case MESA_FORMAT_L_FLOAT32:
193 return PIPE_FORMAT_L32_FLOAT;
194 case MESA_FORMAT_L_FLOAT16:
195 return PIPE_FORMAT_L16_FLOAT;
196 case MESA_FORMAT_A_FLOAT32:
197 return PIPE_FORMAT_A32_FLOAT;
198 case MESA_FORMAT_A_FLOAT16:
199 return PIPE_FORMAT_A16_FLOAT;
200 case MESA_FORMAT_I_FLOAT32:
201 return PIPE_FORMAT_I32_FLOAT;
202 case MESA_FORMAT_I_FLOAT16:
203 return PIPE_FORMAT_I16_FLOAT;
204 case MESA_FORMAT_R_FLOAT32:
205 return PIPE_FORMAT_R32_FLOAT;
206 case MESA_FORMAT_R_FLOAT16:
207 return PIPE_FORMAT_R16_FLOAT;
208 case MESA_FORMAT_RG_FLOAT32:
209 return PIPE_FORMAT_R32G32_FLOAT;
210 case MESA_FORMAT_RG_FLOAT16:
211 return PIPE_FORMAT_R16G16_FLOAT;
212
213 case MESA_FORMAT_R_UNORM8:
214 return PIPE_FORMAT_R8_UNORM;
215 case MESA_FORMAT_R_UNORM16:
216 return PIPE_FORMAT_R16_UNORM;
217 case MESA_FORMAT_RG_UNORM8:
218 return PIPE_FORMAT_R8G8_UNORM;
219 case MESA_FORMAT_RG_UNORM16:
220 return PIPE_FORMAT_R16G16_UNORM;
221 case MESA_FORMAT_RGBA_UNORM16:
222 return PIPE_FORMAT_R16G16B16A16_UNORM;
223
224 /* signed int formats */
225 case MESA_FORMAT_A_UINT8:
226 return PIPE_FORMAT_A8_UINT;
227 case MESA_FORMAT_A_UINT16:
228 return PIPE_FORMAT_A16_UINT;
229 case MESA_FORMAT_A_UINT32:
230 return PIPE_FORMAT_A32_UINT;
231
232 case MESA_FORMAT_A_SINT8:
233 return PIPE_FORMAT_A8_SINT;
234 case MESA_FORMAT_A_SINT16:
235 return PIPE_FORMAT_A16_SINT;
236 case MESA_FORMAT_A_SINT32:
237 return PIPE_FORMAT_A32_SINT;
238
239 case MESA_FORMAT_I_UINT8:
240 return PIPE_FORMAT_I8_UINT;
241 case MESA_FORMAT_I_UINT16:
242 return PIPE_FORMAT_I16_UINT;
243 case MESA_FORMAT_I_UINT32:
244 return PIPE_FORMAT_I32_UINT;
245
246 case MESA_FORMAT_I_SINT8:
247 return PIPE_FORMAT_I8_SINT;
248 case MESA_FORMAT_I_SINT16:
249 return PIPE_FORMAT_I16_SINT;
250 case MESA_FORMAT_I_SINT32:
251 return PIPE_FORMAT_I32_SINT;
252
253 case MESA_FORMAT_L_UINT8:
254 return PIPE_FORMAT_L8_UINT;
255 case MESA_FORMAT_L_UINT16:
256 return PIPE_FORMAT_L16_UINT;
257 case MESA_FORMAT_L_UINT32:
258 return PIPE_FORMAT_L32_UINT;
259
260 case MESA_FORMAT_L_SINT8:
261 return PIPE_FORMAT_L8_SINT;
262 case MESA_FORMAT_L_SINT16:
263 return PIPE_FORMAT_L16_SINT;
264 case MESA_FORMAT_L_SINT32:
265 return PIPE_FORMAT_L32_SINT;
266
267 case MESA_FORMAT_LA_UINT8:
268 return PIPE_FORMAT_L8A8_UINT;
269 case MESA_FORMAT_LA_UINT16:
270 return PIPE_FORMAT_L16A16_UINT;
271 case MESA_FORMAT_LA_UINT32:
272 return PIPE_FORMAT_L32A32_UINT;
273
274 case MESA_FORMAT_LA_SINT8:
275 return PIPE_FORMAT_L8A8_SINT;
276 case MESA_FORMAT_LA_SINT16:
277 return PIPE_FORMAT_L16A16_SINT;
278 case MESA_FORMAT_LA_SINT32:
279 return PIPE_FORMAT_L32A32_SINT;
280
281 case MESA_FORMAT_R_SINT8:
282 return PIPE_FORMAT_R8_SINT;
283 case MESA_FORMAT_RG_SINT8:
284 return PIPE_FORMAT_R8G8_SINT;
285 case MESA_FORMAT_RGB_SINT8:
286 return PIPE_FORMAT_R8G8B8_SINT;
287 case MESA_FORMAT_RGBA_SINT8:
288 return PIPE_FORMAT_R8G8B8A8_SINT;
289 case MESA_FORMAT_R_SINT16:
290 return PIPE_FORMAT_R16_SINT;
291 case MESA_FORMAT_RG_SINT16:
292 return PIPE_FORMAT_R16G16_SINT;
293 case MESA_FORMAT_RGB_SINT16:
294 return PIPE_FORMAT_R16G16B16_SINT;
295 case MESA_FORMAT_RGBA_SINT16:
296 return PIPE_FORMAT_R16G16B16A16_SINT;
297 case MESA_FORMAT_R_SINT32:
298 return PIPE_FORMAT_R32_SINT;
299 case MESA_FORMAT_RG_SINT32:
300 return PIPE_FORMAT_R32G32_SINT;
301 case MESA_FORMAT_RGB_SINT32:
302 return PIPE_FORMAT_R32G32B32_SINT;
303 case MESA_FORMAT_RGBA_SINT32:
304 return PIPE_FORMAT_R32G32B32A32_SINT;
305
306 /* unsigned int formats */
307 case MESA_FORMAT_R_UINT8:
308 return PIPE_FORMAT_R8_UINT;
309 case MESA_FORMAT_RG_UINT8:
310 return PIPE_FORMAT_R8G8_UINT;
311 case MESA_FORMAT_RGB_UINT8:
312 return PIPE_FORMAT_R8G8B8_UINT;
313 case MESA_FORMAT_RGBA_UINT8:
314 return PIPE_FORMAT_R8G8B8A8_UINT;
315 case MESA_FORMAT_R_UINT16:
316 return PIPE_FORMAT_R16_UINT;
317 case MESA_FORMAT_RG_UINT16:
318 return PIPE_FORMAT_R16G16_UINT;
319 case MESA_FORMAT_RGB_UINT16:
320 return PIPE_FORMAT_R16G16B16_UINT;
321 case MESA_FORMAT_RGBA_UINT16:
322 return PIPE_FORMAT_R16G16B16A16_UINT;
323 case MESA_FORMAT_R_UINT32:
324 return PIPE_FORMAT_R32_UINT;
325 case MESA_FORMAT_RG_UINT32:
326 return PIPE_FORMAT_R32G32_UINT;
327 case MESA_FORMAT_RGB_UINT32:
328 return PIPE_FORMAT_R32G32B32_UINT;
329 case MESA_FORMAT_RGBA_UINT32:
330 return PIPE_FORMAT_R32G32B32A32_UINT;
331
332 case MESA_FORMAT_R_RGTC1_UNORM:
333 return PIPE_FORMAT_RGTC1_UNORM;
334 case MESA_FORMAT_R_RGTC1_SNORM:
335 return PIPE_FORMAT_RGTC1_SNORM;
336 case MESA_FORMAT_RG_RGTC2_UNORM:
337 return PIPE_FORMAT_RGTC2_UNORM;
338 case MESA_FORMAT_RG_RGTC2_SNORM:
339 return PIPE_FORMAT_RGTC2_SNORM;
340
341 case MESA_FORMAT_L_LATC1_UNORM:
342 return PIPE_FORMAT_LATC1_UNORM;
343 case MESA_FORMAT_L_LATC1_SNORM:
344 return PIPE_FORMAT_LATC1_SNORM;
345 case MESA_FORMAT_LA_LATC2_UNORM:
346 return PIPE_FORMAT_LATC2_UNORM;
347 case MESA_FORMAT_LA_LATC2_SNORM:
348 return PIPE_FORMAT_LATC2_SNORM;
349
350 /* The destination RGBA format mustn't be changed, because it's also
351 * a destination format of the unpack/decompression function. */
352 case MESA_FORMAT_ETC1_RGB8:
353 return st->has_etc1 ? PIPE_FORMAT_ETC1_RGB8 : PIPE_FORMAT_R8G8B8A8_UNORM;
354
355 case MESA_FORMAT_BPTC_RGBA_UNORM:
356 return PIPE_FORMAT_BPTC_RGBA_UNORM;
357 case MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM:
358 return PIPE_FORMAT_BPTC_SRGBA;
359 case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT:
360 return PIPE_FORMAT_BPTC_RGB_FLOAT;
361 case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT:
362 return PIPE_FORMAT_BPTC_RGB_UFLOAT;
363
364 /* signed normalized formats */
365 case MESA_FORMAT_R_SNORM8:
366 return PIPE_FORMAT_R8_SNORM;
367 case MESA_FORMAT_RG_SNORM8:
368 return PIPE_FORMAT_R8G8_SNORM;
369 case MESA_FORMAT_R8G8B8A8_SNORM:
370 return PIPE_FORMAT_RGBA8888_SNORM;
371 case MESA_FORMAT_A8B8G8R8_SNORM:
372 return PIPE_FORMAT_ABGR8888_SNORM;
373
374 case MESA_FORMAT_A_SNORM8:
375 return PIPE_FORMAT_A8_SNORM;
376 case MESA_FORMAT_L_SNORM8:
377 return PIPE_FORMAT_L8_SNORM;
378 case MESA_FORMAT_LA_SNORM8:
379 return PIPE_FORMAT_L8A8_SNORM;
380 case MESA_FORMAT_I_SNORM8:
381 return PIPE_FORMAT_I8_SNORM;
382
383 case MESA_FORMAT_R_SNORM16:
384 return PIPE_FORMAT_R16_SNORM;
385 case MESA_FORMAT_RG_SNORM16:
386 return PIPE_FORMAT_R16G16_SNORM;
387 case MESA_FORMAT_RGB_SNORM16:
388 return PIPE_FORMAT_R16G16B16_SNORM;
389 case MESA_FORMAT_RGBA_SNORM16:
390 return PIPE_FORMAT_R16G16B16A16_SNORM;
391
392 case MESA_FORMAT_A_SNORM16:
393 return PIPE_FORMAT_A16_SNORM;
394 case MESA_FORMAT_L_SNORM16:
395 return PIPE_FORMAT_L16_SNORM;
396 case MESA_FORMAT_LA_SNORM16:
397 return PIPE_FORMAT_L16A16_SNORM;
398 case MESA_FORMAT_I_SNORM16:
399 return PIPE_FORMAT_I16_SNORM;
400
401 case MESA_FORMAT_R9G9B9E5_FLOAT:
402 return PIPE_FORMAT_R9G9B9E5_FLOAT;
403 case MESA_FORMAT_R11G11B10_FLOAT:
404 return PIPE_FORMAT_R11G11B10_FLOAT;
405 case MESA_FORMAT_B10G10R10A2_UINT:
406 return PIPE_FORMAT_B10G10R10A2_UINT;
407 case MESA_FORMAT_R10G10B10A2_UINT:
408 return PIPE_FORMAT_R10G10B10A2_UINT;
409
410 case MESA_FORMAT_B4G4R4X4_UNORM:
411 return PIPE_FORMAT_B4G4R4X4_UNORM;
412 case MESA_FORMAT_B5G5R5X1_UNORM:
413 return PIPE_FORMAT_B5G5R5X1_UNORM;
414 case MESA_FORMAT_X1B5G5R5_UNORM:
415 return PIPE_FORMAT_X1B5G5R5_UNORM;
416 case MESA_FORMAT_R8G8B8X8_SNORM:
417 return PIPE_FORMAT_RGBX8888_SNORM;
418 case MESA_FORMAT_X8B8G8R8_SNORM:
419 return PIPE_FORMAT_XBGR8888_SNORM;
420 case MESA_FORMAT_R8G8B8X8_SRGB:
421 return PIPE_FORMAT_RGBX8888_SRGB;
422 case MESA_FORMAT_X8B8G8R8_SRGB:
423 return PIPE_FORMAT_XBGR8888_SRGB;
424 case MESA_FORMAT_RGBX_UINT8:
425 return PIPE_FORMAT_R8G8B8X8_UINT;
426 case MESA_FORMAT_RGBX_SINT8:
427 return PIPE_FORMAT_R8G8B8X8_SINT;
428 case MESA_FORMAT_B10G10R10X2_UNORM:
429 return PIPE_FORMAT_B10G10R10X2_UNORM;
430 case MESA_FORMAT_RGBX_UNORM16:
431 return PIPE_FORMAT_R16G16B16X16_UNORM;
432 case MESA_FORMAT_RGBX_SNORM16:
433 return PIPE_FORMAT_R16G16B16X16_SNORM;
434 case MESA_FORMAT_RGBX_FLOAT16:
435 return PIPE_FORMAT_R16G16B16X16_FLOAT;
436 case MESA_FORMAT_RGBX_UINT16:
437 return PIPE_FORMAT_R16G16B16X16_UINT;
438 case MESA_FORMAT_RGBX_SINT16:
439 return PIPE_FORMAT_R16G16B16X16_SINT;
440 case MESA_FORMAT_RGBX_FLOAT32:
441 return PIPE_FORMAT_R32G32B32X32_FLOAT;
442 case MESA_FORMAT_RGBX_UINT32:
443 return PIPE_FORMAT_R32G32B32X32_UINT;
444 case MESA_FORMAT_RGBX_SINT32:
445 return PIPE_FORMAT_R32G32B32X32_SINT;
446
447 case MESA_FORMAT_B8G8R8X8_SRGB:
448 return PIPE_FORMAT_BGRX8888_SRGB;
449 case MESA_FORMAT_X8R8G8B8_SRGB:
450 return PIPE_FORMAT_XRGB8888_SRGB;
451
452 /* ETC2 formats are emulated as uncompressed ones.
453 * The destination formats mustn't be changed, because they are also
454 * destination formats of the unpack/decompression function. */
455 case MESA_FORMAT_ETC2_RGB8:
456 return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8 : PIPE_FORMAT_R8G8B8A8_UNORM;
457 case MESA_FORMAT_ETC2_SRGB8:
458 return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8 :
459 has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
460 case MESA_FORMAT_ETC2_RGBA8_EAC:
461 return st->has_etc2 ? PIPE_FORMAT_ETC2_RGBA8 : PIPE_FORMAT_R8G8B8A8_UNORM;
462 case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
463 return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGBA8 :
464 has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
465 case MESA_FORMAT_ETC2_R11_EAC:
466 return st->has_etc2 ? PIPE_FORMAT_ETC2_R11_UNORM : PIPE_FORMAT_R16_UNORM;
467 case MESA_FORMAT_ETC2_RG11_EAC:
468 return st->has_etc2 ? PIPE_FORMAT_ETC2_RG11_UNORM : PIPE_FORMAT_R16G16_UNORM;
469 case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
470 return st->has_etc2 ? PIPE_FORMAT_ETC2_R11_SNORM : PIPE_FORMAT_R16_SNORM;
471 case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
472 return st->has_etc2 ? PIPE_FORMAT_ETC2_RG11_SNORM : PIPE_FORMAT_R16G16_SNORM;
473 case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
474 return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8A1 : PIPE_FORMAT_R8G8B8A8_UNORM;
475 case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
476 return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8A1 :
477 has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
478
479 case MESA_FORMAT_RGBA_ASTC_4x4:
480 if (!st->has_astc_2d_ldr)
481 return PIPE_FORMAT_R8G8B8A8_UNORM;
482 return PIPE_FORMAT_ASTC_4x4;
483 case MESA_FORMAT_RGBA_ASTC_5x4:
484 if (!st->has_astc_2d_ldr)
485 return PIPE_FORMAT_R8G8B8A8_UNORM;
486 return PIPE_FORMAT_ASTC_5x4;
487 case MESA_FORMAT_RGBA_ASTC_5x5:
488 if (!st->has_astc_2d_ldr)
489 return PIPE_FORMAT_R8G8B8A8_UNORM;
490 return PIPE_FORMAT_ASTC_5x5;
491 case MESA_FORMAT_RGBA_ASTC_6x5:
492 if (!st->has_astc_2d_ldr)
493 return PIPE_FORMAT_R8G8B8A8_UNORM;
494 return PIPE_FORMAT_ASTC_6x5;
495 case MESA_FORMAT_RGBA_ASTC_6x6:
496 if (!st->has_astc_2d_ldr)
497 return PIPE_FORMAT_R8G8B8A8_UNORM;
498 return PIPE_FORMAT_ASTC_6x6;
499 case MESA_FORMAT_RGBA_ASTC_8x5:
500 if (!st->has_astc_2d_ldr)
501 return PIPE_FORMAT_R8G8B8A8_UNORM;
502 return PIPE_FORMAT_ASTC_8x5;
503 case MESA_FORMAT_RGBA_ASTC_8x6:
504 if (!st->has_astc_2d_ldr)
505 return PIPE_FORMAT_R8G8B8A8_UNORM;
506 return PIPE_FORMAT_ASTC_8x6;
507 case MESA_FORMAT_RGBA_ASTC_8x8:
508 if (!st->has_astc_2d_ldr)
509 return PIPE_FORMAT_R8G8B8A8_UNORM;
510 return PIPE_FORMAT_ASTC_8x8;
511 case MESA_FORMAT_RGBA_ASTC_10x5:
512 if (!st->has_astc_2d_ldr)
513 return PIPE_FORMAT_R8G8B8A8_UNORM;
514 return PIPE_FORMAT_ASTC_10x5;
515 case MESA_FORMAT_RGBA_ASTC_10x6:
516 if (!st->has_astc_2d_ldr)
517 return PIPE_FORMAT_R8G8B8A8_UNORM;
518 return PIPE_FORMAT_ASTC_10x6;
519 case MESA_FORMAT_RGBA_ASTC_10x8:
520 if (!st->has_astc_2d_ldr)
521 return PIPE_FORMAT_R8G8B8A8_UNORM;
522 return PIPE_FORMAT_ASTC_10x8;
523 case MESA_FORMAT_RGBA_ASTC_10x10:
524 if (!st->has_astc_2d_ldr)
525 return PIPE_FORMAT_R8G8B8A8_UNORM;
526 return PIPE_FORMAT_ASTC_10x10;
527 case MESA_FORMAT_RGBA_ASTC_12x10:
528 if (!st->has_astc_2d_ldr)
529 return PIPE_FORMAT_R8G8B8A8_UNORM;
530 return PIPE_FORMAT_ASTC_12x10;
531 case MESA_FORMAT_RGBA_ASTC_12x12:
532 if (!st->has_astc_2d_ldr)
533 return PIPE_FORMAT_R8G8B8A8_UNORM;
534 return PIPE_FORMAT_ASTC_12x12;
535
536 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4:
537 if (!st->has_astc_2d_ldr)
538 return PIPE_FORMAT_R8G8B8A8_SRGB;
539 return PIPE_FORMAT_ASTC_4x4_SRGB;
540 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4:
541 if (!st->has_astc_2d_ldr)
542 return PIPE_FORMAT_R8G8B8A8_SRGB;
543 return PIPE_FORMAT_ASTC_5x4_SRGB;
544 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5:
545 if (!st->has_astc_2d_ldr)
546 return PIPE_FORMAT_R8G8B8A8_SRGB;
547 return PIPE_FORMAT_ASTC_5x5_SRGB;
548 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5:
549 if (!st->has_astc_2d_ldr)
550 return PIPE_FORMAT_R8G8B8A8_SRGB;
551 return PIPE_FORMAT_ASTC_6x5_SRGB;
552 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6:
553 if (!st->has_astc_2d_ldr)
554 return PIPE_FORMAT_R8G8B8A8_SRGB;
555 return PIPE_FORMAT_ASTC_6x6_SRGB;
556 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5:
557 if (!st->has_astc_2d_ldr)
558 return PIPE_FORMAT_R8G8B8A8_SRGB;
559 return PIPE_FORMAT_ASTC_8x5_SRGB;
560 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6:
561 if (!st->has_astc_2d_ldr)
562 return PIPE_FORMAT_R8G8B8A8_SRGB;
563 return PIPE_FORMAT_ASTC_8x6_SRGB;
564 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8:
565 if (!st->has_astc_2d_ldr)
566 return PIPE_FORMAT_R8G8B8A8_SRGB;
567 return PIPE_FORMAT_ASTC_8x8_SRGB;
568 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5:
569 if (!st->has_astc_2d_ldr)
570 return PIPE_FORMAT_R8G8B8A8_SRGB;
571 return PIPE_FORMAT_ASTC_10x5_SRGB;
572 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6:
573 if (!st->has_astc_2d_ldr)
574 return PIPE_FORMAT_R8G8B8A8_SRGB;
575 return PIPE_FORMAT_ASTC_10x6_SRGB;
576 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8:
577 if (!st->has_astc_2d_ldr)
578 return PIPE_FORMAT_R8G8B8A8_SRGB;
579 return PIPE_FORMAT_ASTC_10x8_SRGB;
580 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10:
581 if (!st->has_astc_2d_ldr)
582 return PIPE_FORMAT_R8G8B8A8_SRGB;
583 return PIPE_FORMAT_ASTC_10x10_SRGB;
584 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10:
585 if (!st->has_astc_2d_ldr)
586 return PIPE_FORMAT_R8G8B8A8_SRGB;
587 return PIPE_FORMAT_ASTC_12x10_SRGB;
588 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12:
589 if (!st->has_astc_2d_ldr)
590 return PIPE_FORMAT_R8G8B8A8_SRGB;
591 return PIPE_FORMAT_ASTC_12x12_SRGB;
592
593 case MESA_FORMAT_RGBA_ASTC_3x3x3:
594 return PIPE_FORMAT_ASTC_3x3x3;
595 case MESA_FORMAT_RGBA_ASTC_4x3x3:
596 return PIPE_FORMAT_ASTC_4x3x3;
597 case MESA_FORMAT_RGBA_ASTC_4x4x3:
598 return PIPE_FORMAT_ASTC_4x4x3;
599 case MESA_FORMAT_RGBA_ASTC_4x4x4:
600 return PIPE_FORMAT_ASTC_4x4x4;
601 case MESA_FORMAT_RGBA_ASTC_5x4x4:
602 return PIPE_FORMAT_ASTC_5x4x4;
603 case MESA_FORMAT_RGBA_ASTC_5x5x4:
604 return PIPE_FORMAT_ASTC_5x5x4;
605 case MESA_FORMAT_RGBA_ASTC_5x5x5:
606 return PIPE_FORMAT_ASTC_5x5x5;
607 case MESA_FORMAT_RGBA_ASTC_6x5x5:
608 return PIPE_FORMAT_ASTC_6x5x5;
609 case MESA_FORMAT_RGBA_ASTC_6x6x5:
610 return PIPE_FORMAT_ASTC_6x6x5;
611 case MESA_FORMAT_RGBA_ASTC_6x6x6:
612 return PIPE_FORMAT_ASTC_6x6x6;
613 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_3x3x3:
614 return PIPE_FORMAT_ASTC_3x3x3_SRGB;
615 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x3x3:
616 return PIPE_FORMAT_ASTC_4x3x3_SRGB;
617 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4x3:
618 return PIPE_FORMAT_ASTC_4x4x3_SRGB;
619 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4x4:
620 return PIPE_FORMAT_ASTC_4x4x4_SRGB;
621 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4x4:
622 return PIPE_FORMAT_ASTC_5x4x4_SRGB;
623 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5x4:
624 return PIPE_FORMAT_ASTC_5x5x4_SRGB;
625 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5x5:
626 return PIPE_FORMAT_ASTC_5x5x5_SRGB;
627 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5x5:
628 return PIPE_FORMAT_ASTC_6x5x5_SRGB;
629 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6x5:
630 return PIPE_FORMAT_ASTC_6x6x5_SRGB;
631 case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6x6:
632 return PIPE_FORMAT_ASTC_6x6x6_SRGB;
633
634 case MESA_FORMAT_ATC_RGB:
635 return PIPE_FORMAT_ATC_RGB;
636 case MESA_FORMAT_ATC_RGBA_EXPLICIT:
637 return PIPE_FORMAT_ATC_RGBA_EXPLICIT;
638 case MESA_FORMAT_ATC_RGBA_INTERPOLATED:
639 return PIPE_FORMAT_ATC_RGBA_INTERPOLATED;
640
641 default:
642 if (0) {
643 debug_printf("%s(mesa_format=%s) -> NONE\n",
644 __func__, _mesa_get_format_name(mesaFormat));
645 }
646 return PIPE_FORMAT_NONE;
647 }
648 }
649
650
651 /**
652 * Translate Gallium format to Mesa format.
653 */
654 mesa_format
655 st_pipe_format_to_mesa_format(enum pipe_format format)
656 {
657 switch (format) {
658 case PIPE_FORMAT_ABGR8888_UNORM:
659 return MESA_FORMAT_A8B8G8R8_UNORM;
660 case PIPE_FORMAT_RGBA8888_UNORM:
661 return MESA_FORMAT_R8G8B8A8_UNORM;
662 case PIPE_FORMAT_R8G8B8_UNORM:
663 return MESA_FORMAT_RGB_UNORM8;
664 case PIPE_FORMAT_BGRA8888_UNORM:
665 return MESA_FORMAT_B8G8R8A8_UNORM;
666 case PIPE_FORMAT_ARGB8888_UNORM:
667 return MESA_FORMAT_A8R8G8B8_UNORM;
668 case PIPE_FORMAT_XBGR8888_UNORM:
669 return MESA_FORMAT_X8B8G8R8_UNORM;
670 case PIPE_FORMAT_RGBX8888_UNORM:
671 return MESA_FORMAT_R8G8B8X8_UNORM;
672 case PIPE_FORMAT_BGRX8888_UNORM:
673 return MESA_FORMAT_B8G8R8X8_UNORM;
674 case PIPE_FORMAT_XRGB8888_UNORM:
675 return MESA_FORMAT_X8R8G8B8_UNORM;
676 case PIPE_FORMAT_B5G5R5A1_UNORM:
677 return MESA_FORMAT_B5G5R5A1_UNORM;
678 case PIPE_FORMAT_A1B5G5R5_UNORM:
679 return MESA_FORMAT_A1B5G5R5_UNORM;
680 case PIPE_FORMAT_B4G4R4A4_UNORM:
681 return MESA_FORMAT_B4G4R4A4_UNORM;
682 case PIPE_FORMAT_A4B4G4R4_UNORM:
683 return MESA_FORMAT_A4B4G4R4_UNORM;
684 case PIPE_FORMAT_B5G6R5_UNORM:
685 return MESA_FORMAT_B5G6R5_UNORM;
686 case PIPE_FORMAT_B2G3R3_UNORM:
687 return MESA_FORMAT_B2G3R3_UNORM;
688 case PIPE_FORMAT_B10G10R10A2_UNORM:
689 return MESA_FORMAT_B10G10R10A2_UNORM;
690 case PIPE_FORMAT_R10G10B10A2_UNORM:
691 return MESA_FORMAT_R10G10B10A2_UNORM;
692 case PIPE_FORMAT_R10G10B10X2_UNORM:
693 return MESA_FORMAT_R10G10B10X2_UNORM;
694 case PIPE_FORMAT_L4A4_UNORM:
695 return MESA_FORMAT_L4A4_UNORM;
696 case PIPE_FORMAT_L8A8_UNORM:
697 return MESA_FORMAT_LA_UNORM8;
698 case PIPE_FORMAT_L16A16_UNORM:
699 return MESA_FORMAT_LA_UNORM16;
700 case PIPE_FORMAT_A8_UNORM:
701 return MESA_FORMAT_A_UNORM8;
702 case PIPE_FORMAT_A16_UNORM:
703 return MESA_FORMAT_A_UNORM16;
704 case PIPE_FORMAT_L8_UNORM:
705 return MESA_FORMAT_L_UNORM8;
706 case PIPE_FORMAT_L16_UNORM:
707 return MESA_FORMAT_L_UNORM16;
708 case PIPE_FORMAT_I8_UNORM:
709 return MESA_FORMAT_I_UNORM8;
710 case PIPE_FORMAT_I16_UNORM:
711 return MESA_FORMAT_I_UNORM16;
712 case PIPE_FORMAT_S8_UINT:
713 return MESA_FORMAT_S_UINT8;
714
715 case PIPE_FORMAT_R16G16B16A16_UNORM:
716 return MESA_FORMAT_RGBA_UNORM16;
717
718 case PIPE_FORMAT_Z16_UNORM:
719 return MESA_FORMAT_Z_UNORM16;
720 case PIPE_FORMAT_Z32_UNORM:
721 return MESA_FORMAT_Z_UNORM32;
722 case PIPE_FORMAT_S8_UINT_Z24_UNORM:
723 return MESA_FORMAT_S8_UINT_Z24_UNORM;
724 case PIPE_FORMAT_X8Z24_UNORM:
725 return MESA_FORMAT_X8_UINT_Z24_UNORM;
726 case PIPE_FORMAT_Z24X8_UNORM:
727 return MESA_FORMAT_Z24_UNORM_X8_UINT;
728 case PIPE_FORMAT_Z24_UNORM_S8_UINT:
729 return MESA_FORMAT_Z24_UNORM_S8_UINT;
730 case PIPE_FORMAT_Z32_FLOAT:
731 return MESA_FORMAT_Z_FLOAT32;
732 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
733 return MESA_FORMAT_Z32_FLOAT_S8X24_UINT;
734
735 case PIPE_FORMAT_UYVY:
736 return MESA_FORMAT_YCBCR;
737 case PIPE_FORMAT_YUYV:
738 return MESA_FORMAT_YCBCR_REV;
739
740 case PIPE_FORMAT_DXT1_RGB:
741 return MESA_FORMAT_RGB_DXT1;
742 case PIPE_FORMAT_DXT1_RGBA:
743 return MESA_FORMAT_RGBA_DXT1;
744 case PIPE_FORMAT_DXT3_RGBA:
745 return MESA_FORMAT_RGBA_DXT3;
746 case PIPE_FORMAT_DXT5_RGBA:
747 return MESA_FORMAT_RGBA_DXT5;
748 case PIPE_FORMAT_DXT1_SRGB:
749 return MESA_FORMAT_SRGB_DXT1;
750 case PIPE_FORMAT_DXT1_SRGBA:
751 return MESA_FORMAT_SRGBA_DXT1;
752 case PIPE_FORMAT_DXT3_SRGBA:
753 return MESA_FORMAT_SRGBA_DXT3;
754 case PIPE_FORMAT_DXT5_SRGBA:
755 return MESA_FORMAT_SRGBA_DXT5;
756 case PIPE_FORMAT_L8_SRGB:
757 return MESA_FORMAT_L_SRGB8;
758 case PIPE_FORMAT_L8A8_SRGB:
759 return MESA_FORMAT_LA_SRGB8;
760 case PIPE_FORMAT_R8_SRGB:
761 return MESA_FORMAT_R_SRGB8;
762 case PIPE_FORMAT_R8G8B8_SRGB:
763 return MESA_FORMAT_BGR_SRGB8;
764 case PIPE_FORMAT_ABGR8888_SRGB:
765 return MESA_FORMAT_A8B8G8R8_SRGB;
766 case PIPE_FORMAT_RGBA8888_SRGB:
767 return MESA_FORMAT_R8G8B8A8_SRGB;
768 case PIPE_FORMAT_BGRA8888_SRGB:
769 return MESA_FORMAT_B8G8R8A8_SRGB;
770 case PIPE_FORMAT_ARGB8888_SRGB:
771 return MESA_FORMAT_A8R8G8B8_SRGB;
772 case PIPE_FORMAT_R32G32B32A32_FLOAT:
773 return MESA_FORMAT_RGBA_FLOAT32;
774 case PIPE_FORMAT_R16G16B16A16_FLOAT:
775 return MESA_FORMAT_RGBA_FLOAT16;
776 case PIPE_FORMAT_R32G32B32_FLOAT:
777 return MESA_FORMAT_RGB_FLOAT32;
778 case PIPE_FORMAT_R16G16B16_FLOAT:
779 return MESA_FORMAT_RGB_FLOAT16;
780 case PIPE_FORMAT_L32A32_FLOAT:
781 return MESA_FORMAT_LA_FLOAT32;
782 case PIPE_FORMAT_L16A16_FLOAT:
783 return MESA_FORMAT_LA_FLOAT16;
784 case PIPE_FORMAT_L32_FLOAT:
785 return MESA_FORMAT_L_FLOAT32;
786 case PIPE_FORMAT_L16_FLOAT:
787 return MESA_FORMAT_L_FLOAT16;
788 case PIPE_FORMAT_A32_FLOAT:
789 return MESA_FORMAT_A_FLOAT32;
790 case PIPE_FORMAT_A16_FLOAT:
791 return MESA_FORMAT_A_FLOAT16;
792 case PIPE_FORMAT_I32_FLOAT:
793 return MESA_FORMAT_I_FLOAT32;
794 case PIPE_FORMAT_I16_FLOAT:
795 return MESA_FORMAT_I_FLOAT16;
796 case PIPE_FORMAT_R32_FLOAT:
797 return MESA_FORMAT_R_FLOAT32;
798 case PIPE_FORMAT_R16_FLOAT:
799 return MESA_FORMAT_R_FLOAT16;
800 case PIPE_FORMAT_R32G32_FLOAT:
801 return MESA_FORMAT_RG_FLOAT32;
802 case PIPE_FORMAT_R16G16_FLOAT:
803 return MESA_FORMAT_RG_FLOAT16;
804
805 case PIPE_FORMAT_R8_UNORM:
806 return MESA_FORMAT_R_UNORM8;
807 case PIPE_FORMAT_R16_UNORM:
808 return MESA_FORMAT_R_UNORM16;
809 case PIPE_FORMAT_R8G8_UNORM:
810 return MESA_FORMAT_RG_UNORM8;
811 case PIPE_FORMAT_R16G16_UNORM:
812 return MESA_FORMAT_RG_UNORM16;
813
814 case PIPE_FORMAT_A8_UINT:
815 return MESA_FORMAT_A_UINT8;
816 case PIPE_FORMAT_A16_UINT:
817 return MESA_FORMAT_A_UINT16;
818 case PIPE_FORMAT_A32_UINT:
819 return MESA_FORMAT_A_UINT32;
820 case PIPE_FORMAT_A8_SINT:
821 return MESA_FORMAT_A_SINT8;
822 case PIPE_FORMAT_A16_SINT:
823 return MESA_FORMAT_A_SINT16;
824 case PIPE_FORMAT_A32_SINT:
825 return MESA_FORMAT_A_SINT32;
826
827 case PIPE_FORMAT_I8_UINT:
828 return MESA_FORMAT_I_UINT8;
829 case PIPE_FORMAT_I16_UINT:
830 return MESA_FORMAT_I_UINT16;
831 case PIPE_FORMAT_I32_UINT:
832 return MESA_FORMAT_I_UINT32;
833 case PIPE_FORMAT_I8_SINT:
834 return MESA_FORMAT_I_SINT8;
835 case PIPE_FORMAT_I16_SINT:
836 return MESA_FORMAT_I_SINT16;
837 case PIPE_FORMAT_I32_SINT:
838 return MESA_FORMAT_I_SINT32;
839
840 case PIPE_FORMAT_L8_UINT:
841 return MESA_FORMAT_L_UINT8;
842 case PIPE_FORMAT_L16_UINT:
843 return MESA_FORMAT_L_UINT16;
844 case PIPE_FORMAT_L32_UINT:
845 return MESA_FORMAT_L_UINT32;
846 case PIPE_FORMAT_L8_SINT:
847 return MESA_FORMAT_L_SINT8;
848 case PIPE_FORMAT_L16_SINT:
849 return MESA_FORMAT_L_SINT16;
850 case PIPE_FORMAT_L32_SINT:
851 return MESA_FORMAT_L_SINT32;
852
853 case PIPE_FORMAT_L8A8_UINT:
854 return MESA_FORMAT_LA_UINT8;
855 case PIPE_FORMAT_L16A16_UINT:
856 return MESA_FORMAT_LA_UINT16;
857 case PIPE_FORMAT_L32A32_UINT:
858 return MESA_FORMAT_LA_UINT32;
859 case PIPE_FORMAT_L8A8_SINT:
860 return MESA_FORMAT_LA_SINT8;
861 case PIPE_FORMAT_L16A16_SINT:
862 return MESA_FORMAT_LA_SINT16;
863 case PIPE_FORMAT_L32A32_SINT:
864 return MESA_FORMAT_LA_SINT32;
865
866 case PIPE_FORMAT_R8_SINT:
867 return MESA_FORMAT_R_SINT8;
868 case PIPE_FORMAT_R8G8_SINT:
869 return MESA_FORMAT_RG_SINT8;
870 case PIPE_FORMAT_R8G8B8_SINT:
871 return MESA_FORMAT_RGB_SINT8;
872 case PIPE_FORMAT_R8G8B8A8_SINT:
873 return MESA_FORMAT_RGBA_SINT8;
874
875 case PIPE_FORMAT_R16_SINT:
876 return MESA_FORMAT_R_SINT16;
877 case PIPE_FORMAT_R16G16_SINT:
878 return MESA_FORMAT_RG_SINT16;
879 case PIPE_FORMAT_R16G16B16_SINT:
880 return MESA_FORMAT_RGB_SINT16;
881 case PIPE_FORMAT_R16G16B16A16_SINT:
882 return MESA_FORMAT_RGBA_SINT16;
883
884 case PIPE_FORMAT_R32_SINT:
885 return MESA_FORMAT_R_SINT32;
886 case PIPE_FORMAT_R32G32_SINT:
887 return MESA_FORMAT_RG_SINT32;
888 case PIPE_FORMAT_R32G32B32_SINT:
889 return MESA_FORMAT_RGB_SINT32;
890 case PIPE_FORMAT_R32G32B32A32_SINT:
891 return MESA_FORMAT_RGBA_SINT32;
892
893 /* unsigned int formats */
894 case PIPE_FORMAT_R8_UINT:
895 return MESA_FORMAT_R_UINT8;
896 case PIPE_FORMAT_R8G8_UINT:
897 return MESA_FORMAT_RG_UINT8;
898 case PIPE_FORMAT_R8G8B8_UINT:
899 return MESA_FORMAT_RGB_UINT8;
900 case PIPE_FORMAT_R8G8B8A8_UINT:
901 return MESA_FORMAT_RGBA_UINT8;
902
903 case PIPE_FORMAT_R16_UINT:
904 return MESA_FORMAT_R_UINT16;
905 case PIPE_FORMAT_R16G16_UINT:
906 return MESA_FORMAT_RG_UINT16;
907 case PIPE_FORMAT_R16G16B16_UINT:
908 return MESA_FORMAT_RGB_UINT16;
909 case PIPE_FORMAT_R16G16B16A16_UINT:
910 return MESA_FORMAT_RGBA_UINT16;
911
912 case PIPE_FORMAT_R32_UINT:
913 return MESA_FORMAT_R_UINT32;
914 case PIPE_FORMAT_R32G32_UINT:
915 return MESA_FORMAT_RG_UINT32;
916 case PIPE_FORMAT_R32G32B32_UINT:
917 return MESA_FORMAT_RGB_UINT32;
918 case PIPE_FORMAT_R32G32B32A32_UINT:
919 return MESA_FORMAT_RGBA_UINT32;
920
921 case PIPE_FORMAT_RGTC1_UNORM:
922 return MESA_FORMAT_R_RGTC1_UNORM;
923 case PIPE_FORMAT_RGTC1_SNORM:
924 return MESA_FORMAT_R_RGTC1_SNORM;
925 case PIPE_FORMAT_RGTC2_UNORM:
926 return MESA_FORMAT_RG_RGTC2_UNORM;
927 case PIPE_FORMAT_RGTC2_SNORM:
928 return MESA_FORMAT_RG_RGTC2_SNORM;
929
930 case PIPE_FORMAT_LATC1_UNORM:
931 return MESA_FORMAT_L_LATC1_UNORM;
932 case PIPE_FORMAT_LATC1_SNORM:
933 return MESA_FORMAT_L_LATC1_SNORM;
934 case PIPE_FORMAT_LATC2_UNORM:
935 return MESA_FORMAT_LA_LATC2_UNORM;
936 case PIPE_FORMAT_LATC2_SNORM:
937 return MESA_FORMAT_LA_LATC2_SNORM;
938
939 case PIPE_FORMAT_ETC1_RGB8:
940 return MESA_FORMAT_ETC1_RGB8;
941
942 case PIPE_FORMAT_BPTC_RGBA_UNORM:
943 return MESA_FORMAT_BPTC_RGBA_UNORM;
944 case PIPE_FORMAT_BPTC_SRGBA:
945 return MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM;
946 case PIPE_FORMAT_BPTC_RGB_FLOAT:
947 return MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT;
948 case PIPE_FORMAT_BPTC_RGB_UFLOAT:
949 return MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT;
950
951 /* signed normalized formats */
952 case PIPE_FORMAT_R8_SNORM:
953 return MESA_FORMAT_R_SNORM8;
954 case PIPE_FORMAT_R8G8_SNORM:
955 return MESA_FORMAT_RG_SNORM8;
956 case PIPE_FORMAT_RGBA8888_SNORM:
957 return MESA_FORMAT_R8G8B8A8_SNORM;
958 case PIPE_FORMAT_ABGR8888_SNORM:
959 return MESA_FORMAT_A8B8G8R8_SNORM;
960
961 case PIPE_FORMAT_A8_SNORM:
962 return MESA_FORMAT_A_SNORM8;
963 case PIPE_FORMAT_L8_SNORM:
964 return MESA_FORMAT_L_SNORM8;
965 case PIPE_FORMAT_L8A8_SNORM:
966 return MESA_FORMAT_LA_SNORM8;
967 case PIPE_FORMAT_I8_SNORM:
968 return MESA_FORMAT_I_SNORM8;
969
970 case PIPE_FORMAT_R16_SNORM:
971 return MESA_FORMAT_R_SNORM16;
972 case PIPE_FORMAT_R16G16_SNORM:
973 return MESA_FORMAT_RG_SNORM16;
974 case PIPE_FORMAT_R16G16B16_SNORM:
975 return MESA_FORMAT_RGB_SNORM16;
976 case PIPE_FORMAT_R16G16B16A16_SNORM:
977 return MESA_FORMAT_RGBA_SNORM16;
978
979 case PIPE_FORMAT_A16_SNORM:
980 return MESA_FORMAT_A_SNORM16;
981 case PIPE_FORMAT_L16_SNORM:
982 return MESA_FORMAT_L_SNORM16;
983 case PIPE_FORMAT_L16A16_SNORM:
984 return MESA_FORMAT_LA_SNORM16;
985 case PIPE_FORMAT_I16_SNORM:
986 return MESA_FORMAT_I_SNORM16;
987
988 case PIPE_FORMAT_R9G9B9E5_FLOAT:
989 return MESA_FORMAT_R9G9B9E5_FLOAT;
990 case PIPE_FORMAT_R11G11B10_FLOAT:
991 return MESA_FORMAT_R11G11B10_FLOAT;
992
993 case PIPE_FORMAT_B10G10R10A2_UINT:
994 return MESA_FORMAT_B10G10R10A2_UINT;
995 case PIPE_FORMAT_R10G10B10A2_UINT:
996 return MESA_FORMAT_R10G10B10A2_UINT;
997
998 case PIPE_FORMAT_B4G4R4X4_UNORM:
999 return MESA_FORMAT_B4G4R4X4_UNORM;
1000 case PIPE_FORMAT_B5G5R5X1_UNORM:
1001 return MESA_FORMAT_B5G5R5X1_UNORM;
1002 case PIPE_FORMAT_X1B5G5R5_UNORM:
1003 return MESA_FORMAT_X1B5G5R5_UNORM;
1004 case PIPE_FORMAT_RGBX8888_SNORM:
1005 return MESA_FORMAT_R8G8B8X8_SNORM;
1006 case PIPE_FORMAT_XBGR8888_SNORM:
1007 return MESA_FORMAT_X8B8G8R8_SNORM;
1008 case PIPE_FORMAT_RGBX8888_SRGB:
1009 return MESA_FORMAT_R8G8B8X8_SRGB;
1010 case PIPE_FORMAT_XBGR8888_SRGB:
1011 return MESA_FORMAT_X8B8G8R8_SRGB;
1012 case PIPE_FORMAT_R8G8B8X8_UINT:
1013 return MESA_FORMAT_RGBX_UINT8;
1014 case PIPE_FORMAT_R8G8B8X8_SINT:
1015 return MESA_FORMAT_RGBX_SINT8;
1016 case PIPE_FORMAT_B10G10R10X2_UNORM:
1017 return MESA_FORMAT_B10G10R10X2_UNORM;
1018 case PIPE_FORMAT_R16G16B16X16_UNORM:
1019 return MESA_FORMAT_RGBX_UNORM16;
1020 case PIPE_FORMAT_R16G16B16X16_SNORM:
1021 return MESA_FORMAT_RGBX_SNORM16;
1022 case PIPE_FORMAT_R16G16B16X16_FLOAT:
1023 return MESA_FORMAT_RGBX_FLOAT16;
1024 case PIPE_FORMAT_R16G16B16X16_UINT:
1025 return MESA_FORMAT_RGBX_UINT16;
1026 case PIPE_FORMAT_R16G16B16X16_SINT:
1027 return MESA_FORMAT_RGBX_SINT16;
1028 case PIPE_FORMAT_R32G32B32X32_FLOAT:
1029 return MESA_FORMAT_RGBX_FLOAT32;
1030 case PIPE_FORMAT_R32G32B32X32_UINT:
1031 return MESA_FORMAT_RGBX_UINT32;
1032 case PIPE_FORMAT_R32G32B32X32_SINT:
1033 return MESA_FORMAT_RGBX_SINT32;
1034
1035 case PIPE_FORMAT_BGRX8888_SRGB:
1036 return MESA_FORMAT_B8G8R8X8_SRGB;
1037 case PIPE_FORMAT_XRGB8888_SRGB:
1038 return MESA_FORMAT_X8R8G8B8_SRGB;
1039
1040 case PIPE_FORMAT_ETC2_RGB8:
1041 return MESA_FORMAT_ETC2_RGB8;
1042 case PIPE_FORMAT_ETC2_SRGB8:
1043 return MESA_FORMAT_ETC2_SRGB8;
1044 case PIPE_FORMAT_ETC2_RGB8A1:
1045 return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
1046 case PIPE_FORMAT_ETC2_SRGB8A1:
1047 return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
1048 case PIPE_FORMAT_ETC2_RGBA8:
1049 return MESA_FORMAT_ETC2_RGBA8_EAC;
1050 case PIPE_FORMAT_ETC2_SRGBA8:
1051 return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC;
1052 case PIPE_FORMAT_ETC2_R11_UNORM:
1053 return MESA_FORMAT_ETC2_R11_EAC;
1054 case PIPE_FORMAT_ETC2_R11_SNORM:
1055 return MESA_FORMAT_ETC2_SIGNED_R11_EAC;
1056 case PIPE_FORMAT_ETC2_RG11_UNORM:
1057 return MESA_FORMAT_ETC2_RG11_EAC;
1058 case PIPE_FORMAT_ETC2_RG11_SNORM:
1059 return MESA_FORMAT_ETC2_SIGNED_RG11_EAC;
1060
1061 case PIPE_FORMAT_ASTC_4x4:
1062 return MESA_FORMAT_RGBA_ASTC_4x4;
1063 case PIPE_FORMAT_ASTC_5x4:
1064 return MESA_FORMAT_RGBA_ASTC_5x4;
1065 case PIPE_FORMAT_ASTC_5x5:
1066 return MESA_FORMAT_RGBA_ASTC_5x5;
1067 case PIPE_FORMAT_ASTC_6x5:
1068 return MESA_FORMAT_RGBA_ASTC_6x5;
1069 case PIPE_FORMAT_ASTC_6x6:
1070 return MESA_FORMAT_RGBA_ASTC_6x6;
1071 case PIPE_FORMAT_ASTC_8x5:
1072 return MESA_FORMAT_RGBA_ASTC_8x5;
1073 case PIPE_FORMAT_ASTC_8x6:
1074 return MESA_FORMAT_RGBA_ASTC_8x6;
1075 case PIPE_FORMAT_ASTC_8x8:
1076 return MESA_FORMAT_RGBA_ASTC_8x8;
1077 case PIPE_FORMAT_ASTC_10x5:
1078 return MESA_FORMAT_RGBA_ASTC_10x5;
1079 case PIPE_FORMAT_ASTC_10x6:
1080 return MESA_FORMAT_RGBA_ASTC_10x6;
1081 case PIPE_FORMAT_ASTC_10x8:
1082 return MESA_FORMAT_RGBA_ASTC_10x8;
1083 case PIPE_FORMAT_ASTC_10x10:
1084 return MESA_FORMAT_RGBA_ASTC_10x10;
1085 case PIPE_FORMAT_ASTC_12x10:
1086 return MESA_FORMAT_RGBA_ASTC_12x10;
1087 case PIPE_FORMAT_ASTC_12x12:
1088 return MESA_FORMAT_RGBA_ASTC_12x12;
1089
1090 case PIPE_FORMAT_ASTC_4x4_SRGB:
1091 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4;
1092 case PIPE_FORMAT_ASTC_5x4_SRGB:
1093 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4;
1094 case PIPE_FORMAT_ASTC_5x5_SRGB:
1095 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5;
1096 case PIPE_FORMAT_ASTC_6x5_SRGB:
1097 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5;
1098 case PIPE_FORMAT_ASTC_6x6_SRGB:
1099 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6;
1100 case PIPE_FORMAT_ASTC_8x5_SRGB:
1101 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5;
1102 case PIPE_FORMAT_ASTC_8x6_SRGB:
1103 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6;
1104 case PIPE_FORMAT_ASTC_8x8_SRGB:
1105 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8;
1106 case PIPE_FORMAT_ASTC_10x5_SRGB:
1107 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5;
1108 case PIPE_FORMAT_ASTC_10x6_SRGB:
1109 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6;
1110 case PIPE_FORMAT_ASTC_10x8_SRGB:
1111 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8;
1112 case PIPE_FORMAT_ASTC_10x10_SRGB:
1113 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10;
1114 case PIPE_FORMAT_ASTC_12x10_SRGB:
1115 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10;
1116 case PIPE_FORMAT_ASTC_12x12_SRGB:
1117 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12;
1118
1119 case PIPE_FORMAT_ASTC_3x3x3:
1120 return MESA_FORMAT_RGBA_ASTC_3x3x3;
1121 case PIPE_FORMAT_ASTC_4x3x3:
1122 return MESA_FORMAT_RGBA_ASTC_4x3x3;
1123 case PIPE_FORMAT_ASTC_4x4x3:
1124 return MESA_FORMAT_RGBA_ASTC_4x4x3;
1125 case PIPE_FORMAT_ASTC_4x4x4:
1126 return MESA_FORMAT_RGBA_ASTC_4x4x4;
1127 case PIPE_FORMAT_ASTC_5x4x4:
1128 return MESA_FORMAT_RGBA_ASTC_5x4x4;
1129 case PIPE_FORMAT_ASTC_5x5x4:
1130 return MESA_FORMAT_RGBA_ASTC_5x5x4;
1131 case PIPE_FORMAT_ASTC_5x5x5:
1132 return MESA_FORMAT_RGBA_ASTC_5x5x5;
1133 case PIPE_FORMAT_ASTC_6x5x5:
1134 return MESA_FORMAT_RGBA_ASTC_6x5x5;
1135 case PIPE_FORMAT_ASTC_6x6x5:
1136 return MESA_FORMAT_RGBA_ASTC_6x6x5;
1137 case PIPE_FORMAT_ASTC_6x6x6:
1138 return MESA_FORMAT_RGBA_ASTC_6x6x6;
1139 case PIPE_FORMAT_ASTC_3x3x3_SRGB:
1140 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_3x3x3;
1141 case PIPE_FORMAT_ASTC_4x3x3_SRGB:
1142 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x3x3;
1143 case PIPE_FORMAT_ASTC_4x4x3_SRGB:
1144 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4x3;
1145 case PIPE_FORMAT_ASTC_4x4x4_SRGB:
1146 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4x4;
1147 case PIPE_FORMAT_ASTC_5x4x4_SRGB:
1148 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4x4;
1149 case PIPE_FORMAT_ASTC_5x5x4_SRGB:
1150 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5x4;
1151 case PIPE_FORMAT_ASTC_5x5x5_SRGB:
1152 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5x5;
1153 case PIPE_FORMAT_ASTC_6x5x5_SRGB:
1154 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5x5;
1155 case PIPE_FORMAT_ASTC_6x6x5_SRGB:
1156 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6x5;
1157 case PIPE_FORMAT_ASTC_6x6x6_SRGB:
1158 return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6x6;
1159
1160 case PIPE_FORMAT_ATC_RGB:
1161 return MESA_FORMAT_ATC_RGB;
1162 case PIPE_FORMAT_ATC_RGBA_EXPLICIT:
1163 return MESA_FORMAT_ATC_RGBA_EXPLICIT;
1164 case PIPE_FORMAT_ATC_RGBA_INTERPOLATED:
1165 return MESA_FORMAT_ATC_RGBA_INTERPOLATED;
1166
1167 default:
1168 return MESA_FORMAT_NONE;
1169 }
1170 }
1171
1172 /**
1173 * Map GL texture formats to Gallium pipe formats.
1174 */
1175 struct format_mapping
1176 {
1177 GLenum glFormats[18]; /**< list of GLenum formats, 0-terminated */
1178 enum pipe_format pipeFormats[14]; /**< list of pipe formats, 0-terminated */
1179 };
1180
1181
1182 #define DEFAULT_RGBA_FORMATS \
1183 PIPE_FORMAT_R8G8B8A8_UNORM, \
1184 PIPE_FORMAT_B8G8R8A8_UNORM, \
1185 PIPE_FORMAT_A8R8G8B8_UNORM, \
1186 PIPE_FORMAT_A8B8G8R8_UNORM, \
1187 0
1188
1189 #define DEFAULT_RGB_FORMATS \
1190 PIPE_FORMAT_R8G8B8X8_UNORM, \
1191 PIPE_FORMAT_B8G8R8X8_UNORM, \
1192 PIPE_FORMAT_X8R8G8B8_UNORM, \
1193 PIPE_FORMAT_X8B8G8R8_UNORM, \
1194 PIPE_FORMAT_B5G6R5_UNORM, \
1195 DEFAULT_RGBA_FORMATS
1196
1197 #define DEFAULT_SRGBA_FORMATS \
1198 PIPE_FORMAT_R8G8B8A8_SRGB, \
1199 PIPE_FORMAT_B8G8R8A8_SRGB, \
1200 PIPE_FORMAT_A8R8G8B8_SRGB, \
1201 PIPE_FORMAT_A8B8G8R8_SRGB, \
1202 0
1203
1204 #define DEFAULT_DEPTH_FORMATS \
1205 PIPE_FORMAT_Z24X8_UNORM, \
1206 PIPE_FORMAT_X8Z24_UNORM, \
1207 PIPE_FORMAT_Z16_UNORM, \
1208 PIPE_FORMAT_Z24_UNORM_S8_UINT, \
1209 PIPE_FORMAT_S8_UINT_Z24_UNORM, \
1210 0
1211
1212 #define DEFAULT_SNORM8_RGBA_FORMATS \
1213 PIPE_FORMAT_R8G8B8A8_SNORM, \
1214 0
1215
1216 #define DEFAULT_UNORM16_RGBA_FORMATS \
1217 PIPE_FORMAT_R16G16B16A16_UNORM, \
1218 DEFAULT_RGBA_FORMATS
1219
1220
1221 /**
1222 * This table maps OpenGL texture format enums to Gallium pipe_format enums.
1223 * Multiple GL enums might map to multiple pipe_formats.
1224 * The first pipe format in the list that's supported is the one that's chosen.
1225 */
1226 static const struct format_mapping format_map[] = {
1227 /* Basic RGB, RGBA formats */
1228 {
1229 { GL_RGB10, 0 },
1230 { PIPE_FORMAT_R10G10B10X2_UNORM, PIPE_FORMAT_B10G10R10X2_UNORM,
1231 PIPE_FORMAT_R10G10B10A2_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
1232 DEFAULT_RGB_FORMATS }
1233 },
1234 {
1235 { GL_RGB10_A2, 0 },
1236 { PIPE_FORMAT_R10G10B10A2_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
1237 DEFAULT_RGBA_FORMATS }
1238 },
1239 {
1240 { 4, GL_RGBA, GL_RGBA8, 0 },
1241 { PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS }
1242 },
1243 {
1244 { GL_BGRA, 0 },
1245 { DEFAULT_RGBA_FORMATS }
1246 },
1247 {
1248 { 3, GL_RGB, GL_RGB8, 0 },
1249 { PIPE_FORMAT_R8G8B8X8_UNORM, DEFAULT_RGB_FORMATS }
1250 },
1251 {
1252 { GL_RGB12, GL_RGB16, 0 },
1253 { PIPE_FORMAT_R16G16B16X16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
1254 DEFAULT_RGB_FORMATS }
1255 },
1256 {
1257 { GL_RGBA12, GL_RGBA16, 0 },
1258 { PIPE_FORMAT_R16G16B16A16_UNORM, DEFAULT_RGBA_FORMATS }
1259 },
1260 {
1261 { GL_RGBA4, GL_RGBA2, 0 },
1262 { PIPE_FORMAT_B4G4R4A4_UNORM, PIPE_FORMAT_A4B4G4R4_UNORM,
1263 DEFAULT_RGBA_FORMATS }
1264 },
1265 {
1266 { GL_RGB5_A1, 0 },
1267 { PIPE_FORMAT_B5G5R5A1_UNORM, PIPE_FORMAT_A1B5G5R5_UNORM,
1268 DEFAULT_RGBA_FORMATS }
1269 },
1270 {
1271 { GL_R3_G3_B2, 0 },
1272 { PIPE_FORMAT_B2G3R3_UNORM, PIPE_FORMAT_B5G6R5_UNORM,
1273 PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGB_FORMATS }
1274 },
1275 {
1276 { GL_RGB4 },
1277 { PIPE_FORMAT_B4G4R4X4_UNORM, PIPE_FORMAT_B4G4R4A4_UNORM,
1278 PIPE_FORMAT_A4B4G4R4_UNORM,
1279 DEFAULT_RGB_FORMATS }
1280 },
1281 {
1282 { GL_RGB5 },
1283 { PIPE_FORMAT_B5G5R5X1_UNORM, PIPE_FORMAT_X1B5G5R5_UNORM,
1284 PIPE_FORMAT_B5G5R5A1_UNORM, PIPE_FORMAT_A1B5G5R5_UNORM,
1285 DEFAULT_RGB_FORMATS }
1286 },
1287 {
1288 { GL_RGB565 },
1289 { PIPE_FORMAT_B5G6R5_UNORM, DEFAULT_RGB_FORMATS }
1290 },
1291
1292 /* basic Alpha formats */
1293 {
1294 { GL_ALPHA12, GL_ALPHA16, 0 },
1295 { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
1296 PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
1297 },
1298 {
1299 { GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_COMPRESSED_ALPHA, 0 },
1300 { PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
1301 },
1302
1303 /* basic Luminance formats */
1304 {
1305 { GL_LUMINANCE12, GL_LUMINANCE16, 0 },
1306 { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
1307 PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
1308 },
1309 {
1310 { 1, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, 0 },
1311 { PIPE_FORMAT_L8_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGB_FORMATS }
1312 },
1313
1314 /* basic Luminance/Alpha formats */
1315 {
1316 { GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,
1317 GL_LUMINANCE16_ALPHA16, 0},
1318 { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
1319 PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
1320 },
1321 {
1322 { 2, GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, 0 },
1323 { PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
1324 },
1325 {
1326 { GL_LUMINANCE4_ALPHA4, 0 },
1327 { PIPE_FORMAT_L4A4_UNORM, PIPE_FORMAT_L8A8_UNORM,
1328 DEFAULT_RGBA_FORMATS }
1329 },
1330
1331 /* basic Intensity formats */
1332 {
1333 { GL_INTENSITY12, GL_INTENSITY16, 0 },
1334 { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
1335 PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
1336 },
1337 {
1338 { GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8,
1339 GL_COMPRESSED_INTENSITY, 0 },
1340 { PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
1341 },
1342
1343 /* YCbCr */
1344 {
1345 { GL_YCBCR_MESA, 0 },
1346 { PIPE_FORMAT_UYVY, PIPE_FORMAT_YUYV, 0 }
1347 },
1348
1349 /* compressed formats */ /* XXX PIPE_BIND_SAMPLER_VIEW only */
1350 {
1351 { GL_COMPRESSED_RGB, 0 },
1352 { PIPE_FORMAT_DXT1_RGB, DEFAULT_RGB_FORMATS }
1353 },
1354 {
1355 { GL_COMPRESSED_RGBA, 0 },
1356 { PIPE_FORMAT_DXT5_RGBA, DEFAULT_RGBA_FORMATS }
1357 },
1358 {
1359 { GL_RGB_S3TC, GL_RGB4_S3TC, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 0 },
1360 { PIPE_FORMAT_DXT1_RGB, 0 }
1361 },
1362 {
1363 { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0 },
1364 { PIPE_FORMAT_DXT1_RGBA, 0 }
1365 },
1366 {
1367 { GL_RGBA_S3TC, GL_RGBA4_S3TC, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0 },
1368 { PIPE_FORMAT_DXT3_RGBA, 0 }
1369 },
1370 {
1371 { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0 },
1372 { PIPE_FORMAT_DXT5_RGBA, 0 }
1373 },
1374
1375 #if 0
1376 {
1377 { GL_COMPRESSED_RGB_FXT1_3DFX, 0 },
1378 { PIPE_FORMAT_RGB_FXT1, 0 }
1379 },
1380 {
1381 { GL_COMPRESSED_RGBA_FXT1_3DFX, 0 },
1382 { PIPE_FORMAT_RGBA_FXT1, 0 }
1383 },
1384 #endif
1385
1386 /* Depth formats */
1387 {
1388 { GL_DEPTH_COMPONENT16, 0 },
1389 { PIPE_FORMAT_Z16_UNORM, DEFAULT_DEPTH_FORMATS }
1390 },
1391 {
1392 { GL_DEPTH_COMPONENT24, 0 },
1393 { PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM,
1394 DEFAULT_DEPTH_FORMATS }
1395 },
1396 {
1397 { GL_DEPTH_COMPONENT32, 0 },
1398 { PIPE_FORMAT_Z32_UNORM, DEFAULT_DEPTH_FORMATS }
1399 },
1400 {
1401 { GL_DEPTH_COMPONENT, 0 },
1402 { DEFAULT_DEPTH_FORMATS }
1403 },
1404 {
1405 { GL_DEPTH_COMPONENT32F, 0 },
1406 { PIPE_FORMAT_Z32_FLOAT, 0 }
1407 },
1408
1409 /* stencil formats */
1410 {
1411 { GL_STENCIL_INDEX, GL_STENCIL_INDEX1_EXT, GL_STENCIL_INDEX4_EXT,
1412 GL_STENCIL_INDEX8_EXT, GL_STENCIL_INDEX16_EXT, 0 },
1413 {
1414 PIPE_FORMAT_S8_UINT, PIPE_FORMAT_Z24_UNORM_S8_UINT,
1415 PIPE_FORMAT_S8_UINT_Z24_UNORM, 0
1416 }
1417 },
1418
1419 /* Depth / Stencil formats */
1420 {
1421 { GL_DEPTH_STENCIL_EXT, GL_DEPTH24_STENCIL8_EXT, 0 },
1422 { PIPE_FORMAT_Z24_UNORM_S8_UINT, PIPE_FORMAT_S8_UINT_Z24_UNORM, 0 }
1423 },
1424 {
1425 { GL_DEPTH32F_STENCIL8, 0 },
1426 { PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, 0 }
1427 },
1428
1429 /* sRGB formats */
1430 {
1431 { GL_SRGB_EXT, GL_SRGB8_EXT, 0 },
1432 { PIPE_FORMAT_R8G8B8X8_SRGB, PIPE_FORMAT_B8G8R8X8_SRGB,
1433 DEFAULT_SRGBA_FORMATS }
1434 },
1435 {
1436 { GL_SRGB_ALPHA_EXT, GL_SRGB8_ALPHA8_EXT, 0 },
1437 { PIPE_FORMAT_R8G8B8A8_SRGB, DEFAULT_SRGBA_FORMATS }
1438 },
1439 {
1440 { GL_COMPRESSED_SRGB_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 0 },
1441 { PIPE_FORMAT_DXT1_SRGB, PIPE_FORMAT_R8G8B8X8_SRGB,
1442 PIPE_FORMAT_B8G8R8X8_SRGB, DEFAULT_SRGBA_FORMATS }
1443 },
1444 {
1445 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0 },
1446 { PIPE_FORMAT_DXT1_SRGBA, 0 }
1447 },
1448 {
1449 { GL_COMPRESSED_SRGB_ALPHA_EXT,
1450 GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0 },
1451 { PIPE_FORMAT_DXT3_SRGBA, DEFAULT_SRGBA_FORMATS }
1452 },
1453 {
1454 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0 },
1455 { PIPE_FORMAT_DXT5_SRGBA, 0 }
1456 },
1457 {
1458 { GL_SLUMINANCE_ALPHA_EXT, GL_SLUMINANCE8_ALPHA8_EXT,
1459 GL_COMPRESSED_SLUMINANCE_ALPHA_EXT, 0 },
1460 { PIPE_FORMAT_L8A8_SRGB, DEFAULT_SRGBA_FORMATS }
1461 },
1462 {
1463 { GL_SLUMINANCE_EXT, GL_SLUMINANCE8_EXT, GL_COMPRESSED_SLUMINANCE_EXT,
1464 0 },
1465 { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS }
1466 },
1467 {
1468 { GL_SR8_EXT, 0 },
1469 { PIPE_FORMAT_R8_SRGB, 0 }
1470 },
1471
1472 /* 16-bit float formats */
1473 {
1474 { GL_RGBA16F_ARB, 0 },
1475 { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1476 },
1477 {
1478 { GL_RGB16F_ARB, 0 },
1479 { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R16G16B16X16_FLOAT,
1480 PIPE_FORMAT_R16G16B16A16_FLOAT,
1481 PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1482 },
1483 {
1484 { GL_LUMINANCE_ALPHA16F_ARB, 0 },
1485 { PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1486 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1487 },
1488 {
1489 { GL_ALPHA16F_ARB, 0 },
1490 { PIPE_FORMAT_A16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
1491 PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1492 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1493 },
1494 {
1495 { GL_INTENSITY16F_ARB, 0 },
1496 { PIPE_FORMAT_I16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
1497 PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1498 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1499 },
1500 {
1501 { GL_LUMINANCE16F_ARB, 0 },
1502 { PIPE_FORMAT_L16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
1503 PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1504 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1505 },
1506 {
1507 { GL_R16F, 0 },
1508 { PIPE_FORMAT_R16_FLOAT, PIPE_FORMAT_R16G16_FLOAT,
1509 PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1510 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1511 },
1512 {
1513 { GL_RG16F, 0 },
1514 { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1515 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1516 },
1517
1518 /* 32-bit float formats */
1519 {
1520 { GL_RGBA32F_ARB, 0 },
1521 { PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1522 },
1523 {
1524 { GL_RGB32F_ARB, 0 },
1525 { PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32X32_FLOAT,
1526 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1527 },
1528 {
1529 { GL_LUMINANCE_ALPHA32F_ARB, 0 },
1530 { PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1531 },
1532 {
1533 { GL_ALPHA32F_ARB, 0 },
1534 { PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1535 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1536 },
1537 {
1538 { GL_INTENSITY32F_ARB, 0 },
1539 { PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1540 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1541 },
1542 {
1543 { GL_LUMINANCE32F_ARB, 0 },
1544 { PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1545 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1546 },
1547 {
1548 { GL_R32F, 0 },
1549 { PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT,
1550 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1551 },
1552 {
1553 { GL_RG32F, 0 },
1554 { PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1555 },
1556
1557 /* R, RG formats */
1558 {
1559 { GL_RED, GL_R8, 0 },
1560 { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1561 },
1562 {
1563 { GL_RG, GL_RG8, 0 },
1564 { PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1565 },
1566 {
1567 { GL_R16, 0 },
1568 { PIPE_FORMAT_R16_UNORM, PIPE_FORMAT_R16G16_UNORM,
1569 DEFAULT_UNORM16_RGBA_FORMATS }
1570 },
1571 {
1572 { GL_RG16, 0 },
1573 { PIPE_FORMAT_R16G16_UNORM, DEFAULT_UNORM16_RGBA_FORMATS }
1574 },
1575
1576 /* compressed R, RG formats */
1577 {
1578 { GL_COMPRESSED_RED, GL_COMPRESSED_RED_RGTC1, 0 },
1579 { PIPE_FORMAT_RGTC1_UNORM, PIPE_FORMAT_R8_UNORM, DEFAULT_RGBA_FORMATS }
1580 },
1581 {
1582 { GL_COMPRESSED_SIGNED_RED_RGTC1, 0 },
1583 { PIPE_FORMAT_RGTC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1584 },
1585 {
1586 { GL_COMPRESSED_RG, GL_COMPRESSED_RG_RGTC2, 0 },
1587 { PIPE_FORMAT_RGTC2_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1588 },
1589 {
1590 { GL_COMPRESSED_SIGNED_RG_RGTC2, 0 },
1591 { PIPE_FORMAT_RGTC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1592 },
1593 {
1594 { GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_LATC1_EXT, 0 },
1595 { PIPE_FORMAT_LATC1_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGBA_FORMATS }
1596 },
1597 {
1598 { GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT, 0 },
1599 { PIPE_FORMAT_LATC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1600 },
1601 {
1602 { GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT,
1603 GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0 },
1604 { PIPE_FORMAT_LATC2_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
1605 },
1606 {
1607 { GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT, 0 },
1608 { PIPE_FORMAT_LATC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1609 },
1610
1611 /* ETC1 */
1612 {
1613 { GL_ETC1_RGB8_OES, 0 },
1614 { PIPE_FORMAT_ETC1_RGB8, 0 }
1615 },
1616
1617 /* ETC2 */
1618 {
1619 { GL_COMPRESSED_RGB8_ETC2, 0 },
1620 { PIPE_FORMAT_ETC2_RGB8, 0 }
1621 },
1622 {
1623 { GL_COMPRESSED_SRGB8_ETC2, 0 },
1624 { PIPE_FORMAT_ETC2_SRGB8, 0 }
1625 },
1626 {
1627 { GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 0 },
1628 { PIPE_FORMAT_ETC2_RGB8A1, 0 }
1629 },
1630 {
1631 { GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 0 },
1632 { PIPE_FORMAT_ETC2_SRGB8A1, 0 }
1633 },
1634 {
1635 { GL_COMPRESSED_RGBA8_ETC2_EAC, 0 },
1636 { PIPE_FORMAT_ETC2_RGBA8, 0 }
1637 },
1638 {
1639 { GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 0 },
1640 { PIPE_FORMAT_ETC2_SRGBA8, 0 }
1641 },
1642 {
1643 { GL_COMPRESSED_R11_EAC, 0 },
1644 { PIPE_FORMAT_ETC2_R11_UNORM, 0 }
1645 },
1646 {
1647 { GL_COMPRESSED_SIGNED_R11_EAC, 0 },
1648 { PIPE_FORMAT_ETC2_R11_SNORM, 0 }
1649 },
1650 {
1651 { GL_COMPRESSED_RG11_EAC, 0 },
1652 { PIPE_FORMAT_ETC2_RG11_UNORM, 0 }
1653 },
1654 {
1655 { GL_COMPRESSED_SIGNED_RG11_EAC, 0 },
1656 { PIPE_FORMAT_ETC2_RG11_SNORM, 0 }
1657 },
1658
1659 /* BPTC */
1660 {
1661 { GL_COMPRESSED_RGBA_BPTC_UNORM, 0 },
1662 { PIPE_FORMAT_BPTC_RGBA_UNORM, 0 },
1663 },
1664 {
1665 { GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM, 0 },
1666 { PIPE_FORMAT_BPTC_SRGBA, 0 },
1667 },
1668 {
1669 { GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT, 0 },
1670 { PIPE_FORMAT_BPTC_RGB_FLOAT, 0 },
1671 },
1672 {
1673 { GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT, 0 },
1674 { PIPE_FORMAT_BPTC_RGB_UFLOAT, 0 },
1675 },
1676
1677 /* ASTC */
1678 {
1679 { GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 0 },
1680 { PIPE_FORMAT_ASTC_4x4, 0},
1681 },
1682 {
1683 { GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 0 },
1684 { PIPE_FORMAT_ASTC_5x4, 0},
1685 },
1686 {
1687 { GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 0 },
1688 { PIPE_FORMAT_ASTC_5x5, 0},
1689 },
1690 {
1691 { GL_COMPRESSED_RGBA_ASTC_6x5_KHR, 0 },
1692 { PIPE_FORMAT_ASTC_6x5, 0},
1693 },
1694 {
1695 { GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 0 },
1696 { PIPE_FORMAT_ASTC_6x6, 0},
1697 },
1698 {
1699 { GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 0 },
1700 { PIPE_FORMAT_ASTC_8x5, 0},
1701 },
1702 {
1703 { GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 0 },
1704 { PIPE_FORMAT_ASTC_8x6, 0},
1705 },
1706 {
1707 { GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 0 },
1708 { PIPE_FORMAT_ASTC_8x8, 0},
1709 },
1710 {
1711 { GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 0 },
1712 { PIPE_FORMAT_ASTC_10x5, 0},
1713 },
1714 {
1715 { GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 0 },
1716 { PIPE_FORMAT_ASTC_10x6, 0},
1717 },
1718 {
1719 { GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 0 },
1720 { PIPE_FORMAT_ASTC_10x8, 0},
1721 },
1722 {
1723 { GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 0 },
1724 { PIPE_FORMAT_ASTC_10x10, 0},
1725 },
1726 {
1727 { GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 0 },
1728 { PIPE_FORMAT_ASTC_12x10, 0},
1729 },
1730 {
1731 { GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 0 },
1732 { PIPE_FORMAT_ASTC_12x12, 0},
1733 },
1734
1735 {
1736 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 0 },
1737 { PIPE_FORMAT_ASTC_4x4_SRGB, 0},
1738 },
1739 {
1740 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 0 },
1741 { PIPE_FORMAT_ASTC_5x4_SRGB, 0},
1742 },
1743 {
1744 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 0 },
1745 { PIPE_FORMAT_ASTC_5x5_SRGB, 0},
1746 },
1747 {
1748 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 0 },
1749 { PIPE_FORMAT_ASTC_6x5_SRGB, 0},
1750 },
1751 {
1752 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 0 },
1753 { PIPE_FORMAT_ASTC_6x6_SRGB, 0},
1754 },
1755 {
1756 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 0 },
1757 { PIPE_FORMAT_ASTC_8x5_SRGB, 0},
1758 },
1759 {
1760 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 0 },
1761 { PIPE_FORMAT_ASTC_8x6_SRGB, 0},
1762 },
1763 {
1764 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 0 },
1765 { PIPE_FORMAT_ASTC_8x8_SRGB, 0},
1766 },
1767 {
1768 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 0 },
1769 { PIPE_FORMAT_ASTC_10x5_SRGB, 0},
1770 },
1771 {
1772 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 0 },
1773 { PIPE_FORMAT_ASTC_10x6_SRGB, 0},
1774 },
1775 {
1776 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 0 },
1777 { PIPE_FORMAT_ASTC_10x8_SRGB, 0},
1778 },
1779 {
1780 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 0 },
1781 { PIPE_FORMAT_ASTC_10x10_SRGB, 0},
1782 },
1783 {
1784 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 0 },
1785 { PIPE_FORMAT_ASTC_12x10_SRGB, 0},
1786 },
1787 {
1788 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 0 },
1789 { PIPE_FORMAT_ASTC_12x12_SRGB, 0},
1790 },
1791
1792 /* signed/unsigned integer formats.
1793 */
1794 {
1795 { GL_RGBA_INTEGER_EXT,
1796 GL_BGRA_INTEGER_EXT,
1797 GL_RGBA8I_EXT, 0 },
1798 { PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1799 },
1800 {
1801 { GL_RGB_INTEGER_EXT,
1802 GL_BGR_INTEGER_EXT,
1803 GL_RGB8I_EXT,
1804 GL_BLUE_INTEGER_EXT, 0 },
1805 { PIPE_FORMAT_R8G8B8_SINT, PIPE_FORMAT_R8G8B8X8_SINT,
1806 PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1807 },
1808 {
1809 { GL_ALPHA_INTEGER_EXT,
1810 GL_ALPHA8I_EXT, 0 },
1811 { PIPE_FORMAT_A8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1812 },
1813 {
1814 { GL_ALPHA16I_EXT, 0 },
1815 { PIPE_FORMAT_A16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
1816 },
1817 {
1818 { GL_ALPHA32I_EXT, 0 },
1819 { PIPE_FORMAT_A32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1820 },
1821 {
1822 { GL_ALPHA8UI_EXT, 0 },
1823 { PIPE_FORMAT_A8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1824 },
1825 {
1826 { GL_ALPHA16UI_EXT, 0 },
1827 { PIPE_FORMAT_A16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1828 },
1829 {
1830 { GL_ALPHA32UI_EXT, 0 },
1831 { PIPE_FORMAT_A32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1832 },
1833 {
1834 { GL_INTENSITY8I_EXT, 0 },
1835 { PIPE_FORMAT_I8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1836 },
1837 {
1838 { GL_INTENSITY16I_EXT, 0 },
1839 { PIPE_FORMAT_I16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
1840 },
1841 {
1842 { GL_INTENSITY32I_EXT, 0 },
1843 { PIPE_FORMAT_I32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1844 },
1845 {
1846 { GL_INTENSITY8UI_EXT, 0 },
1847 { PIPE_FORMAT_I8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1848 },
1849 {
1850 { GL_INTENSITY16UI_EXT, 0 },
1851 { PIPE_FORMAT_I16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1852 },
1853 {
1854 { GL_INTENSITY32UI_EXT, 0 },
1855 { PIPE_FORMAT_I32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1856 },
1857 {
1858 { GL_LUMINANCE8I_EXT, 0 },
1859 { PIPE_FORMAT_L8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1860 },
1861 {
1862 { GL_LUMINANCE16I_EXT, 0 },
1863 { PIPE_FORMAT_L16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
1864 },
1865 {
1866 { GL_LUMINANCE32I_EXT, 0 },
1867 { PIPE_FORMAT_L32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1868 },
1869 {
1870 { GL_LUMINANCE_INTEGER_EXT,
1871 GL_LUMINANCE8UI_EXT, 0 },
1872 { PIPE_FORMAT_L8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1873 },
1874 {
1875 { GL_LUMINANCE16UI_EXT, 0 },
1876 { PIPE_FORMAT_L16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1877 },
1878 {
1879 { GL_LUMINANCE32UI_EXT, 0 },
1880 { PIPE_FORMAT_L32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1881 },
1882 {
1883 { GL_LUMINANCE_ALPHA_INTEGER_EXT,
1884 GL_LUMINANCE_ALPHA8I_EXT, 0 },
1885 { PIPE_FORMAT_L8A8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1886 },
1887 {
1888 { GL_LUMINANCE_ALPHA16I_EXT, 0 },
1889 { PIPE_FORMAT_L16A16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
1890 },
1891 {
1892 { GL_LUMINANCE_ALPHA32I_EXT, 0 },
1893 { PIPE_FORMAT_L32A32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1894 },
1895 {
1896 { GL_LUMINANCE_ALPHA8UI_EXT, 0 },
1897 { PIPE_FORMAT_L8A8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1898 },
1899 {
1900 { GL_LUMINANCE_ALPHA16UI_EXT, 0 },
1901 { PIPE_FORMAT_L16A16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1902 },
1903 {
1904 { GL_LUMINANCE_ALPHA32UI_EXT, 0 },
1905 { PIPE_FORMAT_L32A32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1906 },
1907 {
1908 { GL_RGB16I_EXT, 0 },
1909 { PIPE_FORMAT_R16G16B16_SINT, PIPE_FORMAT_R16G16B16X16_SINT,
1910 PIPE_FORMAT_R16G16B16A16_SINT, 0 },
1911 },
1912 {
1913 { GL_RGBA16I_EXT, 0 },
1914 { PIPE_FORMAT_R16G16B16A16_SINT, 0 },
1915 },
1916 {
1917 { GL_RGB32I_EXT, 0 },
1918 { PIPE_FORMAT_R32G32B32_SINT, PIPE_FORMAT_R32G32B32X32_SINT,
1919 PIPE_FORMAT_R32G32B32A32_SINT, 0 },
1920 },
1921 {
1922 { GL_RGBA32I_EXT, 0 },
1923 { PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1924 },
1925 {
1926 { GL_RGBA8UI_EXT, 0 },
1927 { PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1928 },
1929 {
1930 { GL_RGB8UI_EXT, 0 },
1931 { PIPE_FORMAT_R8G8B8_UINT, PIPE_FORMAT_R8G8B8X8_UINT,
1932 PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1933 },
1934 {
1935 { GL_RGB16UI_EXT, 0 },
1936 { PIPE_FORMAT_R16G16B16_UINT, PIPE_FORMAT_R16G16B16X16_UINT,
1937 PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1938 },
1939 {
1940 { GL_RGBA16UI_EXT, 0 },
1941 { PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1942 },
1943 {
1944 { GL_RGB32UI_EXT, 0},
1945 { PIPE_FORMAT_R32G32B32_UINT, PIPE_FORMAT_R32G32B32X32_UINT,
1946 PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1947 },
1948 {
1949 { GL_RGBA32UI_EXT, 0},
1950 { PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1951 },
1952 {
1953 { GL_R8I, GL_RED_INTEGER_EXT, 0},
1954 { PIPE_FORMAT_R8_SINT, 0},
1955 },
1956 {
1957 { GL_R16I, 0},
1958 { PIPE_FORMAT_R16_SINT, 0},
1959 },
1960 {
1961 { GL_R32I, 0},
1962 { PIPE_FORMAT_R32_SINT, 0},
1963 },
1964 {
1965 { GL_R8UI, 0},
1966 { PIPE_FORMAT_R8_UINT, 0},
1967 },
1968 {
1969 { GL_R16UI, 0},
1970 { PIPE_FORMAT_R16_UINT, 0},
1971 },
1972 {
1973 { GL_R32UI, 0},
1974 { PIPE_FORMAT_R32_UINT, 0},
1975 },
1976 {
1977 { GL_RG8I, GL_GREEN_INTEGER_EXT, 0},
1978 { PIPE_FORMAT_R8G8_SINT, 0},
1979 },
1980 {
1981 { GL_RG16I, 0},
1982 { PIPE_FORMAT_R16G16_SINT, 0},
1983 },
1984 {
1985 { GL_RG32I, 0},
1986 { PIPE_FORMAT_R32G32_SINT, 0},
1987 },
1988 {
1989 { GL_RG8UI, 0},
1990 { PIPE_FORMAT_R8G8_UINT, 0},
1991 },
1992 {
1993 { GL_RG16UI, 0},
1994 { PIPE_FORMAT_R16G16_UINT, 0},
1995 },
1996 {
1997 { GL_RG32UI, 0},
1998 { PIPE_FORMAT_R32G32_UINT, 0},
1999 },
2000 /* signed normalized formats */
2001 {
2002 { GL_RED_SNORM, GL_R8_SNORM, 0 },
2003 { PIPE_FORMAT_R8_SNORM, PIPE_FORMAT_R8G8_SNORM,
2004 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2005 },
2006 {
2007 { GL_R16_SNORM, 0 },
2008 { PIPE_FORMAT_R16_SNORM,
2009 PIPE_FORMAT_R16G16_SNORM,
2010 PIPE_FORMAT_R16G16B16A16_SNORM,
2011 PIPE_FORMAT_R8_SNORM,
2012 PIPE_FORMAT_R8G8_SNORM,
2013 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2014 },
2015 {
2016 { GL_RG_SNORM, GL_RG8_SNORM, 0 },
2017 { PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2018 },
2019 {
2020 { GL_RG16_SNORM, 0 },
2021 { PIPE_FORMAT_R16G16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
2022 PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2023 },
2024 {
2025 { GL_RGB_SNORM, GL_RGB8_SNORM, 0 },
2026 { PIPE_FORMAT_R8G8B8X8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2027 },
2028 {
2029 { GL_RGBA_SNORM, GL_RGBA8_SNORM, 0 },
2030 { PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2031 },
2032 {
2033 { GL_RGB16_SNORM, 0 },
2034 { PIPE_FORMAT_R16G16B16X16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
2035 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2036 },
2037 {
2038 { GL_RGBA16_SNORM, 0 },
2039 { PIPE_FORMAT_R16G16B16A16_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2040 },
2041 {
2042 { GL_ALPHA_SNORM, GL_ALPHA8_SNORM, 0 },
2043 { PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2044 },
2045 {
2046 { GL_ALPHA16_SNORM, 0 },
2047 { PIPE_FORMAT_A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
2048 PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2049 },
2050 {
2051 { GL_LUMINANCE_SNORM, GL_LUMINANCE8_SNORM, 0 },
2052 { PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2053 },
2054 {
2055 { GL_LUMINANCE16_SNORM, 0 },
2056 { PIPE_FORMAT_L16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
2057 PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2058 },
2059 {
2060 { GL_LUMINANCE_ALPHA_SNORM, GL_LUMINANCE8_ALPHA8_SNORM, 0 },
2061 { PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2062 },
2063 {
2064 { GL_LUMINANCE16_ALPHA16_SNORM, 0 },
2065 { PIPE_FORMAT_L16A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
2066 PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2067 },
2068 {
2069 { GL_INTENSITY_SNORM, GL_INTENSITY8_SNORM, 0 },
2070 { PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2071 },
2072 {
2073 { GL_INTENSITY16_SNORM, 0 },
2074 { PIPE_FORMAT_I16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
2075 PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
2076 },
2077 {
2078 { GL_RGB9_E5, 0 },
2079 { PIPE_FORMAT_R9G9B9E5_FLOAT, 0 }
2080 },
2081 {
2082 { GL_R11F_G11F_B10F, 0 },
2083 { PIPE_FORMAT_R11G11B10_FLOAT, 0 }
2084 },
2085 {
2086 { GL_RGB10_A2UI, 0 },
2087 { PIPE_FORMAT_R10G10B10A2_UINT, PIPE_FORMAT_B10G10R10A2_UINT, 0 }
2088 },
2089 };
2090
2091
2092 /**
2093 * Return first supported format from the given list.
2094 * \param allow_dxt indicates whether it's OK to return a DXT format.
2095 */
2096 static enum pipe_format
2097 find_supported_format(struct pipe_screen *screen,
2098 const enum pipe_format formats[],
2099 enum pipe_texture_target target,
2100 unsigned sample_count,
2101 unsigned storage_sample_count,
2102 unsigned bindings,
2103 boolean allow_dxt)
2104 {
2105 uint i;
2106 for (i = 0; formats[i]; i++) {
2107 if (screen->is_format_supported(screen, formats[i], target,
2108 sample_count, storage_sample_count,
2109 bindings)) {
2110 if (!allow_dxt && util_format_is_s3tc(formats[i])) {
2111 /* we can't return a dxt format, continue searching */
2112 continue;
2113 }
2114
2115 return formats[i];
2116 }
2117 }
2118 return PIPE_FORMAT_NONE;
2119 }
2120
2121
2122 struct exact_format_mapping
2123 {
2124 GLenum format;
2125 GLenum type;
2126 enum pipe_format pformat;
2127 };
2128
2129 static const struct exact_format_mapping rgba8888_tbl[] =
2130 {
2131 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_ABGR8888_UNORM },
2132 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_ABGR8888_UNORM },
2133 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_RGBA8888_UNORM },
2134 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_RGBA8888_UNORM },
2135 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_ARGB8888_UNORM },
2136 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_BGRA8888_UNORM },
2137 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8A8_UNORM },
2138 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_A8B8G8R8_UNORM },
2139 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8A8_UNORM },
2140 { 0, 0, 0 }
2141 };
2142
2143 static const struct exact_format_mapping rgbx8888_tbl[] =
2144 {
2145 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_XBGR8888_UNORM },
2146 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_XBGR8888_UNORM },
2147 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_RGBX8888_UNORM },
2148 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_RGBX8888_UNORM },
2149 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_XRGB8888_UNORM },
2150 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_BGRX8888_UNORM },
2151 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8X8_UNORM },
2152 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_X8B8G8R8_UNORM },
2153 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8X8_UNORM },
2154 { 0, 0, 0 }
2155 };
2156
2157
2158 /**
2159 * For unsized/base internal formats, we may choose a convenient effective
2160 * internal format for {format, type}. If one exists, return that, otherwise
2161 * return PIPE_FORMAT_NONE.
2162 */
2163 static enum pipe_format
2164 find_exact_format(GLint internalFormat, GLenum format, GLenum type)
2165 {
2166 uint i;
2167 const struct exact_format_mapping* tbl;
2168
2169 if (format == GL_NONE || type == GL_NONE)
2170 return PIPE_FORMAT_NONE;
2171
2172 switch (internalFormat) {
2173 case 4:
2174 case GL_RGBA:
2175 tbl = rgba8888_tbl;
2176 break;
2177 case 3:
2178 case GL_RGB:
2179 tbl = rgbx8888_tbl;
2180 break;
2181 default:
2182 return PIPE_FORMAT_NONE;
2183 }
2184
2185 for (i = 0; tbl[i].format; i++)
2186 if (tbl[i].format == format && tbl[i].type == type)
2187 return tbl[i].pformat;
2188
2189 return PIPE_FORMAT_NONE;
2190 }
2191
2192
2193 /**
2194 * Given an OpenGL internalFormat value for a texture or surface, return
2195 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
2196 * This is called during glTexImage2D, for example.
2197 *
2198 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
2199 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
2200 * we want render-to-texture ability.
2201 *
2202 * \param internalFormat the user value passed to glTexImage2D
2203 * \param target one of PIPE_TEXTURE_x
2204 * \param bindings bitmask of PIPE_BIND_x flags.
2205 * \param allow_dxt indicates whether it's OK to return a DXT format. This
2206 * only matters when internalFormat names a generic or
2207 * specific compressed format. And that should only happen
2208 * when we're getting called from gl[Copy]TexImage().
2209 */
2210 enum pipe_format
2211 st_choose_format(struct st_context *st, GLenum internalFormat,
2212 GLenum format, GLenum type,
2213 enum pipe_texture_target target, unsigned sample_count,
2214 unsigned storage_sample_count,
2215 unsigned bindings, boolean allow_dxt)
2216 {
2217 struct pipe_screen *screen = st->pipe->screen;
2218 unsigned i;
2219 int j;
2220 enum pipe_format pf;
2221
2222 /* can't render to compressed formats at this time */
2223 if (_mesa_is_compressed_format(st->ctx, internalFormat)
2224 && (bindings & ~PIPE_BIND_SAMPLER_VIEW)) {
2225 return PIPE_FORMAT_NONE;
2226 }
2227
2228 /* search for exact matches */
2229 pf = find_exact_format(internalFormat, format, type);
2230 if (pf != PIPE_FORMAT_NONE &&
2231 screen->is_format_supported(screen, pf, target, sample_count,
2232 storage_sample_count, bindings)) {
2233 goto success;
2234 }
2235
2236 /* For an unsized GL_RGB but a 2_10_10_10 type, try to pick one of the
2237 * 2_10_10_10 formats. This is important for
2238 * GL_EXT_texture_type_2_10_10_10_EXT support, which says that these
2239 * formats are not color-renderable. Mesa's check for making those
2240 * non-color-renderable is based on our chosen format being 2101010.
2241 */
2242 if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
2243 if (internalFormat == GL_RGB)
2244 internalFormat = GL_RGB10;
2245 else if (internalFormat == GL_RGBA)
2246 internalFormat = GL_RGB10_A2;
2247 }
2248
2249 if (type == GL_UNSIGNED_SHORT_5_5_5_1) {
2250 if (internalFormat == GL_RGB)
2251 internalFormat = GL_RGB5;
2252 else if (internalFormat == GL_RGBA)
2253 internalFormat = GL_RGB5_A1;
2254 }
2255
2256 /* search table for internalFormat */
2257 for (i = 0; i < ARRAY_SIZE(format_map); i++) {
2258 const struct format_mapping *mapping = &format_map[i];
2259 for (j = 0; mapping->glFormats[j]; j++) {
2260 if (mapping->glFormats[j] == internalFormat) {
2261 /* Found the desired internal format. Find first pipe format
2262 * which is supported by the driver.
2263 */
2264 pf = find_supported_format(screen, mapping->pipeFormats,
2265 target, sample_count,
2266 storage_sample_count, bindings,
2267 allow_dxt);
2268 goto success;
2269 }
2270 }
2271 }
2272
2273 _mesa_problem(NULL, "unhandled format!\n");
2274 return PIPE_FORMAT_NONE;
2275
2276 success:
2277 if (0) {
2278 debug_printf("%s(fmt=%s, type=%s, intFmt=%s) = %s\n",
2279 __FUNCTION__,
2280 _mesa_enum_to_string(format),
2281 _mesa_enum_to_string(type),
2282 _mesa_enum_to_string(internalFormat),
2283 util_format_name(pf));
2284 }
2285 return pf;
2286 }
2287
2288
2289 /**
2290 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
2291 */
2292 enum pipe_format
2293 st_choose_renderbuffer_format(struct st_context *st,
2294 GLenum internalFormat, unsigned sample_count,
2295 unsigned storage_sample_count)
2296 {
2297 unsigned bindings;
2298 if (_mesa_is_depth_or_stencil_format(internalFormat))
2299 bindings = PIPE_BIND_DEPTH_STENCIL;
2300 else
2301 bindings = PIPE_BIND_RENDER_TARGET;
2302 return st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
2303 PIPE_TEXTURE_2D, sample_count,
2304 storage_sample_count, bindings, FALSE);
2305 }
2306
2307
2308 /**
2309 * Given an OpenGL user-requested format and type, and swapBytes state,
2310 * return the format which exactly matches those parameters, so that
2311 * a memcpy-based transfer can be done.
2312 *
2313 * If no format is supported, return PIPE_FORMAT_NONE.
2314 */
2315 enum pipe_format
2316 st_choose_matching_format(struct st_context *st, unsigned bind,
2317 GLenum format, GLenum type, GLboolean swapBytes)
2318 {
2319 struct pipe_screen *screen = st->pipe->screen;
2320 mesa_format mesa_format;
2321
2322 for (mesa_format = 1; mesa_format < MESA_FORMAT_COUNT; mesa_format++) {
2323 if (_mesa_is_format_srgb(mesa_format)) {
2324 continue;
2325 }
2326 if (_mesa_get_format_bits(mesa_format, GL_TEXTURE_INTENSITY_SIZE) > 0) {
2327 /* If `format` is GL_RED/GL_RED_INTEGER, then we might match some
2328 * intensity formats, which we don't want.
2329 */
2330 continue;
2331 }
2332
2333 if (_mesa_format_matches_format_and_type(mesa_format, format, type,
2334 swapBytes, NULL)) {
2335 enum pipe_format format =
2336 st_mesa_format_to_pipe_format(st, mesa_format);
2337
2338 if (format &&
2339 screen->is_format_supported(screen, format, PIPE_TEXTURE_2D,
2340 0, 0, bind)) {
2341 return format;
2342 }
2343 /* It's unlikely to find 2 matching Mesa formats. */
2344 break;
2345 }
2346 }
2347 return PIPE_FORMAT_NONE;
2348 }
2349
2350
2351 /**
2352 * Called via ctx->Driver.ChooseTextureFormat().
2353 */
2354 mesa_format
2355 st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
2356 GLint internalFormat,
2357 GLenum format, GLenum type)
2358 {
2359 struct st_context *st = st_context(ctx);
2360 enum pipe_format pFormat;
2361 mesa_format mFormat;
2362 unsigned bindings;
2363 bool is_renderbuffer = false;
2364 enum pipe_texture_target pTarget;
2365
2366 if (target == GL_RENDERBUFFER) {
2367 pTarget = PIPE_TEXTURE_2D;
2368 is_renderbuffer = true;
2369 } else {
2370 pTarget = gl_target_to_pipe(target);
2371 }
2372
2373 if (target == GL_TEXTURE_1D || target == GL_TEXTURE_1D_ARRAY) {
2374 /* We don't do compression for these texture targets because of
2375 * difficulty with sub-texture updates on non-block boundaries, etc.
2376 * So change the internal format request to an uncompressed format.
2377 */
2378 internalFormat =
2379 _mesa_generic_compressed_format_to_uncompressed_format(internalFormat);
2380 }
2381
2382 /* GL textures may wind up being render targets, but we don't know
2383 * that in advance. Specify potential render target flags now for formats
2384 * that we know should always be renderable.
2385 */
2386 bindings = PIPE_BIND_SAMPLER_VIEW;
2387 if (_mesa_is_depth_or_stencil_format(internalFormat))
2388 bindings |= PIPE_BIND_DEPTH_STENCIL;
2389 else if (is_renderbuffer || internalFormat == 3 || internalFormat == 4 ||
2390 internalFormat == GL_RGB || internalFormat == GL_RGBA ||
2391 internalFormat == GL_RGBA2 ||
2392 internalFormat == GL_RGB4 || internalFormat == GL_RGBA4 ||
2393 internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
2394 internalFormat == GL_BGRA ||
2395 internalFormat == GL_RGB16F ||
2396 internalFormat == GL_RGBA16F ||
2397 internalFormat == GL_RGB32F ||
2398 internalFormat == GL_RGBA32F)
2399 bindings |= PIPE_BIND_RENDER_TARGET;
2400
2401 /* GLES allows the driver to choose any format which matches
2402 * the format+type combo, because GLES only supports unsized internal
2403 * formats and expects the driver to choose whatever suits it.
2404 */
2405 if (_mesa_is_gles(ctx)) {
2406 GLenum baseFormat = _mesa_base_tex_format(ctx, internalFormat);
2407 GLenum basePackFormat = _mesa_base_pack_format(format);
2408 GLenum iformat = internalFormat;
2409
2410 /* Treat GL_BGRA as GL_RGBA. */
2411 if (iformat == GL_BGRA)
2412 iformat = GL_RGBA;
2413
2414 /* Check if the internalformat is unsized and compatible
2415 * with the "format".
2416 */
2417 if (iformat == baseFormat && iformat == basePackFormat) {
2418 pFormat = st_choose_matching_format(st, bindings, format, type,
2419 ctx->Unpack.SwapBytes);
2420
2421 if (pFormat != PIPE_FORMAT_NONE)
2422 return st_pipe_format_to_mesa_format(pFormat);
2423
2424 if (!is_renderbuffer) {
2425 /* try choosing format again, this time without render
2426 * target bindings.
2427 */
2428 pFormat = st_choose_matching_format(st, PIPE_BIND_SAMPLER_VIEW,
2429 format, type,
2430 ctx->Unpack.SwapBytes);
2431 if (pFormat != PIPE_FORMAT_NONE)
2432 return st_pipe_format_to_mesa_format(pFormat);
2433 }
2434 }
2435 }
2436
2437 pFormat = st_choose_format(st, internalFormat, format, type,
2438 pTarget, 0, 0, bindings, GL_TRUE);
2439
2440 if (pFormat == PIPE_FORMAT_NONE && !is_renderbuffer) {
2441 /* try choosing format again, this time without render target bindings */
2442 pFormat = st_choose_format(st, internalFormat, format, type,
2443 pTarget, 0, 0, PIPE_BIND_SAMPLER_VIEW,
2444 GL_TRUE);
2445 }
2446
2447 if (pFormat == PIPE_FORMAT_NONE) {
2448 mFormat = _mesa_glenum_to_compressed_format(internalFormat);
2449 if (st_compressed_format_fallback(st, mFormat))
2450 return mFormat;
2451
2452 /* no luck at all */
2453 return MESA_FORMAT_NONE;
2454 }
2455
2456 mFormat = st_pipe_format_to_mesa_format(pFormat);
2457
2458 /* Debugging aid */
2459 if (0) {
2460 debug_printf("%s(intFormat=%s, format=%s, type=%s) -> %s, %s\n",
2461 __func__,
2462 _mesa_enum_to_string(internalFormat),
2463 _mesa_enum_to_string(format),
2464 _mesa_enum_to_string(type),
2465 util_format_name(pFormat),
2466 _mesa_get_format_name(mFormat));
2467 }
2468
2469 return mFormat;
2470 }
2471
2472
2473 /**
2474 * Called via ctx->Driver.QueryInternalFormat().
2475 */
2476 static size_t
2477 st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
2478 GLenum internalFormat, int samples[16])
2479 {
2480 struct st_context *st = st_context(ctx);
2481 enum pipe_format format;
2482 unsigned i, bind, num_sample_counts = 0;
2483
2484 (void) target;
2485
2486 if (_mesa_is_depth_or_stencil_format(internalFormat))
2487 bind = PIPE_BIND_DEPTH_STENCIL;
2488 else
2489 bind = PIPE_BIND_RENDER_TARGET;
2490
2491 /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
2492 * formats.
2493 */
2494 if (!ctx->Extensions.EXT_sRGB) {
2495 internalFormat = _mesa_get_linear_internalformat(internalFormat);
2496 }
2497
2498 /* Set sample counts in descending order. */
2499 for (i = 16; i > 1; i--) {
2500 format = st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
2501 PIPE_TEXTURE_2D, i, i, bind, FALSE);
2502
2503 if (format != PIPE_FORMAT_NONE) {
2504 samples[num_sample_counts++] = i;
2505 }
2506 }
2507
2508 if (!num_sample_counts) {
2509 samples[num_sample_counts++] = 1;
2510 }
2511
2512 return num_sample_counts;
2513 }
2514
2515
2516 /**
2517 * ARB_internalformat_query2 driver hook.
2518 */
2519 void
2520 st_QueryInternalFormat(struct gl_context *ctx, GLenum target,
2521 GLenum internalFormat, GLenum pname, GLint *params)
2522 {
2523 struct st_context *st = st_context(ctx);
2524 /* The API entry-point gives us a temporary params buffer that is non-NULL
2525 * and guaranteed to have at least 16 elements.
2526 */
2527 assert(params != NULL);
2528
2529 switch (pname) {
2530 case GL_SAMPLES:
2531 st_QuerySamplesForFormat(ctx, target, internalFormat, params);
2532 break;
2533
2534 case GL_NUM_SAMPLE_COUNTS: {
2535 int samples[16];
2536 size_t num_samples;
2537 num_samples = st_QuerySamplesForFormat(ctx, target, internalFormat,
2538 samples);
2539 params[0] = (GLint) num_samples;
2540 break;
2541 }
2542 case GL_INTERNALFORMAT_PREFERRED: {
2543 params[0] = GL_NONE;
2544
2545 /* We need to resolve an internal format that is compatible with
2546 * the passed internal format, and optimal to the driver. By now,
2547 * we just validate that the passed internal format is supported by
2548 * the driver, and if so return the same internal format, otherwise
2549 * return GL_NONE.
2550 */
2551 unsigned bindings;
2552 if (_mesa_is_depth_or_stencil_format(internalFormat))
2553 bindings = PIPE_BIND_DEPTH_STENCIL;
2554 else
2555 bindings = PIPE_BIND_RENDER_TARGET;
2556 enum pipe_format pformat = st_choose_format(st,
2557 internalFormat,
2558 GL_NONE,
2559 GL_NONE,
2560 PIPE_TEXTURE_2D, 0, 0,
2561 bindings, FALSE);
2562 if (pformat)
2563 params[0] = internalFormat;
2564 break;
2565 }
2566 default:
2567 /* For the rest of the pnames, we call back the Mesa's default
2568 * function for drivers that don't implement ARB_internalformat_query2.
2569 */
2570 _mesa_query_internal_format_default(ctx, target, internalFormat, pname,
2571 params);
2572 }
2573 }
2574
2575
2576 /**
2577 * This is used for translating texture border color and the clear
2578 * color. For example, the clear color is interpreted according to
2579 * the renderbuffer's base format. For example, if clearing a
2580 * GL_LUMINANCE buffer, we'll return colorOut[0] = colorOut[1] =
2581 * colorOut[2] = colorIn[0].
2582 * Similarly for texture border colors.
2583 */
2584 void
2585 st_translate_color(const union gl_color_union *colorIn,
2586 union pipe_color_union *colorOut,
2587 GLenum baseFormat, GLboolean is_integer)
2588 {
2589 if (is_integer) {
2590 const int *in = colorIn->i;
2591 int *out = colorOut->i;
2592
2593 switch (baseFormat) {
2594 case GL_RED:
2595 out[0] = in[0];
2596 out[1] = 0;
2597 out[2] = 0;
2598 out[3] = 1;
2599 break;
2600 case GL_RG:
2601 out[0] = in[0];
2602 out[1] = in[1];
2603 out[2] = 0;
2604 out[3] = 1;
2605 break;
2606 case GL_RGB:
2607 out[0] = in[0];
2608 out[1] = in[1];
2609 out[2] = in[2];
2610 out[3] = 1;
2611 break;
2612 case GL_ALPHA:
2613 out[0] = out[1] = out[2] = 0;
2614 out[3] = in[3];
2615 break;
2616 case GL_LUMINANCE:
2617 out[0] = out[1] = out[2] = in[0];
2618 out[3] = 1;
2619 break;
2620 case GL_LUMINANCE_ALPHA:
2621 out[0] = out[1] = out[2] = in[0];
2622 out[3] = in[3];
2623 break;
2624 case GL_INTENSITY:
2625 out[0] = out[1] = out[2] = out[3] = in[0];
2626 break;
2627 default:
2628 COPY_4V(out, in);
2629 }
2630 }
2631 else {
2632 const float *in = colorIn->f;
2633 float *out = colorOut->f;
2634
2635 switch (baseFormat) {
2636 case GL_RED:
2637 out[0] = in[0];
2638 out[1] = 0.0F;
2639 out[2] = 0.0F;
2640 out[3] = 1.0F;
2641 break;
2642 case GL_RG:
2643 out[0] = in[0];
2644 out[1] = in[1];
2645 out[2] = 0.0F;
2646 out[3] = 1.0F;
2647 break;
2648 case GL_RGB:
2649 out[0] = in[0];
2650 out[1] = in[1];
2651 out[2] = in[2];
2652 out[3] = 1.0F;
2653 break;
2654 case GL_ALPHA:
2655 out[0] = out[1] = out[2] = 0.0F;
2656 out[3] = in[3];
2657 break;
2658 case GL_LUMINANCE:
2659 out[0] = out[1] = out[2] = in[0];
2660 out[3] = 1.0F;
2661 break;
2662 case GL_LUMINANCE_ALPHA:
2663 out[0] = out[1] = out[2] = in[0];
2664 out[3] = in[3];
2665 break;
2666 /* Stencil border is tricky on some hw. Help drivers a little here. */
2667 case GL_STENCIL_INDEX:
2668 case GL_INTENSITY:
2669 out[0] = out[1] = out[2] = out[3] = in[0];
2670 break;
2671 default:
2672 COPY_4V(out, in);
2673 }
2674 }
2675 }