@@ -1342,8 +1342,8 @@ enum {
VGA_DRAW_LINE4D2,
VGA_DRAW_LINE8D2,
VGA_DRAW_LINE8,
- VGA_DRAW_LINE15,
- VGA_DRAW_LINE16,
+ VGA_DRAW_LINE15_SWAP,
+ VGA_DRAW_LINE16_SWAP,
VGA_DRAW_LINE_NB,
};
@@ -1354,8 +1354,8 @@ static vga_draw_line_func * const vga_draw_line_table[VGA_DRAW_LINE_NB] = {
vga_draw_line4d2,
vga_draw_line8d2,
vga_draw_line8,
- vga_draw_line15,
- vga_draw_line16,
+ vga_draw_line15_swap,
+ vga_draw_line16_swap,
};
static int vga_get_bpp(VGACommonState *s)
@@ -1537,12 +1537,15 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
bits = 8;
break;
case 15:
- v = VGA_DRAW_LINE15;
- bits = 16;
- break;
case 16:
- v = VGA_DRAW_LINE16;
- bits = 16;
+ if (byteswap) {
+ v = depth == 15 ? VGA_DRAW_LINE15_SWAP : VGA_DRAW_LINE16_SWAP;
+ } else if (!is_buffer_shared(surface)) {
+ fprintf(stderr,
+ "vga: Non-shared surface at %dbpp unsupported !\n", depth);
+ return;
+ }
+ bits = depth;
break;
case 24:
case 32:
@@ -1552,6 +1555,7 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
return;
}
bits = depth;
+ break;
}
}
if (!is_buffer_shared(surface)) {
@@ -281,18 +281,28 @@ static void vga_draw_line8(VGACommonState *s1, uint8_t *d,
/* XXX: optimize */
+/* We have lduw_he_p, lduw_be_p, lduw_le_p but we don't have
+ * lduw_sw_p, as in unconditionally swap :) So let's make it
+ * up here
+ */
+#if defined(HOST_WORDS_BIGENDIAN)
+#define ld_sw_pixel16 lduw_le_p
+#else
+#define ld_sw_pixel16 lduw_be_p
+#endif
+
/*
* 15 bit color
*/
-static void vga_draw_line15(VGACommonState *s1, uint8_t *d,
- const uint8_t *s, int width)
+static void vga_draw_line15_swap(VGACommonState *s1, uint8_t *d,
+ const uint8_t *s, int width)
{
int w;
uint32_t v, r, g, b;
w = width;
do {
- v = lduw_p((void *)s);
+ v = ld_sw_pixel16((void *)s);
r = (v >> 7) & 0xf8;
g = (v >> 2) & 0xf8;
b = (v << 3) & 0xf8;
@@ -305,15 +315,15 @@ static void vga_draw_line15(VGACommonState *s1, uint8_t *d,
/*
* 16 bit color
*/
-static void vga_draw_line16(VGACommonState *s1, uint8_t *d,
- const uint8_t *s, int width)
+static void vga_draw_line16_swap(VGACommonState *s1, uint8_t *d,
+ const uint8_t *s, int width)
{
int w;
uint32_t v, r, g, b;
w = width;
do {
- v = lduw_p((void *)s);
+ v = ld_sw_pixel16((void *)s);
r = (v >> 8) & 0xf8;
g = (v >> 3) & 0xfc;
b = (v << 3) & 0xf8;
@@ -322,4 +332,3 @@ static void vga_draw_line16(VGACommonState *s1, uint8_t *d,
d += 4;
} while (--w != 0);
}
-
We now only use vga_draw_line15() and vga_draw_line16() when byteswapping. Otherwise we have a shared surface. Make this explicit and remove the reliance on lduw_p which uses TARGET_WORDS_ENDIAN. We now only rely on the "byteswap" variable in vga_draw_graphic(). Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> --- hw/display/vga.c | 22 +++++++++++++--------- hw/display/vga_template.h | 23 ++++++++++++++++------- 2 files changed, 29 insertions(+), 16 deletions(-)