Merge remote branch 'origin/nvc0'
[mesa.git] / src / mesa / state_tracker / st_format.c
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/texstore.h"
38 #include "main/image.h"
39 #include "main/macros.h"
40 #include "main/mfeatures.h"
41
42 #include "pipe/p_context.h"
43 #include "pipe/p_defines.h"
44 #include "pipe/p_screen.h"
45 #include "util/u_format.h"
46 #include "st_context.h"
47 #include "st_format.h"
48
49
50 static GLuint
51 format_max_bits(enum pipe_format format)
52 {
53 GLuint size = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0);
54
55 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 1));
56 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 2));
57 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3));
58 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0));
59 size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1));
60 return size;
61 }
62
63
64 /**
65 * Return basic GL datatype for the given gallium format.
66 */
67 GLenum
68 st_format_datatype(enum pipe_format format)
69 {
70 const struct util_format_description *desc;
71
72 desc = util_format_description(format);
73 assert(desc);
74
75 if (desc->layout == UTIL_FORMAT_LAYOUT_PLAIN) {
76 if (format == PIPE_FORMAT_B5G5R5A1_UNORM ||
77 format == PIPE_FORMAT_B5G6R5_UNORM) {
78 return GL_UNSIGNED_SHORT;
79 }
80 else if (format == PIPE_FORMAT_Z24_UNORM_S8_USCALED ||
81 format == PIPE_FORMAT_S8_USCALED_Z24_UNORM ||
82 format == PIPE_FORMAT_Z24X8_UNORM ||
83 format == PIPE_FORMAT_X8Z24_UNORM) {
84 return GL_UNSIGNED_INT_24_8;
85 }
86 else {
87 const GLuint size = format_max_bits(format);
88 if (size == 8) {
89 if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
90 return GL_UNSIGNED_BYTE;
91 else
92 return GL_BYTE;
93 }
94 else if (size == 16) {
95 if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
96 return GL_UNSIGNED_SHORT;
97 else
98 return GL_SHORT;
99 }
100 else {
101 assert( size <= 32 );
102 if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
103 return GL_UNSIGNED_INT;
104 else
105 return GL_INT;
106 }
107 }
108 }
109 else if (format == PIPE_FORMAT_UYVY) {
110 return GL_UNSIGNED_SHORT;
111 }
112 else if (format == PIPE_FORMAT_YUYV) {
113 return GL_UNSIGNED_SHORT;
114 }
115 else {
116 /* probably a compressed format, unsupported anyway */
117 return GL_NONE;
118 }
119 }
120
121
122 /**
123 * Translate Mesa format to Gallium format.
124 */
125 enum pipe_format
126 st_mesa_format_to_pipe_format(gl_format mesaFormat)
127 {
128 switch (mesaFormat) {
129 case MESA_FORMAT_RGBA8888:
130 return PIPE_FORMAT_A8B8G8R8_UNORM;
131 case MESA_FORMAT_RGBA8888_REV:
132 return PIPE_FORMAT_R8G8B8A8_UNORM;
133 case MESA_FORMAT_ARGB8888:
134 return PIPE_FORMAT_B8G8R8A8_UNORM;
135 case MESA_FORMAT_ARGB8888_REV:
136 return PIPE_FORMAT_A8R8G8B8_UNORM;
137 case MESA_FORMAT_XRGB8888:
138 return PIPE_FORMAT_B8G8R8X8_UNORM;
139 case MESA_FORMAT_XRGB8888_REV:
140 return PIPE_FORMAT_X8R8G8B8_UNORM;
141 case MESA_FORMAT_ARGB1555:
142 return PIPE_FORMAT_B5G5R5A1_UNORM;
143 case MESA_FORMAT_ARGB4444:
144 return PIPE_FORMAT_B4G4R4A4_UNORM;
145 case MESA_FORMAT_RGB565:
146 return PIPE_FORMAT_B5G6R5_UNORM;
147 case MESA_FORMAT_RGB332:
148 return PIPE_FORMAT_B2G3R3_UNORM;
149 case MESA_FORMAT_ARGB2101010:
150 return PIPE_FORMAT_B10G10R10A2_UNORM;
151 case MESA_FORMAT_AL44:
152 return PIPE_FORMAT_L4A4_UNORM;
153 case MESA_FORMAT_AL88:
154 return PIPE_FORMAT_L8A8_UNORM;
155 case MESA_FORMAT_AL1616:
156 return PIPE_FORMAT_L16A16_UNORM;
157 case MESA_FORMAT_A8:
158 return PIPE_FORMAT_A8_UNORM;
159 case MESA_FORMAT_A16:
160 return PIPE_FORMAT_A16_UNORM;
161 case MESA_FORMAT_L8:
162 return PIPE_FORMAT_L8_UNORM;
163 case MESA_FORMAT_L16:
164 return PIPE_FORMAT_L16_UNORM;
165 case MESA_FORMAT_I8:
166 return PIPE_FORMAT_I8_UNORM;
167 case MESA_FORMAT_I16:
168 return PIPE_FORMAT_I16_UNORM;
169 case MESA_FORMAT_Z16:
170 return PIPE_FORMAT_Z16_UNORM;
171 case MESA_FORMAT_Z32:
172 return PIPE_FORMAT_Z32_UNORM;
173 case MESA_FORMAT_Z24_S8:
174 return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
175 case MESA_FORMAT_S8_Z24:
176 return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
177 case MESA_FORMAT_Z24_X8:
178 return PIPE_FORMAT_X8Z24_UNORM;
179 case MESA_FORMAT_X8_Z24:
180 return PIPE_FORMAT_Z24X8_UNORM;
181 case MESA_FORMAT_S8:
182 return PIPE_FORMAT_S8_USCALED;
183 case MESA_FORMAT_YCBCR:
184 return PIPE_FORMAT_UYVY;
185 #if FEATURE_texture_s3tc
186 case MESA_FORMAT_RGB_DXT1:
187 return PIPE_FORMAT_DXT1_RGB;
188 case MESA_FORMAT_RGBA_DXT1:
189 return PIPE_FORMAT_DXT1_RGBA;
190 case MESA_FORMAT_RGBA_DXT3:
191 return PIPE_FORMAT_DXT3_RGBA;
192 case MESA_FORMAT_RGBA_DXT5:
193 return PIPE_FORMAT_DXT5_RGBA;
194 #if FEATURE_EXT_texture_sRGB
195 case MESA_FORMAT_SRGB_DXT1:
196 return PIPE_FORMAT_DXT1_SRGB;
197 case MESA_FORMAT_SRGBA_DXT1:
198 return PIPE_FORMAT_DXT1_SRGBA;
199 case MESA_FORMAT_SRGBA_DXT3:
200 return PIPE_FORMAT_DXT3_SRGBA;
201 case MESA_FORMAT_SRGBA_DXT5:
202 return PIPE_FORMAT_DXT5_SRGBA;
203 #endif
204 #endif
205 #if FEATURE_EXT_texture_sRGB
206 case MESA_FORMAT_SLA8:
207 return PIPE_FORMAT_L8A8_SRGB;
208 case MESA_FORMAT_SL8:
209 return PIPE_FORMAT_L8_SRGB;
210 case MESA_FORMAT_SRGB8:
211 return PIPE_FORMAT_R8G8B8_SRGB;
212 case MESA_FORMAT_SRGBA8:
213 return PIPE_FORMAT_A8B8G8R8_SRGB;
214 case MESA_FORMAT_SARGB8:
215 return PIPE_FORMAT_B8G8R8A8_SRGB;
216 #endif
217 case MESA_FORMAT_R8:
218 return PIPE_FORMAT_R8_UNORM;
219 case MESA_FORMAT_R16:
220 return PIPE_FORMAT_R16_UNORM;
221 case MESA_FORMAT_RG88:
222 return PIPE_FORMAT_R8G8_UNORM;
223 case MESA_FORMAT_RG1616:
224 return PIPE_FORMAT_R16G16_UNORM;
225 case MESA_FORMAT_RGBA_16:
226 return PIPE_FORMAT_R16G16B16A16_UNORM;
227
228 /* signed int formats */
229 case MESA_FORMAT_RGBA_INT8:
230 return PIPE_FORMAT_R8G8B8A8_SSCALED;
231 case MESA_FORMAT_RGBA_INT16:
232 return PIPE_FORMAT_R16G16B16A16_SSCALED;
233 case MESA_FORMAT_RGBA_INT32:
234 return PIPE_FORMAT_R32G32B32A32_SSCALED;
235
236 /* unsigned int formats */
237 case MESA_FORMAT_RGBA_UINT8:
238 return PIPE_FORMAT_R8G8B8A8_USCALED;
239 case MESA_FORMAT_RGBA_UINT16:
240 return PIPE_FORMAT_R16G16B16A16_USCALED;
241 case MESA_FORMAT_RGBA_UINT32:
242 return PIPE_FORMAT_R32G32B32A32_USCALED;
243
244 case MESA_FORMAT_RED_RGTC1:
245 return PIPE_FORMAT_RGTC1_UNORM;
246 case MESA_FORMAT_SIGNED_RED_RGTC1:
247 return PIPE_FORMAT_RGTC1_SNORM;
248 case MESA_FORMAT_RG_RGTC2:
249 return PIPE_FORMAT_RGTC2_UNORM;
250 case MESA_FORMAT_SIGNED_RG_RGTC2:
251 return PIPE_FORMAT_RGTC2_SNORM;
252 default:
253 assert(0);
254 return PIPE_FORMAT_NONE;
255 }
256 }
257
258
259 /**
260 * Translate Gallium format to Mesa format.
261 */
262 gl_format
263 st_pipe_format_to_mesa_format(enum pipe_format format)
264 {
265 switch (format) {
266 case PIPE_FORMAT_A8B8G8R8_UNORM:
267 return MESA_FORMAT_RGBA8888;
268 case PIPE_FORMAT_R8G8B8A8_UNORM:
269 return MESA_FORMAT_RGBA8888_REV;
270 case PIPE_FORMAT_B8G8R8A8_UNORM:
271 return MESA_FORMAT_ARGB8888;
272 case PIPE_FORMAT_A8R8G8B8_UNORM:
273 return MESA_FORMAT_ARGB8888_REV;
274 case PIPE_FORMAT_B8G8R8X8_UNORM:
275 return MESA_FORMAT_XRGB8888;
276 case PIPE_FORMAT_X8R8G8B8_UNORM:
277 return MESA_FORMAT_XRGB8888_REV;
278 case PIPE_FORMAT_B5G5R5A1_UNORM:
279 return MESA_FORMAT_ARGB1555;
280 case PIPE_FORMAT_B4G4R4A4_UNORM:
281 return MESA_FORMAT_ARGB4444;
282 case PIPE_FORMAT_B5G6R5_UNORM:
283 return MESA_FORMAT_RGB565;
284 case PIPE_FORMAT_B2G3R3_UNORM:
285 return MESA_FORMAT_RGB332;
286 case PIPE_FORMAT_B10G10R10A2_UNORM:
287 return MESA_FORMAT_ARGB2101010;
288 case PIPE_FORMAT_L4A4_UNORM:
289 return MESA_FORMAT_AL44;
290 case PIPE_FORMAT_L8A8_UNORM:
291 return MESA_FORMAT_AL88;
292 case PIPE_FORMAT_L16A16_UNORM:
293 return MESA_FORMAT_AL1616;
294 case PIPE_FORMAT_A8_UNORM:
295 return MESA_FORMAT_A8;
296 case PIPE_FORMAT_A16_UNORM:
297 return MESA_FORMAT_A16;
298 case PIPE_FORMAT_L8_UNORM:
299 return MESA_FORMAT_L8;
300 case PIPE_FORMAT_L16_UNORM:
301 return MESA_FORMAT_L16;
302 case PIPE_FORMAT_I8_UNORM:
303 return MESA_FORMAT_I8;
304 case PIPE_FORMAT_I16_UNORM:
305 return MESA_FORMAT_I16;
306 case PIPE_FORMAT_S8_USCALED:
307 return MESA_FORMAT_S8;
308
309 case PIPE_FORMAT_R16G16B16A16_UNORM:
310 return MESA_FORMAT_RGBA_16;
311 case PIPE_FORMAT_R16G16B16A16_SNORM:
312 return MESA_FORMAT_SIGNED_RGBA_16;
313
314 case PIPE_FORMAT_Z16_UNORM:
315 return MESA_FORMAT_Z16;
316 case PIPE_FORMAT_Z32_UNORM:
317 return MESA_FORMAT_Z32;
318 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
319 return MESA_FORMAT_Z24_S8;
320 case PIPE_FORMAT_X8Z24_UNORM:
321 return MESA_FORMAT_Z24_X8;
322 case PIPE_FORMAT_Z24X8_UNORM:
323 return MESA_FORMAT_X8_Z24;
324 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
325 return MESA_FORMAT_S8_Z24;
326
327 case PIPE_FORMAT_UYVY:
328 return MESA_FORMAT_YCBCR;
329 case PIPE_FORMAT_YUYV:
330 return MESA_FORMAT_YCBCR_REV;
331
332 #if FEATURE_texture_s3tc
333 case PIPE_FORMAT_DXT1_RGB:
334 return MESA_FORMAT_RGB_DXT1;
335 case PIPE_FORMAT_DXT1_RGBA:
336 return MESA_FORMAT_RGBA_DXT1;
337 case PIPE_FORMAT_DXT3_RGBA:
338 return MESA_FORMAT_RGBA_DXT3;
339 case PIPE_FORMAT_DXT5_RGBA:
340 return MESA_FORMAT_RGBA_DXT5;
341 #if FEATURE_EXT_texture_sRGB
342 case PIPE_FORMAT_DXT1_SRGB:
343 return MESA_FORMAT_SRGB_DXT1;
344 case PIPE_FORMAT_DXT1_SRGBA:
345 return MESA_FORMAT_SRGBA_DXT1;
346 case PIPE_FORMAT_DXT3_SRGBA:
347 return MESA_FORMAT_SRGBA_DXT3;
348 case PIPE_FORMAT_DXT5_SRGBA:
349 return MESA_FORMAT_SRGBA_DXT5;
350 #endif
351 #endif
352
353 #if FEATURE_EXT_texture_sRGB
354 case PIPE_FORMAT_L8A8_SRGB:
355 return MESA_FORMAT_SLA8;
356 case PIPE_FORMAT_L8_SRGB:
357 return MESA_FORMAT_SL8;
358 case PIPE_FORMAT_R8G8B8_SRGB:
359 return MESA_FORMAT_SRGB8;
360 case PIPE_FORMAT_A8B8G8R8_SRGB:
361 return MESA_FORMAT_SRGBA8;
362 case PIPE_FORMAT_B8G8R8A8_SRGB:
363 return MESA_FORMAT_SARGB8;
364 #endif
365
366 case PIPE_FORMAT_R8_UNORM:
367 return MESA_FORMAT_R8;
368 case PIPE_FORMAT_R16_UNORM:
369 return MESA_FORMAT_R16;
370 case PIPE_FORMAT_R8G8_UNORM:
371 return MESA_FORMAT_RG88;
372 case PIPE_FORMAT_R16G16_UNORM:
373 return MESA_FORMAT_RG1616;
374
375 /* signed int formats */
376 case PIPE_FORMAT_R8G8B8A8_SSCALED:
377 return MESA_FORMAT_RGBA_INT8;
378 case PIPE_FORMAT_R16G16B16A16_SSCALED:
379 return MESA_FORMAT_RGBA_INT16;
380 case PIPE_FORMAT_R32G32B32A32_SSCALED:
381 return MESA_FORMAT_RGBA_INT32;
382
383 /* unsigned int formats */
384 case PIPE_FORMAT_R8G8B8A8_USCALED:
385 return MESA_FORMAT_RGBA_UINT8;
386 case PIPE_FORMAT_R16G16B16A16_USCALED:
387 return MESA_FORMAT_RGBA_UINT16;
388 case PIPE_FORMAT_R32G32B32A32_USCALED:
389 return MESA_FORMAT_RGBA_UINT32;
390
391 case PIPE_FORMAT_RGTC1_UNORM:
392 return MESA_FORMAT_RED_RGTC1;
393 case PIPE_FORMAT_RGTC1_SNORM:
394 return MESA_FORMAT_SIGNED_RED_RGTC1;
395 case PIPE_FORMAT_RGTC2_UNORM:
396 return MESA_FORMAT_RG_RGTC2;
397 case PIPE_FORMAT_RGTC2_SNORM:
398 return MESA_FORMAT_SIGNED_RG_RGTC2;
399
400 default:
401 assert(0);
402 return MESA_FORMAT_NONE;
403 }
404 }
405
406
407 /**
408 * Return first supported format from the given list.
409 */
410 static enum pipe_format
411 find_supported_format(struct pipe_screen *screen,
412 const enum pipe_format formats[],
413 uint num_formats,
414 enum pipe_texture_target target,
415 unsigned sample_count,
416 unsigned tex_usage,
417 unsigned geom_flags)
418 {
419 uint i;
420 for (i = 0; i < num_formats; i++) {
421 if (screen->is_format_supported(screen, formats[i], target,
422 sample_count, tex_usage, geom_flags)) {
423 return formats[i];
424 }
425 }
426 return PIPE_FORMAT_NONE;
427 }
428
429
430 /**
431 * Find an RGBA format supported by the context/winsys.
432 */
433 static enum pipe_format
434 default_rgba_format(struct pipe_screen *screen,
435 enum pipe_texture_target target,
436 unsigned sample_count,
437 unsigned tex_usage,
438 unsigned geom_flags)
439 {
440 static const enum pipe_format colorFormats[] = {
441 PIPE_FORMAT_B8G8R8A8_UNORM,
442 PIPE_FORMAT_A8R8G8B8_UNORM,
443 PIPE_FORMAT_A8B8G8R8_UNORM,
444 PIPE_FORMAT_B5G6R5_UNORM
445 };
446 return find_supported_format(screen, colorFormats, Elements(colorFormats),
447 target, sample_count, tex_usage, geom_flags);
448 }
449
450
451 /**
452 * Find an RGB format supported by the context/winsys.
453 */
454 static enum pipe_format
455 default_rgb_format(struct pipe_screen *screen,
456 enum pipe_texture_target target,
457 unsigned sample_count,
458 unsigned tex_usage,
459 unsigned geom_flags)
460 {
461 static const enum pipe_format colorFormats[] = {
462 PIPE_FORMAT_B8G8R8X8_UNORM,
463 PIPE_FORMAT_X8R8G8B8_UNORM,
464 PIPE_FORMAT_X8B8G8R8_UNORM,
465 PIPE_FORMAT_B8G8R8A8_UNORM,
466 PIPE_FORMAT_A8R8G8B8_UNORM,
467 PIPE_FORMAT_A8B8G8R8_UNORM,
468 PIPE_FORMAT_B5G6R5_UNORM
469 };
470 return find_supported_format(screen, colorFormats, Elements(colorFormats),
471 target, sample_count, tex_usage, geom_flags);
472 }
473
474 /**
475 * Find an sRGBA format supported by the context/winsys.
476 */
477 static enum pipe_format
478 default_srgba_format(struct pipe_screen *screen,
479 enum pipe_texture_target target,
480 unsigned sample_count,
481 unsigned tex_usage,
482 unsigned geom_flags)
483 {
484 static const enum pipe_format colorFormats[] = {
485 PIPE_FORMAT_B8G8R8A8_SRGB,
486 PIPE_FORMAT_A8R8G8B8_SRGB,
487 PIPE_FORMAT_A8B8G8R8_SRGB,
488 };
489 return find_supported_format(screen, colorFormats, Elements(colorFormats),
490 target, sample_count, tex_usage, geom_flags);
491 }
492
493
494 /**
495 * Given an OpenGL internalFormat value for a texture or surface, return
496 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
497 * This is called during glTexImage2D, for example.
498 *
499 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
500 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
501 * we want render-to-texture ability.
502 *
503 * \param internalFormat the user value passed to glTexImage2D
504 * \param target one of PIPE_TEXTURE_x
505 * \param bindings bitmask of PIPE_BIND_x flags.
506 */
507 enum pipe_format
508 st_choose_format(struct pipe_screen *screen, GLenum internalFormat,
509 enum pipe_texture_target target, unsigned sample_count,
510 unsigned bindings)
511 {
512 unsigned geom_flags = 0; /* we don't care about POT vs. NPOT here, yet */
513
514 switch (internalFormat) {
515 case GL_RGB10:
516 case GL_RGB10_A2:
517 if (screen->is_format_supported( screen, PIPE_FORMAT_B10G10R10A2_UNORM,
518 target, sample_count, bindings,
519 geom_flags ))
520 return PIPE_FORMAT_B10G10R10A2_UNORM;
521 /* Pass through. */
522 case 4:
523 case GL_RGBA:
524 case GL_RGBA8:
525 return default_rgba_format( screen, target, sample_count, bindings,
526 geom_flags );
527
528 case GL_BGRA:
529 if (screen->is_format_supported( screen, PIPE_FORMAT_B8G8R8A8_UNORM,
530 target, sample_count, bindings,
531 geom_flags ))
532 return PIPE_FORMAT_B8G8R8A8_UNORM;
533 return default_rgba_format( screen, target, sample_count, bindings,
534 geom_flags );
535
536 case 3:
537 case GL_RGB:
538 case GL_RGB8:
539 return default_rgb_format( screen, target, sample_count, bindings,
540 geom_flags );
541
542 case GL_RGB12:
543 case GL_RGB16:
544 case GL_RGBA12:
545 case GL_RGBA16:
546 if (screen->is_format_supported( screen, PIPE_FORMAT_R16G16B16A16_UNORM,
547 target, sample_count, bindings,
548 geom_flags ))
549 return PIPE_FORMAT_R16G16B16A16_UNORM;
550 return default_rgba_format( screen, target, sample_count, bindings,
551 geom_flags );
552
553 case GL_RGBA4:
554 case GL_RGBA2:
555 if (screen->is_format_supported( screen, PIPE_FORMAT_B4G4R4A4_UNORM,
556 target, sample_count, bindings,
557 geom_flags ))
558 return PIPE_FORMAT_B4G4R4A4_UNORM;
559 return default_rgba_format( screen, target, sample_count, bindings,
560 geom_flags );
561
562 case GL_RGB5_A1:
563 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
564 target, sample_count, bindings,
565 geom_flags ))
566 return PIPE_FORMAT_B5G5R5A1_UNORM;
567 return default_rgba_format( screen, target, sample_count, bindings,
568 geom_flags );
569
570 case GL_R3_G3_B2:
571 if (screen->is_format_supported( screen, PIPE_FORMAT_B2G3R3_UNORM,
572 target, sample_count, bindings,
573 geom_flags ))
574 return PIPE_FORMAT_B2G3R3_UNORM;
575 /* Pass through. */
576 case GL_RGB5:
577 case GL_RGB4:
578 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G6R5_UNORM,
579 target, sample_count, bindings,
580 geom_flags ))
581 return PIPE_FORMAT_B5G6R5_UNORM;
582 if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
583 target, sample_count, bindings,
584 geom_flags ))
585 return PIPE_FORMAT_B5G5R5A1_UNORM;
586 return default_rgba_format( screen, target, sample_count, bindings,
587 geom_flags );
588
589 case GL_ALPHA12:
590 case GL_ALPHA16:
591 if (screen->is_format_supported( screen, PIPE_FORMAT_A16_UNORM, target,
592 sample_count, bindings, geom_flags ))
593 return PIPE_FORMAT_A16_UNORM;
594 /* Pass through. */
595 case GL_ALPHA:
596 case GL_ALPHA4:
597 case GL_ALPHA8:
598 case GL_COMPRESSED_ALPHA:
599 if (screen->is_format_supported( screen, PIPE_FORMAT_A8_UNORM, target,
600 sample_count, bindings, geom_flags ))
601 return PIPE_FORMAT_A8_UNORM;
602 return default_rgba_format( screen, target, sample_count, bindings,
603 geom_flags );
604
605 case GL_LUMINANCE12:
606 case GL_LUMINANCE16:
607 if (screen->is_format_supported( screen, PIPE_FORMAT_L16_UNORM, target,
608 sample_count, bindings, geom_flags ))
609 return PIPE_FORMAT_L16_UNORM;
610 /* Pass through. */
611 case 1:
612 case GL_LUMINANCE:
613 case GL_LUMINANCE4:
614 case GL_LUMINANCE8:
615 case GL_COMPRESSED_LUMINANCE:
616 if (screen->is_format_supported( screen, PIPE_FORMAT_L8_UNORM, target,
617 sample_count, bindings, geom_flags ))
618 return PIPE_FORMAT_L8_UNORM;
619 return default_rgba_format( screen, target, sample_count, bindings,
620 geom_flags );
621
622 case GL_LUMINANCE12_ALPHA4:
623 case GL_LUMINANCE12_ALPHA12:
624 case GL_LUMINANCE16_ALPHA16:
625 if (screen->is_format_supported( screen, PIPE_FORMAT_L16A16_UNORM, target,
626 sample_count, bindings, geom_flags ))
627 return PIPE_FORMAT_L16A16_UNORM;
628 /* Pass through. */
629 case 2:
630 case GL_LUMINANCE_ALPHA:
631 case GL_LUMINANCE6_ALPHA2:
632 case GL_LUMINANCE8_ALPHA8:
633 case GL_COMPRESSED_LUMINANCE_ALPHA:
634 if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_UNORM, target,
635 sample_count, bindings, geom_flags ))
636 return PIPE_FORMAT_L8A8_UNORM;
637 return default_rgba_format( screen, target, sample_count, bindings,
638 geom_flags );
639
640 case GL_LUMINANCE4_ALPHA4:
641 if (screen->is_format_supported( screen, PIPE_FORMAT_L4A4_UNORM, target,
642 sample_count, bindings, geom_flags ))
643 return PIPE_FORMAT_L4A4_UNORM;
644 if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_UNORM, target,
645 sample_count, bindings, geom_flags ))
646 return PIPE_FORMAT_L8A8_UNORM;
647 return default_rgba_format( screen, target, sample_count, bindings,
648 geom_flags );
649
650 case GL_INTENSITY12:
651 case GL_INTENSITY16:
652 if (screen->is_format_supported( screen, PIPE_FORMAT_I16_UNORM, target,
653 sample_count, bindings, geom_flags ))
654 return PIPE_FORMAT_I16_UNORM;
655 /* Pass through. */
656 case GL_INTENSITY:
657 case GL_INTENSITY4:
658 case GL_INTENSITY8:
659 case GL_COMPRESSED_INTENSITY:
660 if (screen->is_format_supported( screen, PIPE_FORMAT_I8_UNORM, target,
661 sample_count, bindings, geom_flags ))
662 return PIPE_FORMAT_I8_UNORM;
663 return default_rgba_format( screen, target, sample_count, bindings,
664 geom_flags );
665
666 case GL_YCBCR_MESA:
667 if (screen->is_format_supported(screen, PIPE_FORMAT_UYVY, target,
668 sample_count, bindings, geom_flags)) {
669 return PIPE_FORMAT_UYVY;
670 }
671 if (screen->is_format_supported(screen, PIPE_FORMAT_YUYV, target,
672 sample_count, bindings, geom_flags)) {
673 return PIPE_FORMAT_YUYV;
674 }
675 return PIPE_FORMAT_NONE;
676
677 case GL_COMPRESSED_RGB:
678 /* can only sample from compressed formats */
679 if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
680 return PIPE_FORMAT_NONE;
681 else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
682 target, sample_count, bindings,
683 geom_flags))
684 return PIPE_FORMAT_DXT1_RGB;
685 else
686 return default_rgb_format(screen, target, sample_count, bindings,
687 geom_flags);
688
689 case GL_COMPRESSED_RGBA:
690 /* can only sample from compressed formats */
691 if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
692 return PIPE_FORMAT_NONE;
693 else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
694 target, sample_count, bindings,
695 geom_flags))
696 return PIPE_FORMAT_DXT3_RGBA;
697 else
698 return default_rgba_format(screen, target, sample_count, bindings,
699 geom_flags);
700
701 case GL_RGB_S3TC:
702 case GL_RGB4_S3TC:
703 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
704 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
705 target, sample_count, bindings,
706 geom_flags))
707 return PIPE_FORMAT_DXT1_RGB;
708 else
709 return PIPE_FORMAT_NONE;
710
711 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
712 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGBA,
713 target, sample_count, bindings,
714 geom_flags))
715 return PIPE_FORMAT_DXT1_RGBA;
716 else
717 return PIPE_FORMAT_NONE;
718
719 case GL_RGBA_S3TC:
720 case GL_RGBA4_S3TC:
721 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
722 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
723 target, sample_count, bindings,
724 geom_flags))
725 return PIPE_FORMAT_DXT3_RGBA;
726 else
727 return PIPE_FORMAT_NONE;
728
729 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
730 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
731 target, sample_count, bindings,
732 geom_flags))
733 return PIPE_FORMAT_DXT5_RGBA;
734 else
735 return PIPE_FORMAT_NONE;
736
737 #if 0
738 case GL_COMPRESSED_RGB_FXT1_3DFX:
739 return PIPE_FORMAT_RGB_FXT1;
740 case GL_COMPRESSED_RGBA_FXT1_3DFX:
741 return PIPE_FORMAT_RGB_FXT1;
742 #endif
743
744 case GL_DEPTH_COMPONENT16:
745 if (screen->is_format_supported(screen, PIPE_FORMAT_Z16_UNORM, target,
746 sample_count, bindings, geom_flags))
747 return PIPE_FORMAT_Z16_UNORM;
748 /* fall-through */
749 case GL_DEPTH_COMPONENT24:
750 if (screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
751 target, sample_count, bindings, geom_flags))
752 return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
753 if (screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
754 target, sample_count, bindings, geom_flags))
755 return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
756 /* fall-through */
757 case GL_DEPTH_COMPONENT32:
758 if (screen->is_format_supported(screen, PIPE_FORMAT_Z32_UNORM, target,
759 sample_count, bindings, geom_flags))
760 return PIPE_FORMAT_Z32_UNORM;
761 /* fall-through */
762 case GL_DEPTH_COMPONENT:
763 {
764 static const enum pipe_format formats[] = {
765 PIPE_FORMAT_Z32_UNORM,
766 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
767 PIPE_FORMAT_S8_USCALED_Z24_UNORM,
768 PIPE_FORMAT_Z16_UNORM
769 };
770 return find_supported_format(screen, formats, Elements(formats),
771 target, sample_count, bindings, geom_flags);
772 }
773
774 case GL_STENCIL_INDEX:
775 case GL_STENCIL_INDEX1_EXT:
776 case GL_STENCIL_INDEX4_EXT:
777 case GL_STENCIL_INDEX8_EXT:
778 case GL_STENCIL_INDEX16_EXT:
779 {
780 static const enum pipe_format formats[] = {
781 PIPE_FORMAT_S8_USCALED,
782 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
783 PIPE_FORMAT_S8_USCALED_Z24_UNORM
784 };
785 return find_supported_format(screen, formats, Elements(formats),
786 target, sample_count, bindings, geom_flags);
787 }
788
789 case GL_DEPTH_STENCIL_EXT:
790 case GL_DEPTH24_STENCIL8_EXT:
791 {
792 static const enum pipe_format formats[] = {
793 PIPE_FORMAT_Z24_UNORM_S8_USCALED,
794 PIPE_FORMAT_S8_USCALED_Z24_UNORM
795 };
796 return find_supported_format(screen, formats, Elements(formats),
797 target, sample_count, bindings, geom_flags);
798 }
799
800 case GL_SRGB_EXT:
801 case GL_SRGB8_EXT:
802 case GL_SRGB_ALPHA_EXT:
803 case GL_SRGB8_ALPHA8_EXT:
804 return default_srgba_format( screen, target, sample_count, bindings,
805 geom_flags );
806
807 case GL_COMPRESSED_SRGB_EXT:
808 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
809 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_SRGB, target,
810 sample_count, bindings, geom_flags))
811 return PIPE_FORMAT_DXT1_SRGB;
812 return default_srgba_format( screen, target, sample_count, bindings,
813 geom_flags );
814
815 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
816 return PIPE_FORMAT_DXT1_SRGBA;
817
818 case GL_COMPRESSED_SRGB_ALPHA_EXT:
819 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
820 if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_SRGBA, target,
821 sample_count, bindings, geom_flags))
822 return PIPE_FORMAT_DXT3_SRGBA;
823 return default_srgba_format( screen, target, sample_count, bindings,
824 geom_flags );
825
826 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
827 return PIPE_FORMAT_DXT5_SRGBA;
828
829 case GL_SLUMINANCE_ALPHA_EXT:
830 case GL_SLUMINANCE8_ALPHA8_EXT:
831 case GL_COMPRESSED_SLUMINANCE_EXT:
832 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
833 if (screen->is_format_supported(screen, PIPE_FORMAT_L8A8_SRGB, target,
834 sample_count, bindings, geom_flags))
835 return PIPE_FORMAT_L8A8_SRGB;
836 return default_srgba_format( screen, target, sample_count, bindings,
837 geom_flags );
838
839 case GL_SLUMINANCE_EXT:
840 case GL_SLUMINANCE8_EXT:
841 if (screen->is_format_supported(screen, PIPE_FORMAT_L8_SRGB, target,
842 sample_count, bindings, geom_flags))
843 return PIPE_FORMAT_L8_SRGB;
844 return default_srgba_format( screen, target, sample_count, bindings,
845 geom_flags );
846
847 case GL_RED:
848 case GL_R8:
849 if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
850 sample_count, bindings, geom_flags))
851 return PIPE_FORMAT_R8_UNORM;
852 return PIPE_FORMAT_NONE;
853 case GL_RG:
854 case GL_RG8:
855 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
856 sample_count, bindings, geom_flags))
857 return PIPE_FORMAT_R8G8_UNORM;
858 return PIPE_FORMAT_NONE;
859
860 case GL_R16:
861 if (screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM, target,
862 sample_count, bindings, geom_flags))
863 return PIPE_FORMAT_R16_UNORM;
864 return PIPE_FORMAT_NONE;
865
866 case GL_RG16:
867 if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM, target,
868 sample_count, bindings, geom_flags))
869 return PIPE_FORMAT_R16G16_UNORM;
870 return PIPE_FORMAT_NONE;
871
872 case GL_COMPRESSED_RED:
873 case GL_COMPRESSED_RED_RGTC1:
874 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_UNORM, target,
875 sample_count, bindings, geom_flags))
876 return PIPE_FORMAT_RGTC1_UNORM;
877 if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
878 sample_count, bindings, geom_flags))
879 return PIPE_FORMAT_R8_UNORM;
880 return PIPE_FORMAT_NONE;
881
882 case GL_COMPRESSED_SIGNED_RED_RGTC1:
883 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_SNORM, target,
884 sample_count, bindings, geom_flags))
885 return PIPE_FORMAT_RGTC1_SNORM;
886 return PIPE_FORMAT_NONE;
887
888 case GL_COMPRESSED_RG:
889 case GL_COMPRESSED_RG_RGTC2:
890 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_UNORM, target,
891 sample_count, bindings, geom_flags))
892 return PIPE_FORMAT_RGTC2_UNORM;
893 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
894 sample_count, bindings, geom_flags))
895 return PIPE_FORMAT_R8G8_UNORM;
896 return PIPE_FORMAT_NONE;
897
898 case GL_COMPRESSED_SIGNED_RG_RGTC2:
899 if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_SNORM, target,
900 sample_count, bindings, geom_flags))
901 return PIPE_FORMAT_RGTC2_SNORM;
902 return PIPE_FORMAT_NONE;
903
904 /* signed/unsigned integer formats.
905 * XXX Mesa only has formats for RGBA signed/unsigned integer formats.
906 * If/when new formats are added this code should be updated.
907 */
908 case GL_RED_INTEGER_EXT:
909 case GL_GREEN_INTEGER_EXT:
910 case GL_BLUE_INTEGER_EXT:
911 case GL_ALPHA_INTEGER_EXT:
912 case GL_RGB_INTEGER_EXT:
913 case GL_RGBA_INTEGER_EXT:
914 case GL_BGR_INTEGER_EXT:
915 case GL_BGRA_INTEGER_EXT:
916 case GL_LUMINANCE_INTEGER_EXT:
917 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
918 /* fall-through */
919 case GL_RGBA8I_EXT:
920 case GL_RGB8I_EXT:
921 case GL_ALPHA8I_EXT:
922 case GL_INTENSITY8I_EXT:
923 case GL_LUMINANCE8I_EXT:
924 case GL_LUMINANCE_ALPHA8I_EXT:
925 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SSCALED,
926 target,
927 sample_count, bindings, geom_flags))
928 return PIPE_FORMAT_R8G8B8A8_SSCALED;
929 return PIPE_FORMAT_NONE;
930 case GL_RGBA16I_EXT:
931 case GL_RGB16I_EXT:
932 case GL_ALPHA16I_EXT:
933 case GL_INTENSITY16I_EXT:
934 case GL_LUMINANCE16I_EXT:
935 case GL_LUMINANCE_ALPHA16I_EXT:
936 if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_SSCALED,
937 target,
938 sample_count, bindings, geom_flags))
939 return PIPE_FORMAT_R16G16B16A16_SSCALED;
940 return PIPE_FORMAT_NONE;
941 case GL_RGBA32I_EXT:
942 case GL_RGB32I_EXT:
943 case GL_ALPHA32I_EXT:
944 case GL_INTENSITY32I_EXT:
945 case GL_LUMINANCE32I_EXT:
946 case GL_LUMINANCE_ALPHA32I_EXT:
947 /* xxx */
948 if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_SSCALED,
949 target,
950 sample_count, bindings, geom_flags))
951 return PIPE_FORMAT_R32G32B32A32_SSCALED;
952 return PIPE_FORMAT_NONE;
953
954 case GL_RGBA8UI_EXT:
955 case GL_RGB8UI_EXT:
956 case GL_ALPHA8UI_EXT:
957 case GL_INTENSITY8UI_EXT:
958 case GL_LUMINANCE8UI_EXT:
959 case GL_LUMINANCE_ALPHA8UI_EXT:
960 if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_USCALED,
961 target,
962 sample_count, bindings, geom_flags))
963 return PIPE_FORMAT_R8G8B8A8_USCALED;
964 return PIPE_FORMAT_NONE;
965
966 case GL_RGBA16UI_EXT:
967 case GL_RGB16UI_EXT:
968 case GL_ALPHA16UI_EXT:
969 case GL_INTENSITY16UI_EXT:
970 case GL_LUMINANCE16UI_EXT:
971 case GL_LUMINANCE_ALPHA16UI_EXT:
972 if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_USCALED,
973 target,
974 sample_count, bindings, geom_flags))
975 return PIPE_FORMAT_R16G16B16A16_USCALED;
976 return PIPE_FORMAT_NONE;
977
978 case GL_RGBA32UI_EXT:
979 case GL_RGB32UI_EXT:
980 case GL_ALPHA32UI_EXT:
981 case GL_INTENSITY32UI_EXT:
982 case GL_LUMINANCE32UI_EXT:
983 case GL_LUMINANCE_ALPHA32UI_EXT:
984 if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_USCALED,
985 target,
986 sample_count, bindings, geom_flags))
987 return PIPE_FORMAT_R32G32B32A32_USCALED;
988 return PIPE_FORMAT_NONE;
989
990 default:
991 return PIPE_FORMAT_NONE;
992 }
993 }
994
995
996 /**
997 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
998 */
999 enum pipe_format
1000 st_choose_renderbuffer_format(struct pipe_screen *screen,
1001 GLenum internalFormat, unsigned sample_count)
1002 {
1003 uint usage;
1004 if (_mesa_is_depth_or_stencil_format(internalFormat))
1005 usage = PIPE_BIND_DEPTH_STENCIL;
1006 else
1007 usage = PIPE_BIND_RENDER_TARGET;
1008 return st_choose_format(screen, internalFormat, PIPE_TEXTURE_2D,
1009 sample_count, usage);
1010 }
1011
1012
1013 /**
1014 * Called via ctx->Driver.chooseTextureFormat().
1015 */
1016 gl_format
1017 st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
1018 GLenum format, GLenum type, GLboolean renderable)
1019 {
1020 struct pipe_screen *screen = st_context(ctx)->pipe->screen;
1021 enum pipe_format pFormat;
1022 uint bindings;
1023
1024 (void) format;
1025 (void) type;
1026
1027 /* GL textures may wind up being render targets, but we don't know
1028 * that in advance. Specify potential render target flags now.
1029 */
1030 bindings = PIPE_BIND_SAMPLER_VIEW;
1031 if (renderable == GL_TRUE) {
1032 if (_mesa_is_depth_format(internalFormat) ||
1033 _mesa_is_depth_or_stencil_format(internalFormat))
1034 bindings |= PIPE_BIND_DEPTH_STENCIL;
1035 else
1036 bindings |= PIPE_BIND_RENDER_TARGET;
1037 }
1038
1039 pFormat = st_choose_format(screen, internalFormat,
1040 PIPE_TEXTURE_2D, 0, bindings);
1041
1042 if (pFormat == PIPE_FORMAT_NONE) {
1043 /* try choosing format again, this time without render target bindings */
1044 pFormat = st_choose_format(screen, internalFormat,
1045 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
1046 }
1047
1048 if (pFormat == PIPE_FORMAT_NONE) {
1049 /* no luck at all */
1050 return MESA_FORMAT_NONE;
1051 }
1052
1053 return st_pipe_format_to_mesa_format(pFormat);
1054 }
1055
1056 gl_format
1057 st_ChooseTextureFormat(struct gl_context *ctx, GLint internalFormat,
1058 GLenum format, GLenum type)
1059 {
1060 boolean want_renderable =
1061 internalFormat == 3 || internalFormat == 4 ||
1062 internalFormat == GL_RGB || internalFormat == GL_RGBA ||
1063 internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
1064 internalFormat == GL_BGRA;
1065
1066 return st_ChooseTextureFormat_renderable(ctx, internalFormat,
1067 format, type, want_renderable);
1068 }
1069
1070 /**
1071 * Test if a gallium format is equivalent to a GL format/type.
1072 */
1073 GLboolean
1074 st_equal_formats(enum pipe_format pFormat, GLenum format, GLenum type)
1075 {
1076 switch (pFormat) {
1077 case PIPE_FORMAT_A8B8G8R8_UNORM:
1078 return format == GL_RGBA && type == GL_UNSIGNED_BYTE;
1079 case PIPE_FORMAT_A8R8G8B8_UNORM:
1080 return format == GL_BGRA && type == GL_UNSIGNED_BYTE;
1081 case PIPE_FORMAT_B5G6R5_UNORM:
1082 return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5;
1083 /* XXX more combos... */
1084 default:
1085 return GL_FALSE;
1086 }
1087 }
1088
1089 GLboolean
1090 st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
1091 {
1092 if (format1 == format2)
1093 return GL_TRUE;
1094
1095 if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
1096 format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
1097 return GL_TRUE;
1098
1099 if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
1100 format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
1101 return GL_TRUE;
1102
1103 if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
1104 format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
1105 return GL_TRUE;
1106
1107 if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
1108 format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
1109 return GL_TRUE;
1110
1111 if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
1112 format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
1113 return GL_TRUE;
1114
1115 if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
1116 format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
1117 return GL_TRUE;
1118
1119 return GL_FALSE;
1120 }
1121
1122
1123
1124 /**
1125 * This is used for translating texture border color and the clear
1126 * color. For example, the clear color is interpreted according to
1127 * the renderbuffer's base format. For example, if clearing a
1128 * GL_LUMINANCE buffer, ClearColor[0] = luminance and ClearColor[1] =
1129 * alpha. Similarly for texture border colors.
1130 */
1131 void
1132 st_translate_color(const GLfloat colorIn[4], GLenum baseFormat,
1133 GLfloat colorOut[4])
1134 {
1135 switch (baseFormat) {
1136 case GL_RED:
1137 colorOut[0] = colorIn[0];
1138 colorOut[1] = 0.0F;
1139 colorOut[2] = 0.0F;
1140 colorOut[3] = 1.0F;
1141 break;
1142 case GL_RG:
1143 colorOut[0] = colorIn[0];
1144 colorOut[1] = colorIn[1];
1145 colorOut[2] = 0.0F;
1146 colorOut[3] = 1.0F;
1147 break;
1148 case GL_RGB:
1149 colorOut[0] = colorIn[0];
1150 colorOut[1] = colorIn[1];
1151 colorOut[2] = colorIn[2];
1152 colorOut[3] = 1.0F;
1153 break;
1154 case GL_ALPHA:
1155 colorOut[0] = colorOut[1] = colorOut[2] = 0.0;
1156 colorOut[3] = colorIn[3];
1157 break;
1158 case GL_LUMINANCE:
1159 colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
1160 colorOut[3] = 1.0;
1161 break;
1162 case GL_LUMINANCE_ALPHA:
1163 colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
1164 colorOut[3] = colorIn[3];
1165 break;
1166 case GL_INTENSITY:
1167 colorOut[0] = colorOut[1] = colorOut[2] = colorOut[3] = colorIn[0];
1168 break;
1169 default:
1170 COPY_4V(colorOut, colorIn);
1171 }
1172 }