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
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/format/u_format.h"
52 #include "st_cb_texture.h"
53 #include "st_context.h"
54 #include "st_format.h"
55 #include "st_texture.h"
56
57
58 /**
59 * Translate Mesa format to Gallium format.
60 */
61 enum pipe_format
st_mesa_format_to_pipe_format(const struct st_context * st,mesa_format mesaFormat)62 st_mesa_format_to_pipe_format(const struct st_context *st,
63 mesa_format mesaFormat)
64 {
65 struct pipe_screen *screen = st->screen;
66
67 /* The destination RGBA format mustn't be changed, because it's also
68 * a destination format of the unpack/decompression function.
69 */
70 if (mesaFormat == MESA_FORMAT_ETC1_RGB8 && !st->has_etc1)
71 return st->transcode_etc ? PIPE_FORMAT_DXT1_RGB : PIPE_FORMAT_R8G8B8A8_UNORM;
72
73 /* ETC2 formats are emulated as uncompressed ones.
74 * The destination formats mustn't be changed, because they are also
75 * destination formats of the unpack/decompression function.
76 */
77 if (_mesa_is_format_etc2(mesaFormat) && !st->has_etc2) {
78 bool has_bgra_srgb = screen->is_format_supported(screen,
79 PIPE_FORMAT_B8G8R8A8_SRGB,
80 PIPE_TEXTURE_2D, 0, 0,
81 PIPE_BIND_SAMPLER_VIEW);
82
83 switch (mesaFormat) {
84 case MESA_FORMAT_ETC2_RGB8:
85 return st->transcode_etc ? PIPE_FORMAT_DXT1_RGB : PIPE_FORMAT_R8G8B8A8_UNORM;
86 case MESA_FORMAT_ETC2_SRGB8:
87 return st->transcode_etc ? PIPE_FORMAT_DXT1_SRGB :
88 has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
89 case MESA_FORMAT_ETC2_RGBA8_EAC:
90 return st->transcode_etc ? PIPE_FORMAT_DXT5_RGBA : PIPE_FORMAT_R8G8B8A8_UNORM;
91 case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
92 return st->transcode_etc ? PIPE_FORMAT_DXT5_SRGBA :
93 has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
94 case MESA_FORMAT_ETC2_R11_EAC:
95 return PIPE_FORMAT_R16_UNORM;
96 case MESA_FORMAT_ETC2_RG11_EAC:
97 return PIPE_FORMAT_R16G16_UNORM;
98 case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
99 return PIPE_FORMAT_R16_SNORM;
100 case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
101 return PIPE_FORMAT_R16G16_SNORM;
102 case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
103 return st->transcode_etc ? PIPE_FORMAT_DXT1_RGBA : PIPE_FORMAT_R8G8B8A8_UNORM;
104 case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
105 return st->transcode_etc ? PIPE_FORMAT_DXT1_SRGBA :
106 has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB;
107 default:
108 unreachable("Unknown ETC2 format");
109 }
110 }
111
112 if (st_astc_format_fallback(st, mesaFormat)) {
113 const bool is_5x5 = mesaFormat == PIPE_FORMAT_ASTC_5x5 ||
114 mesaFormat == PIPE_FORMAT_ASTC_5x5_SRGB;
115
116 /* If we're only emulating ASTC void extents, use the original format */
117 if (st->astc_void_extents_need_denorm_flush &&
118 (is_5x5 ? st->has_astc_5x5_ldr : st->has_astc_2d_ldr))
119 return mesaFormat;
120
121 /* We're emulating all of ASTC via transcoding or decompression */
122 if (_mesa_is_format_srgb(mesaFormat)) {
123 return st->transcode_astc ? PIPE_FORMAT_DXT5_SRGBA :
124 PIPE_FORMAT_R8G8B8A8_SRGB;
125 } else {
126 return st->transcode_astc ? PIPE_FORMAT_DXT5_RGBA :
127 PIPE_FORMAT_R8G8B8A8_UNORM;
128 }
129 }
130
131 if (_mesa_is_format_s3tc(mesaFormat) && !st->has_s3tc) {
132 return _mesa_is_format_srgb(mesaFormat) ? PIPE_FORMAT_R8G8B8A8_SRGB :
133 PIPE_FORMAT_R8G8B8A8_UNORM;
134 }
135
136 if ((_mesa_is_format_rgtc(mesaFormat) && !st->has_rgtc) ||
137 (_mesa_is_format_latc(mesaFormat) && !st->has_latc)) {
138 switch (mesaFormat) {
139 case MESA_FORMAT_R_RGTC1_UNORM:
140 return PIPE_FORMAT_R8_UNORM;
141 case MESA_FORMAT_R_RGTC1_SNORM:
142 return PIPE_FORMAT_R8_SNORM;
143 case MESA_FORMAT_RG_RGTC2_UNORM:
144 return PIPE_FORMAT_R8G8_UNORM;
145 case MESA_FORMAT_RG_RGTC2_SNORM:
146 return PIPE_FORMAT_R8G8_SNORM;
147 case MESA_FORMAT_L_LATC1_UNORM:
148 return PIPE_FORMAT_L8_UNORM;
149 case MESA_FORMAT_L_LATC1_SNORM:
150 return PIPE_FORMAT_L8_SNORM;
151 case MESA_FORMAT_LA_LATC2_UNORM:
152 return PIPE_FORMAT_L8A8_UNORM;
153 case MESA_FORMAT_LA_LATC2_SNORM:
154 return PIPE_FORMAT_L8A8_SNORM;
155 default:
156 unreachable("Unknown RGTC format");
157 }
158 }
159
160 if (_mesa_is_format_bptc(mesaFormat) && !st->has_bptc) {
161 switch (mesaFormat) {
162 case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT:
163 case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT:
164 return PIPE_FORMAT_R16G16B16X16_FLOAT;
165 default:
166 return _mesa_is_format_srgb(mesaFormat) ? PIPE_FORMAT_R8G8B8A8_SRGB :
167 PIPE_FORMAT_R8G8B8A8_UNORM;
168 }
169 }
170
171 return mesaFormat;
172 }
173
174
175 /**
176 * Translate Gallium format to Mesa format.
177 */
178 mesa_format
st_pipe_format_to_mesa_format(enum pipe_format format)179 st_pipe_format_to_mesa_format(enum pipe_format format)
180 {
181 mesa_format mf = format;
182 if (!_mesa_get_format_name(mf))
183 return MESA_FORMAT_NONE;
184 return mf;
185 }
186
187 /**
188 * Map GL texture formats to Gallium pipe formats.
189 */
190 struct format_mapping
191 {
192 GLenum glFormats[18]; /**< list of GLenum formats, 0-terminated */
193 enum pipe_format pipeFormats[14]; /**< list of pipe formats, 0-terminated */
194 };
195
196
197 #define DEFAULT_RGBA_FORMATS \
198 PIPE_FORMAT_R8G8B8A8_UNORM, \
199 PIPE_FORMAT_B8G8R8A8_UNORM, \
200 PIPE_FORMAT_A8R8G8B8_UNORM, \
201 PIPE_FORMAT_A8B8G8R8_UNORM, \
202 0
203
204 #define DEFAULT_RGB_FORMATS \
205 PIPE_FORMAT_R8G8B8X8_UNORM, \
206 PIPE_FORMAT_B8G8R8X8_UNORM, \
207 PIPE_FORMAT_X8R8G8B8_UNORM, \
208 PIPE_FORMAT_X8B8G8R8_UNORM, \
209 PIPE_FORMAT_B5G6R5_UNORM, \
210 DEFAULT_RGBA_FORMATS
211
212 #define DEFAULT_SRGBA_FORMATS \
213 PIPE_FORMAT_R8G8B8A8_SRGB, \
214 PIPE_FORMAT_B8G8R8A8_SRGB, \
215 PIPE_FORMAT_A8R8G8B8_SRGB, \
216 PIPE_FORMAT_A8B8G8R8_SRGB, \
217 0
218
219 #define DEFAULT_DEPTH_FORMATS \
220 PIPE_FORMAT_Z24X8_UNORM, \
221 PIPE_FORMAT_X8Z24_UNORM, \
222 PIPE_FORMAT_Z16_UNORM, \
223 PIPE_FORMAT_Z24_UNORM_S8_UINT, \
224 PIPE_FORMAT_S8_UINT_Z24_UNORM, \
225 0
226
227 #define DEFAULT_SNORM8_RGBA_FORMATS \
228 PIPE_FORMAT_R8G8B8A8_SNORM, \
229 0
230
231 #define DEFAULT_UNORM16_RGBA_FORMATS \
232 PIPE_FORMAT_R16G16B16A16_UNORM, \
233 DEFAULT_RGBA_FORMATS
234
235
236 /**
237 * This table maps OpenGL texture format enums to Gallium pipe_format enums.
238 * Multiple GL enums might map to multiple pipe_formats.
239 * The first pipe format in the list that's supported is the one that's chosen.
240 */
241 static const struct format_mapping format_map[] = {
242 /* Basic RGB, RGBA formats */
243 {
244 { GL_RGB10, 0 },
245 { PIPE_FORMAT_R10G10B10X2_UNORM, PIPE_FORMAT_B10G10R10X2_UNORM,
246 PIPE_FORMAT_R10G10B10A2_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
247 DEFAULT_RGB_FORMATS }
248 },
249 {
250 { GL_RGB10_A2, 0 },
251 { PIPE_FORMAT_R10G10B10A2_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
252 DEFAULT_RGBA_FORMATS }
253 },
254 {
255 { 4, GL_RGBA, GL_RGBA8, 0 },
256 { PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS }
257 },
258 {
259 { GL_BGRA, GL_BGRA8_EXT, 0 },
260 { DEFAULT_RGBA_FORMATS }
261 },
262 {
263 { 3, GL_RGB, GL_RGB8, 0 },
264 { PIPE_FORMAT_R8G8B8X8_UNORM, DEFAULT_RGB_FORMATS }
265 },
266 {
267 { GL_RGB12, GL_RGB16, 0 },
268 { PIPE_FORMAT_R16G16B16X16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
269 DEFAULT_RGB_FORMATS }
270 },
271 {
272 { GL_RGBA12, GL_RGBA16, 0 },
273 { PIPE_FORMAT_R16G16B16A16_UNORM, DEFAULT_RGBA_FORMATS }
274 },
275 {
276 { GL_RGBA4, GL_RGBA2, 0 },
277 { PIPE_FORMAT_B4G4R4A4_UNORM, PIPE_FORMAT_A4B4G4R4_UNORM,
278 DEFAULT_RGBA_FORMATS }
279 },
280 {
281 { GL_RGB5_A1, 0 },
282 { PIPE_FORMAT_B5G5R5A1_UNORM, PIPE_FORMAT_A1B5G5R5_UNORM,
283 DEFAULT_RGBA_FORMATS }
284 },
285 {
286 { GL_R3_G3_B2, 0 },
287 { PIPE_FORMAT_B2G3R3_UNORM, PIPE_FORMAT_R3G3B2_UNORM,
288 PIPE_FORMAT_B5G6R5_UNORM, PIPE_FORMAT_B5G5R5A1_UNORM,
289 DEFAULT_RGB_FORMATS }
290 },
291 {
292 { GL_RGB4, 0 },
293 { PIPE_FORMAT_B4G4R4X4_UNORM, PIPE_FORMAT_B4G4R4A4_UNORM,
294 PIPE_FORMAT_A4B4G4R4_UNORM,
295 DEFAULT_RGB_FORMATS }
296 },
297 {
298 { GL_RGB5, 0 },
299 { PIPE_FORMAT_B5G5R5X1_UNORM, PIPE_FORMAT_X1B5G5R5_UNORM,
300 PIPE_FORMAT_B5G5R5A1_UNORM, PIPE_FORMAT_A1B5G5R5_UNORM,
301 DEFAULT_RGB_FORMATS }
302 },
303 {
304 { GL_RGB565, 0 },
305 { PIPE_FORMAT_B5G6R5_UNORM, DEFAULT_RGB_FORMATS }
306 },
307
308 /* basic Alpha formats */
309 {
310 { GL_ALPHA12, GL_ALPHA16, 0 },
311 { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
312 PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
313 },
314 {
315 { GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_COMPRESSED_ALPHA, 0 },
316 { PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
317 },
318
319 /* basic Luminance formats */
320 {
321 { GL_LUMINANCE12, GL_LUMINANCE16, 0 },
322 { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
323 PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
324 },
325 {
326 { 1, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, 0 },
327 { PIPE_FORMAT_L8_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGB_FORMATS }
328 },
329
330 /* basic Luminance/Alpha formats */
331 {
332 { GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,
333 GL_LUMINANCE16_ALPHA16, 0},
334 { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
335 PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
336 },
337 {
338 { 2, GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, 0 },
339 { PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
340 },
341 {
342 { GL_LUMINANCE4_ALPHA4, 0 },
343 { PIPE_FORMAT_L4A4_UNORM, PIPE_FORMAT_L8A8_UNORM,
344 DEFAULT_RGBA_FORMATS }
345 },
346
347 /* basic Intensity formats */
348 {
349 { GL_INTENSITY12, GL_INTENSITY16, 0 },
350 { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
351 PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
352 },
353 {
354 { GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8,
355 GL_COMPRESSED_INTENSITY, 0 },
356 { PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
357 },
358
359 /* YCbCr */
360 {
361 { GL_YCBCR_MESA, 0 },
362 { PIPE_FORMAT_UYVY, PIPE_FORMAT_YUYV, 0 }
363 },
364
365 /* compressed formats */ /* XXX PIPE_BIND_SAMPLER_VIEW only */
366 {
367 { GL_COMPRESSED_RGB, 0 },
368 { PIPE_FORMAT_DXT1_RGB, DEFAULT_RGB_FORMATS }
369 },
370 {
371 { GL_COMPRESSED_RGBA, 0 },
372 { PIPE_FORMAT_DXT5_RGBA, DEFAULT_RGBA_FORMATS }
373 },
374 {
375 { GL_RGB_S3TC, GL_RGB4_S3TC, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 0 },
376 { PIPE_FORMAT_DXT1_RGB, 0 }
377 },
378 {
379 { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0 },
380 { PIPE_FORMAT_DXT1_RGBA, 0 }
381 },
382 {
383 { GL_RGBA_S3TC, GL_RGBA4_S3TC, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0 },
384 { PIPE_FORMAT_DXT3_RGBA, 0 }
385 },
386 {
387 { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0 },
388 { PIPE_FORMAT_DXT5_RGBA, 0 }
389 },
390
391 {
392 { GL_COMPRESSED_RGB_FXT1_3DFX, 0 },
393 { PIPE_FORMAT_FXT1_RGB, 0 }
394 },
395 {
396 { GL_COMPRESSED_RGBA_FXT1_3DFX, 0 },
397 { PIPE_FORMAT_FXT1_RGBA, 0 }
398 },
399
400 /* Depth formats */
401 {
402 { GL_DEPTH_COMPONENT16, 0 },
403 { PIPE_FORMAT_Z16_UNORM, DEFAULT_DEPTH_FORMATS }
404 },
405 {
406 { GL_DEPTH_COMPONENT24, 0 },
407 { PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM,
408 DEFAULT_DEPTH_FORMATS }
409 },
410 {
411 { GL_DEPTH_COMPONENT32, 0 },
412 { PIPE_FORMAT_Z32_UNORM, DEFAULT_DEPTH_FORMATS }
413 },
414 {
415 { GL_DEPTH_COMPONENT, 0 },
416 { DEFAULT_DEPTH_FORMATS }
417 },
418 {
419 { GL_DEPTH_COMPONENT32F, 0 },
420 { PIPE_FORMAT_Z32_FLOAT, 0 }
421 },
422
423 /* stencil formats */
424 {
425 { GL_STENCIL_INDEX, GL_STENCIL_INDEX1_EXT, GL_STENCIL_INDEX4_EXT,
426 GL_STENCIL_INDEX8_EXT, GL_STENCIL_INDEX16_EXT, 0 },
427 {
428 PIPE_FORMAT_S8_UINT, PIPE_FORMAT_Z24_UNORM_S8_UINT,
429 PIPE_FORMAT_S8_UINT_Z24_UNORM, 0
430 }
431 },
432
433 /* Depth / Stencil formats */
434 {
435 { GL_DEPTH_STENCIL_EXT, GL_DEPTH24_STENCIL8_EXT, 0 },
436 { PIPE_FORMAT_Z24_UNORM_S8_UINT, PIPE_FORMAT_S8_UINT_Z24_UNORM, 0 }
437 },
438 {
439 { GL_DEPTH32F_STENCIL8, 0 },
440 { PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, 0 }
441 },
442
443 /* sRGB formats */
444 {
445 { GL_SRGB_EXT, GL_SRGB8_EXT, 0 },
446 { PIPE_FORMAT_R8G8B8X8_SRGB, PIPE_FORMAT_B8G8R8X8_SRGB,
447 DEFAULT_SRGBA_FORMATS }
448 },
449 {
450 { GL_SRGB_ALPHA_EXT, GL_SRGB8_ALPHA8_EXT, 0 },
451 { PIPE_FORMAT_R8G8B8A8_SRGB, DEFAULT_SRGBA_FORMATS }
452 },
453 {
454 { GL_COMPRESSED_SRGB_EXT, 0 },
455 { PIPE_FORMAT_DXT1_SRGB, PIPE_FORMAT_R8G8B8X8_SRGB,
456 PIPE_FORMAT_B8G8R8X8_SRGB, DEFAULT_SRGBA_FORMATS }
457 },
458 {
459 { GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 0 },
460 { PIPE_FORMAT_DXT1_SRGB }
461 },
462 {
463 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0 },
464 { PIPE_FORMAT_DXT1_SRGBA, 0 }
465 },
466 {
467 { GL_COMPRESSED_SRGB_ALPHA_EXT },
468 { PIPE_FORMAT_DXT3_SRGBA, DEFAULT_SRGBA_FORMATS }
469 },
470 {
471 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0 },
472 { PIPE_FORMAT_DXT3_SRGBA, 0 }
473 },
474 {
475 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0 },
476 { PIPE_FORMAT_DXT5_SRGBA, 0 }
477 },
478 {
479 { GL_SLUMINANCE_ALPHA_EXT, GL_SLUMINANCE8_ALPHA8_EXT,
480 GL_COMPRESSED_SLUMINANCE_ALPHA_EXT, 0 },
481 { PIPE_FORMAT_L8A8_SRGB, DEFAULT_SRGBA_FORMATS }
482 },
483 {
484 { GL_SLUMINANCE_EXT, GL_SLUMINANCE8_EXT, GL_COMPRESSED_SLUMINANCE_EXT,
485 0 },
486 { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS }
487 },
488 {
489 { GL_SR8_EXT, 0 },
490 { PIPE_FORMAT_R8_SRGB, 0 }
491 },
492 {
493 { GL_SRG8_EXT, 0 },
494 { PIPE_FORMAT_R8G8_SRGB, 0 }
495 },
496
497 /* 16-bit float formats */
498 {
499 { GL_RGBA16F_ARB, 0 },
500 { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
501 },
502 {
503 { GL_RGB16F_ARB, 0 },
504 { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R16G16B16X16_FLOAT,
505 PIPE_FORMAT_R16G16B16A16_FLOAT,
506 PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
507 },
508 {
509 { GL_LUMINANCE_ALPHA16F_ARB, 0 },
510 { PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
511 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
512 },
513 {
514 { GL_ALPHA16F_ARB, 0 },
515 { PIPE_FORMAT_A16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
516 PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
517 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
518 },
519 {
520 { GL_INTENSITY16F_ARB, 0 },
521 { PIPE_FORMAT_I16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
522 PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
523 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
524 },
525 {
526 { GL_LUMINANCE16F_ARB, 0 },
527 { PIPE_FORMAT_L16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
528 PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
529 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
530 },
531 {
532 { GL_R16F, 0 },
533 { PIPE_FORMAT_R16_FLOAT, PIPE_FORMAT_R16G16_FLOAT,
534 PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
535 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
536 },
537 {
538 { GL_RG16F, 0 },
539 { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
540 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
541 },
542
543 /* 32-bit float formats */
544 {
545 { GL_RGBA32F_ARB, 0 },
546 { PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
547 },
548 {
549 { GL_RGB32F_ARB, 0 },
550 { PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32X32_FLOAT,
551 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
552 },
553 {
554 { GL_LUMINANCE_ALPHA32F_ARB, 0 },
555 { PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
556 },
557 {
558 { GL_ALPHA32F_ARB, 0 },
559 { PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
560 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
561 },
562 {
563 { GL_INTENSITY32F_ARB, 0 },
564 { PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
565 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
566 },
567 {
568 { GL_LUMINANCE32F_ARB, 0 },
569 { PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
570 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
571 },
572 {
573 { GL_R32F, 0 },
574 { PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT,
575 PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
576 },
577 {
578 { GL_RG32F, 0 },
579 { PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
580 },
581
582 /* R, RG formats */
583 {
584 { GL_RED, GL_R8, 0 },
585 { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
586 },
587 {
588 { GL_RG, GL_RG8, 0 },
589 { PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
590 },
591 {
592 { GL_R16, 0 },
593 { PIPE_FORMAT_R16_UNORM, PIPE_FORMAT_R16G16_UNORM,
594 DEFAULT_UNORM16_RGBA_FORMATS }
595 },
596 {
597 { GL_RG16, 0 },
598 { PIPE_FORMAT_R16G16_UNORM, DEFAULT_UNORM16_RGBA_FORMATS }
599 },
600
601 /* compressed R, RG formats */
602 {
603 { GL_COMPRESSED_RED, 0 },
604 { PIPE_FORMAT_RGTC1_UNORM, PIPE_FORMAT_R8_UNORM, DEFAULT_RGBA_FORMATS }
605 },
606 {
607 { GL_COMPRESSED_RED_RGTC1, 0 },
608 { PIPE_FORMAT_RGTC1_UNORM, 0 }
609 },
610 {
611 { GL_COMPRESSED_SIGNED_RED_RGTC1, 0 },
612 { PIPE_FORMAT_RGTC1_SNORM, 0 }
613 },
614 {
615 { GL_COMPRESSED_RG, 0 },
616 { PIPE_FORMAT_RGTC2_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
617 },
618 {
619 { GL_COMPRESSED_RG_RGTC2, 0 },
620 { PIPE_FORMAT_RGTC2_UNORM, 0 }
621 },
622 {
623 { GL_COMPRESSED_SIGNED_RG_RGTC2, 0 },
624 { PIPE_FORMAT_RGTC2_SNORM, 0 }
625 },
626 {
627 { GL_COMPRESSED_LUMINANCE, 0 },
628 { PIPE_FORMAT_LATC1_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGBA_FORMATS }
629 },
630 {
631 { GL_COMPRESSED_LUMINANCE_LATC1_EXT, 0 },
632 { PIPE_FORMAT_LATC1_UNORM, 0 }
633 },
634 {
635 { GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT, 0 },
636 { PIPE_FORMAT_LATC1_SNORM, 0 }
637 },
638 {
639 { GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0 },
640 { PIPE_FORMAT_LATC2_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
641 },
642 {
643 { GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT, 0 },
644 { PIPE_FORMAT_LATC2_UNORM, 0 }
645 },
646 {
647 { GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT, 0 },
648 { PIPE_FORMAT_LATC2_SNORM, 0 }
649 },
650
651 /* ETC1 */
652 {
653 { GL_ETC1_RGB8_OES, 0 },
654 { PIPE_FORMAT_ETC1_RGB8, 0 }
655 },
656
657 /* ETC2 */
658 {
659 { GL_COMPRESSED_RGB8_ETC2, 0 },
660 { PIPE_FORMAT_ETC2_RGB8, 0 }
661 },
662 {
663 { GL_COMPRESSED_SRGB8_ETC2, 0 },
664 { PIPE_FORMAT_ETC2_SRGB8, 0 }
665 },
666 {
667 { GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 0 },
668 { PIPE_FORMAT_ETC2_RGB8A1, 0 }
669 },
670 {
671 { GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 0 },
672 { PIPE_FORMAT_ETC2_SRGB8A1, 0 }
673 },
674 {
675 { GL_COMPRESSED_RGBA8_ETC2_EAC, 0 },
676 { PIPE_FORMAT_ETC2_RGBA8, 0 }
677 },
678 {
679 { GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 0 },
680 { PIPE_FORMAT_ETC2_SRGBA8, 0 }
681 },
682 {
683 { GL_COMPRESSED_R11_EAC, 0 },
684 { PIPE_FORMAT_ETC2_R11_UNORM, 0 }
685 },
686 {
687 { GL_COMPRESSED_SIGNED_R11_EAC, 0 },
688 { PIPE_FORMAT_ETC2_R11_SNORM, 0 }
689 },
690 {
691 { GL_COMPRESSED_RG11_EAC, 0 },
692 { PIPE_FORMAT_ETC2_RG11_UNORM, 0 }
693 },
694 {
695 { GL_COMPRESSED_SIGNED_RG11_EAC, 0 },
696 { PIPE_FORMAT_ETC2_RG11_SNORM, 0 }
697 },
698
699 /* BPTC */
700 {
701 { GL_COMPRESSED_RGBA_BPTC_UNORM, 0 },
702 { PIPE_FORMAT_BPTC_RGBA_UNORM, 0 },
703 },
704 {
705 { GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM, 0 },
706 { PIPE_FORMAT_BPTC_SRGBA, 0 },
707 },
708 {
709 { GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT, 0 },
710 { PIPE_FORMAT_BPTC_RGB_FLOAT, 0 },
711 },
712 {
713 { GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT, 0 },
714 { PIPE_FORMAT_BPTC_RGB_UFLOAT, 0 },
715 },
716
717 /* ASTC */
718 {
719 { GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 0 },
720 { PIPE_FORMAT_ASTC_4x4, 0},
721 },
722 {
723 { GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 0 },
724 { PIPE_FORMAT_ASTC_5x4, 0},
725 },
726 {
727 { GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 0 },
728 { PIPE_FORMAT_ASTC_5x5, 0},
729 },
730 {
731 { GL_COMPRESSED_RGBA_ASTC_6x5_KHR, 0 },
732 { PIPE_FORMAT_ASTC_6x5, 0},
733 },
734 {
735 { GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 0 },
736 { PIPE_FORMAT_ASTC_6x6, 0},
737 },
738 {
739 { GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 0 },
740 { PIPE_FORMAT_ASTC_8x5, 0},
741 },
742 {
743 { GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 0 },
744 { PIPE_FORMAT_ASTC_8x6, 0},
745 },
746 {
747 { GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 0 },
748 { PIPE_FORMAT_ASTC_8x8, 0},
749 },
750 {
751 { GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 0 },
752 { PIPE_FORMAT_ASTC_10x5, 0},
753 },
754 {
755 { GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 0 },
756 { PIPE_FORMAT_ASTC_10x6, 0},
757 },
758 {
759 { GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 0 },
760 { PIPE_FORMAT_ASTC_10x8, 0},
761 },
762 {
763 { GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 0 },
764 { PIPE_FORMAT_ASTC_10x10, 0},
765 },
766 {
767 { GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 0 },
768 { PIPE_FORMAT_ASTC_12x10, 0},
769 },
770 {
771 { GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 0 },
772 { PIPE_FORMAT_ASTC_12x12, 0},
773 },
774
775 {
776 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 0 },
777 { PIPE_FORMAT_ASTC_4x4_SRGB, 0},
778 },
779 {
780 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 0 },
781 { PIPE_FORMAT_ASTC_5x4_SRGB, 0},
782 },
783 {
784 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 0 },
785 { PIPE_FORMAT_ASTC_5x5_SRGB, 0},
786 },
787 {
788 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 0 },
789 { PIPE_FORMAT_ASTC_6x5_SRGB, 0},
790 },
791 {
792 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 0 },
793 { PIPE_FORMAT_ASTC_6x6_SRGB, 0},
794 },
795 {
796 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 0 },
797 { PIPE_FORMAT_ASTC_8x5_SRGB, 0},
798 },
799 {
800 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 0 },
801 { PIPE_FORMAT_ASTC_8x6_SRGB, 0},
802 },
803 {
804 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 0 },
805 { PIPE_FORMAT_ASTC_8x8_SRGB, 0},
806 },
807 {
808 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 0 },
809 { PIPE_FORMAT_ASTC_10x5_SRGB, 0},
810 },
811 {
812 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 0 },
813 { PIPE_FORMAT_ASTC_10x6_SRGB, 0},
814 },
815 {
816 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 0 },
817 { PIPE_FORMAT_ASTC_10x8_SRGB, 0},
818 },
819 {
820 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 0 },
821 { PIPE_FORMAT_ASTC_10x10_SRGB, 0},
822 },
823 {
824 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 0 },
825 { PIPE_FORMAT_ASTC_12x10_SRGB, 0},
826 },
827 {
828 { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 0 },
829 { PIPE_FORMAT_ASTC_12x12_SRGB, 0},
830 },
831
832 /* signed/unsigned integer formats.
833 */
834 {
835 { GL_RGBA_INTEGER_EXT,
836 GL_BGRA_INTEGER_EXT,
837 GL_RGBA8I_EXT, 0 },
838 { PIPE_FORMAT_R8G8B8A8_SINT, 0 }
839 },
840 {
841 { GL_RGB_INTEGER_EXT,
842 GL_BGR_INTEGER_EXT,
843 GL_RGB8I_EXT,
844 GL_BLUE_INTEGER_EXT, 0 },
845 { PIPE_FORMAT_R8G8B8_SINT, PIPE_FORMAT_R8G8B8X8_SINT,
846 PIPE_FORMAT_R8G8B8A8_SINT, 0 }
847 },
848 {
849 { GL_ALPHA_INTEGER_EXT,
850 GL_ALPHA8I_EXT, 0 },
851 { PIPE_FORMAT_A8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
852 },
853 {
854 { GL_ALPHA16I_EXT, 0 },
855 { PIPE_FORMAT_A16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
856 },
857 {
858 { GL_ALPHA32I_EXT, 0 },
859 { PIPE_FORMAT_A32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
860 },
861 {
862 { GL_ALPHA8UI_EXT, 0 },
863 { PIPE_FORMAT_A8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
864 },
865 {
866 { GL_ALPHA16UI_EXT, 0 },
867 { PIPE_FORMAT_A16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
868 },
869 {
870 { GL_ALPHA32UI_EXT, 0 },
871 { PIPE_FORMAT_A32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
872 },
873 {
874 { GL_INTENSITY8I_EXT, 0 },
875 { PIPE_FORMAT_I8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
876 },
877 {
878 { GL_INTENSITY16I_EXT, 0 },
879 { PIPE_FORMAT_I16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
880 },
881 {
882 { GL_INTENSITY32I_EXT, 0 },
883 { PIPE_FORMAT_I32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
884 },
885 {
886 { GL_INTENSITY8UI_EXT, 0 },
887 { PIPE_FORMAT_I8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
888 },
889 {
890 { GL_INTENSITY16UI_EXT, 0 },
891 { PIPE_FORMAT_I16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
892 },
893 {
894 { GL_INTENSITY32UI_EXT, 0 },
895 { PIPE_FORMAT_I32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
896 },
897 {
898 { GL_LUMINANCE8I_EXT, 0 },
899 { PIPE_FORMAT_L8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
900 },
901 {
902 { GL_LUMINANCE16I_EXT, 0 },
903 { PIPE_FORMAT_L16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
904 },
905 {
906 { GL_LUMINANCE32I_EXT, 0 },
907 { PIPE_FORMAT_L32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
908 },
909 {
910 { GL_LUMINANCE_INTEGER_EXT,
911 GL_LUMINANCE8UI_EXT, 0 },
912 { PIPE_FORMAT_L8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
913 },
914 {
915 { GL_LUMINANCE16UI_EXT, 0 },
916 { PIPE_FORMAT_L16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
917 },
918 {
919 { GL_LUMINANCE32UI_EXT, 0 },
920 { PIPE_FORMAT_L32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
921 },
922 {
923 { GL_LUMINANCE_ALPHA_INTEGER_EXT,
924 GL_LUMINANCE_ALPHA8I_EXT, 0 },
925 { PIPE_FORMAT_L8A8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
926 },
927 {
928 { GL_LUMINANCE_ALPHA16I_EXT, 0 },
929 { PIPE_FORMAT_L16A16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
930 },
931 {
932 { GL_LUMINANCE_ALPHA32I_EXT, 0 },
933 { PIPE_FORMAT_L32A32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
934 },
935 {
936 { GL_LUMINANCE_ALPHA8UI_EXT, 0 },
937 { PIPE_FORMAT_L8A8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
938 },
939 {
940 { GL_LUMINANCE_ALPHA16UI_EXT, 0 },
941 { PIPE_FORMAT_L16A16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
942 },
943 {
944 { GL_LUMINANCE_ALPHA32UI_EXT, 0 },
945 { PIPE_FORMAT_L32A32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
946 },
947 {
948 { GL_RGB16I_EXT, 0 },
949 { PIPE_FORMAT_R16G16B16_SINT, PIPE_FORMAT_R16G16B16X16_SINT,
950 PIPE_FORMAT_R16G16B16A16_SINT, 0 },
951 },
952 {
953 { GL_RGBA16I_EXT, 0 },
954 { PIPE_FORMAT_R16G16B16A16_SINT, 0 },
955 },
956 {
957 { GL_RGB32I_EXT, 0 },
958 { PIPE_FORMAT_R32G32B32_SINT, PIPE_FORMAT_R32G32B32X32_SINT,
959 PIPE_FORMAT_R32G32B32A32_SINT, 0 },
960 },
961 {
962 { GL_RGBA32I_EXT, 0 },
963 { PIPE_FORMAT_R32G32B32A32_SINT, 0 }
964 },
965 {
966 { GL_RGBA8UI_EXT, 0 },
967 { PIPE_FORMAT_R8G8B8A8_UINT, 0 }
968 },
969 {
970 { GL_RGB8UI_EXT, 0 },
971 { PIPE_FORMAT_R8G8B8_UINT, PIPE_FORMAT_R8G8B8X8_UINT,
972 PIPE_FORMAT_R8G8B8A8_UINT, 0 }
973 },
974 {
975 { GL_RGB16UI_EXT, 0 },
976 { PIPE_FORMAT_R16G16B16_UINT, PIPE_FORMAT_R16G16B16X16_UINT,
977 PIPE_FORMAT_R16G16B16A16_UINT, 0 }
978 },
979 {
980 { GL_RGBA16UI_EXT, 0 },
981 { PIPE_FORMAT_R16G16B16A16_UINT, 0 }
982 },
983 {
984 { GL_RGB32UI_EXT, 0},
985 { PIPE_FORMAT_R32G32B32_UINT, PIPE_FORMAT_R32G32B32X32_UINT,
986 PIPE_FORMAT_R32G32B32A32_UINT, 0 }
987 },
988 {
989 { GL_RGBA32UI_EXT, 0},
990 { PIPE_FORMAT_R32G32B32A32_UINT, 0 }
991 },
992 {
993 { GL_R8I, GL_RED_INTEGER_EXT, 0},
994 { PIPE_FORMAT_R8_SINT, PIPE_FORMAT_R8G8_SINT, 0},
995 },
996 {
997 { GL_R16I, 0},
998 { PIPE_FORMAT_R16_SINT, 0},
999 },
1000 {
1001 { GL_R32I, 0},
1002 { PIPE_FORMAT_R32_SINT, 0},
1003 },
1004 {
1005 { GL_R8UI, 0},
1006 { PIPE_FORMAT_R8_UINT, PIPE_FORMAT_R8G8_UINT, 0},
1007 },
1008 {
1009 { GL_R16UI, 0},
1010 { PIPE_FORMAT_R16_UINT, 0},
1011 },
1012 {
1013 { GL_R32UI, 0},
1014 { PIPE_FORMAT_R32_UINT, 0},
1015 },
1016 {
1017 { GL_RG8I, GL_GREEN_INTEGER_EXT, 0},
1018 { PIPE_FORMAT_R8G8_SINT, 0},
1019 },
1020 {
1021 { GL_RG16I, 0},
1022 { PIPE_FORMAT_R16G16_SINT, 0},
1023 },
1024 {
1025 { GL_RG32I, 0},
1026 { PIPE_FORMAT_R32G32_SINT, 0},
1027 },
1028 {
1029 { GL_RG8UI, 0},
1030 { PIPE_FORMAT_R8G8_UINT, 0},
1031 },
1032 {
1033 { GL_RG16UI, 0},
1034 { PIPE_FORMAT_R16G16_UINT, 0},
1035 },
1036 {
1037 { GL_RG32UI, 0},
1038 { PIPE_FORMAT_R32G32_UINT, 0},
1039 },
1040 /* signed normalized formats */
1041 {
1042 { GL_RED_SNORM, GL_R8_SNORM, 0 },
1043 { PIPE_FORMAT_R8_SNORM, PIPE_FORMAT_R8G8_SNORM,
1044 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1045 },
1046 {
1047 { GL_R16_SNORM, 0 },
1048 { PIPE_FORMAT_R16_SNORM,
1049 PIPE_FORMAT_R16G16_SNORM,
1050 PIPE_FORMAT_R16G16B16A16_SNORM,
1051 PIPE_FORMAT_R8_SNORM,
1052 PIPE_FORMAT_R8G8_SNORM,
1053 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1054 },
1055 {
1056 { GL_RG_SNORM, GL_RG8_SNORM, 0 },
1057 { PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1058 },
1059 {
1060 { GL_RG16_SNORM, 0 },
1061 { PIPE_FORMAT_R16G16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1062 PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1063 },
1064 {
1065 { GL_RGB_SNORM, GL_RGB8_SNORM, 0 },
1066 { PIPE_FORMAT_R8G8B8X8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1067 },
1068 {
1069 { GL_RGBA_SNORM, GL_RGBA8_SNORM, 0 },
1070 { PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1071 },
1072 {
1073 { GL_RGB16_SNORM, 0 },
1074 { PIPE_FORMAT_R16G16B16X16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1075 PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1076 },
1077 {
1078 { GL_RGBA16_SNORM, 0 },
1079 { PIPE_FORMAT_R16G16B16A16_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1080 },
1081 {
1082 { GL_ALPHA_SNORM, GL_ALPHA8_SNORM, 0 },
1083 { PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1084 },
1085 {
1086 { GL_ALPHA16_SNORM, 0 },
1087 { PIPE_FORMAT_A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1088 PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1089 },
1090 {
1091 { GL_LUMINANCE_SNORM, GL_LUMINANCE8_SNORM, 0 },
1092 { PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1093 },
1094 {
1095 { GL_LUMINANCE16_SNORM, 0 },
1096 { PIPE_FORMAT_L16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1097 PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1098 },
1099 {
1100 { GL_LUMINANCE_ALPHA_SNORM, GL_LUMINANCE8_ALPHA8_SNORM, 0 },
1101 { PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1102 },
1103 {
1104 { GL_LUMINANCE16_ALPHA16_SNORM, 0 },
1105 { PIPE_FORMAT_L16A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1106 PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1107 },
1108 {
1109 { GL_INTENSITY_SNORM, GL_INTENSITY8_SNORM, 0 },
1110 { PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1111 },
1112 {
1113 { GL_INTENSITY16_SNORM, 0 },
1114 { PIPE_FORMAT_I16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
1115 PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
1116 },
1117 {
1118 { GL_RGB9_E5, 0 },
1119 { PIPE_FORMAT_R9G9B9E5_FLOAT, 0 }
1120 },
1121 {
1122 { GL_R11F_G11F_B10F, 0 },
1123 { PIPE_FORMAT_R11G11B10_FLOAT, 0 }
1124 },
1125 {
1126 { GL_RGB10_A2UI, 0 },
1127 { PIPE_FORMAT_R10G10B10A2_UINT, PIPE_FORMAT_B10G10R10A2_UINT, 0 }
1128 },
1129 };
1130
1131
1132 /**
1133 * Return first supported format from the given list.
1134 * \param allow_dxt indicates whether it's OK to return a DXT format.
1135 */
1136 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 storage_sample_count,unsigned bindings,bool allow_dxt)1137 find_supported_format(struct pipe_screen *screen,
1138 const enum pipe_format formats[],
1139 enum pipe_texture_target target,
1140 unsigned sample_count,
1141 unsigned storage_sample_count,
1142 unsigned bindings,
1143 bool allow_dxt)
1144 {
1145 uint i;
1146 for (i = 0; formats[i]; i++) {
1147 if (!bindings || screen->is_format_supported(screen, formats[i], target,
1148 sample_count, storage_sample_count,
1149 bindings)) {
1150 if (!allow_dxt && util_format_is_s3tc(formats[i])) {
1151 /* we can't return a dxt format, continue searching */
1152 continue;
1153 }
1154
1155 return formats[i];
1156 }
1157 }
1158 return PIPE_FORMAT_NONE;
1159 }
1160
1161 /**
1162 * Given an OpenGL internalFormat value for a texture or surface, return
1163 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
1164 * This is called during glTexImage2D, for example.
1165 *
1166 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
1167 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
1168 * we want render-to-texture ability.
1169 * If bindings is zero, the driver doesn't need to support the returned format.
1170 *
1171 * \param internalFormat the user value passed to glTexImage2D
1172 * \param target one of PIPE_TEXTURE_x
1173 * \param bindings bitmask of PIPE_BIND_x flags.
1174 * \param allow_dxt indicates whether it's OK to return a DXT format. This
1175 * only matters when internalFormat names a generic or
1176 * specific compressed format. And that should only happen
1177 * when we're getting called from gl[Copy]TexImage().
1178 */
1179 enum pipe_format
st_choose_format(struct st_context * st,GLenum internalFormat,GLenum format,GLenum type,enum pipe_texture_target target,unsigned sample_count,unsigned storage_sample_count,unsigned bindings,bool swap_bytes,bool allow_dxt)1180 st_choose_format(struct st_context *st, GLenum internalFormat,
1181 GLenum format, GLenum type,
1182 enum pipe_texture_target target, unsigned sample_count,
1183 unsigned storage_sample_count,
1184 unsigned bindings, bool swap_bytes, bool allow_dxt)
1185 {
1186 struct pipe_screen *screen = st->screen;
1187 unsigned i;
1188 int j;
1189 enum pipe_format pf;
1190
1191 /* can't render to compressed formats at this time */
1192 if (_mesa_is_compressed_format(st->ctx, internalFormat)
1193 && (bindings & ~PIPE_BIND_SAMPLER_VIEW)) {
1194 return PIPE_FORMAT_NONE;
1195 }
1196
1197 /* If we have an unsized internalFormat, and the driver supports a format
1198 * that exactly matches format/type such that we can just memcpy, pick that
1199 * (unless the format wouldn't still be unorm, which is the expectation for
1200 * unsized formats).
1201 */
1202 if (_mesa_is_enum_format_unsized(internalFormat) && format != 0 &&
1203 _mesa_is_type_unsigned(type)) {
1204 pf = st_choose_matching_format(st, bindings, format, type,
1205 swap_bytes);
1206
1207 if (pf != PIPE_FORMAT_NONE &&
1208 (!bindings || screen->is_format_supported(screen, pf, target, sample_count,
1209 storage_sample_count, bindings)) &&
1210 _mesa_get_format_base_format(st_pipe_format_to_mesa_format(pf)) ==
1211 internalFormat) {
1212 goto success;
1213 }
1214 }
1215
1216 /* For an unsized GL_RGB but a 2_10_10_10 type, try to pick one of the
1217 * 2_10_10_10 formats. This is important for
1218 * GL_EXT_texture_type_2_10_10_10_REV support, which says that these
1219 * formats are not color-renderable. Mesa's check for making those
1220 * non-color-renderable is based on our chosen format being 2101010.
1221 */
1222 if (type == GL_UNSIGNED_INT_2_10_10_10_REV ||
1223 type == GL_UNSIGNED_INT_10_10_10_2 ||
1224 type == GL_UNSIGNED_INT_10_10_10_2_OES) {
1225 if (internalFormat == GL_RGB)
1226 internalFormat = GL_RGB10;
1227 else if (internalFormat == GL_RGBA)
1228 internalFormat = GL_RGB10_A2;
1229 }
1230
1231 if (type == GL_UNSIGNED_SHORT_5_5_5_1) {
1232 if (internalFormat == GL_RGB)
1233 internalFormat = GL_RGB5;
1234 else if (internalFormat == GL_RGBA)
1235 internalFormat = GL_RGB5_A1;
1236 }
1237
1238 /* search table for internalFormat */
1239 for (i = 0; i < ARRAY_SIZE(format_map); i++) {
1240 const struct format_mapping *mapping = &format_map[i];
1241 for (j = 0; mapping->glFormats[j]; j++) {
1242 if (mapping->glFormats[j] == internalFormat) {
1243 /* Found the desired internal format. Find first pipe format
1244 * which is supported by the driver.
1245 */
1246 pf = find_supported_format(screen, mapping->pipeFormats,
1247 target, sample_count,
1248 storage_sample_count, bindings,
1249 allow_dxt);
1250 goto success;
1251 }
1252 }
1253 }
1254
1255 _mesa_problem(NULL, "unhandled format!\n");
1256 return PIPE_FORMAT_NONE;
1257
1258 success:
1259 if (0) {
1260 debug_printf("%s(fmt=%s, type=%s, intFmt=%s) = %s\n",
1261 __func__,
1262 _mesa_enum_to_string(format),
1263 _mesa_enum_to_string(type),
1264 _mesa_enum_to_string(internalFormat),
1265 util_format_name(pf));
1266 }
1267 return pf;
1268 }
1269
1270
1271 /**
1272 * Given an OpenGL user-requested format and type, and swapBytes state,
1273 * return the format which exactly matches those parameters, so that
1274 * a memcpy-based transfer can be done.
1275 *
1276 * If no match format exists, return PIPE_FORMAT_NONE.
1277 */
1278 enum pipe_format
st_choose_matching_format_noverify(struct st_context * st,GLenum format,GLenum type,GLboolean swapBytes)1279 st_choose_matching_format_noverify(struct st_context *st,
1280 GLenum format, GLenum type, GLboolean swapBytes)
1281 {
1282 if (swapBytes && !_mesa_swap_bytes_in_type_enum(&type))
1283 return PIPE_FORMAT_NONE;
1284
1285 mesa_format mesa_format = _mesa_format_from_format_and_type(format, type);
1286 if (_mesa_format_is_mesa_array_format(mesa_format))
1287 mesa_format = _mesa_format_from_array_format(mesa_format);
1288 if (mesa_format != MESA_FORMAT_NONE)
1289 return st_mesa_format_to_pipe_format(st, mesa_format);
1290
1291 return PIPE_FORMAT_NONE;
1292 }
1293
1294
1295 /**
1296 * Given an OpenGL user-requested format and type, and swapBytes state,
1297 * return the format which exactly matches those parameters, so that
1298 * a memcpy-based transfer can be done.
1299 *
1300 * If no format is supported, return PIPE_FORMAT_NONE.
1301 */
1302 enum pipe_format
st_choose_matching_format(struct st_context * st,unsigned bind,GLenum format,GLenum type,GLboolean swapBytes)1303 st_choose_matching_format(struct st_context *st, unsigned bind,
1304 GLenum format, GLenum type, GLboolean swapBytes)
1305 {
1306 struct pipe_screen *screen = st->screen;
1307 enum pipe_format pformat = st_choose_matching_format_noverify(st, format, type, swapBytes);
1308 if (pformat != PIPE_FORMAT_NONE &&
1309 (!bind || screen->is_format_supported(screen, pformat, PIPE_TEXTURE_2D, 0, 0, bind)))
1310 return pformat;
1311
1312 return PIPE_FORMAT_NONE;
1313 }
1314
1315
1316 /**
1317 * Called via ctx->Driver.ChooseTextureFormat().
1318 */
1319 mesa_format
st_ChooseTextureFormat(struct gl_context * ctx,GLenum target,GLint internalFormat,GLenum format,GLenum type)1320 st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
1321 GLint internalFormat,
1322 GLenum format, GLenum type)
1323 {
1324 struct st_context *st = st_context(ctx);
1325 enum pipe_format pFormat;
1326 mesa_format mFormat;
1327 unsigned bindings;
1328 bool is_renderbuffer = false;
1329 enum pipe_texture_target pTarget;
1330
1331 if (target == GL_RENDERBUFFER) {
1332 pTarget = PIPE_TEXTURE_2D;
1333 is_renderbuffer = true;
1334 } else {
1335 pTarget = gl_target_to_pipe(target);
1336 if (internalFormat == format) {
1337 if (internalFormat == GL_RGBA) {
1338 /* with GL_RGBA, these are effectively aliases to required formats */
1339 switch (type) {
1340 case GL_UNSIGNED_SHORT_5_5_5_1:
1341 case GL_UNSIGNED_SHORT_4_4_4_4:
1342 case GL_UNSIGNED_INT_8_8_8_8:
1343 is_renderbuffer = true;
1344 break;
1345 default: break;
1346 }
1347 } else if (internalFormat == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) {
1348 is_renderbuffer = true;
1349 }
1350 }
1351 }
1352
1353 if (target == GL_TEXTURE_1D || target == GL_TEXTURE_1D_ARRAY) {
1354 /* We don't do compression for these texture targets because of
1355 * difficulty with sub-texture updates on non-block boundaries, etc.
1356 * So change the internal format request to an uncompressed format.
1357 */
1358 internalFormat =
1359 _mesa_generic_compressed_format_to_uncompressed_format(internalFormat);
1360 }
1361
1362 /* GL textures may wind up being render targets, but we don't know
1363 * that in advance. Specify potential render target flags now for formats
1364 * that we know should always be renderable.
1365 */
1366 bindings = PIPE_BIND_SAMPLER_VIEW;
1367 if (_mesa_is_depth_or_stencil_format(internalFormat))
1368 bindings |= PIPE_BIND_DEPTH_STENCIL;
1369 else if (is_renderbuffer)
1370 bindings |= PIPE_BIND_RENDER_TARGET;
1371 else if (internalFormat == 3 || internalFormat == 4 ||
1372 internalFormat == GL_RGB || internalFormat == GL_RGBA ||
1373 internalFormat == GL_RGBA2 ||
1374 internalFormat == GL_RGB4 || internalFormat == GL_RGBA4 ||
1375 internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
1376 internalFormat == GL_BGRA ||
1377 internalFormat == GL_RGB16F ||
1378 internalFormat == GL_RGBA16F ||
1379 internalFormat == GL_RGB32F ||
1380 internalFormat == GL_RGBA32F ||
1381 internalFormat == GL_RED ||
1382 internalFormat == GL_RED_SNORM ||
1383 internalFormat == GL_R8I ||
1384 internalFormat == GL_R8UI)
1385 bindings |= PIPE_BIND_RENDER_TARGET;
1386
1387 if ((_mesa_is_desktop_gl(ctx) && ctx->Version >= 30) &&
1388 (internalFormat == GL_ALPHA4 ||
1389 internalFormat == GL_ALPHA8 ||
1390 internalFormat == GL_ALPHA12 ||
1391 internalFormat == GL_ALPHA16 ||
1392 /* ARB_texture_float */
1393 internalFormat == GL_ALPHA32F_ARB ||
1394 internalFormat == GL_INTENSITY32F_ARB ||
1395 internalFormat == GL_LUMINANCE32F_ARB ||
1396 internalFormat == GL_LUMINANCE_ALPHA32F_ARB ||
1397 internalFormat == GL_ALPHA16F_ARB ||
1398 internalFormat == GL_INTENSITY16F_ARB ||
1399 internalFormat == GL_LUMINANCE16F_ARB ||
1400 internalFormat == GL_LUMINANCE_ALPHA16F_ARB))
1401 bindings |= PIPE_BIND_RENDER_TARGET;
1402
1403 /* GLES allows the driver to choose any format which matches
1404 * the format+type combo, because GLES only supports unsized internal
1405 * formats and expects the driver to choose whatever suits it.
1406 */
1407 if (_mesa_is_gles(ctx)) {
1408 GLenum baseFormat = _mesa_base_tex_format(ctx, internalFormat);
1409 GLenum basePackFormat = _mesa_base_pack_format(format);
1410 GLenum iformat = internalFormat;
1411
1412 /* Treat GL_BGRA as GL_RGBA. */
1413 if (iformat == GL_BGRA)
1414 iformat = GL_RGBA;
1415
1416 /* Check if the internalformat is unsized and compatible
1417 * with the "format".
1418 */
1419 if (iformat == baseFormat && iformat == basePackFormat) {
1420 pFormat = st_choose_matching_format(st, bindings, format, type,
1421 ctx->Unpack.SwapBytes);
1422
1423 if (pFormat != PIPE_FORMAT_NONE)
1424 return st_pipe_format_to_mesa_format(pFormat);
1425
1426 if (!is_renderbuffer) {
1427 /* try choosing format again, this time without render
1428 * target bindings.
1429 */
1430 pFormat = st_choose_matching_format(st, PIPE_BIND_SAMPLER_VIEW,
1431 format, type,
1432 ctx->Unpack.SwapBytes);
1433 if (pFormat != PIPE_FORMAT_NONE)
1434 return st_pipe_format_to_mesa_format(pFormat);
1435 }
1436 }
1437 }
1438
1439 pFormat = st_choose_format(st, internalFormat, format, type,
1440 pTarget, 0, 0, bindings,
1441 ctx->Unpack.SwapBytes, true);
1442
1443 if (pFormat == PIPE_FORMAT_NONE && !is_renderbuffer) {
1444 /* try choosing format again, this time without render target bindings */
1445 pFormat = st_choose_format(st, internalFormat, format, type,
1446 pTarget, 0, 0, PIPE_BIND_SAMPLER_VIEW,
1447 ctx->Unpack.SwapBytes, true);
1448 }
1449
1450 if (pFormat == PIPE_FORMAT_NONE) {
1451 mFormat = _mesa_glenum_to_compressed_format(internalFormat);
1452 if (st_compressed_format_fallback(st, mFormat))
1453 return mFormat;
1454
1455 /* no luck at all */
1456 return MESA_FORMAT_NONE;
1457 }
1458
1459 mFormat = st_pipe_format_to_mesa_format(pFormat);
1460
1461 /* Debugging aid */
1462 if (0) {
1463 debug_printf("%s(intFormat=%s, format=%s, type=%s) -> %s, %s\n",
1464 __func__,
1465 _mesa_enum_to_string(internalFormat),
1466 _mesa_enum_to_string(format),
1467 _mesa_enum_to_string(type),
1468 util_format_name(pFormat),
1469 _mesa_get_format_name(mFormat));
1470 }
1471
1472 return mFormat;
1473 }
1474
1475
1476 /**
1477 * Called via ctx->Driver.QueryInternalFormat().
1478 */
1479 static size_t
st_QuerySamplesForFormat(struct gl_context * ctx,GLenum target,GLenum internalFormat,int samples[16])1480 st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
1481 GLenum internalFormat, int samples[16])
1482 {
1483 struct st_context *st = st_context(ctx);
1484 enum pipe_format format;
1485 unsigned i, bind, num_sample_counts = 0;
1486 unsigned min_max_samples;
1487
1488 (void) target;
1489
1490 if (_mesa_is_depth_or_stencil_format(internalFormat))
1491 bind = PIPE_BIND_DEPTH_STENCIL;
1492 else
1493 bind = PIPE_BIND_RENDER_TARGET;
1494
1495 if (_mesa_is_enum_format_integer(internalFormat))
1496 min_max_samples = ctx->Const.MaxIntegerSamples;
1497 else if (_mesa_is_depth_or_stencil_format(internalFormat))
1498 min_max_samples = ctx->Const.MaxDepthTextureSamples;
1499 else
1500 min_max_samples = ctx->Const.MaxColorTextureSamples;
1501
1502 /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
1503 * formats.
1504 */
1505 if (!ctx->Extensions.EXT_sRGB) {
1506 internalFormat = _mesa_get_linear_internalformat(internalFormat);
1507 }
1508
1509 /* Set sample counts in descending order. */
1510 for (i = 16; i > 1; i--) {
1511 format = st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
1512 PIPE_TEXTURE_2D, i, i, bind,
1513 false, false);
1514
1515 if (format != PIPE_FORMAT_NONE || i == min_max_samples) {
1516 samples[num_sample_counts++] = i;
1517 }
1518 }
1519
1520 if (!num_sample_counts) {
1521 samples[num_sample_counts++] = 1;
1522 }
1523
1524 return num_sample_counts;
1525 }
1526
1527 /* check whether any texture can be allocated for a given format */
1528 bool
st_QueryTextureFormatSupport(struct gl_context * ctx,GLenum target,GLenum internalFormat)1529 st_QueryTextureFormatSupport(struct gl_context *ctx, GLenum target, GLenum internalFormat)
1530 {
1531 struct st_context *st = st_context(ctx);
1532
1533 /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
1534 * formats.
1535 */
1536 if (!ctx->Extensions.EXT_sRGB) {
1537 internalFormat = _mesa_get_linear_internalformat(internalFormat);
1538 }
1539
1540 /* multisample textures need >= 2 samples */
1541 unsigned min_samples = target == GL_TEXTURE_2D_MULTISAMPLE ||
1542 target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY ? 1 : 0;
1543 unsigned max_samples = min_samples ? 16 : 1;
1544
1545 /* compressed textures will be allocated as e.g., RGBA8, so check that instead */
1546 enum pipe_format pf = st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
1547 PIPE_TEXTURE_2D, 0, 0, 0,
1548 false, false);
1549 if (util_format_is_compressed(pf)) {
1550 enum pipe_format fmts[2] = {0};
1551 pf = st_mesa_format_to_pipe_format(st, st_pipe_format_to_mesa_format(pf));
1552 fmts[0] = pf;
1553 for (unsigned i = max_samples; i > min_samples; i >>= 1) {
1554 if (find_supported_format(st->screen, fmts, PIPE_TEXTURE_2D,
1555 i, i, PIPE_BIND_SAMPLER_VIEW, false))
1556 return true;
1557 }
1558 return false;
1559 }
1560 for (unsigned i = max_samples; i > min_samples; i >>= 1) {
1561 if (st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
1562 PIPE_TEXTURE_2D, i, i, PIPE_BIND_SAMPLER_VIEW,
1563 false, false))
1564 return true;
1565 }
1566
1567 return false;
1568 }
1569
1570
1571 /**
1572 * Called via ctx->Driver.QueryInternalFormat().
1573 */
1574 static size_t
st_QueryCompressionRatesForFormat(struct gl_context * ctx,GLenum target,GLenum internalFormat,GLint rates[16])1575 st_QueryCompressionRatesForFormat(struct gl_context *ctx, GLenum target,
1576 GLenum internalFormat, GLint rates[16])
1577 {
1578 struct st_context *st = st_context(ctx);
1579 struct pipe_screen *screen = st->screen;
1580 enum pipe_format format;
1581 int num_rates = 0;
1582 uint32_t pipe_rates[16];
1583 unsigned bind;
1584
1585 (void) target;
1586
1587 if (!screen->query_compression_rates)
1588 return 0;
1589
1590 if (_mesa_is_depth_or_stencil_format(internalFormat))
1591 bind = PIPE_BIND_DEPTH_STENCIL;
1592 else
1593 bind = PIPE_BIND_RENDER_TARGET;
1594
1595 format = st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
1596 PIPE_TEXTURE_2D, 1, 1, bind,
1597 false, false);
1598 screen->query_compression_rates(screen, format, 16, pipe_rates, &num_rates);
1599 for (int i = 0; i < num_rates; ++i) {
1600 rates[i] = st_from_pipe_compression_rate(pipe_rates[i]);
1601 }
1602
1603 return num_rates;
1604 }
1605
1606
1607 /**
1608 * ARB_internalformat_query2 driver hook.
1609 */
1610 void
st_QueryInternalFormat(struct gl_context * ctx,GLenum target,GLenum internalFormat,GLenum pname,GLint * params)1611 st_QueryInternalFormat(struct gl_context *ctx, GLenum target,
1612 GLenum internalFormat, GLenum pname, GLint *params)
1613 {
1614 struct st_context *st = st_context(ctx);
1615 /* The API entry-point gives us a temporary params buffer that is non-NULL
1616 * and guaranteed to have at least 16 elements.
1617 */
1618 assert(params != NULL);
1619
1620 switch (pname) {
1621 case GL_SAMPLES:
1622 st_QuerySamplesForFormat(ctx, target, internalFormat, params);
1623 break;
1624
1625 case GL_NUM_SAMPLE_COUNTS: {
1626 int samples[16];
1627 size_t num_samples;
1628 num_samples = st_QuerySamplesForFormat(ctx, target, internalFormat,
1629 samples);
1630 params[0] = (GLint) num_samples;
1631 break;
1632 }
1633 case GL_INTERNALFORMAT_PREFERRED: {
1634 params[0] = GL_NONE;
1635
1636 /* We need to resolve an internal format that is compatible with
1637 * the passed internal format, and optimal to the driver. By now,
1638 * we just validate that the passed internal format is supported by
1639 * the driver, and if so return the same internal format, otherwise
1640 * return GL_NONE.
1641 */
1642 unsigned bindings;
1643 if (_mesa_is_depth_or_stencil_format(internalFormat))
1644 bindings = PIPE_BIND_DEPTH_STENCIL;
1645 else
1646 bindings = PIPE_BIND_RENDER_TARGET;
1647 enum pipe_format pformat = st_choose_format(st,
1648 internalFormat,
1649 GL_NONE,
1650 GL_NONE,
1651 PIPE_TEXTURE_2D, 0, 0,
1652 bindings,
1653 false, false);
1654 if (pformat)
1655 params[0] = internalFormat;
1656 break;
1657 }
1658 case GL_TEXTURE_REDUCTION_MODE_ARB: {
1659 mesa_format format = st_ChooseTextureFormat(ctx, target, internalFormat, GL_NONE, GL_NONE);
1660 enum pipe_format pformat = st_mesa_format_to_pipe_format(st, format);
1661 struct pipe_screen *screen = st->screen;
1662 params[0] = pformat != PIPE_FORMAT_NONE &&
1663 screen->is_format_supported(screen, pformat, PIPE_TEXTURE_2D,
1664 0, 0, PIPE_BIND_SAMPLER_REDUCTION_MINMAX);
1665 break;
1666 }
1667 case GL_NUM_VIRTUAL_PAGE_SIZES_ARB:
1668 case GL_VIRTUAL_PAGE_SIZE_X_ARB:
1669 case GL_VIRTUAL_PAGE_SIZE_Y_ARB:
1670 case GL_VIRTUAL_PAGE_SIZE_Z_ARB: {
1671 /* this is used only for passing CTS */
1672 if (target == GL_RENDERBUFFER)
1673 target = GL_TEXTURE_2D;
1674 mesa_format format = st_ChooseTextureFormat(ctx, target, internalFormat, GL_NONE, GL_NONE);
1675 enum pipe_format pformat = st_mesa_format_to_pipe_format(st, format);
1676
1677 if (pformat != PIPE_FORMAT_NONE) {
1678 struct pipe_screen *screen = st->screen;
1679 enum pipe_texture_target ptarget = gl_target_to_pipe(target);
1680 bool multi_sample = _mesa_is_multisample_target(target);
1681
1682 if (pname == GL_NUM_VIRTUAL_PAGE_SIZES_ARB)
1683 params[0] = screen->get_sparse_texture_virtual_page_size(
1684 screen, ptarget, multi_sample, pformat, 0, 0, NULL, NULL, NULL);
1685 else {
1686 int *args[3] = {0};
1687 args[pname - GL_VIRTUAL_PAGE_SIZE_X_ARB] = params;
1688
1689 /* 16 comes from the caller _mesa_GetInternalformativ() */
1690 screen->get_sparse_texture_virtual_page_size(
1691 screen, ptarget, multi_sample, pformat, 0, 16,
1692 args[0], args[1], args[2]);
1693 }
1694 }
1695 break;
1696 }
1697 case GL_SURFACE_COMPRESSION_EXT:
1698 st_QueryCompressionRatesForFormat(ctx, target, internalFormat, params);
1699 break;
1700
1701 case GL_NUM_SURFACE_COMPRESSION_FIXED_RATES_EXT: {
1702 GLint rates[16];
1703 size_t num_rates;
1704 num_rates = st_QueryCompressionRatesForFormat(ctx, target, internalFormat,
1705 rates);
1706 params[0] = (GLint) num_rates;
1707 break;
1708 }
1709 case GL_FRAMEBUFFER_BLEND: {
1710 if (target == GL_RENDERBUFFER)
1711 target = GL_TEXTURE_2D;
1712 enum pipe_texture_target ptarget = gl_target_to_pipe(target);
1713 mesa_format format = st_ChooseTextureFormat(ctx, target, internalFormat, GL_NONE, GL_NONE);
1714 enum pipe_format pformat = st_mesa_format_to_pipe_format(st, format);
1715 struct pipe_screen *screen = st->screen;
1716 bool supported = pformat != PIPE_FORMAT_NONE &&
1717 screen->is_format_supported(screen, pformat, ptarget, 0, 0,
1718 PIPE_BIND_BLENDABLE | PIPE_BIND_RENDER_TARGET);
1719 params[0] = supported ? GL_FULL_SUPPORT : GL_NONE;
1720 break;
1721 }
1722 default:
1723 /* For the rest of the pnames, we call back the Mesa's default
1724 * function for drivers that don't implement ARB_internalformat_query2.
1725 */
1726 _mesa_query_internal_format_default(ctx, target, internalFormat, pname,
1727 params);
1728 }
1729 }
1730
1731
1732 /**
1733 * This is used for translating texture border color and the clear
1734 * color. For example, the clear color is interpreted according to
1735 * the renderbuffer's base format. For example, if clearing a
1736 * GL_LUMINANCE buffer, we'll return colorOut[0] = colorOut[1] =
1737 * colorOut[2] = colorIn[0].
1738 * Similarly for texture border colors.
1739 */
1740 void
st_translate_color(union pipe_color_union * color,GLenum baseFormat,GLboolean is_integer)1741 st_translate_color(union pipe_color_union *color,
1742 GLenum baseFormat, GLboolean is_integer)
1743 {
1744 if (is_integer) {
1745 int *ci = color->i;
1746
1747 switch (baseFormat) {
1748 case GL_RED:
1749 ci[1] = 0;
1750 ci[2] = 0;
1751 ci[3] = 1;
1752 break;
1753 case GL_RG:
1754 ci[2] = 0;
1755 ci[3] = 1;
1756 break;
1757 case GL_RGB:
1758 ci[3] = 1;
1759 break;
1760 case GL_ALPHA:
1761 ci[0] = ci[1] = ci[2] = 0;
1762 break;
1763 case GL_LUMINANCE:
1764 ci[1] = ci[2] = ci[0];
1765 ci[3] = 1;
1766 break;
1767 case GL_LUMINANCE_ALPHA:
1768 ci[1] = ci[2] = ci[0];
1769 break;
1770 /* Stencil border is tricky on some hw. Help drivers a little here. */
1771 case GL_STENCIL_INDEX:
1772 case GL_INTENSITY:
1773 ci[1] = ci[2] = ci[3] = ci[0];
1774 break;
1775 }
1776 }
1777 else {
1778 float *cf = color->f;
1779
1780 switch (baseFormat) {
1781 case GL_RED:
1782 cf[1] = 0.0F;
1783 cf[2] = 0.0F;
1784 cf[3] = 1.0F;
1785 break;
1786 case GL_RG:
1787 cf[2] = 0.0F;
1788 cf[3] = 1.0F;
1789 break;
1790 case GL_RGB:
1791 cf[3] = 1.0F;
1792 break;
1793 case GL_ALPHA:
1794 cf[0] = cf[1] = cf[2] = 0.0F;
1795 break;
1796 case GL_LUMINANCE:
1797 cf[1] = cf[2] = cf[0];
1798 cf[3] = 1.0F;
1799 break;
1800 case GL_LUMINANCE_ALPHA:
1801 cf[1] = cf[2] = cf[0];
1802 break;
1803 case GL_INTENSITY:
1804 cf[1] = cf[2] = cf[3] = cf[0];
1805 break;
1806 }
1807 }
1808 }
1809