=== modified file 'hw/pl110.c' --- hw/pl110.c | 13 ++++-- hw/pl110_template.h | 107 ++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 86 insertions(+), 34 deletions(-) Index: hw/pl110.c =================================================================== --- hw/pl110.c.orig 2007-06-13 11:48:22.000000000 +0100 +++ hw/pl110.c 2007-06-13 11:51:57.000000000 +0100 @@ -10,6 +10,7 @@ #include "vl.h" #define PL110_CR_EN 0x001 +#define PL110_CR_BGR 0x100 #define PL110_CR_BEBO 0x200 #define PL110_CR_BEPO 0x400 #define PL110_CR_PWR 0x800 @@ -114,6 +115,7 @@ static void pl110_update_display(void *o int first, last = 0; int dirty, new_dirty; int i; + int bpp_offset; if (!pl110_enabled(s)) return; @@ -145,12 +147,17 @@ static void pl110_update_display(void *o fprintf(stderr, "pl110: Bad color depth\n"); exit(1); } + if (s->cr & PL110_CR_BGR) + bpp_offset = 0; + else + bpp_offset = 18; + if (s->cr & PL110_CR_BEBO) - fn = fntable[s->bpp + 6]; + fn = fntable[s->bpp + 6 + bpp_offset]; else if (s->cr & PL110_CR_BEPO) - fn = fntable[s->bpp + 12]; + fn = fntable[s->bpp + 12 + bpp_offset]; else - fn = fntable[s->bpp]; + fn = fntable[s->bpp + bpp_offset]; src_width = s->cols; switch (s->bpp) { Index: hw/pl110_template.h =================================================================== --- hw/pl110_template.h.orig 2007-06-13 11:48:22.000000000 +0100 +++ hw/pl110_template.h 2007-06-13 11:51:57.000000000 +0100 @@ -24,6 +24,16 @@ #error unknown bit depth #endif +#undef RGB +#define BORDER bgr +#define ORDER 0 +#include "pl110_template.h" +#define ORDER 1 +#include "pl110_template.h" +#define ORDER 2 +#include "pl110_template.h" +#define RGB +#define BORDER rgb #define ORDER 0 #include "pl110_template.h" #define ORDER 1 @@ -33,26 +43,47 @@ static drawfn glue(pl110_draw_fn_,BITS)[18] = { - glue(pl110_draw_line1_lblp,BITS), - glue(pl110_draw_line2_lblp,BITS), - glue(pl110_draw_line4_lblp,BITS), - glue(pl110_draw_line8_lblp,BITS), - glue(pl110_draw_line16_lblp,BITS), - glue(pl110_draw_line32_lblp,BITS), + glue(pl110_draw_line1_lblp_bgr,BITS), + glue(pl110_draw_line2_lblp_bgr,BITS), + glue(pl110_draw_line4_lblp_bgr,BITS), + glue(pl110_draw_line8_lblp_bgr,BITS), + glue(pl110_draw_line16_lblp_bgr,BITS), + glue(pl110_draw_line32_lblp_bgr,BITS), - glue(pl110_draw_line1_bbbp,BITS), - glue(pl110_draw_line2_bbbp,BITS), - glue(pl110_draw_line4_bbbp,BITS), - glue(pl110_draw_line8_bbbp,BITS), - glue(pl110_draw_line16_bbbp,BITS), - glue(pl110_draw_line32_bbbp,BITS), + glue(pl110_draw_line1_bbbp_bgr,BITS), + glue(pl110_draw_line2_bbbp_bgr,BITS), + glue(pl110_draw_line4_bbbp_bgr,BITS), + glue(pl110_draw_line8_bbbp_bgr,BITS), + glue(pl110_draw_line16_bbbp_bgr,BITS), + glue(pl110_draw_line32_bbbp_bgr,BITS), - glue(pl110_draw_line1_lbbp,BITS), - glue(pl110_draw_line2_lbbp,BITS), - glue(pl110_draw_line4_lbbp,BITS), - glue(pl110_draw_line8_lbbp,BITS), - glue(pl110_draw_line16_lbbp,BITS), - glue(pl110_draw_line32_lbbp,BITS) + glue(pl110_draw_line1_lbbp_bgr,BITS), + glue(pl110_draw_line2_lbbp_bgr,BITS), + glue(pl110_draw_line4_lbbp_bgr,BITS), + glue(pl110_draw_line8_lbbp_bgr,BITS), + glue(pl110_draw_line16_lbbp_bgr,BITS), + glue(pl110_draw_line32_lbbp_bgr,BITS), + + glue(pl110_draw_line1_lblp_rgb,BITS), + glue(pl110_draw_line2_lblp_rgb,BITS), + glue(pl110_draw_line4_lblp_rgb,BITS), + glue(pl110_draw_line8_lblp_rgb,BITS), + glue(pl110_draw_line16_lblp_rgb,BITS), + glue(pl110_draw_line32_lblp_rgb,BITS), + + glue(pl110_draw_line1_bbbp_rgb,BITS), + glue(pl110_draw_line2_bbbp_rgb,BITS), + glue(pl110_draw_line4_bbbp_rgb,BITS), + glue(pl110_draw_line8_bbbp_rgb,BITS), + glue(pl110_draw_line16_bbbp_rgb,BITS), + glue(pl110_draw_line32_bbbp_rgb,BITS), + + glue(pl110_draw_line1_lbbp_rgb,BITS), + glue(pl110_draw_line2_lbbp_rgb,BITS), + glue(pl110_draw_line4_lbbp_rgb,BITS), + glue(pl110_draw_line8_lbbp_rgb,BITS), + glue(pl110_draw_line16_lbbp_rgb,BITS), + glue(pl110_draw_line32_lbbp_rgb,BITS), }; #undef BITS @@ -61,18 +92,18 @@ static drawfn glue(pl110_draw_fn_,BITS)[ #else #if ORDER == 0 -#define NAME glue(lblp, BITS) +#define NAME glue(glue(lblp_, BORDER), BITS) #ifdef WORDS_BIGENDIAN #define SWAP_WORDS 1 #endif #elif ORDER == 1 -#define NAME glue(bbbp, BITS) +#define NAME glue(glue(bbbp_, BORDER), BITS) #ifndef WORDS_BIGENDIAN #define SWAP_WORDS 1 #endif #else #define SWAP_PIXELS 1 -#define NAME glue(lbbp, BITS) +#define NAME glue(glue(lbbp_, BORDER), BITS) #ifdef WORDS_BIGENDIAN #define SWAP_WORDS 1 #endif @@ -195,27 +226,34 @@ static void glue(pl110_draw_line16_,NAME #ifdef SWAP_WORDS data = bswap32(data); #endif +#ifdef RGB +#define LSB r +#define MSB b +#else +#define LSB b +#define MSB r +#endif #if 0 - r = data & 0x1f; + LSB = data & 0x1f; data >>= 5; g = data & 0x3f; data >>= 6; - b = data & 0x1f; + MSB = data & 0x1f; data >>= 5; #else - r = (data & 0x1f) << 3; + LSB = (data & 0x1f) << 3; data >>= 5; g = (data & 0x3f) << 2; data >>= 6; - b = (data & 0x1f) << 3; + MSB = (data & 0x1f) << 3; data >>= 5; #endif COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); - r = (data & 0x1f) << 3; + LSB = (data & 0x1f) << 3; data >>= 5; g = (data & 0x3f) << 2; data >>= 6; - b = (data & 0x1f) << 3; + MSB = (data & 0x1f) << 3; data >>= 5; COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); width -= 2; @@ -229,14 +267,21 @@ static void glue(pl110_draw_line32_,NAME unsigned int r, g, b; while (width > 0) { data = *(uint32_t *)src; +#ifdef RGB +#define LSB r +#define MSB b +#else +#define LSB b +#define MSB r +#endif #ifdef SWAP_WORDS - r = data & 0xff; + LSB = data & 0xff; g = (data >> 8) & 0xff; - b = (data >> 16) & 0xff; + MSB = (data >> 16) & 0xff; #else - r = (data >> 24) & 0xff; + LSB = (data >> 24) & 0xff; g = (data >> 16) & 0xff; - b = (data >> 8) & 0xff; + MSB = (data >> 8) & 0xff; #endif COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); width--;