1 /**************************************************************************
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * Copyright (c) 2008-2010 VMware, Inc.
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:
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial portions
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.
27 **************************************************************************/
31 * Mesa / Gallium format conversion and format selection code.
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"
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"
51 format_max_bits(enum pipe_format format
)
53 GLuint size
= util_format_get_component_bits(format
, UTIL_FORMAT_COLORSPACE_RGB
, 0);
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));
65 * Return basic GL datatype for the given gallium format.
68 st_format_datatype(enum pipe_format format
)
70 const struct util_format_description
*desc
;
72 desc
= util_format_description(format
);
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
;
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
;
87 const GLuint size
= format_max_bits(format
);
89 if (desc
->channel
[0].type
== UTIL_FORMAT_TYPE_UNSIGNED
)
90 return GL_UNSIGNED_BYTE
;
94 else if (size
== 16) {
95 if (desc
->channel
[0].type
== UTIL_FORMAT_TYPE_UNSIGNED
)
96 return GL_UNSIGNED_SHORT
;
101 assert( size
<= 32 );
102 if (desc
->channel
[0].type
== UTIL_FORMAT_TYPE_UNSIGNED
)
103 return GL_UNSIGNED_INT
;
109 else if (format
== PIPE_FORMAT_UYVY
) {
110 return GL_UNSIGNED_SHORT
;
112 else if (format
== PIPE_FORMAT_YUYV
) {
113 return GL_UNSIGNED_SHORT
;
116 /* probably a compressed format, unsupported anyway */
123 * Translate Mesa format to Gallium format.
126 st_mesa_format_to_pipe_format(gl_format mesaFormat
)
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
;
158 return PIPE_FORMAT_A8_UNORM
;
159 case MESA_FORMAT_A16
:
160 return PIPE_FORMAT_A16_UNORM
;
162 return PIPE_FORMAT_L8_UNORM
;
163 case MESA_FORMAT_L16
:
164 return PIPE_FORMAT_L16_UNORM
;
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
;
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
;
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
;
217 case MESA_FORMAT_RGBA_FLOAT32
:
218 return PIPE_FORMAT_R32G32B32A32_FLOAT
;
219 case MESA_FORMAT_RGBA_FLOAT16
:
220 return PIPE_FORMAT_R16G16B16A16_FLOAT
;
221 case MESA_FORMAT_RGB_FLOAT32
:
222 return PIPE_FORMAT_R32G32B32_FLOAT
;
223 case MESA_FORMAT_RGB_FLOAT16
:
224 return PIPE_FORMAT_R16G16B16_FLOAT
;
225 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
:
226 return PIPE_FORMAT_L32A32_FLOAT
;
227 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
:
228 return PIPE_FORMAT_L16A16_FLOAT
;
229 case MESA_FORMAT_LUMINANCE_FLOAT32
:
230 return PIPE_FORMAT_L32_FLOAT
;
231 case MESA_FORMAT_LUMINANCE_FLOAT16
:
232 return PIPE_FORMAT_L16_FLOAT
;
233 case MESA_FORMAT_ALPHA_FLOAT32
:
234 return PIPE_FORMAT_A32_FLOAT
;
235 case MESA_FORMAT_ALPHA_FLOAT16
:
236 return PIPE_FORMAT_A16_FLOAT
;
237 case MESA_FORMAT_INTENSITY_FLOAT32
:
238 return PIPE_FORMAT_I32_FLOAT
;
239 case MESA_FORMAT_INTENSITY_FLOAT16
:
240 return PIPE_FORMAT_I16_FLOAT
;
241 case MESA_FORMAT_R_FLOAT32
:
242 return PIPE_FORMAT_R32_FLOAT
;
243 case MESA_FORMAT_R_FLOAT16
:
244 return PIPE_FORMAT_R16_FLOAT
;
245 case MESA_FORMAT_RG_FLOAT32
:
246 return PIPE_FORMAT_R32G32_FLOAT
;
247 case MESA_FORMAT_RG_FLOAT16
:
248 return PIPE_FORMAT_R16G16_FLOAT
;
251 return PIPE_FORMAT_R8_UNORM
;
252 case MESA_FORMAT_R16
:
253 return PIPE_FORMAT_R16_UNORM
;
254 case MESA_FORMAT_RG88
:
255 return PIPE_FORMAT_R8G8_UNORM
;
256 case MESA_FORMAT_RG1616
:
257 return PIPE_FORMAT_R16G16_UNORM
;
258 case MESA_FORMAT_RGBA_16
:
259 return PIPE_FORMAT_R16G16B16A16_UNORM
;
261 /* signed int formats */
262 case MESA_FORMAT_RGBA_INT8
:
263 return PIPE_FORMAT_R8G8B8A8_SSCALED
;
264 case MESA_FORMAT_RGBA_INT16
:
265 return PIPE_FORMAT_R16G16B16A16_SSCALED
;
266 case MESA_FORMAT_RGBA_INT32
:
267 return PIPE_FORMAT_R32G32B32A32_SSCALED
;
269 /* unsigned int formats */
270 case MESA_FORMAT_RGBA_UINT8
:
271 return PIPE_FORMAT_R8G8B8A8_USCALED
;
272 case MESA_FORMAT_RGBA_UINT16
:
273 return PIPE_FORMAT_R16G16B16A16_USCALED
;
274 case MESA_FORMAT_RGBA_UINT32
:
275 return PIPE_FORMAT_R32G32B32A32_USCALED
;
277 case MESA_FORMAT_RED_RGTC1
:
278 return PIPE_FORMAT_RGTC1_UNORM
;
279 case MESA_FORMAT_SIGNED_RED_RGTC1
:
280 return PIPE_FORMAT_RGTC1_SNORM
;
281 case MESA_FORMAT_RG_RGTC2
:
282 return PIPE_FORMAT_RGTC2_UNORM
;
283 case MESA_FORMAT_SIGNED_RG_RGTC2
:
284 return PIPE_FORMAT_RGTC2_SNORM
;
286 case MESA_FORMAT_L_LATC1
:
287 return PIPE_FORMAT_LATC1_UNORM
;
288 case MESA_FORMAT_SIGNED_L_LATC1
:
289 return PIPE_FORMAT_LATC1_SNORM
;
290 case MESA_FORMAT_LA_LATC2
:
291 return PIPE_FORMAT_LATC2_UNORM
;
292 case MESA_FORMAT_SIGNED_LA_LATC2
:
293 return PIPE_FORMAT_LATC2_SNORM
;
295 /* signed normalized formats */
296 case MESA_FORMAT_SIGNED_R8
:
297 return PIPE_FORMAT_R8_SNORM
;
298 case MESA_FORMAT_SIGNED_RG88_REV
:
299 return PIPE_FORMAT_R8G8_SNORM
;
300 case MESA_FORMAT_SIGNED_RGBA8888_REV
:
301 return PIPE_FORMAT_R8G8B8A8_SNORM
;
303 case MESA_FORMAT_SIGNED_A8
:
304 return PIPE_FORMAT_A8_SNORM
;
305 case MESA_FORMAT_SIGNED_L8
:
306 return PIPE_FORMAT_L8_SNORM
;
307 case MESA_FORMAT_SIGNED_AL88
:
308 return PIPE_FORMAT_L8A8_SNORM
;
309 case MESA_FORMAT_SIGNED_I8
:
310 return PIPE_FORMAT_I8_SNORM
;
312 case MESA_FORMAT_SIGNED_R16
:
313 return PIPE_FORMAT_R16_SNORM
;
314 case MESA_FORMAT_SIGNED_GR1616
:
315 return PIPE_FORMAT_R16G16_SNORM
;
316 case MESA_FORMAT_SIGNED_RGBA_16
:
317 return PIPE_FORMAT_R16G16B16A16_SNORM
;
319 case MESA_FORMAT_SIGNED_A16
:
320 return PIPE_FORMAT_A16_SNORM
;
321 case MESA_FORMAT_SIGNED_L16
:
322 return PIPE_FORMAT_L16_SNORM
;
323 case MESA_FORMAT_SIGNED_AL1616
:
324 return PIPE_FORMAT_L16A16_SNORM
;
325 case MESA_FORMAT_SIGNED_I16
:
326 return PIPE_FORMAT_I16_SNORM
;
328 case MESA_FORMAT_RGB9_E5_FLOAT
:
329 return PIPE_FORMAT_R9G9B9E5_FLOAT
;
330 case MESA_FORMAT_R11_G11_B10_FLOAT
:
331 return PIPE_FORMAT_R11G11B10_FLOAT
;
335 return PIPE_FORMAT_NONE
;
341 * Translate Gallium format to Mesa format.
344 st_pipe_format_to_mesa_format(enum pipe_format format
)
347 case PIPE_FORMAT_A8B8G8R8_UNORM
:
348 return MESA_FORMAT_RGBA8888
;
349 case PIPE_FORMAT_R8G8B8A8_UNORM
:
350 return MESA_FORMAT_RGBA8888_REV
;
351 case PIPE_FORMAT_B8G8R8A8_UNORM
:
352 return MESA_FORMAT_ARGB8888
;
353 case PIPE_FORMAT_A8R8G8B8_UNORM
:
354 return MESA_FORMAT_ARGB8888_REV
;
355 case PIPE_FORMAT_B8G8R8X8_UNORM
:
356 return MESA_FORMAT_XRGB8888
;
357 case PIPE_FORMAT_X8R8G8B8_UNORM
:
358 return MESA_FORMAT_XRGB8888_REV
;
359 case PIPE_FORMAT_B5G5R5A1_UNORM
:
360 return MESA_FORMAT_ARGB1555
;
361 case PIPE_FORMAT_B4G4R4A4_UNORM
:
362 return MESA_FORMAT_ARGB4444
;
363 case PIPE_FORMAT_B5G6R5_UNORM
:
364 return MESA_FORMAT_RGB565
;
365 case PIPE_FORMAT_B2G3R3_UNORM
:
366 return MESA_FORMAT_RGB332
;
367 case PIPE_FORMAT_B10G10R10A2_UNORM
:
368 return MESA_FORMAT_ARGB2101010
;
369 case PIPE_FORMAT_L4A4_UNORM
:
370 return MESA_FORMAT_AL44
;
371 case PIPE_FORMAT_L8A8_UNORM
:
372 return MESA_FORMAT_AL88
;
373 case PIPE_FORMAT_L16A16_UNORM
:
374 return MESA_FORMAT_AL1616
;
375 case PIPE_FORMAT_A8_UNORM
:
376 return MESA_FORMAT_A8
;
377 case PIPE_FORMAT_A16_UNORM
:
378 return MESA_FORMAT_A16
;
379 case PIPE_FORMAT_L8_UNORM
:
380 return MESA_FORMAT_L8
;
381 case PIPE_FORMAT_L16_UNORM
:
382 return MESA_FORMAT_L16
;
383 case PIPE_FORMAT_I8_UNORM
:
384 return MESA_FORMAT_I8
;
385 case PIPE_FORMAT_I16_UNORM
:
386 return MESA_FORMAT_I16
;
387 case PIPE_FORMAT_S8_USCALED
:
388 return MESA_FORMAT_S8
;
390 case PIPE_FORMAT_R16G16B16A16_UNORM
:
391 return MESA_FORMAT_RGBA_16
;
393 case PIPE_FORMAT_Z16_UNORM
:
394 return MESA_FORMAT_Z16
;
395 case PIPE_FORMAT_Z32_UNORM
:
396 return MESA_FORMAT_Z32
;
397 case PIPE_FORMAT_S8_USCALED_Z24_UNORM
:
398 return MESA_FORMAT_Z24_S8
;
399 case PIPE_FORMAT_X8Z24_UNORM
:
400 return MESA_FORMAT_Z24_X8
;
401 case PIPE_FORMAT_Z24X8_UNORM
:
402 return MESA_FORMAT_X8_Z24
;
403 case PIPE_FORMAT_Z24_UNORM_S8_USCALED
:
404 return MESA_FORMAT_S8_Z24
;
406 case PIPE_FORMAT_UYVY
:
407 return MESA_FORMAT_YCBCR
;
408 case PIPE_FORMAT_YUYV
:
409 return MESA_FORMAT_YCBCR_REV
;
411 #if FEATURE_texture_s3tc
412 case PIPE_FORMAT_DXT1_RGB
:
413 return MESA_FORMAT_RGB_DXT1
;
414 case PIPE_FORMAT_DXT1_RGBA
:
415 return MESA_FORMAT_RGBA_DXT1
;
416 case PIPE_FORMAT_DXT3_RGBA
:
417 return MESA_FORMAT_RGBA_DXT3
;
418 case PIPE_FORMAT_DXT5_RGBA
:
419 return MESA_FORMAT_RGBA_DXT5
;
420 #if FEATURE_EXT_texture_sRGB
421 case PIPE_FORMAT_DXT1_SRGB
:
422 return MESA_FORMAT_SRGB_DXT1
;
423 case PIPE_FORMAT_DXT1_SRGBA
:
424 return MESA_FORMAT_SRGBA_DXT1
;
425 case PIPE_FORMAT_DXT3_SRGBA
:
426 return MESA_FORMAT_SRGBA_DXT3
;
427 case PIPE_FORMAT_DXT5_SRGBA
:
428 return MESA_FORMAT_SRGBA_DXT5
;
432 #if FEATURE_EXT_texture_sRGB
433 case PIPE_FORMAT_L8A8_SRGB
:
434 return MESA_FORMAT_SLA8
;
435 case PIPE_FORMAT_L8_SRGB
:
436 return MESA_FORMAT_SL8
;
437 case PIPE_FORMAT_R8G8B8_SRGB
:
438 return MESA_FORMAT_SRGB8
;
439 case PIPE_FORMAT_A8B8G8R8_SRGB
:
440 return MESA_FORMAT_SRGBA8
;
441 case PIPE_FORMAT_B8G8R8A8_SRGB
:
442 return MESA_FORMAT_SARGB8
;
444 case PIPE_FORMAT_R32G32B32A32_FLOAT
:
445 return MESA_FORMAT_RGBA_FLOAT32
;
446 case PIPE_FORMAT_R16G16B16A16_FLOAT
:
447 return MESA_FORMAT_RGBA_FLOAT16
;
448 case PIPE_FORMAT_R32G32B32_FLOAT
:
449 return MESA_FORMAT_RGB_FLOAT32
;
450 case PIPE_FORMAT_R16G16B16_FLOAT
:
451 return MESA_FORMAT_RGB_FLOAT16
;
452 case PIPE_FORMAT_L32A32_FLOAT
:
453 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
;
454 case PIPE_FORMAT_L16A16_FLOAT
:
455 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
;
456 case PIPE_FORMAT_L32_FLOAT
:
457 return MESA_FORMAT_LUMINANCE_FLOAT32
;
458 case PIPE_FORMAT_L16_FLOAT
:
459 return MESA_FORMAT_LUMINANCE_FLOAT16
;
460 case PIPE_FORMAT_A32_FLOAT
:
461 return MESA_FORMAT_ALPHA_FLOAT32
;
462 case PIPE_FORMAT_A16_FLOAT
:
463 return MESA_FORMAT_ALPHA_FLOAT16
;
464 case PIPE_FORMAT_I32_FLOAT
:
465 return MESA_FORMAT_INTENSITY_FLOAT32
;
466 case PIPE_FORMAT_I16_FLOAT
:
467 return MESA_FORMAT_INTENSITY_FLOAT16
;
468 case PIPE_FORMAT_R32_FLOAT
:
469 return MESA_FORMAT_R_FLOAT32
;
470 case PIPE_FORMAT_R16_FLOAT
:
471 return MESA_FORMAT_R_FLOAT16
;
472 case PIPE_FORMAT_R32G32_FLOAT
:
473 return MESA_FORMAT_RG_FLOAT32
;
474 case PIPE_FORMAT_R16G16_FLOAT
:
475 return MESA_FORMAT_RG_FLOAT16
;
477 case PIPE_FORMAT_R8_UNORM
:
478 return MESA_FORMAT_R8
;
479 case PIPE_FORMAT_R16_UNORM
:
480 return MESA_FORMAT_R16
;
481 case PIPE_FORMAT_R8G8_UNORM
:
482 return MESA_FORMAT_RG88
;
483 case PIPE_FORMAT_R16G16_UNORM
:
484 return MESA_FORMAT_RG1616
;
486 /* signed int formats */
487 case PIPE_FORMAT_R8G8B8A8_SSCALED
:
488 return MESA_FORMAT_RGBA_INT8
;
489 case PIPE_FORMAT_R16G16B16A16_SSCALED
:
490 return MESA_FORMAT_RGBA_INT16
;
491 case PIPE_FORMAT_R32G32B32A32_SSCALED
:
492 return MESA_FORMAT_RGBA_INT32
;
494 /* unsigned int formats */
495 case PIPE_FORMAT_R8G8B8A8_USCALED
:
496 return MESA_FORMAT_RGBA_UINT8
;
497 case PIPE_FORMAT_R16G16B16A16_USCALED
:
498 return MESA_FORMAT_RGBA_UINT16
;
499 case PIPE_FORMAT_R32G32B32A32_USCALED
:
500 return MESA_FORMAT_RGBA_UINT32
;
502 case PIPE_FORMAT_RGTC1_UNORM
:
503 return MESA_FORMAT_RED_RGTC1
;
504 case PIPE_FORMAT_RGTC1_SNORM
:
505 return MESA_FORMAT_SIGNED_RED_RGTC1
;
506 case PIPE_FORMAT_RGTC2_UNORM
:
507 return MESA_FORMAT_RG_RGTC2
;
508 case PIPE_FORMAT_RGTC2_SNORM
:
509 return MESA_FORMAT_SIGNED_RG_RGTC2
;
511 case PIPE_FORMAT_LATC1_UNORM
:
512 return MESA_FORMAT_L_LATC1
;
513 case PIPE_FORMAT_LATC1_SNORM
:
514 return MESA_FORMAT_SIGNED_L_LATC1
;
515 case PIPE_FORMAT_LATC2_UNORM
:
516 return MESA_FORMAT_LA_LATC2
;
517 //case PIPE_FORMAT_LATC2_SNORM:
518 // return MESA_FORMAT_SIGNED_LA_LATC2;
520 /* signed normalized formats */
521 case PIPE_FORMAT_R8_SNORM
:
522 return MESA_FORMAT_SIGNED_R8
;
523 case PIPE_FORMAT_R8G8_SNORM
:
524 return MESA_FORMAT_SIGNED_RG88_REV
;
525 case PIPE_FORMAT_R8G8B8A8_SNORM
:
526 return MESA_FORMAT_SIGNED_RGBA8888_REV
;
528 case PIPE_FORMAT_A8_SNORM
:
529 return MESA_FORMAT_SIGNED_A8
;
530 case PIPE_FORMAT_L8_SNORM
:
531 return MESA_FORMAT_SIGNED_L8
;
532 case PIPE_FORMAT_L8A8_SNORM
:
533 return MESA_FORMAT_SIGNED_AL88
;
534 case PIPE_FORMAT_I8_SNORM
:
535 return MESA_FORMAT_SIGNED_I8
;
537 case PIPE_FORMAT_R16_SNORM
:
538 return MESA_FORMAT_SIGNED_R16
;
539 case PIPE_FORMAT_R16G16_SNORM
:
540 return MESA_FORMAT_SIGNED_GR1616
;
541 case PIPE_FORMAT_R16G16B16A16_SNORM
:
542 return MESA_FORMAT_SIGNED_RGBA_16
;
544 case PIPE_FORMAT_A16_SNORM
:
545 return MESA_FORMAT_SIGNED_A16
;
546 case PIPE_FORMAT_L16_SNORM
:
547 return MESA_FORMAT_SIGNED_L16
;
548 case PIPE_FORMAT_L16A16_SNORM
:
549 return MESA_FORMAT_SIGNED_AL1616
;
550 case PIPE_FORMAT_I16_SNORM
:
551 return MESA_FORMAT_SIGNED_I16
;
553 case PIPE_FORMAT_R9G9B9E5_FLOAT
:
554 return MESA_FORMAT_RGB9_E5_FLOAT
;
555 case PIPE_FORMAT_R11G11B10_FLOAT
:
556 return MESA_FORMAT_R11_G11_B10_FLOAT
;
560 return MESA_FORMAT_NONE
;
566 * Return first supported format from the given list.
568 static enum pipe_format
569 find_supported_format(struct pipe_screen
*screen
,
570 const enum pipe_format formats
[],
572 enum pipe_texture_target target
,
573 unsigned sample_count
,
577 for (i
= 0; i
< num_formats
; i
++) {
578 if (screen
->is_format_supported(screen
, formats
[i
], target
,
579 sample_count
, tex_usage
)) {
583 return PIPE_FORMAT_NONE
;
588 * Find an RGBA format supported by the context/winsys.
590 static enum pipe_format
591 default_rgba_format(struct pipe_screen
*screen
,
592 enum pipe_texture_target target
,
593 unsigned sample_count
,
596 static const enum pipe_format colorFormats
[] = {
597 PIPE_FORMAT_B8G8R8A8_UNORM
,
598 PIPE_FORMAT_A8R8G8B8_UNORM
,
599 PIPE_FORMAT_A8B8G8R8_UNORM
,
600 PIPE_FORMAT_B5G6R5_UNORM
602 return find_supported_format(screen
, colorFormats
, Elements(colorFormats
),
603 target
, sample_count
, tex_usage
);
608 * Find an RGB format supported by the context/winsys.
610 static enum pipe_format
611 default_rgb_format(struct pipe_screen
*screen
,
612 enum pipe_texture_target target
,
613 unsigned sample_count
,
616 static const enum pipe_format colorFormats
[] = {
617 PIPE_FORMAT_B8G8R8X8_UNORM
,
618 PIPE_FORMAT_X8R8G8B8_UNORM
,
619 PIPE_FORMAT_X8B8G8R8_UNORM
,
620 PIPE_FORMAT_B8G8R8A8_UNORM
,
621 PIPE_FORMAT_A8R8G8B8_UNORM
,
622 PIPE_FORMAT_A8B8G8R8_UNORM
,
623 PIPE_FORMAT_B5G6R5_UNORM
625 return find_supported_format(screen
, colorFormats
, Elements(colorFormats
),
626 target
, sample_count
, tex_usage
);
630 * Find an sRGBA format supported by the context/winsys.
632 static enum pipe_format
633 default_srgba_format(struct pipe_screen
*screen
,
634 enum pipe_texture_target target
,
635 unsigned sample_count
,
638 static const enum pipe_format colorFormats
[] = {
639 PIPE_FORMAT_B8G8R8A8_SRGB
,
640 PIPE_FORMAT_A8R8G8B8_SRGB
,
641 PIPE_FORMAT_A8B8G8R8_SRGB
,
643 return find_supported_format(screen
, colorFormats
, Elements(colorFormats
),
644 target
, sample_count
, tex_usage
);
649 * Given an OpenGL internalFormat value for a texture or surface, return
650 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
651 * This is called during glTexImage2D, for example.
653 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
654 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
655 * we want render-to-texture ability.
657 * \param internalFormat the user value passed to glTexImage2D
658 * \param target one of PIPE_TEXTURE_x
659 * \param bindings bitmask of PIPE_BIND_x flags.
662 st_choose_format(struct pipe_screen
*screen
, GLenum internalFormat
,
663 enum pipe_texture_target target
, unsigned sample_count
,
667 switch (internalFormat
) {
670 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B10G10R10A2_UNORM
,
671 target
, sample_count
, bindings
))
672 return PIPE_FORMAT_B10G10R10A2_UNORM
;
677 return default_rgba_format( screen
, target
, sample_count
, bindings
);
680 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B8G8R8A8_UNORM
,
681 target
, sample_count
, bindings
))
682 return PIPE_FORMAT_B8G8R8A8_UNORM
;
683 return default_rgba_format( screen
, target
, sample_count
, bindings
);
688 return default_rgb_format( screen
, target
, sample_count
, bindings
);
694 if (screen
->is_format_supported( screen
, PIPE_FORMAT_R16G16B16A16_UNORM
,
695 target
, sample_count
, bindings
))
696 return PIPE_FORMAT_R16G16B16A16_UNORM
;
697 return default_rgba_format( screen
, target
, sample_count
, bindings
);
701 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B4G4R4A4_UNORM
,
702 target
, sample_count
, bindings
))
703 return PIPE_FORMAT_B4G4R4A4_UNORM
;
704 return default_rgba_format( screen
, target
, sample_count
, bindings
);
707 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B5G5R5A1_UNORM
,
708 target
, sample_count
, bindings
))
709 return PIPE_FORMAT_B5G5R5A1_UNORM
;
710 return default_rgba_format( screen
, target
, sample_count
, bindings
);
713 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B2G3R3_UNORM
,
714 target
, sample_count
, bindings
))
715 return PIPE_FORMAT_B2G3R3_UNORM
;
719 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B5G6R5_UNORM
,
720 target
, sample_count
, bindings
))
721 return PIPE_FORMAT_B5G6R5_UNORM
;
722 if (screen
->is_format_supported( screen
, PIPE_FORMAT_B5G5R5A1_UNORM
,
723 target
, sample_count
, bindings
))
724 return PIPE_FORMAT_B5G5R5A1_UNORM
;
725 return default_rgba_format( screen
, target
, sample_count
, bindings
);
729 if (screen
->is_format_supported( screen
, PIPE_FORMAT_A16_UNORM
, target
,
730 sample_count
, bindings
))
731 return PIPE_FORMAT_A16_UNORM
;
736 case GL_COMPRESSED_ALPHA
:
737 if (screen
->is_format_supported( screen
, PIPE_FORMAT_A8_UNORM
, target
,
738 sample_count
, bindings
))
739 return PIPE_FORMAT_A8_UNORM
;
740 return default_rgba_format( screen
, target
, sample_count
, bindings
);
744 if (screen
->is_format_supported( screen
, PIPE_FORMAT_L16_UNORM
, target
,
745 sample_count
, bindings
))
746 return PIPE_FORMAT_L16_UNORM
;
752 if (screen
->is_format_supported( screen
, PIPE_FORMAT_L8_UNORM
, target
,
753 sample_count
, bindings
))
754 return PIPE_FORMAT_L8_UNORM
;
755 return default_rgba_format( screen
, target
, sample_count
, bindings
);
757 case GL_LUMINANCE12_ALPHA4
:
758 case GL_LUMINANCE12_ALPHA12
:
759 case GL_LUMINANCE16_ALPHA16
:
760 if (screen
->is_format_supported( screen
, PIPE_FORMAT_L16A16_UNORM
, target
,
761 sample_count
, bindings
))
762 return PIPE_FORMAT_L16A16_UNORM
;
765 case GL_LUMINANCE_ALPHA
:
766 case GL_LUMINANCE6_ALPHA2
:
767 case GL_LUMINANCE8_ALPHA8
:
768 if (screen
->is_format_supported( screen
, PIPE_FORMAT_L8A8_UNORM
, target
,
769 sample_count
, bindings
))
770 return PIPE_FORMAT_L8A8_UNORM
;
771 return default_rgba_format( screen
, target
, sample_count
, bindings
);
773 case GL_LUMINANCE4_ALPHA4
:
774 if (screen
->is_format_supported( screen
, PIPE_FORMAT_L4A4_UNORM
, target
,
775 sample_count
, bindings
))
776 return PIPE_FORMAT_L4A4_UNORM
;
777 if (screen
->is_format_supported( screen
, PIPE_FORMAT_L8A8_UNORM
, target
,
778 sample_count
, bindings
))
779 return PIPE_FORMAT_L8A8_UNORM
;
780 return default_rgba_format( screen
, target
, sample_count
, bindings
);
784 if (screen
->is_format_supported( screen
, PIPE_FORMAT_I16_UNORM
, target
,
785 sample_count
, bindings
))
786 return PIPE_FORMAT_I16_UNORM
;
791 case GL_COMPRESSED_INTENSITY
:
792 if (screen
->is_format_supported( screen
, PIPE_FORMAT_I8_UNORM
, target
,
793 sample_count
, bindings
))
794 return PIPE_FORMAT_I8_UNORM
;
795 return default_rgba_format( screen
, target
, sample_count
, bindings
);
798 if (screen
->is_format_supported(screen
, PIPE_FORMAT_UYVY
, target
,
799 sample_count
, bindings
)) {
800 return PIPE_FORMAT_UYVY
;
802 if (screen
->is_format_supported(screen
, PIPE_FORMAT_YUYV
, target
,
803 sample_count
, bindings
)) {
804 return PIPE_FORMAT_YUYV
;
806 return PIPE_FORMAT_NONE
;
808 case GL_COMPRESSED_RGB
:
809 /* can only sample from compressed formats */
810 if (bindings
& ~PIPE_BIND_SAMPLER_VIEW
)
811 return PIPE_FORMAT_NONE
;
812 else if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT1_RGB
,
813 target
, sample_count
, bindings
))
814 return PIPE_FORMAT_DXT1_RGB
;
816 return default_rgb_format(screen
, target
, sample_count
, bindings
);
818 case GL_COMPRESSED_RGBA
:
819 /* can only sample from compressed formats */
820 if (bindings
& ~PIPE_BIND_SAMPLER_VIEW
)
821 return PIPE_FORMAT_NONE
;
822 else if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT3_RGBA
,
823 target
, sample_count
, bindings
))
824 return PIPE_FORMAT_DXT3_RGBA
;
826 return default_rgba_format(screen
, target
, sample_count
, bindings
);
830 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
831 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT1_RGB
,
832 target
, sample_count
, bindings
))
833 return PIPE_FORMAT_DXT1_RGB
;
835 return PIPE_FORMAT_NONE
;
837 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
838 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT1_RGBA
,
839 target
, sample_count
, bindings
))
840 return PIPE_FORMAT_DXT1_RGBA
;
842 return PIPE_FORMAT_NONE
;
846 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
847 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT3_RGBA
,
848 target
, sample_count
, bindings
))
849 return PIPE_FORMAT_DXT3_RGBA
;
851 return PIPE_FORMAT_NONE
;
853 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
854 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT5_RGBA
,
855 target
, sample_count
, bindings
))
856 return PIPE_FORMAT_DXT5_RGBA
;
858 return PIPE_FORMAT_NONE
;
861 case GL_COMPRESSED_RGB_FXT1_3DFX
:
862 return PIPE_FORMAT_RGB_FXT1
;
863 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
864 return PIPE_FORMAT_RGB_FXT1
;
867 case GL_DEPTH_COMPONENT16
:
868 if (screen
->is_format_supported(screen
, PIPE_FORMAT_Z16_UNORM
, target
,
869 sample_count
, bindings
))
870 return PIPE_FORMAT_Z16_UNORM
;
872 case GL_DEPTH_COMPONENT24
:
873 if (screen
->is_format_supported(screen
, PIPE_FORMAT_Z24_UNORM_S8_USCALED
,
874 target
, sample_count
, bindings
))
875 return PIPE_FORMAT_Z24_UNORM_S8_USCALED
;
876 if (screen
->is_format_supported(screen
, PIPE_FORMAT_S8_USCALED_Z24_UNORM
,
877 target
, sample_count
, bindings
))
878 return PIPE_FORMAT_S8_USCALED_Z24_UNORM
;
880 case GL_DEPTH_COMPONENT32
:
881 if (screen
->is_format_supported(screen
, PIPE_FORMAT_Z32_UNORM
, target
,
882 sample_count
, bindings
))
883 return PIPE_FORMAT_Z32_UNORM
;
885 case GL_DEPTH_COMPONENT
:
887 static const enum pipe_format formats
[] = {
888 PIPE_FORMAT_Z32_UNORM
,
889 PIPE_FORMAT_Z24_UNORM_S8_USCALED
,
890 PIPE_FORMAT_S8_USCALED_Z24_UNORM
,
891 PIPE_FORMAT_Z16_UNORM
893 return find_supported_format(screen
, formats
, Elements(formats
),
894 target
, sample_count
, bindings
);
897 case GL_STENCIL_INDEX
:
898 case GL_STENCIL_INDEX1_EXT
:
899 case GL_STENCIL_INDEX4_EXT
:
900 case GL_STENCIL_INDEX8_EXT
:
901 case GL_STENCIL_INDEX16_EXT
:
903 static const enum pipe_format formats
[] = {
904 PIPE_FORMAT_S8_USCALED
,
905 PIPE_FORMAT_Z24_UNORM_S8_USCALED
,
906 PIPE_FORMAT_S8_USCALED_Z24_UNORM
908 return find_supported_format(screen
, formats
, Elements(formats
),
909 target
, sample_count
, bindings
);
912 case GL_DEPTH_STENCIL_EXT
:
913 case GL_DEPTH24_STENCIL8_EXT
:
915 static const enum pipe_format formats
[] = {
916 PIPE_FORMAT_Z24_UNORM_S8_USCALED
,
917 PIPE_FORMAT_S8_USCALED_Z24_UNORM
919 return find_supported_format(screen
, formats
, Elements(formats
),
920 target
, sample_count
, bindings
);
925 case GL_SRGB_ALPHA_EXT
:
926 case GL_SRGB8_ALPHA8_EXT
:
927 return default_srgba_format( screen
, target
, sample_count
, bindings
);
929 case GL_COMPRESSED_SRGB_EXT
:
930 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
931 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT1_SRGB
, target
,
932 sample_count
, bindings
))
933 return PIPE_FORMAT_DXT1_SRGB
;
934 return default_srgba_format( screen
, target
, sample_count
, bindings
);
936 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
937 return PIPE_FORMAT_DXT1_SRGBA
;
939 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
940 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
941 if (screen
->is_format_supported(screen
, PIPE_FORMAT_DXT3_SRGBA
, target
,
942 sample_count
, bindings
))
943 return PIPE_FORMAT_DXT3_SRGBA
;
944 return default_srgba_format( screen
, target
, sample_count
, bindings
);
946 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
947 return PIPE_FORMAT_DXT5_SRGBA
;
949 case GL_SLUMINANCE_ALPHA_EXT
:
950 case GL_SLUMINANCE8_ALPHA8_EXT
:
951 case GL_COMPRESSED_SLUMINANCE_EXT
:
952 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
953 if (screen
->is_format_supported(screen
, PIPE_FORMAT_L8A8_SRGB
, target
,
954 sample_count
, bindings
))
955 return PIPE_FORMAT_L8A8_SRGB
;
956 return default_srgba_format( screen
, target
, sample_count
, bindings
);
958 case GL_SLUMINANCE_EXT
:
959 case GL_SLUMINANCE8_EXT
:
960 if (screen
->is_format_supported(screen
, PIPE_FORMAT_L8_SRGB
, target
,
961 sample_count
, bindings
))
962 return PIPE_FORMAT_L8_SRGB
;
963 return default_srgba_format( screen
, target
, sample_count
, bindings
);
965 /* prefer formats in order of data size, choosing 16-bit ones if equal sized */
968 static const enum pipe_format formats
[] = {
969 PIPE_FORMAT_R16G16B16A16_FLOAT
,
970 PIPE_FORMAT_R32G32B32A32_FLOAT
972 return find_supported_format(screen
, formats
, Elements(formats
),
973 target
, sample_count
, bindings
);
977 static const enum pipe_format formats
[] = {
978 PIPE_FORMAT_R16G16B16_FLOAT
,
979 PIPE_FORMAT_R16G16B16A16_FLOAT
,
980 PIPE_FORMAT_R32G32B32_FLOAT
,
981 PIPE_FORMAT_R32G32B32A32_FLOAT
983 return find_supported_format(screen
, formats
, Elements(formats
),
984 target
, sample_count
, bindings
);
986 case GL_LUMINANCE_ALPHA16F_ARB
:
988 static const enum pipe_format formats
[] = {
989 PIPE_FORMAT_L16A16_FLOAT
,
990 PIPE_FORMAT_R16G16B16A16_FLOAT
,
991 PIPE_FORMAT_L32A32_FLOAT
,
992 PIPE_FORMAT_R32G32B32A32_FLOAT
994 return find_supported_format(screen
, formats
, Elements(formats
),
995 target
, sample_count
, bindings
);
997 case GL_ALPHA16F_ARB
:
999 static const enum pipe_format formats
[] = {
1000 PIPE_FORMAT_A16_FLOAT
,
1001 PIPE_FORMAT_L16A16_FLOAT
,
1002 PIPE_FORMAT_A32_FLOAT
,
1003 PIPE_FORMAT_R16G16B16A16_FLOAT
,
1004 PIPE_FORMAT_L32A32_FLOAT
,
1005 PIPE_FORMAT_R32G32B32A32_FLOAT
1007 return find_supported_format(screen
, formats
, Elements(formats
),
1008 target
, sample_count
, bindings
);
1010 case GL_INTENSITY16F_ARB
:
1012 static const enum pipe_format formats
[] = {
1013 PIPE_FORMAT_I16_FLOAT
,
1014 PIPE_FORMAT_L16A16_FLOAT
,
1015 PIPE_FORMAT_I32_FLOAT
,
1016 PIPE_FORMAT_R16G16B16A16_FLOAT
,
1017 PIPE_FORMAT_L32A32_FLOAT
,
1018 PIPE_FORMAT_R32G32B32A32_FLOAT
1020 return find_supported_format(screen
, formats
, Elements(formats
),
1021 target
, sample_count
, bindings
);
1023 case GL_LUMINANCE16F_ARB
:
1025 static const enum pipe_format formats
[] = {
1026 PIPE_FORMAT_L16_FLOAT
,
1027 PIPE_FORMAT_L16A16_FLOAT
,
1028 PIPE_FORMAT_L32_FLOAT
,
1029 PIPE_FORMAT_R16G16B16A16_FLOAT
,
1030 PIPE_FORMAT_L32A32_FLOAT
,
1031 PIPE_FORMAT_R32G32B32A32_FLOAT
1033 return find_supported_format(screen
, formats
, Elements(formats
),
1034 target
, sample_count
, bindings
);
1038 static const enum pipe_format formats
[] = {
1039 PIPE_FORMAT_R16_FLOAT
,
1040 PIPE_FORMAT_R16G16_FLOAT
,
1041 PIPE_FORMAT_R32_FLOAT
,
1042 PIPE_FORMAT_R16G16B16A16_FLOAT
,
1043 PIPE_FORMAT_R32G32_FLOAT
,
1044 PIPE_FORMAT_R32G32B32A32_FLOAT
1046 return find_supported_format(screen
, formats
, Elements(formats
),
1047 target
, sample_count
, bindings
);
1051 static const enum pipe_format formats
[] = {
1052 PIPE_FORMAT_R16G16_FLOAT
,
1053 PIPE_FORMAT_R16G16B16A16_FLOAT
,
1054 PIPE_FORMAT_R32G32_FLOAT
,
1055 PIPE_FORMAT_R32G32B32A32_FLOAT
1057 return find_supported_format(screen
, formats
, Elements(formats
),
1058 target
, sample_count
, bindings
);
1061 /* try a 32-bit format if available, otherwise fallback to a 16-bit one */
1062 case GL_RGBA32F_ARB
:
1064 static const enum pipe_format formats
[] = {
1065 PIPE_FORMAT_R32G32B32A32_FLOAT
,
1066 PIPE_FORMAT_R16G16B16A16_FLOAT
1068 return find_supported_format(screen
, formats
, Elements(formats
),
1069 target
, sample_count
, bindings
);
1073 static const enum pipe_format formats
[] = {
1074 PIPE_FORMAT_R32G32B32_FLOAT
,
1075 PIPE_FORMAT_R32G32B32A32_FLOAT
,
1076 PIPE_FORMAT_R16G16B16A16_FLOAT
1078 return find_supported_format(screen
, formats
, Elements(formats
),
1079 target
, sample_count
, bindings
);
1081 case GL_LUMINANCE_ALPHA32F_ARB
:
1083 static const enum pipe_format formats
[] = {
1084 PIPE_FORMAT_L32A32_FLOAT
,
1085 PIPE_FORMAT_R32G32B32A32_FLOAT
,
1086 PIPE_FORMAT_L16A16_FLOAT
,
1087 PIPE_FORMAT_R16G16B16A16_FLOAT
1089 return find_supported_format(screen
, formats
, Elements(formats
),
1090 target
, sample_count
, bindings
);
1092 case GL_ALPHA32F_ARB
:
1094 static const enum pipe_format formats
[] = {
1095 PIPE_FORMAT_A32_FLOAT
,
1096 PIPE_FORMAT_L32A32_FLOAT
,
1097 PIPE_FORMAT_R32G32B32A32_FLOAT
,
1098 PIPE_FORMAT_A16_FLOAT
,
1099 PIPE_FORMAT_L16A16_FLOAT
,
1100 PIPE_FORMAT_R16G16B16A16_FLOAT
1102 return find_supported_format(screen
, formats
, Elements(formats
),
1103 target
, sample_count
, bindings
);
1105 case GL_INTENSITY32F_ARB
:
1107 static const enum pipe_format formats
[] = {
1108 PIPE_FORMAT_I32_FLOAT
,
1109 PIPE_FORMAT_L32A32_FLOAT
,
1110 PIPE_FORMAT_R32G32B32A32_FLOAT
,
1111 PIPE_FORMAT_I16_FLOAT
,
1112 PIPE_FORMAT_L16A16_FLOAT
,
1113 PIPE_FORMAT_R16G16B16A16_FLOAT
1115 return find_supported_format(screen
, formats
, Elements(formats
),
1116 target
, sample_count
, bindings
);
1118 case GL_LUMINANCE32F_ARB
:
1120 static const enum pipe_format formats
[] = {
1121 PIPE_FORMAT_L32_FLOAT
,
1122 PIPE_FORMAT_L32A32_FLOAT
,
1123 PIPE_FORMAT_R32G32B32A32_FLOAT
,
1124 PIPE_FORMAT_L16_FLOAT
,
1125 PIPE_FORMAT_L16A16_FLOAT
,
1126 PIPE_FORMAT_R16G16B16A16_FLOAT
1128 return find_supported_format(screen
, formats
, Elements(formats
),
1129 target
, sample_count
, bindings
);
1133 static const enum pipe_format formats
[] = {
1134 PIPE_FORMAT_R32_FLOAT
,
1135 PIPE_FORMAT_R32G32_FLOAT
,
1136 PIPE_FORMAT_R32G32B32A32_FLOAT
,
1137 PIPE_FORMAT_R16_FLOAT
,
1138 PIPE_FORMAT_R16G16_FLOAT
,
1139 PIPE_FORMAT_R16G16B16A16_FLOAT
1141 return find_supported_format(screen
, formats
, Elements(formats
),
1142 target
, sample_count
, bindings
);
1146 static const enum pipe_format formats
[] = {
1147 PIPE_FORMAT_R32G32_FLOAT
,
1148 PIPE_FORMAT_R32G32B32A32_FLOAT
,
1149 PIPE_FORMAT_R16G16_FLOAT
,
1150 PIPE_FORMAT_R16G16B16A16_FLOAT
1152 return find_supported_format(screen
, formats
, Elements(formats
),
1153 target
, sample_count
, bindings
);
1158 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R8_UNORM
, target
,
1159 sample_count
, bindings
))
1160 return PIPE_FORMAT_R8_UNORM
;
1161 return PIPE_FORMAT_NONE
;
1164 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R8G8_UNORM
, target
,
1165 sample_count
, bindings
))
1166 return PIPE_FORMAT_R8G8_UNORM
;
1167 return PIPE_FORMAT_NONE
;
1170 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R16_UNORM
, target
,
1171 sample_count
, bindings
))
1172 return PIPE_FORMAT_R16_UNORM
;
1173 return PIPE_FORMAT_NONE
;
1176 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R16G16_UNORM
, target
,
1177 sample_count
, bindings
))
1178 return PIPE_FORMAT_R16G16_UNORM
;
1179 return PIPE_FORMAT_NONE
;
1181 case GL_COMPRESSED_RED
:
1182 case GL_COMPRESSED_RED_RGTC1
:
1183 if (screen
->is_format_supported(screen
, PIPE_FORMAT_RGTC1_UNORM
, target
,
1184 sample_count
, bindings
))
1185 return PIPE_FORMAT_RGTC1_UNORM
;
1186 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R8_UNORM
, target
,
1187 sample_count
, bindings
))
1188 return PIPE_FORMAT_R8_UNORM
;
1189 return PIPE_FORMAT_NONE
;
1191 case GL_COMPRESSED_SIGNED_RED_RGTC1
:
1192 if (screen
->is_format_supported(screen
, PIPE_FORMAT_RGTC1_SNORM
, target
,
1193 sample_count
, bindings
))
1194 return PIPE_FORMAT_RGTC1_SNORM
;
1195 return PIPE_FORMAT_NONE
;
1197 case GL_COMPRESSED_RG
:
1198 case GL_COMPRESSED_RG_RGTC2
:
1199 if (screen
->is_format_supported(screen
, PIPE_FORMAT_RGTC2_UNORM
, target
,
1200 sample_count
, bindings
))
1201 return PIPE_FORMAT_RGTC2_UNORM
;
1202 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R8G8_UNORM
, target
,
1203 sample_count
, bindings
))
1204 return PIPE_FORMAT_R8G8_UNORM
;
1205 return PIPE_FORMAT_NONE
;
1207 case GL_COMPRESSED_SIGNED_RG_RGTC2
:
1208 if (screen
->is_format_supported(screen
, PIPE_FORMAT_RGTC2_SNORM
, target
,
1209 sample_count
, bindings
))
1210 return PIPE_FORMAT_RGTC2_SNORM
;
1211 return PIPE_FORMAT_NONE
;
1213 case GL_COMPRESSED_LUMINANCE
:
1214 case GL_COMPRESSED_LUMINANCE_LATC1_EXT
:
1215 if (screen
->is_format_supported(screen
, PIPE_FORMAT_LATC1_UNORM
, target
,
1216 sample_count
, bindings
))
1217 return PIPE_FORMAT_LATC1_UNORM
;
1218 if (screen
->is_format_supported(screen
, PIPE_FORMAT_L8_UNORM
, target
,
1219 sample_count
, bindings
))
1220 return PIPE_FORMAT_L8_UNORM
;
1221 return PIPE_FORMAT_NONE
;
1223 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT
:
1224 if (screen
->is_format_supported(screen
, PIPE_FORMAT_LATC1_SNORM
, target
,
1225 sample_count
, bindings
))
1226 return PIPE_FORMAT_LATC1_SNORM
;
1227 return PIPE_FORMAT_NONE
;
1229 case GL_COMPRESSED_LUMINANCE_ALPHA
:
1230 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT
:
1231 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI
:
1232 if (screen
->is_format_supported(screen
, PIPE_FORMAT_LATC2_UNORM
, target
,
1233 sample_count
, bindings
))
1234 return PIPE_FORMAT_LATC2_UNORM
;
1235 if (screen
->is_format_supported(screen
, PIPE_FORMAT_L8A8_UNORM
, target
,
1236 sample_count
, bindings
))
1237 return PIPE_FORMAT_L8A8_UNORM
;
1238 return PIPE_FORMAT_NONE
;
1240 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT
:
1241 if (screen
->is_format_supported(screen
, PIPE_FORMAT_LATC2_SNORM
, target
,
1242 sample_count
, bindings
))
1243 return PIPE_FORMAT_LATC2_SNORM
;
1244 return PIPE_FORMAT_NONE
;
1246 /* signed/unsigned integer formats.
1247 * XXX Mesa only has formats for RGBA signed/unsigned integer formats.
1248 * If/when new formats are added this code should be updated.
1250 case GL_RED_INTEGER_EXT
:
1251 case GL_GREEN_INTEGER_EXT
:
1252 case GL_BLUE_INTEGER_EXT
:
1253 case GL_ALPHA_INTEGER_EXT
:
1254 case GL_RGB_INTEGER_EXT
:
1255 case GL_RGBA_INTEGER_EXT
:
1256 case GL_BGR_INTEGER_EXT
:
1257 case GL_BGRA_INTEGER_EXT
:
1258 case GL_LUMINANCE_INTEGER_EXT
:
1259 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1263 case GL_ALPHA8I_EXT
:
1264 case GL_INTENSITY8I_EXT
:
1265 case GL_LUMINANCE8I_EXT
:
1266 case GL_LUMINANCE_ALPHA8I_EXT
:
1267 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R8G8B8A8_SSCALED
,
1269 sample_count
, bindings
))
1270 return PIPE_FORMAT_R8G8B8A8_SSCALED
;
1271 return PIPE_FORMAT_NONE
;
1272 case GL_RGBA16I_EXT
:
1274 case GL_ALPHA16I_EXT
:
1275 case GL_INTENSITY16I_EXT
:
1276 case GL_LUMINANCE16I_EXT
:
1277 case GL_LUMINANCE_ALPHA16I_EXT
:
1278 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R16G16B16A16_SSCALED
,
1280 sample_count
, bindings
))
1281 return PIPE_FORMAT_R16G16B16A16_SSCALED
;
1282 return PIPE_FORMAT_NONE
;
1283 case GL_RGBA32I_EXT
:
1285 case GL_ALPHA32I_EXT
:
1286 case GL_INTENSITY32I_EXT
:
1287 case GL_LUMINANCE32I_EXT
:
1288 case GL_LUMINANCE_ALPHA32I_EXT
:
1290 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R32G32B32A32_SSCALED
,
1292 sample_count
, bindings
))
1293 return PIPE_FORMAT_R32G32B32A32_SSCALED
;
1294 return PIPE_FORMAT_NONE
;
1296 case GL_RGBA8UI_EXT
:
1298 case GL_ALPHA8UI_EXT
:
1299 case GL_INTENSITY8UI_EXT
:
1300 case GL_LUMINANCE8UI_EXT
:
1301 case GL_LUMINANCE_ALPHA8UI_EXT
:
1302 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R8G8B8A8_USCALED
,
1304 sample_count
, bindings
))
1305 return PIPE_FORMAT_R8G8B8A8_USCALED
;
1306 return PIPE_FORMAT_NONE
;
1308 case GL_RGBA16UI_EXT
:
1309 case GL_RGB16UI_EXT
:
1310 case GL_ALPHA16UI_EXT
:
1311 case GL_INTENSITY16UI_EXT
:
1312 case GL_LUMINANCE16UI_EXT
:
1313 case GL_LUMINANCE_ALPHA16UI_EXT
:
1314 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R16G16B16A16_USCALED
,
1316 sample_count
, bindings
))
1317 return PIPE_FORMAT_R16G16B16A16_USCALED
;
1318 return PIPE_FORMAT_NONE
;
1320 case GL_RGBA32UI_EXT
:
1321 case GL_RGB32UI_EXT
:
1322 case GL_ALPHA32UI_EXT
:
1323 case GL_INTENSITY32UI_EXT
:
1324 case GL_LUMINANCE32UI_EXT
:
1325 case GL_LUMINANCE_ALPHA32UI_EXT
:
1326 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R32G32B32A32_USCALED
,
1328 sample_count
, bindings
))
1329 return PIPE_FORMAT_R32G32B32A32_USCALED
;
1330 return PIPE_FORMAT_NONE
;
1332 /* signed normalized formats */
1336 static const enum pipe_format formats
[] = {
1337 PIPE_FORMAT_R8_SNORM
,
1338 PIPE_FORMAT_R8G8_SNORM
,
1339 PIPE_FORMAT_R8G8B8A8_SNORM
,
1341 return find_supported_format(screen
, formats
, Elements(formats
),
1342 target
, sample_count
, bindings
);
1347 static const enum pipe_format formats
[] = {
1348 PIPE_FORMAT_R16_SNORM
,
1349 PIPE_FORMAT_R16G16_SNORM
,
1350 PIPE_FORMAT_R16G16B16A16_SNORM
,
1351 PIPE_FORMAT_R8_SNORM
,
1352 PIPE_FORMAT_R8G8_SNORM
,
1353 PIPE_FORMAT_R8G8B8A8_SNORM
,
1355 return find_supported_format(screen
, formats
, Elements(formats
),
1356 target
, sample_count
, bindings
);
1362 static const enum pipe_format formats
[] = {
1363 PIPE_FORMAT_R8G8_SNORM
,
1364 PIPE_FORMAT_R8G8B8A8_SNORM
,
1366 return find_supported_format(screen
, formats
, Elements(formats
),
1367 target
, sample_count
, bindings
);
1372 static const enum pipe_format formats
[] = {
1373 PIPE_FORMAT_R16G16_SNORM
,
1374 PIPE_FORMAT_R16G16B16A16_SNORM
,
1375 PIPE_FORMAT_R8G8_SNORM
,
1376 PIPE_FORMAT_R8G8B8A8_SNORM
,
1378 return find_supported_format(screen
, formats
, Elements(formats
),
1379 target
, sample_count
, bindings
);
1385 case GL_RGBA8_SNORM
:
1386 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R8G8B8A8_SNORM
,
1388 sample_count
, bindings
))
1389 return PIPE_FORMAT_R8G8B8A8_SNORM
;
1390 return PIPE_FORMAT_NONE
;
1392 case GL_RGB16_SNORM
:
1393 case GL_RGBA16_SNORM
:
1395 static const enum pipe_format formats
[] = {
1396 PIPE_FORMAT_R16G16B16A16_SNORM
,
1397 PIPE_FORMAT_R8G8B8A8_SNORM
,
1399 return find_supported_format(screen
, formats
, Elements(formats
),
1400 target
, sample_count
, bindings
);
1404 case GL_ALPHA_SNORM
:
1405 case GL_ALPHA8_SNORM
:
1407 static const enum pipe_format formats
[] = {
1408 PIPE_FORMAT_A8_SNORM
,
1409 PIPE_FORMAT_R8G8B8A8_SNORM
,
1411 return find_supported_format(screen
, formats
, Elements(formats
),
1412 target
, sample_count
, bindings
);
1415 case GL_ALPHA16_SNORM
:
1417 static const enum pipe_format formats
[] = {
1418 PIPE_FORMAT_A16_SNORM
,
1419 PIPE_FORMAT_R16G16B16A16_SNORM
,
1420 PIPE_FORMAT_A8_SNORM
,
1421 PIPE_FORMAT_R8G8B8A8_SNORM
,
1423 return find_supported_format(screen
, formats
, Elements(formats
),
1424 target
, sample_count
, bindings
);
1427 case GL_LUMINANCE_SNORM
:
1428 case GL_LUMINANCE8_SNORM
:
1430 static const enum pipe_format formats
[] = {
1431 PIPE_FORMAT_L8_SNORM
,
1432 PIPE_FORMAT_R8G8B8A8_SNORM
,
1434 return find_supported_format(screen
, formats
, Elements(formats
),
1435 target
, sample_count
, bindings
);
1438 case GL_LUMINANCE16_SNORM
:
1440 static const enum pipe_format formats
[] = {
1441 PIPE_FORMAT_L16_SNORM
,
1442 PIPE_FORMAT_R16G16B16A16_SNORM
,
1443 PIPE_FORMAT_L8_SNORM
,
1444 PIPE_FORMAT_R8G8B8A8_SNORM
,
1446 return find_supported_format(screen
, formats
, Elements(formats
),
1447 target
, sample_count
, bindings
);
1450 case GL_LUMINANCE_ALPHA_SNORM
:
1451 case GL_LUMINANCE8_ALPHA8_SNORM
:
1453 static const enum pipe_format formats
[] = {
1454 PIPE_FORMAT_L8A8_SNORM
,
1455 PIPE_FORMAT_R8G8B8A8_SNORM
,
1457 return find_supported_format(screen
, formats
, Elements(formats
),
1458 target
, sample_count
, bindings
);
1461 case GL_LUMINANCE16_ALPHA16_SNORM
:
1463 static const enum pipe_format formats
[] = {
1464 PIPE_FORMAT_L16A16_SNORM
,
1465 PIPE_FORMAT_R16G16B16A16_SNORM
,
1466 PIPE_FORMAT_L8A8_SNORM
,
1467 PIPE_FORMAT_R8G8B8A8_SNORM
,
1469 return find_supported_format(screen
, formats
, Elements(formats
),
1470 target
, sample_count
, bindings
);
1473 case GL_INTENSITY_SNORM
:
1474 case GL_INTENSITY8_SNORM
:
1476 static const enum pipe_format formats
[] = {
1477 PIPE_FORMAT_I8_SNORM
,
1478 PIPE_FORMAT_R8G8B8A8_SNORM
,
1480 return find_supported_format(screen
, formats
, Elements(formats
),
1481 target
, sample_count
, bindings
);
1484 case GL_INTENSITY16_SNORM
:
1486 static const enum pipe_format formats
[] = {
1487 PIPE_FORMAT_I16_SNORM
,
1488 PIPE_FORMAT_R16G16B16A16_SNORM
,
1489 PIPE_FORMAT_I8_SNORM
,
1490 PIPE_FORMAT_R8G8B8A8_SNORM
,
1492 return find_supported_format(screen
, formats
, Elements(formats
),
1493 target
, sample_count
, bindings
);
1497 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R9G9B9E5_FLOAT
, target
,
1498 sample_count
, bindings
)) {
1499 return PIPE_FORMAT_R9G9B9E5_FLOAT
;
1501 return PIPE_FORMAT_NONE
;
1503 case GL_R11F_G11F_B10F
:
1504 if (screen
->is_format_supported(screen
, PIPE_FORMAT_R11G11B10_FLOAT
, target
,
1505 sample_count
, bindings
)) {
1506 return PIPE_FORMAT_R11G11B10_FLOAT
;
1508 return PIPE_FORMAT_NONE
;
1511 return PIPE_FORMAT_NONE
;
1517 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
1520 st_choose_renderbuffer_format(struct pipe_screen
*screen
,
1521 GLenum internalFormat
, unsigned sample_count
)
1524 if (_mesa_is_depth_or_stencil_format(internalFormat
))
1525 usage
= PIPE_BIND_DEPTH_STENCIL
;
1527 usage
= PIPE_BIND_RENDER_TARGET
;
1528 return st_choose_format(screen
, internalFormat
, PIPE_TEXTURE_2D
,
1529 sample_count
, usage
);
1534 * Called via ctx->Driver.chooseTextureFormat().
1537 st_ChooseTextureFormat_renderable(struct gl_context
*ctx
, GLint internalFormat
,
1538 GLenum format
, GLenum type
, GLboolean renderable
)
1540 struct pipe_screen
*screen
= st_context(ctx
)->pipe
->screen
;
1541 enum pipe_format pFormat
;
1547 /* GL textures may wind up being render targets, but we don't know
1548 * that in advance. Specify potential render target flags now.
1550 bindings
= PIPE_BIND_SAMPLER_VIEW
;
1551 if (renderable
== GL_TRUE
) {
1552 if (_mesa_is_depth_format(internalFormat
) ||
1553 _mesa_is_depth_or_stencil_format(internalFormat
))
1554 bindings
|= PIPE_BIND_DEPTH_STENCIL
;
1556 bindings
|= PIPE_BIND_RENDER_TARGET
;
1559 pFormat
= st_choose_format(screen
, internalFormat
,
1560 PIPE_TEXTURE_2D
, 0, bindings
);
1562 if (pFormat
== PIPE_FORMAT_NONE
) {
1563 /* try choosing format again, this time without render target bindings */
1564 pFormat
= st_choose_format(screen
, internalFormat
,
1565 PIPE_TEXTURE_2D
, 0, PIPE_BIND_SAMPLER_VIEW
);
1568 if (pFormat
== PIPE_FORMAT_NONE
) {
1569 /* no luck at all */
1570 return MESA_FORMAT_NONE
;
1573 return st_pipe_format_to_mesa_format(pFormat
);
1577 st_ChooseTextureFormat(struct gl_context
*ctx
, GLint internalFormat
,
1578 GLenum format
, GLenum type
)
1580 boolean want_renderable
=
1581 internalFormat
== 3 || internalFormat
== 4 ||
1582 internalFormat
== GL_RGB
|| internalFormat
== GL_RGBA
||
1583 internalFormat
== GL_RGB8
|| internalFormat
== GL_RGBA8
||
1584 internalFormat
== GL_BGRA
;
1586 return st_ChooseTextureFormat_renderable(ctx
, internalFormat
,
1587 format
, type
, want_renderable
);
1591 * Test if a gallium format is equivalent to a GL format/type.
1594 st_equal_formats(enum pipe_format pFormat
, GLenum format
, GLenum type
)
1597 case PIPE_FORMAT_A8B8G8R8_UNORM
:
1598 return format
== GL_RGBA
&& type
== GL_UNSIGNED_BYTE
;
1599 case PIPE_FORMAT_A8R8G8B8_UNORM
:
1600 return format
== GL_BGRA
&& type
== GL_UNSIGNED_BYTE
;
1601 case PIPE_FORMAT_B5G6R5_UNORM
:
1602 return format
== GL_RGB
&& type
== GL_UNSIGNED_SHORT_5_6_5
;
1603 /* XXX more combos... */
1610 st_sampler_compat_formats(enum pipe_format format1
, enum pipe_format format2
)
1612 if (format1
== format2
)
1615 if (format1
== PIPE_FORMAT_B8G8R8A8_UNORM
&&
1616 format2
== PIPE_FORMAT_B8G8R8X8_UNORM
)
1619 if (format1
== PIPE_FORMAT_B8G8R8X8_UNORM
&&
1620 format2
== PIPE_FORMAT_B8G8R8A8_UNORM
)
1623 if (format1
== PIPE_FORMAT_A8B8G8R8_UNORM
&&
1624 format2
== PIPE_FORMAT_X8B8G8R8_UNORM
)
1627 if (format1
== PIPE_FORMAT_X8B8G8R8_UNORM
&&
1628 format2
== PIPE_FORMAT_A8B8G8R8_UNORM
)
1631 if (format1
== PIPE_FORMAT_A8R8G8B8_UNORM
&&
1632 format2
== PIPE_FORMAT_X8R8G8B8_UNORM
)
1635 if (format1
== PIPE_FORMAT_X8R8G8B8_UNORM
&&
1636 format2
== PIPE_FORMAT_A8R8G8B8_UNORM
)
1645 * This is used for translating texture border color and the clear
1646 * color. For example, the clear color is interpreted according to
1647 * the renderbuffer's base format. For example, if clearing a
1648 * GL_LUMINANCE buffer, ClearColor[0] = luminance and ClearColor[1] =
1649 * alpha. Similarly for texture border colors.
1652 st_translate_color(const GLfloat colorIn
[4], GLenum baseFormat
,
1653 GLfloat colorOut
[4])
1655 switch (baseFormat
) {
1657 colorOut
[0] = colorIn
[0];
1663 colorOut
[0] = colorIn
[0];
1664 colorOut
[1] = colorIn
[1];
1669 colorOut
[0] = colorIn
[0];
1670 colorOut
[1] = colorIn
[1];
1671 colorOut
[2] = colorIn
[2];
1675 colorOut
[0] = colorOut
[1] = colorOut
[2] = 0.0;
1676 colorOut
[3] = colorIn
[3];
1679 colorOut
[0] = colorOut
[1] = colorOut
[2] = colorIn
[0];
1682 case GL_LUMINANCE_ALPHA
:
1683 colorOut
[0] = colorOut
[1] = colorOut
[2] = colorIn
[0];
1684 colorOut
[3] = colorIn
[3];
1687 colorOut
[0] = colorOut
[1] = colorOut
[2] = colorOut
[3] = colorIn
[0];
1690 COPY_4V(colorOut
, colorIn
);