1
From ca727af0d4ae4076042a240e1112f4475de086ab Mon Sep 17 00:00:00 2001
2
From: Riku Voipio <riku.voipio@nokia.com>
3
Date: Mon, 18 Feb 2013 16:58:22 +0000
4
Subject: [PATCH 01/70] blizzard: fix for non-32bpp host displays
6
TODO: I'm not sure how to trigger this bug, or if the fix is correct
7
(the comments say it's a hack)
9
hw/display/blizzard.c | 105 +++++++++++++++++++++++++++-----------------------
10
1 file changed, 57 insertions(+), 48 deletions(-)
12
diff --git a/hw/display/blizzard.c b/hw/display/blizzard.c
13
index 4a466c8..40f4a5f 100644
14
--- a/hw/display/blizzard.c
15
+++ b/hw/display/blizzard.c
16
@@ -70,7 +70,6 @@ typedef struct {
20
- blizzard_fn_t *line_fn_tab[2];
23
uint8_t hssi_config[3];
24
@@ -116,7 +115,6 @@ typedef struct {
28
- blizzard_fn_t line_fn;
32
@@ -134,6 +132,17 @@ static const int blizzard_iformat_bpp[0x10] = {
37
+#include "blizzard_template.h"
39
+#include "blizzard_template.h"
41
+#include "blizzard_template.h"
43
+#include "blizzard_template.h"
45
+#include "blizzard_template.h"
47
static inline void blizzard_rgb2yuv(int r, int g, int b,
48
int *y, int *u, int *v)
50
@@ -149,8 +158,49 @@ static void blizzard_window(BlizzardState *s)
54
- blizzard_fn_t fn = s->data.line_fn;
55
+ blizzard_fn_t fn = 0;
58
+ /* FIXME: this is a hack - but nseries.c will use this function
59
+ * before correct DisplayState is initialized so we need a way to
60
+ * avoid drawing something when we actually have no clue about host bpp */
61
+ /* XXX PMM : this is no longer possible after the changes to use
62
+ * DisplaySurfaces -- need to check if it is still a problem...
64
+ if (QLIST_EMPTY(&s->state->listeners)) {
69
+ switch (surface_bits_per_pixel(surface)) {
72
+ ? blizzard_draw_fn_r_8[s->iformat]
73
+ : blizzard_draw_fn_8[s->iformat];
77
+ ? blizzard_draw_fn_r_15[s->iformat]
78
+ : blizzard_draw_fn_15[s->iformat];
82
+ ? blizzard_draw_fn_r_16[s->iformat]
83
+ : blizzard_draw_fn_16[s->iformat];
87
+ ? blizzard_draw_fn_r_24[s->iformat]
88
+ : blizzard_draw_fn_24[s->iformat];
92
+ ? blizzard_draw_fn_r_32[s->iformat]
93
+ : blizzard_draw_fn_32[s->iformat];
100
if (s->mx[0] > s->data.x)
101
@@ -181,7 +231,6 @@ static int blizzard_transfer_setup(BlizzardState *s)
104
s->data.angle = s->effect & 3;
105
- s->data.line_fn = s->line_fn_tab[!!s->data.angle][s->iformat];
106
s->data.x = s->ix[0];
107
s->data.y = s->iy[0];
108
s->data.dx = s->ix[1] - s->ix[0] + 1;
109
@@ -933,17 +982,6 @@ static void blizzard_update_display(void *opaque)
114
-#include "blizzard_template.h"
116
-#include "blizzard_template.h"
118
-#include "blizzard_template.h"
120
-#include "blizzard_template.h"
122
-#include "blizzard_template.h"
124
static const GraphicHwOps blizzard_ops = {
125
.invalidate = blizzard_invalidate_display,
126
.gfx_update = blizzard_update_display,
127
@@ -952,44 +990,15 @@ static const GraphicHwOps blizzard_ops = {
128
void *s1d13745_init(qemu_irq gpio_int)
130
BlizzardState *s = (BlizzardState *) g_malloc0(sizeof(*s));
131
- DisplaySurface *surface;
133
s->fb = g_malloc(0x180000);
134
+ /* Fill the framebuffer with white color here because the corresponding
135
+ * code in nseries.c is broken since the DisplayState change in QEMU.
136
+ * This is supposedly ok since nseries.c is the only user of blizzard.c */
137
+ memset(s->fb, 0xff, 0x180000);
139
s->con = graphic_console_init(NULL, &blizzard_ops, s);
140
- surface = qemu_console_surface(s->con);
142
- switch (surface_bits_per_pixel(surface)) {
144
- s->line_fn_tab[0] = s->line_fn_tab[1] =
145
- g_malloc0(sizeof(blizzard_fn_t) * 0x10);
148
- s->line_fn_tab[0] = blizzard_draw_fn_8;
149
- s->line_fn_tab[1] = blizzard_draw_fn_r_8;
152
- s->line_fn_tab[0] = blizzard_draw_fn_15;
153
- s->line_fn_tab[1] = blizzard_draw_fn_r_15;
156
- s->line_fn_tab[0] = blizzard_draw_fn_16;
157
- s->line_fn_tab[1] = blizzard_draw_fn_r_16;
160
- s->line_fn_tab[0] = blizzard_draw_fn_24;
161
- s->line_fn_tab[1] = blizzard_draw_fn_r_24;
164
- s->line_fn_tab[0] = blizzard_draw_fn_32;
165
- s->line_fn_tab[1] = blizzard_draw_fn_r_32;
168
- fprintf(stderr, "%s: Bad color depth\n", __FUNCTION__);