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