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