1 /**************************************************************************
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
29 * RGBA/float tile get/put functions.
30 * Usable both by drivers and state trackers.
34 #include "pipe/p_defines.h"
35 #include "pipe/p_inlines.h"
37 #include "util/u_math.h"
38 #include "util/u_memory.h"
39 #include "util/u_rect.h"
40 #include "util/u_tile.h"
41 #include "lp_tile_cache.h"
42 #include "lp_tile_soa.h"
46 tile_offset
[TILE_VECTOR_HEIGHT
][TILE_VECTOR_WIDTH
] = {
47 { 0, 1, 4, 5, 8, 9, 12, 13},
48 { 2, 3, 6, 7, 10, 11, 14, 15}
53 /*** PIPE_FORMAT_A8R8G8B8_UNORM ***/
56 a8r8g8b8_get_tile_rgba(const unsigned *src
,
57 unsigned w
, unsigned h
,
62 for (i
= 0; i
< h
; i
++) {
63 for (j
= 0; j
< w
; j
++) {
64 const unsigned pixel
= *src
++;
65 TILE_PIXEL(p
, j
, i
, 0) = (pixel
>> 16) & 0xff;
66 TILE_PIXEL(p
, j
, i
, 1) = (pixel
>> 8) & 0xff;
67 TILE_PIXEL(p
, j
, i
, 2) = (pixel
>> 0) & 0xff;
68 TILE_PIXEL(p
, j
, i
, 3) = (pixel
>> 24) & 0xff;
75 a8r8g8b8_put_tile_rgba(unsigned *dst
,
76 unsigned w
, unsigned h
,
81 for (i
= 0; i
< h
; i
++) {
82 for (j
= 0; j
< w
; j
++) {
84 r
= TILE_PIXEL(p
, j
, i
, 0);
85 g
= TILE_PIXEL(p
, j
, i
, 1);
86 b
= TILE_PIXEL(p
, j
, i
, 2);
87 a
= TILE_PIXEL(p
, j
, i
, 3);
88 *dst
++ = (a
<< 24) | (r
<< 16) | (g
<< 8) | b
;
94 /*** PIPE_FORMAT_A8R8G8B8_UNORM ***/
97 x8r8g8b8_get_tile_rgba(const unsigned *src
,
98 unsigned w
, unsigned h
,
103 for (i
= 0; i
< h
; i
++) {
104 for (j
= 0; j
< w
; j
++) {
105 const unsigned pixel
= *src
++;
106 TILE_PIXEL(p
, j
, i
, 0) = (pixel
>> 16) & 0xff;
107 TILE_PIXEL(p
, j
, i
, 1) = (pixel
>> 8) & 0xff;
108 TILE_PIXEL(p
, j
, i
, 2) = (pixel
>> 0) & 0xff;
109 TILE_PIXEL(p
, j
, i
, 3) = 0xff;
116 x8r8g8b8_put_tile_rgba(unsigned *dst
,
117 unsigned w
, unsigned h
,
122 for (i
= 0; i
< h
; i
++) {
123 for (j
= 0; j
< w
; j
++) {
125 r
= TILE_PIXEL(p
, j
, i
, 0);
126 g
= TILE_PIXEL(p
, j
, i
, 1);
127 b
= TILE_PIXEL(p
, j
, i
, 2);
128 *dst
++ = (0xff << 24) | (r
<< 16) | (g
<< 8) | b
;
134 /*** PIPE_FORMAT_B8G8R8A8_UNORM ***/
137 b8g8r8a8_get_tile_rgba(const unsigned *src
,
138 unsigned w
, unsigned h
,
143 for (i
= 0; i
< h
; i
++) {
144 for (j
= 0; j
< w
; j
++) {
145 const unsigned pixel
= *src
++;
146 TILE_PIXEL(p
, j
, i
, 0) = (pixel
>> 8) & 0xff;
147 TILE_PIXEL(p
, j
, i
, 1) = (pixel
>> 16) & 0xff;
148 TILE_PIXEL(p
, j
, i
, 2) = (pixel
>> 24) & 0xff;
149 TILE_PIXEL(p
, j
, i
, 3) = (pixel
>> 0) & 0xff;
156 b8g8r8a8_put_tile_rgba(unsigned *dst
,
157 unsigned w
, unsigned h
,
162 for (i
= 0; i
< h
; i
++) {
163 for (j
= 0; j
< w
; j
++) {
165 r
= TILE_PIXEL(p
, j
, i
, 0);
166 g
= TILE_PIXEL(p
, j
, i
, 1);
167 b
= TILE_PIXEL(p
, j
, i
, 2);
168 a
= TILE_PIXEL(p
, j
, i
, 3);
169 *dst
++ = (b
<< 24) | (g
<< 16) | (r
<< 8) | a
;
175 /*** PIPE_FORMAT_A1R5G5B5_UNORM ***/
178 a1r5g5b5_get_tile_rgba(const ushort
*src
,
179 unsigned w
, unsigned h
,
184 for (i
= 0; i
< h
; i
++) {
185 for (j
= 0; j
< w
; j
++) {
186 const ushort pixel
= *src
++;
187 TILE_PIXEL(p
, j
, i
, 0) = ((pixel
>> 10) & 0x1f) * 255 / 31;
188 TILE_PIXEL(p
, j
, i
, 1) = ((pixel
>> 5) & 0x1f) * 255 / 31;
189 TILE_PIXEL(p
, j
, i
, 2) = ((pixel
) & 0x1f) * 255 / 31;
190 TILE_PIXEL(p
, j
, i
, 3) = ((pixel
>> 15) ) * 255;
197 a1r5g5b5_put_tile_rgba(ushort
*dst
,
198 unsigned w
, unsigned h
,
203 for (i
= 0; i
< h
; i
++) {
204 for (j
= 0; j
< w
; j
++) {
206 r
= TILE_PIXEL(p
, j
, i
, 0);
207 g
= TILE_PIXEL(p
, j
, i
, 1);
208 b
= TILE_PIXEL(p
, j
, i
, 2);
209 a
= TILE_PIXEL(p
, j
, i
, 3);
210 r
= r
>> 3; /* 5 bits */
211 g
= g
>> 3; /* 5 bits */
212 b
= b
>> 3; /* 5 bits */
213 a
= a
>> 7; /* 1 bit */
214 *dst
++ = (a
<< 15) | (r
<< 10) | (g
<< 5) | b
;
220 /*** PIPE_FORMAT_A4R4G4B4_UNORM ***/
223 a4r4g4b4_get_tile_rgba(const ushort
*src
,
224 unsigned w
, unsigned h
,
229 for (i
= 0; i
< h
; i
++) {
230 for (j
= 0; j
< w
; j
++) {
231 const ushort pixel
= *src
++;
232 TILE_PIXEL(p
, j
, i
, 0) = ((pixel
>> 8) & 0xf) * 255 / 15;
233 TILE_PIXEL(p
, j
, i
, 1) = ((pixel
>> 4) & 0xf) * 255 / 15;
234 TILE_PIXEL(p
, j
, i
, 2) = ((pixel
) & 0xf) * 255 / 15;
235 TILE_PIXEL(p
, j
, i
, 3) = ((pixel
>> 12) ) * 255 / 15;
242 a4r4g4b4_put_tile_rgba(ushort
*dst
,
243 unsigned w
, unsigned h
,
248 for (i
= 0; i
< h
; i
++) {
249 for (j
= 0; j
< w
; j
++) {
251 r
= TILE_PIXEL(p
, j
, i
, 0);
252 g
= TILE_PIXEL(p
, j
, i
, 1);
253 b
= TILE_PIXEL(p
, j
, i
, 2);
254 a
= TILE_PIXEL(p
, j
, i
, 3);
259 *dst
++ = (a
<< 12) | (r
<< 16) | (g
<< 4) | b
;
265 /*** PIPE_FORMAT_R5G6B5_UNORM ***/
268 r5g6b5_get_tile_rgba(const ushort
*src
,
269 unsigned w
, unsigned h
,
274 for (i
= 0; i
< h
; i
++) {
275 for (j
= 0; j
< w
; j
++) {
276 const ushort pixel
= *src
++;
277 TILE_PIXEL(p
, j
, i
, 0) = ((pixel
>> 11) & 0x1f) * 255 / 31;
278 TILE_PIXEL(p
, j
, i
, 1) = ((pixel
>> 5) & 0x3f) * 255 / 63;
279 TILE_PIXEL(p
, j
, i
, 2) = ((pixel
) & 0x1f) * 255 / 31;
280 TILE_PIXEL(p
, j
, i
, 3) = 255;
287 r5g6b5_put_tile_rgba(ushort
*dst
,
288 unsigned w
, unsigned h
,
293 for (i
= 0; i
< h
; i
++) {
294 for (j
= 0; j
< w
; j
++) {
295 uint r
= (uint
) TILE_PIXEL(p
, j
, i
, 0) * 31 / 255;
296 uint g
= (uint
) TILE_PIXEL(p
, j
, i
, 1) * 63 / 255;
297 uint b
= (uint
) TILE_PIXEL(p
, j
, i
, 2) * 31 / 255;
298 *dst
++ = (r
<< 11) | (g
<< 5) | (b
);
305 /*** PIPE_FORMAT_Z16_UNORM ***/
308 * Return each Z value as four floats in [0,1].
311 z16_get_tile_rgba(const ushort
*src
,
312 unsigned w
, unsigned h
,
315 const float scale
= 1.0f
/ 65535.0f
;
318 for (i
= 0; i
< h
; i
++) {
319 for (j
= 0; j
< w
; j
++) {
320 TILE_PIXEL(p
, j
, i
, 0) =
321 TILE_PIXEL(p
, j
, i
, 1) =
322 TILE_PIXEL(p
, j
, i
, 2) =
323 TILE_PIXEL(p
, j
, i
, 3) = *src
++ * scale
;
331 /*** PIPE_FORMAT_L8_UNORM ***/
334 l8_get_tile_rgba(const ubyte
*src
,
335 unsigned w
, unsigned h
,
340 for (i
= 0; i
< h
; i
++) {
341 for (j
= 0; j
< w
; j
++, src
++) {
342 TILE_PIXEL(p
, j
, i
, 0) =
343 TILE_PIXEL(p
, j
, i
, 1) =
344 TILE_PIXEL(p
, j
, i
, 2) = *src
;
345 TILE_PIXEL(p
, j
, i
, 3) = 255;
352 l8_put_tile_rgba(ubyte
*dst
,
353 unsigned w
, unsigned h
,
358 for (i
= 0; i
< h
; i
++) {
359 for (j
= 0; j
< w
; j
++) {
361 r
= TILE_PIXEL(p
, j
, i
, 0);
369 /*** PIPE_FORMAT_A8_UNORM ***/
372 a8_get_tile_rgba(const ubyte
*src
,
373 unsigned w
, unsigned h
,
378 for (i
= 0; i
< h
; i
++) {
379 for (j
= 0; j
< w
; j
++, src
++) {
380 TILE_PIXEL(p
, j
, i
, 0) =
381 TILE_PIXEL(p
, j
, i
, 1) =
382 TILE_PIXEL(p
, j
, i
, 2) = 0;
383 TILE_PIXEL(p
, j
, i
, 3) = *src
;
390 a8_put_tile_rgba(ubyte
*dst
,
391 unsigned w
, unsigned h
,
396 for (i
= 0; i
< h
; i
++) {
397 for (j
= 0; j
< w
; j
++) {
399 a
= TILE_PIXEL(p
, j
, i
, 3);
407 /*** PIPE_FORMAT_R16_SNORM ***/
410 r16_get_tile_rgba(const short *src
,
411 unsigned w
, unsigned h
,
416 for (i
= 0; i
< h
; i
++) {
417 for (j
= 0; j
< w
; j
++, src
++) {
418 TILE_PIXEL(p
, j
, i
, 0) = MAX2(src
[0] >> 7, 0);
419 TILE_PIXEL(p
, j
, i
, 1) =
420 TILE_PIXEL(p
, j
, i
, 2) = 0;
421 TILE_PIXEL(p
, j
, i
, 3) = 255;
428 r16_put_tile_rgba(short *dst
,
429 unsigned w
, unsigned h
,
434 for (i
= 0; i
< h
; i
++) {
435 for (j
= 0; j
< w
; j
++, dst
++) {
436 dst
[0] = TILE_PIXEL(p
, j
, i
, 0) << 7;
442 /*** PIPE_FORMAT_R16G16B16A16_SNORM ***/
445 r16g16b16a16_get_tile_rgba(const short *src
,
446 unsigned w
, unsigned h
,
451 for (i
= 0; i
< h
; i
++) {
452 for (j
= 0; j
< w
; j
++, src
+= 4) {
453 TILE_PIXEL(p
, j
, i
, 0) = src
[0] >> 8;
454 TILE_PIXEL(p
, j
, i
, 1) = src
[1] >> 8;
455 TILE_PIXEL(p
, j
, i
, 2) = src
[2] >> 8;
456 TILE_PIXEL(p
, j
, i
, 3) = src
[3] >> 8;
463 r16g16b16a16_put_tile_rgba(short *dst
,
464 unsigned w
, unsigned h
,
469 for (i
= 0; i
< h
; i
++) {
470 for (j
= 0; j
< w
; j
++, dst
+= 4) {
471 dst
[0] = TILE_PIXEL(p
, j
, i
, 0) << 8;
472 dst
[1] = TILE_PIXEL(p
, j
, i
, 1) << 8;
473 dst
[2] = TILE_PIXEL(p
, j
, i
, 2) << 8;
474 dst
[3] = TILE_PIXEL(p
, j
, i
, 3) << 8;
481 /*** PIPE_FORMAT_I8_UNORM ***/
484 i8_get_tile_rgba(const ubyte
*src
,
485 unsigned w
, unsigned h
,
490 for (i
= 0; i
< h
; i
++) {
491 for (j
= 0; j
< w
; j
++, src
++) {
492 TILE_PIXEL(p
, j
, i
, 0) =
493 TILE_PIXEL(p
, j
, i
, 1) =
494 TILE_PIXEL(p
, j
, i
, 2) =
495 TILE_PIXEL(p
, j
, i
, 3) = *src
;
502 i8_put_tile_rgba(ubyte
*dst
,
503 unsigned w
, unsigned h
,
508 for (i
= 0; i
< h
; i
++) {
509 for (j
= 0; j
< w
; j
++) {
511 r
= TILE_PIXEL(p
, j
, i
, 0);
518 /*** PIPE_FORMAT_A8L8_UNORM ***/
521 a8l8_get_tile_rgba(const ushort
*src
,
522 unsigned w
, unsigned h
,
527 for (i
= 0; i
< h
; i
++) {
528 for (j
= 0; j
< w
; j
++) {
530 TILE_PIXEL(p
, j
, i
, 0) =
531 TILE_PIXEL(p
, j
, i
, 1) =
532 TILE_PIXEL(p
, j
, i
, 2) = ra
& 0xff;
533 TILE_PIXEL(p
, j
, i
, 3) = ra
>> 8;
540 a8l8_put_tile_rgba(ushort
*dst
,
541 unsigned w
, unsigned h
,
546 for (i
= 0; i
< h
; i
++) {
547 for (j
= 0; j
< w
; j
++) {
549 r
= TILE_PIXEL(p
, j
, i
, 0);
550 a
= TILE_PIXEL(p
, j
, i
, 3);
551 *dst
++ = (a
<< 8) | r
;
559 /*** PIPE_FORMAT_Z32_UNORM ***/
562 * Return each Z value as four floats in [0,1].
565 z32_get_tile_rgba(const unsigned *src
,
566 unsigned w
, unsigned h
,
569 const double scale
= 1.0 / (double) 0xffffffff;
572 for (i
= 0; i
< h
; i
++) {
573 for (j
= 0; j
< w
; j
++) {
574 TILE_PIXEL(p
, j
, i
, 0) =
575 TILE_PIXEL(p
, j
, i
, 1) =
576 TILE_PIXEL(p
, j
, i
, 2) =
577 TILE_PIXEL(p
, j
, i
, 3) = (float) (*src
++ * scale
);
583 /*** PIPE_FORMAT_S8Z24_UNORM ***/
586 * Return Z component as four float in [0,1]. Stencil part ignored.
589 s8z24_get_tile_rgba(const unsigned *src
,
590 unsigned w
, unsigned h
,
593 const double scale
= 1.0 / ((1 << 24) - 1);
596 for (i
= 0; i
< h
; i
++) {
597 for (j
= 0; j
< w
; j
++) {
598 TILE_PIXEL(p
, j
, i
, 0) =
599 TILE_PIXEL(p
, j
, i
, 1) =
600 TILE_PIXEL(p
, j
, i
, 2) =
601 TILE_PIXEL(p
, j
, i
, 3) = (float) (scale
* (*src
++ & 0xffffff));
607 /*** PIPE_FORMAT_Z24S8_UNORM ***/
610 * Return Z component as four float in [0,1]. Stencil part ignored.
613 z24s8_get_tile_rgba(const unsigned *src
,
614 unsigned w
, unsigned h
,
617 const double scale
= 1.0 / ((1 << 24) - 1);
620 for (i
= 0; i
< h
; i
++) {
621 for (j
= 0; j
< w
; j
++) {
622 TILE_PIXEL(p
, j
, i
, 0) =
623 TILE_PIXEL(p
, j
, i
, 1) =
624 TILE_PIXEL(p
, j
, i
, 2) =
625 TILE_PIXEL(p
, j
, i
, 3) = (float) (scale
* (*src
++ >> 8));
631 /*** PIPE_FORMAT_Z32_FLOAT ***/
634 * Return each Z value as four floats in [0,1].
637 z32f_get_tile_rgba(const float *src
,
638 unsigned w
, unsigned h
,
643 for (i
= 0; i
< h
; i
++) {
644 for (j
= 0; j
< w
; j
++) {
645 TILE_PIXEL(p
, j
, i
, 0) =
646 TILE_PIXEL(p
, j
, i
, 1) =
647 TILE_PIXEL(p
, j
, i
, 2) =
648 TILE_PIXEL(p
, j
, i
, 3) = *src
++;
654 /*** PIPE_FORMAT_YCBCR / PIPE_FORMAT_YCBCR_REV ***/
657 * Convert YCbCr (or YCrCb) to RGBA.
660 ycbcr_get_tile_rgba(const ushort
*src
,
661 unsigned w
, unsigned h
,
667 for (i
= 0; i
< h
; i
++) {
668 /* do two texels at a time */
669 for (j
= 0; j
< (w
& ~1); j
+= 2, src
+= 2) {
670 const ushort t0
= src
[0];
671 const ushort t1
= src
[1];
672 const ubyte y0
= (t0
>> 8) & 0xff; /* luminance */
673 const ubyte y1
= (t1
>> 8) & 0xff; /* luminance */
678 cb
= t1
& 0xff; /* chroma U */
679 cr
= t0
& 0xff; /* chroma V */
682 cb
= t0
& 0xff; /* chroma U */
683 cr
= t1
& 0xff; /* chroma V */
686 /* even pixel: y0,cr,cb */
687 r
= 1.164f
* (y0
-16) + 1.596f
* (cr
-128);
688 g
= 1.164f
* (y0
-16) - 0.813f
* (cr
-128) - 0.391f
* (cb
-128);
689 b
= 1.164f
* (y0
-16) + 2.018f
* (cb
-128);
690 TILE_PIXEL(p
, j
, i
, 0) = r
;
691 TILE_PIXEL(p
, j
, i
, 1) = g
;
692 TILE_PIXEL(p
, j
, i
, 2) = b
;
693 TILE_PIXEL(p
, j
, i
, 3) = 255;
695 /* odd pixel: use y1,cr,cb */
696 r
= 1.164f
* (y1
-16) + 1.596f
* (cr
-128);
697 g
= 1.164f
* (y1
-16) - 0.813f
* (cr
-128) - 0.391f
* (cb
-128);
698 b
= 1.164f
* (y1
-16) + 2.018f
* (cb
-128);
699 TILE_PIXEL(p
, j
+ 1, i
, 0) = r
;
700 TILE_PIXEL(p
, j
+ 1, i
, 1) = g
;
701 TILE_PIXEL(p
, j
+ 1, i
, 2) = b
;
702 TILE_PIXEL(p
, j
+ 1, i
, 3) = 255;
704 /* do the last texel */
706 const ushort t0
= src
[0];
707 const ushort t1
= src
[1];
708 const ubyte y0
= (t0
>> 8) & 0xff; /* luminance */
713 cb
= t1
& 0xff; /* chroma U */
714 cr
= t0
& 0xff; /* chroma V */
717 cb
= t0
& 0xff; /* chroma U */
718 cr
= t1
& 0xff; /* chroma V */
721 /* even pixel: y0,cr,cb */
722 r
= 1.164f
* (y0
-16) + 1.596f
* (cr
-128);
723 g
= 1.164f
* (y0
-16) - 0.813f
* (cr
-128) - 0.391f
* (cb
-128);
724 b
= 1.164f
* (y0
-16) + 2.018f
* (cb
-128);
725 TILE_PIXEL(p
, j
, i
, 0) = r
;
726 TILE_PIXEL(p
, j
, i
, 1) = g
;
727 TILE_PIXEL(p
, j
, i
, 2) = b
;
728 TILE_PIXEL(p
, j
, i
, 3) = 255;
735 fake_get_tile_rgba(const ushort
*src
,
736 unsigned w
, unsigned h
,
741 for (i
= 0; i
< h
; i
++) {
742 for (j
= 0; j
< w
; j
++) {
743 TILE_PIXEL(p
, j
, i
, 0) =
744 TILE_PIXEL(p
, j
, i
, 1) =
745 TILE_PIXEL(p
, j
, i
, 2) =
746 TILE_PIXEL(p
, j
, i
, 3) = (i
^ j
) & 1 ? 255 : 0;
753 lp_tile_raw_to_rgba_soa(enum pipe_format format
,
759 case PIPE_FORMAT_A8R8G8B8_UNORM
:
760 a8r8g8b8_get_tile_rgba((unsigned *) src
, w
, h
, p
);
762 case PIPE_FORMAT_X8R8G8B8_UNORM
:
763 x8r8g8b8_get_tile_rgba((unsigned *) src
, w
, h
, p
);
765 case PIPE_FORMAT_B8G8R8A8_UNORM
:
766 b8g8r8a8_get_tile_rgba((unsigned *) src
, w
, h
, p
);
768 case PIPE_FORMAT_A1R5G5B5_UNORM
:
769 a1r5g5b5_get_tile_rgba((ushort
*) src
, w
, h
, p
);
771 case PIPE_FORMAT_A4R4G4B4_UNORM
:
772 a4r4g4b4_get_tile_rgba((ushort
*) src
, w
, h
, p
);
774 case PIPE_FORMAT_R5G6B5_UNORM
:
775 r5g6b5_get_tile_rgba((ushort
*) src
, w
, h
, p
);
777 case PIPE_FORMAT_L8_UNORM
:
778 l8_get_tile_rgba((ubyte
*) src
, w
, h
, p
);
780 case PIPE_FORMAT_A8_UNORM
:
781 a8_get_tile_rgba((ubyte
*) src
, w
, h
, p
);
783 case PIPE_FORMAT_I8_UNORM
:
784 i8_get_tile_rgba((ubyte
*) src
, w
, h
, p
);
786 case PIPE_FORMAT_A8L8_UNORM
:
787 a8l8_get_tile_rgba((ushort
*) src
, w
, h
, p
);
789 case PIPE_FORMAT_R16_SNORM
:
790 r16_get_tile_rgba((short *) src
, w
, h
, p
);
792 case PIPE_FORMAT_R16G16B16A16_SNORM
:
793 r16g16b16a16_get_tile_rgba((short *) src
, w
, h
, p
);
795 case PIPE_FORMAT_Z16_UNORM
:
796 z16_get_tile_rgba((ushort
*) src
, w
, h
, p
);
798 case PIPE_FORMAT_Z32_UNORM
:
799 z32_get_tile_rgba((unsigned *) src
, w
, h
, p
);
801 case PIPE_FORMAT_S8Z24_UNORM
:
802 case PIPE_FORMAT_X8Z24_UNORM
:
803 s8z24_get_tile_rgba((unsigned *) src
, w
, h
, p
);
805 case PIPE_FORMAT_Z24S8_UNORM
:
806 case PIPE_FORMAT_Z24X8_UNORM
:
807 z24s8_get_tile_rgba((unsigned *) src
, w
, h
, p
);
809 case PIPE_FORMAT_Z32_FLOAT
:
810 z32f_get_tile_rgba((float *) src
, w
, h
, p
);
812 case PIPE_FORMAT_YCBCR
:
813 ycbcr_get_tile_rgba((ushort
*) src
, w
, h
, p
, FALSE
);
815 case PIPE_FORMAT_YCBCR_REV
:
816 ycbcr_get_tile_rgba((ushort
*) src
, w
, h
, p
, TRUE
);
819 debug_printf("%s: unsupported format %s\n", __FUNCTION__
, pf_name(format
));
820 fake_get_tile_rgba(src
, w
, h
, p
);
826 lp_get_tile_rgba_soa(struct pipe_transfer
*pt
,
830 uint w
= TILE_SIZE
, h
= TILE_SIZE
;
833 if (pipe_clip_tile(x
, y
, &w
, &h
, pt
))
836 packed
= MALLOC(pf_get_nblocks(&pt
->block
, w
, h
) * pt
->block
.size
);
841 if(pt
->format
== PIPE_FORMAT_YCBCR
|| pt
->format
== PIPE_FORMAT_YCBCR_REV
)
842 assert((x
& 1) == 0);
844 pipe_get_tile_raw(pt
, x
, y
, w
, h
, packed
, 0);
846 lp_tile_raw_to_rgba_soa(pt
->format
, packed
, w
, h
, p
);
853 lp_put_tile_rgba_soa(struct pipe_transfer
*pt
,
857 uint w
= TILE_SIZE
, h
= TILE_SIZE
;
860 if (pipe_clip_tile(x
, y
, &w
, &h
, pt
))
863 packed
= MALLOC(pf_get_nblocks(&pt
->block
, w
, h
) * pt
->block
.size
);
868 switch (pt
->format
) {
869 case PIPE_FORMAT_A8R8G8B8_UNORM
:
870 a8r8g8b8_put_tile_rgba((unsigned *) packed
, w
, h
, p
);
872 case PIPE_FORMAT_X8R8G8B8_UNORM
:
873 x8r8g8b8_put_tile_rgba((unsigned *) packed
, w
, h
, p
);
875 case PIPE_FORMAT_B8G8R8A8_UNORM
:
876 b8g8r8a8_put_tile_rgba((unsigned *) packed
, w
, h
, p
);
878 case PIPE_FORMAT_A1R5G5B5_UNORM
:
879 a1r5g5b5_put_tile_rgba((ushort
*) packed
, w
, h
, p
);
881 case PIPE_FORMAT_R5G6B5_UNORM
:
882 r5g6b5_put_tile_rgba((ushort
*) packed
, w
, h
, p
);
884 case PIPE_FORMAT_R8G8B8A8_UNORM
:
887 case PIPE_FORMAT_A4R4G4B4_UNORM
:
888 a4r4g4b4_put_tile_rgba((ushort
*) packed
, w
, h
, p
);
890 case PIPE_FORMAT_L8_UNORM
:
891 l8_put_tile_rgba((ubyte
*) packed
, w
, h
, p
);
893 case PIPE_FORMAT_A8_UNORM
:
894 a8_put_tile_rgba((ubyte
*) packed
, w
, h
, p
);
896 case PIPE_FORMAT_I8_UNORM
:
897 i8_put_tile_rgba((ubyte
*) packed
, w
, h
, p
);
899 case PIPE_FORMAT_A8L8_UNORM
:
900 a8l8_put_tile_rgba((ushort
*) packed
, w
, h
, p
);
902 case PIPE_FORMAT_R16_SNORM
:
903 r16_put_tile_rgba((short *) packed
, w
, h
, p
);
905 case PIPE_FORMAT_R16G16B16A16_SNORM
:
906 r16g16b16a16_put_tile_rgba((short *) packed
, w
, h
, p
);
908 case PIPE_FORMAT_Z16_UNORM
:
909 /*z16_put_tile_rgba((ushort *) packed, w, h, p);*/
911 case PIPE_FORMAT_Z32_UNORM
:
912 /*z32_put_tile_rgba((unsigned *) packed, w, h, p);*/
914 case PIPE_FORMAT_S8Z24_UNORM
:
915 case PIPE_FORMAT_X8Z24_UNORM
:
916 /*s8z24_put_tile_rgba((unsigned *) packed, w, h, p);*/
918 case PIPE_FORMAT_Z24S8_UNORM
:
919 case PIPE_FORMAT_Z24X8_UNORM
:
920 /*z24s8_put_tile_rgba((unsigned *) packed, w, h, p);*/
923 debug_printf("%s: unsupported format %s\n", __FUNCTION__
, pf_name(pt
->format
));
926 pipe_put_tile_raw(pt
, x
, y
, w
, h
, packed
, 0);