1 /**************************************************************************
2 *
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
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 TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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/glformats.h"
38 #include "main/texstore.h"
39 #include "main/image.h"
40 #include "main/macros.h"
41 #include "main/mfeatures.h"
42
43 #include "pipe/p_context.h"
44 #include "pipe/p_defines.h"
45 #include "pipe/p_screen.h"
46 #include "util/u_format.h"
47 #include "st_context.h"
48 #include "st_format.h"
49
50
51 /**
52 * Translate Mesa format to Gallium format.
53 */
54 enum pipe_format
st_mesa_format_to_pipe_format(gl_format mesaFormat)55 st_mesa_format_to_pipe_format(gl_format mesaFormat)
56 {
57 switch (mesaFormat) {
58 case MESA_FORMAT_RGBA8888:
59 return PIPE_FORMAT_A8B8G8R8_UNORM;
60 case MESA_FORMAT_RGBA8888_REV:
61 return PIPE_FORMAT_R8G8B8A8_UNORM;
62 case MESA_FORMAT_ARGB8888:
63 return PIPE_FORMAT_B8G8R8A8_UNORM;
64 case MESA_FORMAT_ARGB8888_REV:
65 return PIPE_FORMAT_A8R8G8B8_UNORM;
66 case MESA_FORMAT_RGBX8888:
67 return PIPE_FORMAT_X8B8G8R8_UNORM;
68 case MESA_FORMAT_RGBX8888_REV:
69 return PIPE_FORMAT_R8G8B8X8_UNORM;
70 case MESA_FORMAT_XRGB8888:
71 return PIPE_FORMAT_B8G8R8X8_UNORM;
72 case MESA_FORMAT_XRGB8888_REV:
73 return PIPE_FORMAT_X8R8G8B8_UNORM;
74 case MESA_FORMAT_ARGB1555:
75 return PIPE_FORMAT_B5G5R5A1_UNORM;
76 case MESA_FORMAT_ARGB4444:
77 return PIPE_FORMAT_B4G4R4A4_UNORM;
78 case MESA_FORMAT_RGB565:
79 return PIPE_FORMAT_B5G6R5_UNORM;
80 case MESA_FORMAT_RGB332:
81 return PIPE_FORMAT_B2G3R3_UNORM;
82 case MESA_FORMAT_ARGB2101010:
83 return PIPE_FORMAT_B10G10R10A2_UNORM;
84 case MESA_FORMAT_AL44:
85 return PIPE_FORMAT_L4A4_UNORM;
86 case MESA_FORMAT_AL88:
87 return PIPE_FORMAT_L8A8_UNORM;
88 case MESA_FORMAT_AL1616:
89 return PIPE_FORMAT_L16A16_UNORM;
90 case MESA_FORMAT_A8:
91 return PIPE_FORMAT_A8_UNORM;
92 case MESA_FORMAT_A16:
93 return PIPE_FORMAT_A16_UNORM;
94 case MESA_FORMAT_L8:
95 return PIPE_FORMAT_L8_UNORM;
96 case MESA_FORMAT_L16:
97 return PIPE_FORMAT_L16_UNORM;
98 case MESA_FORMAT_I8:
99 return PIPE_FORMAT_I8_UNORM;
100 case MESA_FORMAT_I16:
101 return PIPE_FORMAT_I16_UNORM;
102 case MESA_FORMAT_Z16:
103 return PIPE_FORMAT_Z16_UNORM;
104 case MESA_FORMAT_Z32:
105 return PIPE_FORMAT_Z32_UNORM;
106 case MESA_FORMAT_Z24_S8:
107 return PIPE_FORMAT_S8_UINT_Z24_UNORM;
108 case MESA_FORMAT_S8_Z24:
109 return PIPE_FORMAT_Z24_UNORM_S8_UINT;
110 case MESA_FORMAT_Z24_X8:
111 return PIPE_FORMAT_X8Z24_UNORM;
112 case MESA_FORMAT_X8_Z24:
113 return PIPE_FORMAT_Z24X8_UNORM;
114 case MESA_FORMAT_S8:
115 return PIPE_FORMAT_S8_UINT;
116 case MESA_FORMAT_Z32_FLOAT:
117 return PIPE_FORMAT_Z32_FLOAT;
118 case MESA_FORMAT_Z32_FLOAT_X24S8:
119 return PIPE_FORMAT_Z32_FLOAT_S8X24_UINT;
120 case MESA_FORMAT_YCBCR:
121 return PIPE_FORMAT_UYVY;
122 #if FEATURE_texture_s3tc
123 case MESA_FORMAT_RGB_DXT1:
124 return PIPE_FORMAT_DXT1_RGB;
125 case MESA_FORMAT_RGBA_DXT1:
126 return PIPE_FORMAT_DXT1_RGBA;
127 case MESA_FORMAT_RGBA_DXT3:
128 return PIPE_FORMAT_DXT3_RGBA;
129 case MESA_FORMAT_RGBA_DXT5:
130 return PIPE_FORMAT_DXT5_RGBA;
131 #if FEATURE_EXT_texture_sRGB
132 case MESA_FORMAT_SRGB_DXT1:
133 return PIPE_FORMAT_DXT1_SRGB;
134 case MESA_FORMAT_SRGBA_DXT1:
135 return PIPE_FORMAT_DXT1_SRGBA;
136 case MESA_FORMAT_SRGBA_DXT3:
137 return PIPE_FORMAT_DXT3_SRGBA;
138 case MESA_FORMAT_SRGBA_DXT5:
139 return PIPE_FORMAT_DXT5_SRGBA;
140 #endif
141 #endif
142 #if FEATURE_EXT_texture_sRGB
143 case MESA_FORMAT_SLA8:
144 return PIPE_FORMAT_L8A8_SRGB;
145 case MESA_FORMAT_SL8:
146 return PIPE_FORMAT_L8_SRGB;
147 case MESA_FORMAT_SRGB8:
148 return PIPE_FORMAT_R8G8B8_SRGB;
149 case MESA_FORMAT_SRGBA8:
150 return PIPE_FORMAT_A8B8G8R8_SRGB;
151 case MESA_FORMAT_SARGB8:
152 return PIPE_FORMAT_B8G8R8A8_SRGB;
153 #endif
154 case MESA_FORMAT_RGBA_FLOAT32:
155 return PIPE_FORMAT_R32G32B32A32_FLOAT;
156 case MESA_FORMAT_RGBA_FLOAT16:
157 return PIPE_FORMAT_R16G16B16A16_FLOAT;
158 case MESA_FORMAT_RGB_FLOAT32:
159 return PIPE_FORMAT_R32G32B32_FLOAT;
160 case MESA_FORMAT_RGB_FLOAT16:
161 return PIPE_FORMAT_R16G16B16_FLOAT;
162 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
163 return PIPE_FORMAT_L32A32_FLOAT;
164 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
165 return PIPE_FORMAT_L16A16_FLOAT;
166 case MESA_FORMAT_LUMINANCE_FLOAT32:
167 return PIPE_FORMAT_L32_FLOAT;
168 case MESA_FORMAT_LUMINANCE_FLOAT16:
169 return PIPE_FORMAT_L16_FLOAT;
170 case MESA_FORMAT_ALPHA_FLOAT32:
171 return PIPE_FORMAT_A32_FLOAT;
172 case MESA_FORMAT_ALPHA_FLOAT16:
173 return PIPE_FORMAT_A16_FLOAT;
174 case MESA_FORMAT_INTENSITY_FLOAT32:
175 return PIPE_FORMAT_I32_FLOAT;
176 case MESA_FORMAT_INTENSITY_FLOAT16:
177 return PIPE_FORMAT_I16_FLOAT;
178 case MESA_FORMAT_R_FLOAT32:
179 return PIPE_FORMAT_R32_FLOAT;
180 case MESA_FORMAT_R_FLOAT16:
181 return PIPE_FORMAT_R16_FLOAT;
182 case MESA_FORMAT_RG_FLOAT32:
183 return PIPE_FORMAT_R32G32_FLOAT;
184 case MESA_FORMAT_RG_FLOAT16:
185 return PIPE_FORMAT_R16G16_FLOAT;
186
187 case MESA_FORMAT_R8:
188 return PIPE_FORMAT_R8_UNORM;
189 case MESA_FORMAT_R16:
190 return PIPE_FORMAT_R16_UNORM;
191 case MESA_FORMAT_GR88:
192 return PIPE_FORMAT_R8G8_UNORM;
193 case MESA_FORMAT_RG1616:
194 return PIPE_FORMAT_R16G16_UNORM;
195 case MESA_FORMAT_RGBA_16:
196 return PIPE_FORMAT_R16G16B16A16_UNORM;
197
198 /* signed int formats */
199 case MESA_FORMAT_ALPHA_UINT8:
200 return PIPE_FORMAT_A8_UINT;
201 case MESA_FORMAT_ALPHA_UINT16:
202 return PIPE_FORMAT_A16_UINT;
203 case MESA_FORMAT_ALPHA_UINT32:
204 return PIPE_FORMAT_A32_UINT;
205
206 case MESA_FORMAT_ALPHA_INT8:
207 return PIPE_FORMAT_A8_SINT;
208 case MESA_FORMAT_ALPHA_INT16:
209 return PIPE_FORMAT_A16_SINT;
210 case MESA_FORMAT_ALPHA_INT32:
211 return PIPE_FORMAT_A32_SINT;
212
213 case MESA_FORMAT_INTENSITY_UINT8:
214 return PIPE_FORMAT_I8_UINT;
215 case MESA_FORMAT_INTENSITY_UINT16:
216 return PIPE_FORMAT_I16_UINT;
217 case MESA_FORMAT_INTENSITY_UINT32:
218 return PIPE_FORMAT_I32_UINT;
219
220 case MESA_FORMAT_INTENSITY_INT8:
221 return PIPE_FORMAT_I8_SINT;
222 case MESA_FORMAT_INTENSITY_INT16:
223 return PIPE_FORMAT_I16_SINT;
224 case MESA_FORMAT_INTENSITY_INT32:
225 return PIPE_FORMAT_I32_SINT;
226
227 case MESA_FORMAT_LUMINANCE_UINT8:
228 return PIPE_FORMAT_L8_UINT;
229 case MESA_FORMAT_LUMINANCE_UINT16:
230 return PIPE_FORMAT_L16_UINT;
231 case MESA_FORMAT_LUMINANCE_UINT32:
232 return PIPE_FORMAT_L32_UINT;
233
234 case MESA_FORMAT_LUMINANCE_INT8:
235 return PIPE_FORMAT_L8_SINT;
236 case MESA_FORMAT_LUMINANCE_INT16:
237 return PIPE_FORMAT_L16_SINT;
238 case MESA_FORMAT_LUMINANCE_INT32:
239 return PIPE_FORMAT_L32_SINT;
240
241 case MESA_FORMAT_LUMINANCE_ALPHA_UINT8:
242 return PIPE_FORMAT_L8A8_UINT;
243 case MESA_FORMAT_LUMINANCE_ALPHA_UINT16:
244 return PIPE_FORMAT_L16A16_UINT;
245 case MESA_FORMAT_LUMINANCE_ALPHA_UINT32:
246 return PIPE_FORMAT_L32A32_UINT;
247
248 case MESA_FORMAT_LUMINANCE_ALPHA_INT8:
249 return PIPE_FORMAT_L8A8_SINT;
250 case MESA_FORMAT_LUMINANCE_ALPHA_INT16:
251 return PIPE_FORMAT_L16A16_SINT;
252 case MESA_FORMAT_LUMINANCE_ALPHA_INT32:
253 return PIPE_FORMAT_L32A32_SINT;
254
255 case MESA_FORMAT_R_INT8:
256 return PIPE_FORMAT_R8_SINT;
257 case MESA_FORMAT_RG_INT8:
258 return PIPE_FORMAT_R8G8_SINT;
259 case MESA_FORMAT_RGB_INT8:
260 return PIPE_FORMAT_R8G8B8_SINT;
261 case MESA_FORMAT_RGBA_INT8:
262 return PIPE_FORMAT_R8G8B8A8_SINT;
263 case MESA_FORMAT_R_INT16:
264 return PIPE_FORMAT_R16_SINT;
265 case MESA_FORMAT_RG_INT16:
266 return PIPE_FORMAT_R16G16_SINT;
267 case MESA_FORMAT_RGB_INT16:
268 return PIPE_FORMAT_R16G16B16_SINT;
269 case MESA_FORMAT_RGBA_INT16:
270 return PIPE_FORMAT_R16G16B16A16_SINT;
271 case MESA_FORMAT_R_INT32:
272 return PIPE_FORMAT_R32_SINT;
273 case MESA_FORMAT_RG_INT32:
274 return PIPE_FORMAT_R32G32_SINT;
275 case MESA_FORMAT_RGB_INT32:
276 return PIPE_FORMAT_R32G32B32_SINT;
277 case MESA_FORMAT_RGBA_INT32:
278 return PIPE_FORMAT_R32G32B32A32_SINT;
279
280 /* unsigned int formats */
281 case MESA_FORMAT_R_UINT8:
282 return PIPE_FORMAT_R8_UINT;
283 case MESA_FORMAT_RG_UINT8:
284 return PIPE_FORMAT_R8G8_UINT;
285 case MESA_FORMAT_RGB_UINT8:
286 return PIPE_FORMAT_R8G8B8_UINT;
287 case MESA_FORMAT_RGBA_UINT8:
288 return PIPE_FORMAT_R8G8B8A8_UINT;
289 case MESA_FORMAT_R_UINT16:
290 return PIPE_FORMAT_R16_UINT;
291 case MESA_FORMAT_RG_UINT16:
292 return PIPE_FORMAT_R16G16_UINT;
293 case MESA_FORMAT_RGB_UINT16:
294 return PIPE_FORMAT_R16G16B16_UINT;
295 case MESA_FORMAT_RGBA_UINT16:
296 return PIPE_FORMAT_R16G16B16A16_UINT;
297 case MESA_FORMAT_R_UINT32:
298 return PIPE_FORMAT_R32_UINT;
299 case MESA_FORMAT_RG_UINT32:
300 return PIPE_FORMAT_R32G32_UINT;
301 case MESA_FORMAT_RGB_UINT32:
302 return PIPE_FORMAT_R32G32B32_UINT;
303 case MESA_FORMAT_RGBA_UINT32:
304 return PIPE_FORMAT_R32G32B32A32_UINT;
305
306 case MESA_FORMAT_RED_RGTC1:
307 return PIPE_FORMAT_RGTC1_UNORM;
308 case MESA_FORMAT_SIGNED_RED_RGTC1:
309 return PIPE_FORMAT_RGTC1_SNORM;
310 case MESA_FORMAT_RG_RGTC2:
311 return PIPE_FORMAT_RGTC2_UNORM;
312 case MESA_FORMAT_SIGNED_RG_RGTC2:
313 return PIPE_FORMAT_RGTC2_SNORM;
314
315 case MESA_FORMAT_L_LATC1:
316 return PIPE_FORMAT_LATC1_UNORM;
317 case MESA_FORMAT_SIGNED_L_LATC1:
318 return PIPE_FORMAT_LATC1_SNORM;
319 case MESA_FORMAT_LA_LATC2:
320 return PIPE_FORMAT_LATC2_UNORM;
321 case MESA_FORMAT_SIGNED_LA_LATC2:
322 return PIPE_FORMAT_LATC2_SNORM;
323
324 case MESA_FORMAT_ETC1_RGB8:
325 return PIPE_FORMAT_ETC1_RGB8;
326
327 /* signed normalized formats */
328 case MESA_FORMAT_SIGNED_R8:
329 return PIPE_FORMAT_R8_SNORM;
330 case MESA_FORMAT_SIGNED_RG88_REV:
331 return PIPE_FORMAT_R8G8_SNORM;
332 case MESA_FORMAT_SIGNED_RGBA8888_REV:
333 return PIPE_FORMAT_R8G8B8A8_SNORM;
334
335 case MESA_FORMAT_SIGNED_A8:
336 return PIPE_FORMAT_A8_SNORM;
337 case MESA_FORMAT_SIGNED_L8:
338 return PIPE_FORMAT_L8_SNORM;
339 case MESA_FORMAT_SIGNED_AL88:
340 return PIPE_FORMAT_L8A8_SNORM;
341 case MESA_FORMAT_SIGNED_I8:
342 return PIPE_FORMAT_I8_SNORM;
343
344 case MESA_FORMAT_SIGNED_R16:
345 return PIPE_FORMAT_R16_SNORM;
346 case MESA_FORMAT_SIGNED_GR1616:
347 return PIPE_FORMAT_R16G16_SNORM;
348 case MESA_FORMAT_SIGNED_RGBA_16:
349 return PIPE_FORMAT_R16G16B16A16_SNORM;
350
351 case MESA_FORMAT_SIGNED_A16:
352 return PIPE_FORMAT_A16_SNORM;
353 case MESA_FORMAT_SIGNED_L16:
354 return PIPE_FORMAT_L16_SNORM;
355 case MESA_FORMAT_SIGNED_AL1616:
356 return PIPE_FORMAT_L16A16_SNORM;
357 case MESA_FORMAT_SIGNED_I16:
358 return PIPE_FORMAT_I16_SNORM;
359
360 case MESA_FORMAT_RGB9_E5_FLOAT:
361 return PIPE_FORMAT_R9G9B9E5_FLOAT;
362 case MESA_FORMAT_R11_G11_B10_FLOAT:
363 return PIPE_FORMAT_R11G11B10_FLOAT;
364 case MESA_FORMAT_ARGB2101010_UINT:
365 return PIPE_FORMAT_B10G10R10A2_UINT;
366 default:
367 assert(0);
368 return PIPE_FORMAT_NONE;
369 }
370 }
371
372
373 /**
374 * Translate Gallium format to Mesa format.
375 */
376 gl_format
st_pipe_format_to_mesa_format(enum pipe_format format)377 st_pipe_format_to_mesa_format(enum pipe_format format)
378 {
379 switch (format) {
380 case PIPE_FORMAT_A8B8G8R8_UNORM:
381 return MESA_FORMAT_RGBA8888;
382 case PIPE_FORMAT_R8G8B8A8_UNORM:
383 return MESA_FORMAT_RGBA8888_REV;
384 case PIPE_FORMAT_B8G8R8A8_UNORM:
385 return MESA_FORMAT_ARGB8888;
386 case PIPE_FORMAT_A8R8G8B8_UNORM:
387 return MESA_FORMAT_ARGB8888_REV;
388 case PIPE_FORMAT_X8B8G8R8_UNORM:
389 return MESA_FORMAT_RGBX8888;
390 case PIPE_FORMAT_R8G8B8X8_UNORM:
391 return MESA_FORMAT_RGBX8888_REV;
392 case PIPE_FORMAT_B8G8R8X8_UNORM:
393 return MESA_FORMAT_XRGB8888;
394 case PIPE_FORMAT_X8R8G8B8_UNORM:
395 return MESA_FORMAT_XRGB8888_REV;
396 case PIPE_FORMAT_B5G5R5A1_UNORM:
397 return MESA_FORMAT_ARGB1555;
398 case PIPE_FORMAT_B4G4R4A4_UNORM:
399 return MESA_FORMAT_ARGB4444;
400 case PIPE_FORMAT_B5G6R5_UNORM:
401 return MESA_FORMAT_RGB565;
402 case PIPE_FORMAT_B2G3R3_UNORM:
403 return MESA_FORMAT_RGB332;
404 case PIPE_FORMAT_B10G10R10A2_UNORM:
405 return MESA_FORMAT_ARGB2101010;
406 case PIPE_FORMAT_L4A4_UNORM:
407 return MESA_FORMAT_AL44;
408 case PIPE_FORMAT_L8A8_UNORM:
409 return MESA_FORMAT_AL88;
410 case PIPE_FORMAT_L16A16_UNORM:
411 return MESA_FORMAT_AL1616;
412 case PIPE_FORMAT_A8_UNORM:
413 return MESA_FORMAT_A8;
414 case PIPE_FORMAT_A16_UNORM:
415 return MESA_FORMAT_A16;
416 case PIPE_FORMAT_L8_UNORM:
417 return MESA_FORMAT_L8;
418 case PIPE_FORMAT_L16_UNORM:
419 return MESA_FORMAT_L16;
420 case PIPE_FORMAT_I8_UNORM:
421 return MESA_FORMAT_I8;
422 case PIPE_FORMAT_I16_UNORM:
423 return MESA_FORMAT_I16;
424 case PIPE_FORMAT_S8_UINT:
425 return MESA_FORMAT_S8;
426
427 case PIPE_FORMAT_R16G16B16A16_UNORM:
428 return MESA_FORMAT_RGBA_16;
429
430 case PIPE_FORMAT_Z16_UNORM:
431 return MESA_FORMAT_Z16;
432 case PIPE_FORMAT_Z32_UNORM:
433 return MESA_FORMAT_Z32;
434 case PIPE_FORMAT_S8_UINT_Z24_UNORM:
435 return MESA_FORMAT_Z24_S8;
436 case PIPE_FORMAT_X8Z24_UNORM:
437 return MESA_FORMAT_Z24_X8;
438 case PIPE_FORMAT_Z24X8_UNORM:
439 return MESA_FORMAT_X8_Z24;
440 case PIPE_FORMAT_Z24_UNORM_S8_UINT:
441 return MESA_FORMAT_S8_Z24;
442 case PIPE_FORMAT_Z32_FLOAT:
443 return MESA_FORMAT_Z32_FLOAT;
444 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
445 return MESA_FORMAT_Z32_FLOAT_X24S8;
446
447 case PIPE_FORMAT_UYVY:
448 return MESA_FORMAT_YCBCR;
449 case PIPE_FORMAT_YUYV:
450 return MESA_FORMAT_YCBCR_REV;
451
452 #if FEATURE_texture_s3tc
453 case PIPE_FORMAT_DXT1_RGB:
454 return MESA_FORMAT_RGB_DXT1;
455 case PIPE_FORMAT_DXT1_RGBA:
456 return MESA_FORMAT_RGBA_DXT1;
457 case PIPE_FORMAT_DXT3_RGBA:
458 return MESA_FORMAT_RGBA_DXT3;
459 case PIPE_FORMAT_DXT5_RGBA:
460 return MESA_FORMAT_RGBA_DXT5;
461 #if FEATURE_EXT_texture_sRGB
462 case PIPE_FORMAT_DXT1_SRGB:
463 return MESA_FORMAT_SRGB_DXT1;
464 case PIPE_FORMAT_DXT1_SRGBA:
465 return MESA_FORMAT_SRGBA_DXT1;
466 case PIPE_FORMAT_DXT3_SRGBA:
467 return MESA_FORMAT_SRGBA_DXT3;
468 case PIPE_FORMAT_DXT5_SRGBA:
469 return MESA_FORMAT_SRGBA_DXT5;
470 #endif
471 #endif
472
473 #if FEATURE_EXT_texture_sRGB
474 case PIPE_FORMAT_L8A8_SRGB:
475 return MESA_FORMAT_SLA8;
476 case PIPE_FORMAT_L8_SRGB:
477 return MESA_FORMAT_SL8;
478 case PIPE_FORMAT_R8G8B8_SRGB:
479 return MESA_FORMAT_SRGB8;
480 case PIPE_FORMAT_A8B8G8R8_SRGB:
481 return MESA_FORMAT_SRGBA8;
482 case PIPE_FORMAT_B8G8R8A8_SRGB:
483 return MESA_FORMAT_SARGB8;
484 #endif
485 case PIPE_FORMAT_R32G32B32A32_FLOAT:
486 return MESA_FORMAT_RGBA_FLOAT32;
487 case PIPE_FORMAT_R16G16B16A16_FLOAT:
488 return MESA_FORMAT_RGBA_FLOAT16;
489 case PIPE_FORMAT_R32G32B32_FLOAT:
490 return MESA_FORMAT_RGB_FLOAT32;
491 case PIPE_FORMAT_R16G16B16_FLOAT:
492 return MESA_FORMAT_RGB_FLOAT16;
493 case PIPE_FORMAT_L32A32_FLOAT:
494 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
495 case PIPE_FORMAT_L16A16_FLOAT:
496 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
497 case PIPE_FORMAT_L32_FLOAT:
498 return MESA_FORMAT_LUMINANCE_FLOAT32;
499 case PIPE_FORMAT_L16_FLOAT:
500 return MESA_FORMAT_LUMINANCE_FLOAT16;
501 case PIPE_FORMAT_A32_FLOAT:
502 return MESA_FORMAT_ALPHA_FLOAT32;
503 case PIPE_FORMAT_A16_FLOAT:
504 return MESA_FORMAT_ALPHA_FLOAT16;
505 case PIPE_FORMAT_I32_FLOAT:
506 return MESA_FORMAT_INTENSITY_FLOAT32;
507 case PIPE_FORMAT_I16_FLOAT:
508 return MESA_FORMAT_INTENSITY_FLOAT16;
509 case PIPE_FORMAT_R32_FLOAT:
510 return MESA_FORMAT_R_FLOAT32;
511 case PIPE_FORMAT_R16_FLOAT:
512 return MESA_FORMAT_R_FLOAT16;
513 case PIPE_FORMAT_R32G32_FLOAT:
514 return MESA_FORMAT_RG_FLOAT32;
515 case PIPE_FORMAT_R16G16_FLOAT:
516 return MESA_FORMAT_RG_FLOAT16;
517
518 case PIPE_FORMAT_R8_UNORM:
519 return MESA_FORMAT_R8;
520 case PIPE_FORMAT_R16_UNORM:
521 return MESA_FORMAT_R16;
522 case PIPE_FORMAT_R8G8_UNORM:
523 return MESA_FORMAT_GR88;
524 case PIPE_FORMAT_R16G16_UNORM:
525 return MESA_FORMAT_RG1616;
526
527 case PIPE_FORMAT_A8_UINT:
528 return MESA_FORMAT_ALPHA_UINT8;
529 case PIPE_FORMAT_A16_UINT:
530 return MESA_FORMAT_ALPHA_UINT16;
531 case PIPE_FORMAT_A32_UINT:
532 return MESA_FORMAT_ALPHA_UINT32;
533 case PIPE_FORMAT_A8_SINT:
534 return MESA_FORMAT_ALPHA_INT8;
535 case PIPE_FORMAT_A16_SINT:
536 return MESA_FORMAT_ALPHA_INT16;
537 case PIPE_FORMAT_A32_SINT:
538 return MESA_FORMAT_ALPHA_INT32;
539
540 case PIPE_FORMAT_I8_UINT:
541 return MESA_FORMAT_INTENSITY_UINT8;
542 case PIPE_FORMAT_I16_UINT:
543 return MESA_FORMAT_INTENSITY_UINT16;
544 case PIPE_FORMAT_I32_UINT:
545 return MESA_FORMAT_INTENSITY_UINT32;
546 case PIPE_FORMAT_I8_SINT:
547 return MESA_FORMAT_INTENSITY_INT8;
548 case PIPE_FORMAT_I16_SINT:
549 return MESA_FORMAT_INTENSITY_INT16;
550 case PIPE_FORMAT_I32_SINT:
551 return MESA_FORMAT_INTENSITY_INT32;
552
553 case PIPE_FORMAT_L8_UINT:
554 return MESA_FORMAT_LUMINANCE_UINT8;
555 case PIPE_FORMAT_L16_UINT:
556 return MESA_FORMAT_LUMINANCE_UINT16;
557 case PIPE_FORMAT_L32_UINT:
558 return MESA_FORMAT_LUMINANCE_UINT32;
559 case PIPE_FORMAT_L8_SINT:
560 return MESA_FORMAT_LUMINANCE_INT8;
561 case PIPE_FORMAT_L16_SINT:
562 return MESA_FORMAT_LUMINANCE_INT16;
563 case PIPE_FORMAT_L32_SINT:
564 return MESA_FORMAT_LUMINANCE_INT32;
565
566 case PIPE_FORMAT_L8A8_UINT:
567 return MESA_FORMAT_LUMINANCE_ALPHA_UINT8;
568 case PIPE_FORMAT_L16A16_UINT:
569 return MESA_FORMAT_LUMINANCE_ALPHA_UINT16;
570 case PIPE_FORMAT_L32A32_UINT:
571 return MESA_FORMAT_LUMINANCE_ALPHA_UINT32;
572 case PIPE_FORMAT_L8A8_SINT:
573 return MESA_FORMAT_LUMINANCE_ALPHA_INT8;
574 case PIPE_FORMAT_L16A16_SINT:
575 return MESA_FORMAT_LUMINANCE_ALPHA_INT16;
576 case PIPE_FORMAT_L32A32_SINT:
577 return MESA_FORMAT_LUMINANCE_ALPHA_INT32;
578
579 case PIPE_FORMAT_R8_SINT:
580 return MESA_FORMAT_R_INT8;
581 case PIPE_FORMAT_R8G8_SINT:
582 return MESA_FORMAT_RG_INT8;
583 case PIPE_FORMAT_R8G8B8_SINT:
584 return MESA_FORMAT_RGB_INT8;
585 case PIPE_FORMAT_R8G8B8A8_SINT:
586 return MESA_FORMAT_RGBA_INT8;
587
588 case PIPE_FORMAT_R16_SINT:
589 return MESA_FORMAT_R_INT16;
590 case PIPE_FORMAT_R16G16_SINT:
591 return MESA_FORMAT_RG_INT16;
592 case PIPE_FORMAT_R16G16B16_SINT:
593 return MESA_FORMAT_RGB_INT16;
594 case PIPE_FORMAT_R16G16B16A16_SINT:
595 return MESA_FORMAT_RGBA_INT16;
596
597 case PIPE_FORMAT_R32_SINT:
598 return MESA_FORMAT_R_INT32;
599 case PIPE_FORMAT_R32G32_SINT:
600 return MESA_FORMAT_RG_INT32;
601 case PIPE_FORMAT_R32G32B32_SINT:
602 return MESA_FORMAT_RGB_INT32;
603 case PIPE_FORMAT_R32G32B32A32_SINT:
604 return MESA_FORMAT_RGBA_INT32;
605
606 /* unsigned int formats */
607 case PIPE_FORMAT_R8_UINT:
608 return MESA_FORMAT_R_UINT8;
609 case PIPE_FORMAT_R8G8_UINT:
610 return MESA_FORMAT_RG_UINT8;
611 case PIPE_FORMAT_R8G8B8_UINT:
612 return MESA_FORMAT_RGB_UINT8;
613 case PIPE_FORMAT_R8G8B8A8_UINT:
614 return MESA_FORMAT_RGBA_UINT8;
615
616 case PIPE_FORMAT_R16_UINT:
617 return MESA_FORMAT_R_UINT16;
618 case PIPE_FORMAT_R16G16_UINT:
619 return MESA_FORMAT_RG_UINT16;
620 case PIPE_FORMAT_R16G16B16_UINT:
621 return MESA_FORMAT_RGB_UINT16;
622 case PIPE_FORMAT_R16G16B16A16_UINT:
623 return MESA_FORMAT_RGBA_UINT16;
624
625 case PIPE_FORMAT_R32_UINT:
626 return MESA_FORMAT_R_UINT32;
627 case PIPE_FORMAT_R32G32_UINT:
628 return MESA_FORMAT_RG_UINT32;
629 case PIPE_FORMAT_R32G32B32_UINT:
630 return MESA_FORMAT_RGB_UINT32;
631 case PIPE_FORMAT_R32G32B32A32_UINT:
632 return MESA_FORMAT_RGBA_UINT32;
633
634 case PIPE_FORMAT_RGTC1_UNORM:
635 return MESA_FORMAT_RED_RGTC1;
636 case PIPE_FORMAT_RGTC1_SNORM:
637 return MESA_FORMAT_SIGNED_RED_RGTC1;
638 case PIPE_FORMAT_RGTC2_UNORM:
639 return MESA_FORMAT_RG_RGTC2;
640 case PIPE_FORMAT_RGTC2_SNORM:
641 return MESA_FORMAT_SIGNED_RG_RGTC2;
642
643 case PIPE_FORMAT_LATC1_UNORM:
644 return MESA_FORMAT_L_LATC1;
645 case PIPE_FORMAT_LATC1_SNORM:
646 return MESA_FORMAT_SIGNED_L_LATC1;
647 case PIPE_FORMAT_LATC2_UNORM:
648 return MESA_FORMAT_LA_LATC2;
649 case PIPE_FORMAT_LATC2_SNORM:
650 return MESA_FORMAT_SIGNED_LA_LATC2;
651
652 case PIPE_FORMAT_ETC1_RGB8:
653 return MESA_FORMAT_ETC1_RGB8;
654
655 /* signed normalized formats */
656 case PIPE_FORMAT_R8_SNORM:
657 return MESA_FORMAT_SIGNED_R8;
658 case PIPE_FORMAT_R8G8_SNORM:
659 return MESA_FORMAT_SIGNED_RG88_REV;
660 case PIPE_FORMAT_R8G8B8A8_SNORM:
661 return MESA_FORMAT_SIGNED_RGBA8888_REV;
662
663 case PIPE_FORMAT_A8_SNORM:
664 return MESA_FORMAT_SIGNED_A8;
665 case PIPE_FORMAT_L8_SNORM:
666 return MESA_FORMAT_SIGNED_L8;
667 case PIPE_FORMAT_L8A8_SNORM:
668 return MESA_FORMAT_SIGNED_AL88;
669 case PIPE_FORMAT_I8_SNORM:
670 return MESA_FORMAT_SIGNED_I8;
671
672 case PIPE_FORMAT_R16_SNORM:
673 return MESA_FORMAT_SIGNED_R16;
674 case PIPE_FORMAT_R16G16_SNORM:
675 return MESA_FORMAT_SIGNED_GR1616;
676 case PIPE_FORMAT_R16G16B16A16_SNORM:
677 return MESA_FORMAT_SIGNED_RGBA_16;
678
679 case PIPE_FORMAT_A16_SNORM:
680 return MESA_FORMAT_SIGNED_A16;
681 case PIPE_FORMAT_L16_SNORM:
682 return MESA_FORMAT_SIGNED_L16;
683 case PIPE_FORMAT_L16A16_SNORM:
684 return MESA_FORMAT_SIGNED_AL1616;
685 case PIPE_FORMAT_I16_SNORM:
686 return MESA_FORMAT_SIGNED_I16;
687
688 case PIPE_FORMAT_R9G9B9E5_FLOAT:
689 return MESA_FORMAT_RGB9_E5_FLOAT;
690 case PIPE_FORMAT_R11G11B10_FLOAT:
691 return MESA_FORMAT_R11_G11_B10_FLOAT;
692
693 case PIPE_FORMAT_B10G10R10A2_UINT:
694 return MESA_FORMAT_ARGB2101010_UINT;
695 default:
696 assert(0);
697 return MESA_FORMAT_NONE;
698 }
699 }
700
701
702 /**
703 * Map GL texture formats to Gallium pipe formats.
704 */
705 struct format_mapping
706 {
707 GLenum glFormats[18]; /**< list of GLenum formats, 0-terminated */
708 enum pipe_format pipeFormats[10]; /**< list of pipe formats, 0-terminated */
709 };
710
711
712 #define DEFAULT_RGBA_FORMATS \
713 PIPE_FORMAT_B8G8R8A8_UNORM, \
714 PIPE_FORMAT_A8R8G8B8_UNORM, \
715 PIPE_FORMAT_A8B8G8R8_UNORM, \
716 PIPE_FORMAT_B5G6R5_UNORM, \
717 0
718
719 #define DEFAULT_RGB_FORMATS \
720 PIPE_FORMAT_B8G8R8X8_UNORM, \
721 PIPE_FORMAT_X8R8G8B8_UNORM, \
722 PIPE_FORMAT_X8B8G8R8_UNORM, \
723 PIPE_FORMAT_B8G8R8A8_UNORM, \
724 PIPE_FORMAT_A8R8G8B8_UNORM, \
725 PIPE_FORMAT_A8B8G8R8_UNORM, \
726 PIPE_FORMAT_B5G6R5_UNORM, \
727 0
728
729 #define DEFAULT_SRGBA_FORMATS \
730 PIPE_FORMAT_B8G8R8A8_SRGB, \
731 PIPE_FORMAT_A8R8G8B8_SRGB, \
732 PIPE_FORMAT_A8B8G8R8_SRGB, \
733 0
734
735 #define DEFAULT_DEPTH_FORMATS \
736 PIPE_FORMAT_Z24X8_UNORM, \
737 PIPE_FORMAT_X8Z24_UNORM, \
738 PIPE_FORMAT_Z16_UNORM, \
739 PIPE_FORMAT_Z24_UNORM_S8_UINT, \
740 PIPE_FORMAT_S8_UINT_Z24_UNORM, \
741 0
742
743 #define DEFAULT_SNORM8_RGBA_FORMATS \
744 PIPE_FORMAT_R8G8B8A8_SNORM, \
745 0
746
747 #define DEFAULT_UNORM16_RGBA_FORMATS \
748 PIPE_FORMAT_R16G16B16A16_UNORM, \
749 DEFAULT_RGBA_FORMATS
750
751
752 /**
753 * This table maps OpenGL texture format enums to Gallium pipe_format enums.
754 * Multiple GL enums might map to multiple pipe_formats.
755 * The first pipe format in the list that's supported is the one that's chosen.
756 */
757 static const struct format_mapping format_map[] = {
758 /* Basic RGB, RGBA formats */
759 {
760 { GL_RGB10, GL_RGB10_A2, 0 },
761 { PIPE_FORMAT_B10G10R10A2_UNORM, DEFAULT_RGBA_FORMATS }
762 },
763 {
764 { 4, GL_RGBA, GL_RGBA8, 0 },
765 { PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS }
766 },
767 {
768 { GL_BGRA, 0 },
769 { PIPE_FORMAT_B8G8R8A8_UNORM, DEFAULT_RGBA_FORMATS }
770 },
771 {
772 { 3, GL_RGB, GL_RGB8, 0 },
773 { DEFAULT_RGB_FORMATS }
774 },
775 {
776 { GL_RGB12, GL_RGB16, GL_RGBA12, GL_RGBA16, 0 },
777 { PIPE_FORMAT_R16G16B16A16_UNORM, DEFAULT_RGBA_FORMATS }
778 },
779 {
780 { GL_RGBA4, GL_RGBA2, 0 },
781 { PIPE_FORMAT_B4G4R4A4_UNORM, DEFAULT_RGBA_FORMATS }
782 },
783 {
784 { GL_RGB5_A1, 0 },
785 { PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGBA_FORMATS }
786 },
787 {
788 { GL_R3_G3_B2, 0 },
789 { PIPE_FORMAT_B2G3R3_UNORM, PIPE_FORMAT_B5G6R5_UNORM,
790 PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGBA_FORMATS }
791 },
792 {
793 { GL_RGB5, GL_RGB4 },
794 { PIPE_FORMAT_B5G6R5_UNORM, PIPE_FORMAT_B5G5R5A1_UNORM,
795 DEFAULT_RGBA_FORMATS }
796 },
797 {
798 { GL_RGB565 },
799 { PIPE_FORMAT_B5G6R5_UNORM, DEFAULT_RGBA_FORMATS }
800 },
801
802 /* basic Alpha formats */
803 {
804 { GL_ALPHA12, GL_ALPHA16, 0 },
805 { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_A8_UNORM,
806 DEFAULT_RGBA_FORMATS }
807 },
808 {
809 { GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_COMPRESSED_ALPHA, 0 },
810 { PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
811 },
812
813 /* basic Luminance formats */
814 {
815 { GL_LUMINANCE12, GL_LUMINANCE16, 0 },
816 { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
817 },
818 {
819 { 1, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, 0 },
820 { PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
821 },
822
823 /* basic Luminance/Alpha formats */
824 {
825 { GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,
826 GL_LUMINANCE16_ALPHA16, 0},
827 { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_L8A8_UNORM,
828 DEFAULT_RGBA_FORMATS }
829 },
830 {
831 { 2, GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, 0 },
832 { PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
833 },
834 {
835 { GL_LUMINANCE4_ALPHA4, 0 },
836 { PIPE_FORMAT_L4A4_UNORM, PIPE_FORMAT_L8A8_UNORM,
837 DEFAULT_RGBA_FORMATS }
838 },
839
840 /* basic Intensity formats */
841 {
842 { GL_INTENSITY12, GL_INTENSITY16, 0 },
843 { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
844 },
845 {
846 { GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8,
847 GL_COMPRESSED_INTENSITY, 0 },
848 { PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
849 },
850
851 /* YCbCr */
852 {
853 { GL_YCBCR_MESA, 0 },
854 { PIPE_FORMAT_UYVY, PIPE_FORMAT_YUYV, 0 }
855 },
856
857 /* compressed formats */ /* XXX PIPE_BIND_SAMPLER_VIEW only */
858 {
859 { GL_COMPRESSED_RGB, 0 },
860 { PIPE_FORMAT_DXT1_RGB, DEFAULT_RGB_FORMATS }
861 },
862 {
863 { GL_COMPRESSED_RGBA, 0 },
864 { PIPE_FORMAT_DXT5_RGBA, DEFAULT_RGBA_FORMATS }
865 },
866 {
867 { GL_RGB_S3TC, GL_RGB4_S3TC, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 0 },
868 { PIPE_FORMAT_DXT1_RGB, 0 }
869 },
870 {
871 { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0 },
872 { PIPE_FORMAT_DXT1_RGBA, 0 }
873 },
874 {
875 { GL_RGBA_S3TC, GL_RGBA4_S3TC, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0 },
876 { PIPE_FORMAT_DXT3_RGBA, 0 }
877 },
878 {
879 { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0 },
880 { PIPE_FORMAT_DXT5_RGBA, 0 }
881 },
882
883 #if 0
884 {
885 { GL_COMPRESSED_RGB_FXT1_3DFX, 0 },
886 { PIPE_FORMAT_RGB_FXT1, 0 }
887 },
888 {
889 { GL_COMPRESSED_RGBA_FXT1_3DFX, 0 },
890 { PIPE_FORMAT_RGBA_FXT1, 0 }
891 },
892 #endif
893
894 /* Depth formats */
895 {
896 { GL_DEPTH_COMPONENT16, 0 },
897 { PIPE_FORMAT_Z16_UNORM, DEFAULT_DEPTH_FORMATS }
898 },
899 {
900 { GL_DEPTH_COMPONENT24, 0 },
901 { PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM,
902 DEFAULT_DEPTH_FORMATS }
903 },
904 {
905 { GL_DEPTH_COMPONENT32, 0 },
906 { PIPE_FORMAT_Z32_UNORM, DEFAULT_DEPTH_FORMATS }
907 },
908 {
909 { GL_DEPTH_COMPONENT, 0 },
910 { DEFAULT_DEPTH_FORMATS }
911 },
912 {
913 { GL_DEPTH_COMPONENT32F, 0 },
914 { PIPE_FORMAT_Z32_FLOAT, 0 }
915 },
916
917 /* stencil formats */
918 {
919 { GL_STENCIL_INDEX, GL_STENCIL_INDEX1_EXT, GL_STENCIL_INDEX4_EXT,
920 GL_STENCIL_INDEX8_EXT, GL_STENCIL_INDEX16_EXT, 0 },
921 {
922 PIPE_FORMAT_S8_UINT, PIPE_FORMAT_Z24_UNORM_S8_UINT,
923 PIPE_FORMAT_S8_UINT_Z24_UNORM, 0
924 }
925 },
926
927 /* Depth / Stencil formats */
928 {
929 { GL_DEPTH_STENCIL_EXT, GL_DEPTH24_STENCIL8_EXT, 0 },
930 { PIPE_FORMAT_Z24_UNORM_S8_UINT, PIPE_FORMAT_S8_UINT_Z24_UNORM, 0 }
931 },
932 {
933 { GL_DEPTH32F_STENCIL8, 0 },
934 { PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, 0 }
935 },
936
937 /* sRGB formats */
938 {
939 { GL_SRGB_EXT, GL_SRGB8_EXT, GL_SRGB_ALPHA_EXT, GL_SRGB8_ALPHA8_EXT, 0 },
940 { DEFAULT_SRGBA_FORMATS }
941 },
942 {
943 { GL_COMPRESSED_SRGB_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 0 },
944 { PIPE_FORMAT_DXT1_SRGB, DEFAULT_SRGBA_FORMATS }
945 },
946 {
947 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0 },
948 { PIPE_FORMAT_DXT1_SRGBA, 0 }
949 },
950 {
951 { GL_COMPRESSED_SRGB_ALPHA_EXT,
952 GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0 },
953 { PIPE_FORMAT_DXT3_SRGBA, DEFAULT_SRGBA_FORMATS }
954 },
955 {
956 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0 },
957 { PIPE_FORMAT_DXT5_SRGBA, 0 }
958 },
959 {
960 { GL_SLUMINANCE_ALPHA_EXT, GL_SLUMINANCE8_ALPHA8_EXT,
961 GL_COMPRESSED_SLUMINANCE_EXT, GL_COMPRESSED_SLUMINANCE_ALPHA_EXT, 0 },
962 { PIPE_FORMAT_L8A8_SRGB, DEFAULT_SRGBA_FORMATS }
963 },
964 {
965 { GL_SLUMINANCE_EXT, GL_SLUMINANCE8_EXT, 0 },
966 { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS }
967 },
968
969 /* 16-bit float formats */
970 {
971 { GL_RGBA16F_ARB, 0 },
972 { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
973 },
974 {
975 { GL_RGB16F_ARB, 0 },
976 { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
977 PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
978 },
979 {
980 { GL_LUMINANCE_ALPHA16F_ARB, 0 },
981 { PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
982 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
983 },
984 {
985 { GL_ALPHA16F_ARB, 0 },
986 { PIPE_FORMAT_A16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
987 PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
988 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
989 },
990 {
991 { GL_INTENSITY16F_ARB, 0 },
992 { PIPE_FORMAT_I16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
993 PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
994 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
995 },
996 {
997 { GL_LUMINANCE16F_ARB, 0 },
998 { PIPE_FORMAT_L16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
999 PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1000 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1001 },
1002 {
1003 { GL_R16F, 0 },
1004 { PIPE_FORMAT_R16_FLOAT, PIPE_FORMAT_R16G16_FLOAT,
1005 PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1006 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1007 },
1008 {
1009 { GL_RG16F, 0 },
1010 { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
1011 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
1012 },
1013
1014 /* 32-bit float formats */
1015 {
1016 { GL_RGBA32F_ARB, 0 },
1017 { PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1018 },
1019 {
1020 { GL_RGB32F_ARB, 0 },
1021 { PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
1022 PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1023 },
1024 {
1025 { GL_LUMINANCE_ALPHA32F_ARB, 0 },
1026 { PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
1027 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1028 },
1029 {
1030 { GL_ALPHA32F_ARB, 0 },
1031 { PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1032 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_A16_FLOAT,
1033 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1034 },
1035 {
1036 { GL_INTENSITY32F_ARB, 0 },
1037 { PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1038 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_I16_FLOAT,
1039 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1040 },
1041 {
1042 { GL_LUMINANCE32F_ARB, 0 },
1043 { PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
1044 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_L16_FLOAT,
1045 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1046 },
1047 {
1048 { GL_R32F, 0 },
1049 { PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT,
1050 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16_FLOAT,
1051 PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1052 },
1053 {
1054 { GL_RG32F, 0 },
1055 { PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
1056 PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
1057 },
1058
1059 /* R, RG formats */
1060 {
1061 { GL_RED, GL_R8, 0 },
1062 { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1063 },
1064 {
1065 { GL_RG, GL_RG8, 0 },
1066 { PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1067 },
1068 {
1069 { GL_R16, 0 },
1070 { PIPE_FORMAT_R16_UNORM, PIPE_FORMAT_R16G16_UNORM,
1071 DEFAULT_UNORM16_RGBA_FORMATS }
1072 },
1073 {
1074 { GL_RG16, 0 },
1075 { PIPE_FORMAT_R16G16_UNORM, DEFAULT_UNORM16_RGBA_FORMATS }
1076 },
1077
1078 /* compressed R, RG formats */
1079 {
1080 { GL_COMPRESSED_RED, GL_COMPRESSED_RED_RGTC1, 0 },
1081 { PIPE_FORMAT_RGTC1_UNORM, PIPE_FORMAT_R8_UNORM, DEFAULT_RGBA_FORMATS }
1082 },
1083 {
1084 { GL_COMPRESSED_SIGNED_RED_RGTC1, 0 },
1085 { PIPE_FORMAT_RGTC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1086 },
1087 {
1088 { GL_COMPRESSED_RG, GL_COMPRESSED_RG_RGTC2, 0 },
1089 { PIPE_FORMAT_RGTC2_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
1090 },
1091 {
1092 { GL_COMPRESSED_SIGNED_RG_RGTC2, 0 },
1093 { PIPE_FORMAT_RGTC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1094 },
1095 {
1096 { GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_LATC1_EXT, 0 },
1097 { PIPE_FORMAT_LATC1_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGBA_FORMATS }
1098 },
1099 {
1100 { GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT, 0 },
1101 { PIPE_FORMAT_LATC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1102 },
1103 {
1104 { GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT,
1105 GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0 },
1106 { PIPE_FORMAT_LATC2_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
1107 },
1108 {
1109 { GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT, 0 },
1110 { PIPE_FORMAT_LATC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
1111 },
1112
1113 /* ETC1 */
1114 {
1115 { GL_ETC1_RGB8_OES, 0 },
1116 { PIPE_FORMAT_ETC1_RGB8, 0 }
1117 },
1118
1119 /* signed/unsigned integer formats.
1120 */
1121 {
1122 { GL_RED_INTEGER_EXT,
1123 GL_GREEN_INTEGER_EXT,
1124 GL_BLUE_INTEGER_EXT,
1125 GL_RGBA_INTEGER_EXT,
1126 GL_BGRA_INTEGER_EXT,
1127 GL_RGBA8I_EXT, 0 },
1128 { PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1129 },
1130 {
1131 { GL_RGB_INTEGER_EXT,
1132 GL_BGR_INTEGER_EXT,
1133 GL_RGB8I_EXT, 0 },
1134 { PIPE_FORMAT_R8G8B8_SINT,
1135 PIPE_FORMAT_R8G8B8A8_SINT, 0 }
1136 },
1137 {
1138 { GL_ALPHA_INTEGER_EXT,
1139 GL_ALPHA8I_EXT, 0 },
1140 { PIPE_FORMAT_A8_SINT, 0 }
1141 },
1142 {
1143 { GL_ALPHA16I_EXT, 0 },
1144 { PIPE_FORMAT_A16_SINT, 0 }
1145 },
1146 {
1147 { GL_ALPHA32I_EXT, 0 },
1148 { PIPE_FORMAT_A32_SINT, 0 }
1149 },
1150 {
1151 { GL_ALPHA8UI_EXT, 0 },
1152 { PIPE_FORMAT_A8_UINT, 0 }
1153 },
1154 {
1155 { GL_ALPHA16UI_EXT, 0 },
1156 { PIPE_FORMAT_A16_UINT, 0 }
1157 },
1158 {
1159 { GL_ALPHA32UI_EXT, 0 },
1160 { PIPE_FORMAT_A32_UINT, 0 }
1161 },
1162 {
1163 { GL_INTENSITY8I_EXT, 0 },
1164 { PIPE_FORMAT_I8_SINT, 0 }
1165 },
1166 {
1167 { GL_INTENSITY16I_EXT, 0 },
1168 { PIPE_FORMAT_I16_SINT, 0 }
1169 },
1170 {
1171 { GL_INTENSITY32I_EXT, 0 },
1172 { PIPE_FORMAT_I32_SINT, 0 }
1173 },
1174 {
1175 { GL_INTENSITY8UI_EXT, 0 },
1176 { PIPE_FORMAT_I8_UINT, 0 }
1177 },
1178 {
1179 { GL_INTENSITY16UI_EXT, 0 },
1180 { PIPE_FORMAT_I16_UINT, 0 }
1181 },
1182 {
1183 { GL_INTENSITY32UI_EXT, 0 },
1184 { PIPE_FORMAT_I32_UINT, 0 }
1185 },
1186 {
1187 { GL_LUMINANCE8I_EXT, 0 },
1188 { PIPE_FORMAT_L8_SINT, 0 }
1189 },
1190 {
1191 { GL_LUMINANCE16I_EXT, 0 },
1192 { PIPE_FORMAT_L16_SINT, 0 }
1193 },
1194 {
1195 { GL_LUMINANCE32I_EXT, 0 },
1196 { PIPE_FORMAT_L32_SINT, 0 }
1197 },
1198 {
1199 { GL_LUMINANCE_INTEGER_EXT,
1200 GL_LUMINANCE8UI_EXT, 0 },
1201 { PIPE_FORMAT_L8_UINT, 0 }
1202 },
1203 {
1204 { GL_LUMINANCE16UI_EXT, 0 },
1205 { PIPE_FORMAT_L16_UINT, 0 }
1206 },
1207 {
1208 { GL_LUMINANCE32UI_EXT, 0 },
1209 { PIPE_FORMAT_L32_UINT, 0 }
1210 },
1211 {
1212 { GL_LUMINANCE_ALPHA_INTEGER_EXT,
1213 GL_LUMINANCE_ALPHA8I_EXT, 0 },
1214 { PIPE_FORMAT_L8A8_SINT, 0 }
1215 },
1216 {
1217 { GL_LUMINANCE_ALPHA16I_EXT, 0 },
1218 { PIPE_FORMAT_L16A16_SINT, 0 }
1219 },
1220 {
1221 { GL_LUMINANCE_ALPHA32I_EXT, 0 },
1222 { PIPE_FORMAT_L32A32_SINT, 0 }
1223 },
1224 {
1225 { GL_LUMINANCE_ALPHA8UI_EXT, 0 },
1226 { PIPE_FORMAT_L8A8_UINT, 0 }
1227 },
1228 {
1229 { GL_LUMINANCE_ALPHA16UI_EXT, 0 },
1230 { PIPE_FORMAT_L16A16_UINT, 0 }
1231 },
1232 {
1233 { GL_LUMINANCE_ALPHA32UI_EXT, 0 },
1234 { PIPE_FORMAT_L32A32_UINT, 0 }
1235 },
1236 {
1237 { GL_RGB16I_EXT, 0 },
1238 { PIPE_FORMAT_R16G16B16_SINT,
1239 PIPE_FORMAT_R16G16B16A16_SINT, 0 },
1240 },
1241 {
1242 { GL_RGBA16I_EXT, 0 },
1243 { PIPE_FORMAT_R16G16B16A16_SINT, 0 },
1244 },
1245 {
1246 { GL_RGB32I_EXT, 0 },
1247 { PIPE_FORMAT_R32G32B32_SINT,
1248 PIPE_FORMAT_R32G32B32A32_SINT, 0 },
1249 },
1250 {
1251 { GL_RGBA32I_EXT, 0 },
1252 { PIPE_FORMAT_R32G32B32A32_SINT, 0 }
1253 },
1254 {
1255 { GL_RGBA8UI_EXT, 0 },
1256 { PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1257 },
1258 {
1259 { GL_RGB8UI_EXT, 0 },
1260 { PIPE_FORMAT_R8G8B8_UINT,
1261 PIPE_FORMAT_R8G8B8A8_UINT, 0 }
1262 },
1263 {
1264 { GL_RGB16UI_EXT, 0 },
1265 { PIPE_FORMAT_R16G16B16_UINT,
1266 PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1267 },
1268 {
1269 { GL_RGBA16UI_EXT, 0 },
1270 { PIPE_FORMAT_R16G16B16A16_UINT, 0 }
1271 },
1272 {
1273 { GL_RGB32UI_EXT, 0},
1274 { PIPE_FORMAT_R32G32B32_UINT,
1275 PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1276 },
1277 {
1278 { GL_RGBA32UI_EXT, 0},
1279 { PIPE_FORMAT_R32G32B32A32_UINT, 0 }
1280 },
1281 {
1282 { GL_R8I, 0},
1283 { PIPE_FORMAT_R8_SINT, 0},
1284 },
1285 {
1286 { GL_R16I, 0},
1287 { PIPE_FORMAT_R16_SINT, 0},
1288 },
1289 {
1290 { GL_R32I, 0},
1291 { PIPE_FORMAT_R32_SINT, 0},
1292 },
1293 {
1294 { GL_R8UI, 0},
1295 { PIPE_FORMAT_R8_UINT, 0},
1296 },
1297 {
1298 { GL_R16UI, 0},
1299 { PIPE_FORMAT_R16_UINT, 0},
1300 },
1301 {
1302 { GL_R32UI, 0},
1303 { PIPE_FORMAT_R32_UINT, 0},
1304 },
1305 {
1306 { GL_RG8I, 0},
1307 { PIPE_FORMAT_R8G8_SINT, 0},
1308 },
1309 {
1310 { GL_RG16I, 0},
1311 { PIPE_FORMAT_R16G16_SINT, 0},
1312 },
1313 {
1314 { GL_RG32I, 0},
1315 { PIPE_FORMAT_R32G32_SINT, 0},
1316 },
1317 {
1318 { GL_RG8UI, 0},
1319 { PIPE_FORMAT_R8G8_UINT, 0},
1320 },
1321 {
1322 { GL_RG16UI, 0},
1323 { PIPE_FORMAT_R16G16_UINT, 0},
1324 },
1325 {
1326 { GL_RG32UI, 0},
1327 { PIPE_FORMAT_R32G32_UINT, 0},
1328 },
1329 /* signed normalized formats */
1330 {
1331 { GL_RED_SNORM, GL_R8_SNORM, 0 },
1332 { PIPE_FORMAT_R8_SNORM, PIPE_FORMAT_R8G8_SNORM,
1333 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1334 },
1335 {
1336 { GL_R16_SNORM, 0 },
1337 { PIPE_FORMAT_R16_SNORM,
1338 PIPE_FORMAT_R16G16_SNORM,
1339 PIPE_FORMAT_R16G16B16A16_SNORM,
1340 PIPE_FORMAT_R8_SNORM,
1341 PIPE_FORMAT_R8G8_SNORM,
1342 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1343 },
1344 {
1345 { GL_RG_SNORM, GL_RG8_SNORM, 0 },
1346 { PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1347 },
1348 {
1349 { GL_RG16_SNORM, 0 },
1350 { PIPE_FORMAT_R16G16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1351 PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1352 },
1353 {
1354 { GL_RGB_SNORM, GL_RGB8_SNORM, GL_RGBA_SNORM, GL_RGBA8_SNORM, 0 },
1355 { PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1356 },
1357 {
1358 { GL_RGB16_SNORM, GL_RGBA16_SNORM, 0 },
1359 { PIPE_FORMAT_R16G16B16A16_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1360 },
1361 {
1362 { GL_ALPHA_SNORM, GL_ALPHA8_SNORM, 0 },
1363 { PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1364 },
1365 {
1366 { GL_ALPHA16_SNORM, 0 },
1367 { PIPE_FORMAT_A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1368 PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1369 },
1370 {
1371 { GL_LUMINANCE_SNORM, GL_LUMINANCE8_SNORM, 0 },
1372 { PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1373 },
1374 {
1375 { GL_LUMINANCE16_SNORM, 0 },
1376 { PIPE_FORMAT_L16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1377 PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1378 },
1379 {
1380 { GL_LUMINANCE_ALPHA_SNORM, GL_LUMINANCE8_ALPHA8_SNORM, 0 },
1381 { PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1382 },
1383 {
1384 { GL_LUMINANCE16_ALPHA16_SNORM, 0 },
1385 { PIPE_FORMAT_L16A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1386 PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1387 },
1388 {
1389 { GL_INTENSITY_SNORM, GL_INTENSITY8_SNORM, 0 },
1390 { PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1391 },
1392 {
1393 { GL_INTENSITY16_SNORM, 0 },
1394 { PIPE_FORMAT_I16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1395 PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1396 },
1397 {
1398 { GL_RGB9_E5, 0 },
1399 { PIPE_FORMAT_R9G9B9E5_FLOAT, 0 }
1400 },
1401 {
1402 { GL_R11F_G11F_B10F, 0 },
1403 { PIPE_FORMAT_R11G11B10_FLOAT, 0 }
1404 },
1405 {
1406 { GL_RGB10_A2UI, 0 },
1407 { PIPE_FORMAT_B10G10R10A2_UINT, 0 }
1408 },
1409 };
1410
1411
1412 /**
1413 * Return first supported format from the given list.
1414 */
1415 static enum pipe_format
find_supported_format(struct pipe_screen * screen,const enum pipe_format formats[],enum pipe_texture_target target,unsigned sample_count,unsigned tex_usage)1416 find_supported_format(struct pipe_screen *screen,
1417 const enum pipe_format formats[],
1418 enum pipe_texture_target target,
1419 unsigned sample_count,
1420 unsigned tex_usage)
1421 {
1422 uint i;
1423 for (i = 0; formats[i]; i++) {
1424 if (screen->is_format_supported(screen, formats[i], target,
1425 sample_count, tex_usage)) {
1426 return formats[i];
1427 }
1428 }
1429 return PIPE_FORMAT_NONE;
1430 }
1431
1432 struct exact_format_mapping
1433 {
1434 GLenum format;
1435 GLenum type;
1436 enum pipe_format pformat;
1437 };
1438
1439 static const struct exact_format_mapping rgba8888_tbl[] =
1440 {
1441 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_A8B8G8R8_UNORM },
1442 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_A8B8G8R8_UNORM },
1443 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_R8G8B8A8_UNORM },
1444 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_R8G8B8A8_UNORM },
1445 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_A8R8G8B8_UNORM },
1446 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_B8G8R8A8_UNORM },
1447 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8A8_UNORM },
1448 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_A8B8G8R8_UNORM },
1449 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8A8_UNORM },
1450 { 0, 0, 0 }
1451 };
1452
1453 static const struct exact_format_mapping rgbx8888_tbl[] =
1454 {
1455 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_X8R8G8B8_UNORM },
1456 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_B8G8R8X8_UNORM },
1457 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8X8_UNORM },
1458 /* No Mesa formats for these Gallium formats:
1459 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_X8B8G8R8_UNORM },
1460 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_X8B8G8R8_UNORM },
1461 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_R8G8B8X8_UNORM },
1462 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_R8G8B8X8_UNORM },
1463 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8X8_UNORM },
1464 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_X8B8G8R8_UNORM },
1465 */
1466 { 0, 0, 0 }
1467 };
1468
1469 static const struct exact_format_mapping rgba1010102_tbl[] =
1470 {
1471 { GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_B10G10R10A2_UNORM },
1472 /* No Mesa formats for these Gallium formats:
1473 { GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_R10G10B10A2_UNORM },
1474 { GL_ABGR_EXT, GL_UNSIGNED_INT_10_10_10_2, PIPE_FORMAT_R10G10B10A2_UNORM },
1475 { GL_ABGR_EXT, GL_UNSIGNED_INT, PIPE_FORMAT_R10G10B10A2_UNORM },
1476 */
1477 { 0, 0, 0 }
1478 };
1479
1480 /**
1481 * If there is an exact pipe_format match for {internalFormat, format, type}
1482 * return that, otherwise return PIPE_FORMAT_NONE so we can do fuzzy matching.
1483 */
1484 static enum pipe_format
find_exact_format(GLint internalFormat,GLenum format,GLenum type)1485 find_exact_format(GLint internalFormat, GLenum format, GLenum type)
1486 {
1487 uint i;
1488 const struct exact_format_mapping* tbl;
1489
1490 if (format == GL_NONE || type == GL_NONE)
1491 return PIPE_FORMAT_NONE;
1492
1493 switch (internalFormat) {
1494 case 4:
1495 case GL_RGBA:
1496 case GL_RGBA8:
1497 tbl = rgba8888_tbl;
1498 break;
1499 case 3:
1500 case GL_RGB:
1501 case GL_RGB8:
1502 tbl = rgbx8888_tbl;
1503 break;
1504 case GL_RGB10_A2:
1505 tbl = rgba1010102_tbl;
1506 break;
1507 default:
1508 return PIPE_FORMAT_NONE;
1509 }
1510
1511 for (i = 0; tbl[i].format; i++)
1512 if (tbl[i].format == format && tbl[i].type == type)
1513 return tbl[i].pformat;
1514
1515 return PIPE_FORMAT_NONE;
1516 }
1517
1518 /**
1519 * Given an OpenGL internalFormat value for a texture or surface, return
1520 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
1521 * This is called during glTexImage2D, for example.
1522 *
1523 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
1524 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
1525 * we want render-to-texture ability.
1526 *
1527 * \param internalFormat the user value passed to glTexImage2D
1528 * \param target one of PIPE_TEXTURE_x
1529 * \param bindings bitmask of PIPE_BIND_x flags.
1530 */
1531 enum pipe_format
st_choose_format(struct pipe_screen * screen,GLenum internalFormat,GLenum format,GLenum type,enum pipe_texture_target target,unsigned sample_count,unsigned bindings)1532 st_choose_format(struct pipe_screen *screen, GLenum internalFormat,
1533 GLenum format, GLenum type,
1534 enum pipe_texture_target target, unsigned sample_count,
1535 unsigned bindings)
1536 {
1537 GET_CURRENT_CONTEXT(ctx); /* XXX this should be a function parameter */
1538 int i, j;
1539 enum pipe_format pf;
1540
1541 /* can't render to compressed formats at this time */
1542 if (_mesa_is_compressed_format(ctx, internalFormat)
1543 && (bindings & ~PIPE_BIND_SAMPLER_VIEW)) {
1544 return PIPE_FORMAT_NONE;
1545 }
1546
1547 /* search for exact matches */
1548 pf = find_exact_format(internalFormat, format, type);
1549 if (pf != PIPE_FORMAT_NONE &&
1550 screen->is_format_supported(screen, pf,
1551 target, sample_count, bindings))
1552 return pf;
1553
1554 /* search table for internalFormat */
1555 for (i = 0; i < Elements(format_map); i++) {
1556 const struct format_mapping *mapping = &format_map[i];
1557 for (j = 0; mapping->glFormats[j]; j++) {
1558 if (mapping->glFormats[j] == internalFormat) {
1559 /* Found the desired internal format. Find first pipe format
1560 * which is supported by the driver.
1561 */
1562 return find_supported_format(screen, mapping->pipeFormats,
1563 target, sample_count, bindings);
1564 }
1565 }
1566 }
1567
1568 _mesa_problem(NULL, "unhandled format!\n");
1569 return PIPE_FORMAT_NONE;
1570 }
1571
1572
1573 /**
1574 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
1575 */
1576 enum pipe_format
st_choose_renderbuffer_format(struct pipe_screen * screen,GLenum internalFormat,unsigned sample_count)1577 st_choose_renderbuffer_format(struct pipe_screen *screen,
1578 GLenum internalFormat, unsigned sample_count)
1579 {
1580 uint usage;
1581 if (_mesa_is_depth_or_stencil_format(internalFormat))
1582 usage = PIPE_BIND_DEPTH_STENCIL;
1583 else
1584 usage = PIPE_BIND_RENDER_TARGET;
1585 return st_choose_format(screen, internalFormat, GL_NONE, GL_NONE, PIPE_TEXTURE_2D,
1586 sample_count, usage);
1587 }
1588
1589
1590 gl_format
st_ChooseTextureFormat_renderable(struct gl_context * ctx,GLint internalFormat,GLenum format,GLenum type,GLboolean renderable)1591 st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
1592 GLenum format, GLenum type, GLboolean renderable)
1593 {
1594 struct pipe_screen *screen = st_context(ctx)->pipe->screen;
1595 enum pipe_format pFormat;
1596 uint bindings;
1597
1598 (void) format;
1599 (void) type;
1600
1601 /* GL textures may wind up being render targets, but we don't know
1602 * that in advance. Specify potential render target flags now.
1603 */
1604 bindings = PIPE_BIND_SAMPLER_VIEW;
1605 if (renderable) {
1606 if (_mesa_is_depth_or_stencil_format(internalFormat))
1607 bindings |= PIPE_BIND_DEPTH_STENCIL;
1608 else
1609 bindings |= PIPE_BIND_RENDER_TARGET;
1610 }
1611
1612 pFormat = st_choose_format(screen, internalFormat, format, type,
1613 PIPE_TEXTURE_2D, 0, bindings);
1614
1615 if (pFormat == PIPE_FORMAT_NONE) {
1616 /* try choosing format again, this time without render target bindings */
1617 pFormat = st_choose_format(screen, internalFormat, format, type,
1618 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
1619 }
1620
1621 if (pFormat == PIPE_FORMAT_NONE) {
1622 /* no luck at all */
1623 return MESA_FORMAT_NONE;
1624 }
1625
1626 return st_pipe_format_to_mesa_format(pFormat);
1627 }
1628
1629
1630 /**
1631 * Called via ctx->Driver.ChooseTextureFormat().
1632 */
1633 gl_format
st_ChooseTextureFormat(struct gl_context * ctx,GLenum target,GLint internalFormat,GLenum format,GLenum type)1634 st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
1635 GLint internalFormat,
1636 GLenum format, GLenum type)
1637 {
1638 boolean want_renderable =
1639 internalFormat == 3 || internalFormat == 4 ||
1640 internalFormat == GL_RGB || internalFormat == GL_RGBA ||
1641 internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
1642 internalFormat == GL_BGRA;
1643
1644 if (target == GL_TEXTURE_1D || target == GL_TEXTURE_1D_ARRAY) {
1645 /* We don't do compression for these texture targets because of
1646 * difficulty with sub-texture updates on non-block boundaries, etc.
1647 * So change the internal format request to an uncompressed format.
1648 */
1649 internalFormat =
1650 _mesa_generic_compressed_format_to_uncompressed_format(internalFormat);
1651 }
1652
1653 return st_ChooseTextureFormat_renderable(ctx, internalFormat,
1654 format, type, want_renderable);
1655 }
1656
1657
1658 GLboolean
st_sampler_compat_formats(enum pipe_format format1,enum pipe_format format2)1659 st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
1660 {
1661 if (format1 == format2)
1662 return GL_TRUE;
1663
1664 if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
1665 format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
1666 return GL_TRUE;
1667
1668 if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
1669 format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
1670 return GL_TRUE;
1671
1672 if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
1673 format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
1674 return GL_TRUE;
1675
1676 if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
1677 format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
1678 return GL_TRUE;
1679
1680 if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
1681 format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
1682 return GL_TRUE;
1683
1684 if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
1685 format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
1686 return GL_TRUE;
1687
1688 return GL_FALSE;
1689 }
1690
1691
1692
1693 /**
1694 * This is used for translating texture border color and the clear
1695 * color. For example, the clear color is interpreted according to
1696 * the renderbuffer's base format. For example, if clearing a
1697 * GL_LUMINANCE buffer, we'll return colorOut[0] = colorOut[1] =
1698 * colorOut[2] = colorIn[0].
1699 * Similarly for texture border colors.
1700 */
1701 void
st_translate_color(union gl_color_union * colorIn,union pipe_color_union * colorOut,GLenum baseFormat,GLboolean is_integer)1702 st_translate_color(union gl_color_union *colorIn,
1703 union pipe_color_union *colorOut,
1704 GLenum baseFormat, GLboolean is_integer)
1705 {
1706 if (is_integer) {
1707 int *in = colorIn->i;
1708 int *out = colorOut->i;
1709
1710 switch (baseFormat) {
1711 case GL_RED:
1712 out[0] = in[0];
1713 out[1] = 0;
1714 out[2] = 0;
1715 out[3] = 1;
1716 break;
1717 case GL_RG:
1718 out[0] = in[0];
1719 out[1] = in[1];
1720 out[2] = 0;
1721 out[3] = 1;
1722 break;
1723 case GL_RGB:
1724 out[0] = in[0];
1725 out[1] = in[1];
1726 out[2] = in[2];
1727 out[3] = 1;
1728 break;
1729 case GL_ALPHA:
1730 out[0] = out[1] = out[2] = 0;
1731 out[3] = in[3];
1732 break;
1733 case GL_LUMINANCE:
1734 out[0] = out[1] = out[2] = in[0];
1735 out[3] = 1;
1736 break;
1737 case GL_LUMINANCE_ALPHA:
1738 out[0] = out[1] = out[2] = in[0];
1739 out[3] = in[3];
1740 break;
1741 case GL_INTENSITY:
1742 out[0] = out[1] = out[2] = out[3] = in[0];
1743 break;
1744 default:
1745 COPY_4V(out, in);
1746 }
1747 }
1748 else {
1749 float *in = colorIn->f;
1750 float *out = colorOut->f;
1751
1752 switch (baseFormat) {
1753 case GL_RED:
1754 out[0] = in[0];
1755 out[1] = 0.0F;
1756 out[2] = 0.0F;
1757 out[3] = 1.0F;
1758 break;
1759 case GL_RG:
1760 out[0] = in[0];
1761 out[1] = in[1];
1762 out[2] = 0.0F;
1763 out[3] = 1.0F;
1764 break;
1765 case GL_RGB:
1766 out[0] = in[0];
1767 out[1] = in[1];
1768 out[2] = in[2];
1769 out[3] = 1.0F;
1770 break;
1771 case GL_ALPHA:
1772 out[0] = out[1] = out[2] = 0.0F;
1773 out[3] = in[3];
1774 break;
1775 case GL_LUMINANCE:
1776 out[0] = out[1] = out[2] = in[0];
1777 out[3] = 1.0F;
1778 break;
1779 case GL_LUMINANCE_ALPHA:
1780 out[0] = out[1] = out[2] = in[0];
1781 out[3] = in[3];
1782 break;
1783 case GL_INTENSITY:
1784 out[0] = out[1] = out[2] = out[3] = in[0];
1785 break;
1786 default:
1787 COPY_4V(out, in);
1788 }
1789 }
1790 }
1791