Commit 221bb2d563aec566c6104ed1286aa2fd7f58c3f2

Authored by aurel32
1 parent e64995db

Fix g364fb video emulation

(Hervé Poussineau)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5016 c046a42c-6fe2-441c-8c8c-71466251a162
hw/g364fb.c
@@ -36,7 +36,6 @@ typedef struct G364State { @@ -36,7 +36,6 @@ typedef struct G364State {
36 QEMUConsole *console; 36 QEMUConsole *console;
37 int graphic_mode; 37 int graphic_mode;
38 uint32_t scr_width, scr_height; /* in pixels */ 38 uint32_t scr_width, scr_height; /* in pixels */
39 - uint32_t last_scr_width, last_scr_height; /* in pixels */  
40 } G364State; 39 } G364State;
41 40
42 /* 41 /*
@@ -73,9 +72,6 @@ typedef struct G364State { @@ -73,9 +72,6 @@ typedef struct G364State {
73 72
74 static void g364fb_draw_graphic(G364State *s, int full_update) 73 static void g364fb_draw_graphic(G364State *s, int full_update)
75 { 74 {
76 - if (s->scr_width == 0 || s->scr_height == 0)  
77 - return;  
78 -  
79 switch (s->ds->depth) { 75 switch (s->ds->depth) {
80 case 8: 76 case 8:
81 g364fb_draw_graphic8(s, full_update); 77 g364fb_draw_graphic8(s, full_update);
@@ -94,7 +90,7 @@ static void g364fb_draw_graphic(G364State *s, int full_update) @@ -94,7 +90,7 @@ static void g364fb_draw_graphic(G364State *s, int full_update)
94 return; 90 return;
95 } 91 }
96 92
97 - dpy_update(s->ds, 0, 0, s->last_scr_width, s->last_scr_height); 93 + dpy_update(s->ds, 0, 0, s->scr_width, s->scr_height);
98 } 94 }
99 95
100 static void g364fb_draw_blank(G364State *s, int full_update) 96 static void g364fb_draw_blank(G364State *s, int full_update)
@@ -104,17 +100,15 @@ static void g364fb_draw_blank(G364State *s, int full_update) @@ -104,17 +100,15 @@ static void g364fb_draw_blank(G364State *s, int full_update)
104 100
105 if (!full_update) 101 if (!full_update)
106 return; 102 return;
107 - if (s->last_scr_width <= 0 || s->last_scr_height <= 0)  
108 - return;  
109 103
110 - w = s->last_scr_width * ((s->ds->depth + 7) >> 3); 104 + w = s->scr_width * ((s->ds->depth + 7) >> 3);
111 d = s->ds->data; 105 d = s->ds->data;
112 - for(i = 0; i < s->last_scr_height; i++) { 106 + for(i = 0; i < s->scr_height; i++) {
113 memset(d, 0, w); 107 memset(d, 0, w);
114 d += s->ds->linesize; 108 d += s->ds->linesize;
115 } 109 }
116 - dpy_update(s->ds, 0, 0,  
117 - s->last_scr_width, s->last_scr_height); 110 +
  111 + dpy_update(s->ds, 0, 0, s->scr_width, s->scr_height);
118 } 112 }
119 113
120 #define GMODE_GRAPH 0 114 #define GMODE_GRAPH 0
@@ -125,6 +119,9 @@ static void g364fb_update_display(void *opaque) @@ -125,6 +119,9 @@ static void g364fb_update_display(void *opaque)
125 G364State *s = opaque; 119 G364State *s = opaque;
126 int full_update, graphic_mode; 120 int full_update, graphic_mode;
127 121
  122 + if (s->scr_width == 0 || s->scr_height == 0)
  123 + return;
  124 +
128 if (s->ctla & CTLA_FORCE_BLANK) 125 if (s->ctla & CTLA_FORCE_BLANK)
129 graphic_mode = GMODE_BLANK; 126 graphic_mode = GMODE_BLANK;
130 else 127 else
@@ -134,6 +131,10 @@ static void g364fb_update_display(void *opaque) @@ -134,6 +131,10 @@ static void g364fb_update_display(void *opaque)
134 s->graphic_mode = graphic_mode; 131 s->graphic_mode = graphic_mode;
135 full_update = 1; 132 full_update = 1;
136 } 133 }
  134 + if (s->scr_width != s->ds->width || s->scr_height != s->ds->height) {
  135 + qemu_console_resize(s->console, s->scr_width, s->scr_height);
  136 + full_update = 1;
  137 + }
137 switch(graphic_mode) { 138 switch(graphic_mode) {
138 case GMODE_GRAPH: 139 case GMODE_GRAPH:
139 g364fb_draw_graphic(s, full_update); 140 g364fb_draw_graphic(s, full_update);
@@ -158,7 +159,6 @@ static void g364fb_reset(void *opaque) @@ -158,7 +159,6 @@ static void g364fb_reset(void *opaque)
158 159
159 memset(s->palette, 0, sizeof(s->palette)); 160 memset(s->palette, 0, sizeof(s->palette));
160 s->scr_width = s->scr_height = 0; 161 s->scr_width = s->scr_height = 0;
161 - s->last_scr_width = s->last_scr_height = 0;  
162 memset(s->vram_buffer, 0, s->vram_size); 162 memset(s->vram_buffer, 0, s->vram_size);
163 s->graphic_mode = -1; /* force full update */ 163 s->graphic_mode = -1; /* force full update */
164 } 164 }
@@ -266,8 +266,6 @@ static void g364fb_ctrl_writeb(void *opaque, target_phys_addr_t addr, uint32_t v @@ -266,8 +266,6 @@ static void g364fb_ctrl_writeb(void *opaque, target_phys_addr_t addr, uint32_t v
266 #endif 266 #endif
267 break; 267 break;
268 } 268 }
269 - if (s->scr_width && s->scr_height)  
270 - qemu_console_resize(s->console, s->scr_width, s->scr_height);  
271 } 269 }
272 s->graphic_mode = -1; /* force full update */ 270 s->graphic_mode = -1; /* force full update */
273 } 271 }
hw/g364fb_template.h
@@ -27,11 +27,11 @@ static void glue(g364fb_draw_graphic, BPP)(G364State *s, int full_update) @@ -27,11 +27,11 @@ static void glue(g364fb_draw_graphic, BPP)(G364State *s, int full_update)
27 uint8_t *data_display, *dd; 27 uint8_t *data_display, *dd;
28 28
29 data_buffer = s->vram_buffer; 29 data_buffer = s->vram_buffer;
30 - w_display = s->last_scr_width * PIXEL_WIDTH / 8; 30 + w_display = s->scr_width * PIXEL_WIDTH / 8;
31 data_display = s->ds->data; 31 data_display = s->ds->data;
32 - for(i = 0; i < s->last_scr_height; i++) { 32 + for(i = 0; i < s->scr_height; i++) {
33 dd = data_display; 33 dd = data_display;
34 - for (j = 0; j < s->last_scr_width; j++, dd += PIXEL_WIDTH / 8, data_buffer++) { 34 + for (j = 0; j < s->scr_width; j++, dd += PIXEL_WIDTH / 8, data_buffer++) {
35 uint8_t index = *data_buffer; 35 uint8_t index = *data_buffer;
36 *((glue(glue(uint, PIXEL_WIDTH), _t) *)dd) = glue(rgb_to_pixel, BPP)( 36 *((glue(glue(uint, PIXEL_WIDTH), _t) *)dd) = glue(rgb_to_pixel, BPP)(
37 s->palette[index][0], 37 s->palette[index][0],