Merge branch 'mesa_7_6_branch'
[mesa.git] / src / gallium / drivers / llvmpipe / lp_tile_soa.c
1 /**************************************************************************
2 *
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * All Rights Reserved.
5 *
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:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
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.
25 *
26 **************************************************************************/
27
28 /**
29 * RGBA/float tile get/put functions.
30 * Usable both by drivers and state trackers.
31 */
32
33
34 #include "pipe/p_defines.h"
35 #include "pipe/p_inlines.h"
36
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"
43
44
45 const unsigned char
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}
49 };
50
51
52
53 /*** PIPE_FORMAT_A8R8G8B8_UNORM ***/
54
55 static void
56 a8r8g8b8_get_tile_rgba(const unsigned *src,
57 unsigned w, unsigned h,
58 uint8_t *p)
59 {
60 unsigned i, j;
61
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;
69 }
70 }
71 }
72
73
74 static void
75 a8r8g8b8_put_tile_rgba(unsigned *dst,
76 unsigned w, unsigned h,
77 const uint8_t *p)
78 {
79 unsigned i, j;
80
81 for (i = 0; i < h; i++) {
82 for (j = 0; j < w; j++) {
83 unsigned r, g, b, a;
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;
89 }
90 }
91 }
92
93
94 /*** PIPE_FORMAT_A8R8G8B8_UNORM ***/
95
96 static void
97 x8r8g8b8_get_tile_rgba(const unsigned *src,
98 unsigned w, unsigned h,
99 uint8_t *p)
100 {
101 unsigned i, j;
102
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;
110 }
111 }
112 }
113
114
115 static void
116 x8r8g8b8_put_tile_rgba(unsigned *dst,
117 unsigned w, unsigned h,
118 const uint8_t *p)
119 {
120 unsigned i, j;
121
122 for (i = 0; i < h; i++) {
123 for (j = 0; j < w; j++) {
124 unsigned r, g, b;
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;
129 }
130 }
131 }
132
133
134 /*** PIPE_FORMAT_B8G8R8A8_UNORM ***/
135
136 static void
137 b8g8r8a8_get_tile_rgba(const unsigned *src,
138 unsigned w, unsigned h,
139 uint8_t *p)
140 {
141 unsigned i, j;
142
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;
150 }
151 }
152 }
153
154
155 static void
156 b8g8r8a8_put_tile_rgba(unsigned *dst,
157 unsigned w, unsigned h,
158 const uint8_t *p)
159 {
160 unsigned i, j;
161
162 for (i = 0; i < h; i++) {
163 for (j = 0; j < w; j++) {
164 unsigned r, g, b, a;
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;
170 }
171 }
172 }
173
174
175 /*** PIPE_FORMAT_A1R5G5B5_UNORM ***/
176
177 static void
178 a1r5g5b5_get_tile_rgba(const ushort *src,
179 unsigned w, unsigned h,
180 uint8_t *p)
181 {
182 unsigned i, j;
183
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;
191 }
192 }
193 }
194
195
196 static void
197 a1r5g5b5_put_tile_rgba(ushort *dst,
198 unsigned w, unsigned h,
199 const uint8_t *p)
200 {
201 unsigned i, j;
202
203 for (i = 0; i < h; i++) {
204 for (j = 0; j < w; j++) {
205 unsigned r, g, b, a;
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;
215 }
216 }
217 }
218
219
220 /*** PIPE_FORMAT_A4R4G4B4_UNORM ***/
221
222 static void
223 a4r4g4b4_get_tile_rgba(const ushort *src,
224 unsigned w, unsigned h,
225 uint8_t *p)
226 {
227 unsigned i, j;
228
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;
236 }
237 }
238 }
239
240
241 static void
242 a4r4g4b4_put_tile_rgba(ushort *dst,
243 unsigned w, unsigned h,
244 const uint8_t *p)
245 {
246 unsigned i, j;
247
248 for (i = 0; i < h; i++) {
249 for (j = 0; j < w; j++) {
250 unsigned r, g, b, a;
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);
255 r >>= 4;
256 g >>= 4;
257 b >>= 4;
258 a >>= 4;
259 *dst++ = (a << 12) | (r << 16) | (g << 4) | b;
260 }
261 }
262 }
263
264
265 /*** PIPE_FORMAT_R5G6B5_UNORM ***/
266
267 static void
268 r5g6b5_get_tile_rgba(const ushort *src,
269 unsigned w, unsigned h,
270 uint8_t *p)
271 {
272 unsigned i, j;
273
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;
281 }
282 }
283 }
284
285
286 static void
287 r5g6b5_put_tile_rgba(ushort *dst,
288 unsigned w, unsigned h,
289 const uint8_t *p)
290 {
291 unsigned i, j;
292
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);
299 }
300 }
301 }
302
303
304
305 /*** PIPE_FORMAT_Z16_UNORM ***/
306
307 /**
308 * Return each Z value as four floats in [0,1].
309 */
310 static void
311 z16_get_tile_rgba(const ushort *src,
312 unsigned w, unsigned h,
313 uint8_t *p)
314 {
315 const float scale = 1.0f / 65535.0f;
316 unsigned i, j;
317
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;
324 }
325 }
326 }
327
328
329
330
331 /*** PIPE_FORMAT_L8_UNORM ***/
332
333 static void
334 l8_get_tile_rgba(const ubyte *src,
335 unsigned w, unsigned h,
336 uint8_t *p)
337 {
338 unsigned i, j;
339
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;
346 }
347 }
348 }
349
350
351 static void
352 l8_put_tile_rgba(ubyte *dst,
353 unsigned w, unsigned h,
354 const uint8_t *p)
355 {
356 unsigned i, j;
357
358 for (i = 0; i < h; i++) {
359 for (j = 0; j < w; j++) {
360 unsigned r;
361 r = TILE_PIXEL(p, j, i, 0);
362 *dst++ = (ubyte) r;
363 }
364 }
365 }
366
367
368
369 /*** PIPE_FORMAT_A8_UNORM ***/
370
371 static void
372 a8_get_tile_rgba(const ubyte *src,
373 unsigned w, unsigned h,
374 uint8_t *p)
375 {
376 unsigned i, j;
377
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;
384 }
385 }
386 }
387
388
389 static void
390 a8_put_tile_rgba(ubyte *dst,
391 unsigned w, unsigned h,
392 const uint8_t *p)
393 {
394 unsigned i, j;
395
396 for (i = 0; i < h; i++) {
397 for (j = 0; j < w; j++) {
398 unsigned a;
399 a = TILE_PIXEL(p, j, i, 3);
400 *dst++ = (ubyte) a;
401 }
402 }
403 }
404
405
406
407 /*** PIPE_FORMAT_R16_SNORM ***/
408
409 static void
410 r16_get_tile_rgba(const short *src,
411 unsigned w, unsigned h,
412 uint8_t *p)
413 {
414 unsigned i, j;
415
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;
422 }
423 }
424 }
425
426
427 static void
428 r16_put_tile_rgba(short *dst,
429 unsigned w, unsigned h,
430 const uint8_t *p)
431 {
432 unsigned i, j;
433
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;
437 }
438 }
439 }
440
441
442 /*** PIPE_FORMAT_R16G16B16A16_SNORM ***/
443
444 static void
445 r16g16b16a16_get_tile_rgba(const short *src,
446 unsigned w, unsigned h,
447 uint8_t *p)
448 {
449 unsigned i, j;
450
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;
457 }
458 }
459 }
460
461
462 static void
463 r16g16b16a16_put_tile_rgba(short *dst,
464 unsigned w, unsigned h,
465 const uint8_t *p)
466 {
467 unsigned i, j;
468
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;
475 }
476 }
477 }
478
479
480
481 /*** PIPE_FORMAT_I8_UNORM ***/
482
483 static void
484 i8_get_tile_rgba(const ubyte *src,
485 unsigned w, unsigned h,
486 uint8_t *p)
487 {
488 unsigned i, j;
489
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;
496 }
497 }
498 }
499
500
501 static void
502 i8_put_tile_rgba(ubyte *dst,
503 unsigned w, unsigned h,
504 const uint8_t *p)
505 {
506 unsigned i, j;
507
508 for (i = 0; i < h; i++) {
509 for (j = 0; j < w; j++) {
510 unsigned r;
511 r = TILE_PIXEL(p, j, i, 0);
512 *dst++ = (ubyte) r;
513 }
514 }
515 }
516
517
518 /*** PIPE_FORMAT_A8L8_UNORM ***/
519
520 static void
521 a8l8_get_tile_rgba(const ushort *src,
522 unsigned w, unsigned h,
523 uint8_t *p)
524 {
525 unsigned i, j;
526
527 for (i = 0; i < h; i++) {
528 for (j = 0; j < w; j++) {
529 ushort ra = *src++;
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;
534 }
535 }
536 }
537
538
539 static void
540 a8l8_put_tile_rgba(ushort *dst,
541 unsigned w, unsigned h,
542 const uint8_t *p)
543 {
544 unsigned i, j;
545
546 for (i = 0; i < h; i++) {
547 for (j = 0; j < w; j++) {
548 unsigned r, a;
549 r = TILE_PIXEL(p, j, i, 0);
550 a = TILE_PIXEL(p, j, i, 3);
551 *dst++ = (a << 8) | r;
552 }
553 }
554 }
555
556
557
558
559 /*** PIPE_FORMAT_Z32_UNORM ***/
560
561 /**
562 * Return each Z value as four floats in [0,1].
563 */
564 static void
565 z32_get_tile_rgba(const unsigned *src,
566 unsigned w, unsigned h,
567 uint8_t *p)
568 {
569 const double scale = 1.0 / (double) 0xffffffff;
570 unsigned i, j;
571
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);
578 }
579 }
580 }
581
582
583 /*** PIPE_FORMAT_S8Z24_UNORM ***/
584
585 /**
586 * Return Z component as four float in [0,1]. Stencil part ignored.
587 */
588 static void
589 s8z24_get_tile_rgba(const unsigned *src,
590 unsigned w, unsigned h,
591 uint8_t *p)
592 {
593 const double scale = 1.0 / ((1 << 24) - 1);
594 unsigned i, j;
595
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));
602 }
603 }
604 }
605
606
607 /*** PIPE_FORMAT_Z24S8_UNORM ***/
608
609 /**
610 * Return Z component as four float in [0,1]. Stencil part ignored.
611 */
612 static void
613 z24s8_get_tile_rgba(const unsigned *src,
614 unsigned w, unsigned h,
615 uint8_t *p)
616 {
617 const double scale = 1.0 / ((1 << 24) - 1);
618 unsigned i, j;
619
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));
626 }
627 }
628 }
629
630
631 /*** PIPE_FORMAT_Z32_FLOAT ***/
632
633 /**
634 * Return each Z value as four floats in [0,1].
635 */
636 static void
637 z32f_get_tile_rgba(const float *src,
638 unsigned w, unsigned h,
639 uint8_t *p)
640 {
641 unsigned i, j;
642
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++;
649 }
650 }
651 }
652
653
654 /*** PIPE_FORMAT_YCBCR / PIPE_FORMAT_YCBCR_REV ***/
655
656 /**
657 * Convert YCbCr (or YCrCb) to RGBA.
658 */
659 static void
660 ycbcr_get_tile_rgba(const ushort *src,
661 unsigned w, unsigned h,
662 uint8_t *p,
663 boolean rev)
664 {
665 unsigned i, j;
666
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 */
674 ubyte cb, cr;
675 float r, g, b;
676
677 if (rev) {
678 cb = t1 & 0xff; /* chroma U */
679 cr = t0 & 0xff; /* chroma V */
680 }
681 else {
682 cb = t0 & 0xff; /* chroma U */
683 cr = t1 & 0xff; /* chroma V */
684 }
685
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;
694
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;
703 }
704 /* do the last texel */
705 if (w & 1) {
706 const ushort t0 = src[0];
707 const ushort t1 = src[1];
708 const ubyte y0 = (t0 >> 8) & 0xff; /* luminance */
709 ubyte cb, cr;
710 float r, g, b;
711
712 if (rev) {
713 cb = t1 & 0xff; /* chroma U */
714 cr = t0 & 0xff; /* chroma V */
715 }
716 else {
717 cb = t0 & 0xff; /* chroma U */
718 cr = t1 & 0xff; /* chroma V */
719 }
720
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;
729 }
730 }
731 }
732
733
734 static void
735 fake_get_tile_rgba(const ushort *src,
736 unsigned w, unsigned h,
737 uint8_t *p)
738 {
739 unsigned i, j;
740
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;
747 }
748 }
749 }
750
751
752 static void
753 lp_tile_raw_to_rgba_soa(enum pipe_format format,
754 void *src,
755 uint w, uint h,
756 uint8_t *p)
757 {
758 switch (format) {
759 case PIPE_FORMAT_A8R8G8B8_UNORM:
760 a8r8g8b8_get_tile_rgba((unsigned *) src, w, h, p);
761 break;
762 case PIPE_FORMAT_X8R8G8B8_UNORM:
763 x8r8g8b8_get_tile_rgba((unsigned *) src, w, h, p);
764 break;
765 case PIPE_FORMAT_B8G8R8A8_UNORM:
766 b8g8r8a8_get_tile_rgba((unsigned *) src, w, h, p);
767 break;
768 case PIPE_FORMAT_A1R5G5B5_UNORM:
769 a1r5g5b5_get_tile_rgba((ushort *) src, w, h, p);
770 break;
771 case PIPE_FORMAT_A4R4G4B4_UNORM:
772 a4r4g4b4_get_tile_rgba((ushort *) src, w, h, p);
773 break;
774 case PIPE_FORMAT_R5G6B5_UNORM:
775 r5g6b5_get_tile_rgba((ushort *) src, w, h, p);
776 break;
777 case PIPE_FORMAT_L8_UNORM:
778 l8_get_tile_rgba((ubyte *) src, w, h, p);
779 break;
780 case PIPE_FORMAT_A8_UNORM:
781 a8_get_tile_rgba((ubyte *) src, w, h, p);
782 break;
783 case PIPE_FORMAT_I8_UNORM:
784 i8_get_tile_rgba((ubyte *) src, w, h, p);
785 break;
786 case PIPE_FORMAT_A8L8_UNORM:
787 a8l8_get_tile_rgba((ushort *) src, w, h, p);
788 break;
789 case PIPE_FORMAT_R16_SNORM:
790 r16_get_tile_rgba((short *) src, w, h, p);
791 break;
792 case PIPE_FORMAT_R16G16B16A16_SNORM:
793 r16g16b16a16_get_tile_rgba((short *) src, w, h, p);
794 break;
795 case PIPE_FORMAT_Z16_UNORM:
796 z16_get_tile_rgba((ushort *) src, w, h, p);
797 break;
798 case PIPE_FORMAT_Z32_UNORM:
799 z32_get_tile_rgba((unsigned *) src, w, h, p);
800 break;
801 case PIPE_FORMAT_S8Z24_UNORM:
802 case PIPE_FORMAT_X8Z24_UNORM:
803 s8z24_get_tile_rgba((unsigned *) src, w, h, p);
804 break;
805 case PIPE_FORMAT_Z24S8_UNORM:
806 case PIPE_FORMAT_Z24X8_UNORM:
807 z24s8_get_tile_rgba((unsigned *) src, w, h, p);
808 break;
809 case PIPE_FORMAT_Z32_FLOAT:
810 z32f_get_tile_rgba((float *) src, w, h, p);
811 break;
812 case PIPE_FORMAT_YCBCR:
813 ycbcr_get_tile_rgba((ushort *) src, w, h, p, FALSE);
814 break;
815 case PIPE_FORMAT_YCBCR_REV:
816 ycbcr_get_tile_rgba((ushort *) src, w, h, p, TRUE);
817 break;
818 default:
819 debug_printf("%s: unsupported format %s\n", __FUNCTION__, pf_name(format));
820 fake_get_tile_rgba(src, w, h, p);
821 }
822 }
823
824
825 void
826 lp_get_tile_rgba_soa(struct pipe_transfer *pt,
827 uint x, uint y,
828 uint8_t *p)
829 {
830 uint w = TILE_SIZE, h = TILE_SIZE;
831 void *packed;
832
833 if (pipe_clip_tile(x, y, &w, &h, pt))
834 return;
835
836 packed = MALLOC(pf_get_nblocks(&pt->block, w, h) * pt->block.size);
837
838 if (!packed)
839 return;
840
841 if(pt->format == PIPE_FORMAT_YCBCR || pt->format == PIPE_FORMAT_YCBCR_REV)
842 assert((x & 1) == 0);
843
844 pipe_get_tile_raw(pt, x, y, w, h, packed, 0);
845
846 lp_tile_raw_to_rgba_soa(pt->format, packed, w, h, p);
847
848 FREE(packed);
849 }
850
851
852 void
853 lp_put_tile_rgba_soa(struct pipe_transfer *pt,
854 uint x, uint y,
855 const uint8_t *p)
856 {
857 uint w = TILE_SIZE, h = TILE_SIZE;
858 void *packed;
859
860 if (pipe_clip_tile(x, y, &w, &h, pt))
861 return;
862
863 packed = MALLOC(pf_get_nblocks(&pt->block, w, h) * pt->block.size);
864
865 if (!packed)
866 return;
867
868 switch (pt->format) {
869 case PIPE_FORMAT_A8R8G8B8_UNORM:
870 a8r8g8b8_put_tile_rgba((unsigned *) packed, w, h, p);
871 break;
872 case PIPE_FORMAT_X8R8G8B8_UNORM:
873 x8r8g8b8_put_tile_rgba((unsigned *) packed, w, h, p);
874 break;
875 case PIPE_FORMAT_B8G8R8A8_UNORM:
876 b8g8r8a8_put_tile_rgba((unsigned *) packed, w, h, p);
877 break;
878 case PIPE_FORMAT_A1R5G5B5_UNORM:
879 a1r5g5b5_put_tile_rgba((ushort *) packed, w, h, p);
880 break;
881 case PIPE_FORMAT_R5G6B5_UNORM:
882 r5g6b5_put_tile_rgba((ushort *) packed, w, h, p);
883 break;
884 case PIPE_FORMAT_R8G8B8A8_UNORM:
885 assert(0);
886 break;
887 case PIPE_FORMAT_A4R4G4B4_UNORM:
888 a4r4g4b4_put_tile_rgba((ushort *) packed, w, h, p);
889 break;
890 case PIPE_FORMAT_L8_UNORM:
891 l8_put_tile_rgba((ubyte *) packed, w, h, p);
892 break;
893 case PIPE_FORMAT_A8_UNORM:
894 a8_put_tile_rgba((ubyte *) packed, w, h, p);
895 break;
896 case PIPE_FORMAT_I8_UNORM:
897 i8_put_tile_rgba((ubyte *) packed, w, h, p);
898 break;
899 case PIPE_FORMAT_A8L8_UNORM:
900 a8l8_put_tile_rgba((ushort *) packed, w, h, p);
901 break;
902 case PIPE_FORMAT_R16_SNORM:
903 r16_put_tile_rgba((short *) packed, w, h, p);
904 break;
905 case PIPE_FORMAT_R16G16B16A16_SNORM:
906 r16g16b16a16_put_tile_rgba((short *) packed, w, h, p);
907 break;
908 case PIPE_FORMAT_Z16_UNORM:
909 /*z16_put_tile_rgba((ushort *) packed, w, h, p);*/
910 break;
911 case PIPE_FORMAT_Z32_UNORM:
912 /*z32_put_tile_rgba((unsigned *) packed, w, h, p);*/
913 break;
914 case PIPE_FORMAT_S8Z24_UNORM:
915 case PIPE_FORMAT_X8Z24_UNORM:
916 /*s8z24_put_tile_rgba((unsigned *) packed, w, h, p);*/
917 break;
918 case PIPE_FORMAT_Z24S8_UNORM:
919 case PIPE_FORMAT_Z24X8_UNORM:
920 /*z24s8_put_tile_rgba((unsigned *) packed, w, h, p);*/
921 break;
922 default:
923 debug_printf("%s: unsupported format %s\n", __FUNCTION__, pf_name(pt->format));
924 }
925
926 pipe_put_tile_raw(pt, x, y, w, h, packed, 0);
927
928 FREE(packed);
929 }
930
931