Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / gallium / drivers / cell / spu / spu_colorpack.h
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
30 #ifndef SPU_COLORPACK_H
31 #define SPU_COLORPACK_H
32
33
34 #include <transpose_matrix4x4.h>
35 #include <spu_intrinsics.h>
36
37
38 static INLINE unsigned int
39 spu_pack_R8G8B8A8(vector float rgba)
40 {
41   vector unsigned int out = spu_convtu(rgba, 32);
42
43   out = spu_shuffle(out, out, ((vector unsigned char) {
44                                   0, 4, 8, 12, 0, 0, 0, 0, 
45                                   0, 0, 0, 0, 0, 0, 0, 0 }) );
46
47   return spu_extract(out, 0);
48 }
49
50
51 static INLINE unsigned int
52 spu_pack_A8R8G8B8(vector float rgba)
53 {
54   vector unsigned int out = spu_convtu(rgba, 32);
55   out = spu_shuffle(out, out, ((vector unsigned char) {
56                                   12, 0, 4, 8, 0, 0, 0, 0, 
57                                   0, 0, 0, 0, 0, 0, 0, 0}) );
58   return spu_extract(out, 0);
59 }
60
61
62 static INLINE unsigned int
63 spu_pack_B8G8R8A8(vector float rgba)
64 {
65   vector unsigned int out = spu_convtu(rgba, 32);
66   out = spu_shuffle(out, out, ((vector unsigned char) {
67                                   8, 4, 0, 12, 0, 0, 0, 0, 
68                                   0, 0, 0, 0, 0, 0, 0, 0}) );
69   return spu_extract(out, 0);
70 }
71
72
73 static INLINE unsigned int
74 spu_pack_color_shuffle(vector float rgba, vector unsigned char shuffle)
75 {
76   vector unsigned int out = spu_convtu(rgba, 32);
77   out = spu_shuffle(out, out, shuffle);
78   return spu_extract(out, 0);
79 }
80
81
82 static INLINE vector float
83 spu_unpack_B8G8R8A8(uint color)
84 {
85    vector unsigned int color_u4 = spu_splats(color);
86    color_u4 = spu_shuffle(color_u4, color_u4,
87                           ((vector unsigned char) {
88                              2, 2, 2, 2,
89                              1, 1, 1, 1,
90                              0, 0, 0, 0,
91                              3, 3, 3, 3}) );
92    return spu_convtf(color_u4, 32);
93 }
94
95
96 static INLINE vector float
97 spu_unpack_A8R8G8B8(uint color)
98 {
99    vector unsigned int color_u4 = spu_splats(color);
100    color_u4 = spu_shuffle(color_u4, color_u4,
101                           ((vector unsigned char) {
102                              1, 1, 1, 1,
103                              2, 2, 2, 2,
104                              3, 3, 3, 3,
105                              0, 0, 0, 0}) );
106    return spu_convtf(color_u4, 32);
107 }
108
109
110 /**
111  * \param color_in - array of 32-bit packed ARGB colors
112  * \param color_out - returns float colors in RRRR, GGGG, BBBB, AAAA order
113  */
114 static INLINE void
115 spu_unpack_A8R8G8B8_transpose4(const vector unsigned int color_in[4],
116                                vector float color_out[4])
117 {
118    vector unsigned int c0;
119
120    c0 = spu_shuffle(color_in[0], color_in[0],
121                     ((vector unsigned char) {
122                        1, 1, 1, 1,  2, 2, 2, 2,  3, 3, 3, 3,  0, 0, 0, 0}) );
123    color_out[0] = spu_convtf(c0, 32);
124
125    c0 = spu_shuffle(color_in[1], color_in[1],
126                     ((vector unsigned char) {
127                        1, 1, 1, 1,  2, 2, 2, 2,  3, 3, 3, 3,  0, 0, 0, 0}) );
128    color_out[1] = spu_convtf(c0, 32);
129
130    c0 = spu_shuffle(color_in[2], color_in[2],
131                     ((vector unsigned char) {
132                        1, 1, 1, 1,  2, 2, 2, 2,  3, 3, 3, 3,  0, 0, 0, 0}) );
133    color_out[2] = spu_convtf(c0, 32);
134
135    c0 = spu_shuffle(color_in[3], color_in[3],
136                     ((vector unsigned char) {
137                        1, 1, 1, 1,  2, 2, 2, 2,  3, 3, 3, 3,  0, 0, 0, 0}) );
138    color_out[3] = spu_convtf(c0, 32);
139
140    _transpose_matrix4x4(color_out, color_out);
141 }
142
143
144
145 #endif /* SPU_COLORPACK_H */