]> git.proxmox.com Git - mirror_qemu.git/blame - hw/display/pl110_template.h
Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging
[mirror_qemu.git] / hw / display / pl110_template.h
CommitLineData
5fafdf24 1/*
bdd5003a
PB
2 * Arm PrimeCell PL110 Color LCD Controller
3 *
4 * Copyright (c) 2005 CodeSourcery, LLC.
5 * Written by Paul Brook
6 *
8e31bf38 7 * This code is licensed under the GNU LGPL
bdd5003a
PB
8 *
9 * Framebuffer format conversion routines.
10 */
11
12#ifndef ORDER
560ebce6 13#error "pl110_template.h is only for inclusion by pl110.c"
bdd5003a
PB
14#endif
15
bdd5003a 16#if ORDER == 0
ba1c16e4 17#define NAME glue(lblp_, BORDER)
e2542fe2 18#ifdef HOST_WORDS_BIGENDIAN
bdd5003a
PB
19#define SWAP_WORDS 1
20#endif
21#elif ORDER == 1
ba1c16e4 22#define NAME glue(bbbp_, BORDER)
e2542fe2 23#ifndef HOST_WORDS_BIGENDIAN
bdd5003a
PB
24#define SWAP_WORDS 1
25#endif
26#else
27#define SWAP_PIXELS 1
ba1c16e4 28#define NAME glue(lbbp_, BORDER)
e2542fe2 29#ifdef HOST_WORDS_BIGENDIAN
bdd5003a
PB
30#define SWAP_WORDS 1
31#endif
32#endif
33
34#define FN_2(x, y) FN(x, y) FN(x+1, y)
1f9519c9 35#define FN_4(x, y) FN_2(x, y) FN_2(x+2, y)
bdd5003a
PB
36#define FN_8(y) FN_4(0, y) FN_4(4, y)
37
714fa308 38static void glue(pl110_draw_line1_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep)
bdd5003a 39{
6e4c0d1f 40 uint32_t *palette = opaque;
bdd5003a
PB
41 uint32_t data;
42 while (width > 0) {
43 data = *(uint32_t *)src;
44#ifdef SWAP_PIXELS
6e4c0d1f 45#define FN(x, y) COPY_PIXEL(d, palette[(data >> (y + 7 - (x))) & 1]);
bdd5003a 46#else
6e4c0d1f 47#define FN(x, y) COPY_PIXEL(d, palette[(data >> ((x) + y)) & 1]);
bdd5003a 48#endif
be9d3657 49#ifdef SWAP_WORDS
bdd5003a
PB
50 FN_8(24)
51 FN_8(16)
52 FN_8(8)
53 FN_8(0)
54#else
55 FN_8(0)
56 FN_8(8)
57 FN_8(16)
58 FN_8(24)
59#endif
60#undef FN
61 width -= 32;
62 src += 4;
63 }
64}
65
714fa308 66static void glue(pl110_draw_line2_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep)
bdd5003a 67{
6e4c0d1f 68 uint32_t *palette = opaque;
bdd5003a
PB
69 uint32_t data;
70 while (width > 0) {
71 data = *(uint32_t *)src;
72#ifdef SWAP_PIXELS
6e4c0d1f 73#define FN(x, y) COPY_PIXEL(d, palette[(data >> (y + 6 - (x)*2)) & 3]);
bdd5003a 74#else
6e4c0d1f 75#define FN(x, y) COPY_PIXEL(d, palette[(data >> ((x)*2 + y)) & 3]);
bdd5003a 76#endif
be9d3657 77#ifdef SWAP_WORDS
bdd5003a
PB
78 FN_4(0, 24)
79 FN_4(0, 16)
80 FN_4(0, 8)
81 FN_4(0, 0)
82#else
83 FN_4(0, 0)
84 FN_4(0, 8)
85 FN_4(0, 16)
86 FN_4(0, 24)
87#endif
88#undef FN
89 width -= 16;
90 src += 4;
91 }
92}
93
714fa308 94static void glue(pl110_draw_line4_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep)
bdd5003a 95{
6e4c0d1f 96 uint32_t *palette = opaque;
bdd5003a
PB
97 uint32_t data;
98 while (width > 0) {
99 data = *(uint32_t *)src;
100#ifdef SWAP_PIXELS
6e4c0d1f 101#define FN(x, y) COPY_PIXEL(d, palette[(data >> (y + 4 - (x)*4)) & 0xf]);
bdd5003a 102#else
6e4c0d1f 103#define FN(x, y) COPY_PIXEL(d, palette[(data >> ((x)*4 + y)) & 0xf]);
bdd5003a 104#endif
be9d3657 105#ifdef SWAP_WORDS
bdd5003a
PB
106 FN_2(0, 24)
107 FN_2(0, 16)
108 FN_2(0, 8)
109 FN_2(0, 0)
110#else
111 FN_2(0, 0)
112 FN_2(0, 8)
113 FN_2(0, 16)
114 FN_2(0, 24)
115#endif
116#undef FN
117 width -= 8;
118 src += 4;
119 }
120}
121
714fa308 122static void glue(pl110_draw_line8_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep)
bdd5003a 123{
6e4c0d1f 124 uint32_t *palette = opaque;
bdd5003a
PB
125 uint32_t data;
126 while (width > 0) {
127 data = *(uint32_t *)src;
6e4c0d1f 128#define FN(x) COPY_PIXEL(d, palette[(data >> (x)) & 0xff]);
be9d3657 129#ifdef SWAP_WORDS
bdd5003a
PB
130 FN(24)
131 FN(16)
132 FN(8)
133 FN(0)
134#else
135 FN(0)
136 FN(8)
137 FN(16)
138 FN(24)
139#endif
140#undef FN
141 width -= 4;
142 src += 4;
143 }
144}
145
714fa308 146static void glue(pl110_draw_line16_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep)
bdd5003a
PB
147{
148 uint32_t data;
149 unsigned int r, g, b;
150 while (width > 0) {
151 data = *(uint32_t *)src;
be9d3657 152#ifdef SWAP_WORDS
bdd5003a
PB
153 data = bswap32(data);
154#endif
e9c05b42
AZ
155#ifdef RGB
156#define LSB r
157#define MSB b
158#else
159#define LSB b
160#define MSB r
161#endif
bdd5003a 162#if 0
e9c05b42 163 LSB = data & 0x1f;
bdd5003a
PB
164 data >>= 5;
165 g = data & 0x3f;
166 data >>= 6;
e9c05b42 167 MSB = data & 0x1f;
bdd5003a
PB
168 data >>= 5;
169#else
e9c05b42 170 LSB = (data & 0x1f) << 3;
bdd5003a
PB
171 data >>= 5;
172 g = (data & 0x3f) << 2;
173 data >>= 6;
e9c05b42 174 MSB = (data & 0x1f) << 3;
bdd5003a
PB
175 data >>= 5;
176#endif
ba1c16e4 177 COPY_PIXEL(d, rgb_to_pixel32(r, g, b));
e9c05b42 178 LSB = (data & 0x1f) << 3;
bdd5003a
PB
179 data >>= 5;
180 g = (data & 0x3f) << 2;
181 data >>= 6;
e9c05b42 182 MSB = (data & 0x1f) << 3;
bdd5003a 183 data >>= 5;
ba1c16e4 184 COPY_PIXEL(d, rgb_to_pixel32(r, g, b));
e9c05b42
AZ
185#undef MSB
186#undef LSB
bdd5003a
PB
187 width -= 2;
188 src += 4;
189 }
190}
191
714fa308 192static void glue(pl110_draw_line32_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep)
bdd5003a
PB
193{
194 uint32_t data;
195 unsigned int r, g, b;
196 while (width > 0) {
197 data = *(uint32_t *)src;
e9c05b42
AZ
198#ifdef RGB
199#define LSB r
200#define MSB b
201#else
202#define LSB b
203#define MSB r
204#endif
399a4e21 205#ifndef SWAP_WORDS
e9c05b42 206 LSB = data & 0xff;
bdd5003a 207 g = (data >> 8) & 0xff;
e9c05b42 208 MSB = (data >> 16) & 0xff;
bdd5003a 209#else
e9c05b42 210 LSB = (data >> 24) & 0xff;
bdd5003a 211 g = (data >> 16) & 0xff;
e9c05b42 212 MSB = (data >> 8) & 0xff;
bdd5003a 213#endif
ba1c16e4 214 COPY_PIXEL(d, rgb_to_pixel32(r, g, b));
e9c05b42
AZ
215#undef MSB
216#undef LSB
bdd5003a
PB
217 width--;
218 src += 4;
219 }
220}
221
4fbf5556
PM
222static void glue(pl110_draw_line16_555_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep)
223{
224 /* RGB 555 plus an intensity bit (which we ignore) */
225 uint32_t data;
226 unsigned int r, g, b;
227 while (width > 0) {
228 data = *(uint32_t *)src;
229#ifdef SWAP_WORDS
230 data = bswap32(data);
231#endif
232#ifdef RGB
233#define LSB r
234#define MSB b
235#else
236#define LSB b
237#define MSB r
238#endif
239 LSB = (data & 0x1f) << 3;
240 data >>= 5;
241 g = (data & 0x1f) << 3;
242 data >>= 5;
243 MSB = (data & 0x1f) << 3;
244 data >>= 5;
ba1c16e4 245 COPY_PIXEL(d, rgb_to_pixel32(r, g, b));
4fbf5556
PM
246 LSB = (data & 0x1f) << 3;
247 data >>= 5;
248 g = (data & 0x1f) << 3;
249 data >>= 5;
250 MSB = (data & 0x1f) << 3;
251 data >>= 6;
ba1c16e4 252 COPY_PIXEL(d, rgb_to_pixel32(r, g, b));
4fbf5556
PM
253#undef MSB
254#undef LSB
255 width -= 2;
256 src += 4;
257 }
258}
259
260static void glue(pl110_draw_line12_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep)
261{
262 /* RGB 444 with 4 bits of zeroes at the top of each halfword */
263 uint32_t data;
264 unsigned int r, g, b;
265 while (width > 0) {
266 data = *(uint32_t *)src;
267#ifdef SWAP_WORDS
268 data = bswap32(data);
269#endif
270#ifdef RGB
271#define LSB r
272#define MSB b
273#else
274#define LSB b
275#define MSB r
276#endif
277 LSB = (data & 0xf) << 4;
278 data >>= 4;
279 g = (data & 0xf) << 4;
280 data >>= 4;
281 MSB = (data & 0xf) << 4;
282 data >>= 8;
ba1c16e4 283 COPY_PIXEL(d, rgb_to_pixel32(r, g, b));
4fbf5556
PM
284 LSB = (data & 0xf) << 4;
285 data >>= 4;
286 g = (data & 0xf) << 4;
287 data >>= 4;
288 MSB = (data & 0xf) << 4;
289 data >>= 8;
ba1c16e4 290 COPY_PIXEL(d, rgb_to_pixel32(r, g, b));
4fbf5556
PM
291#undef MSB
292#undef LSB
293 width -= 2;
294 src += 4;
295 }
296}
297
bdd5003a
PB
298#undef SWAP_PIXELS
299#undef NAME
300#undef SWAP_WORDS
301#undef ORDER