Fix g364fb video emulation
PATCH 1/1 Fix g364fb video emulation
Hi,
Attached patches fixes screen resolution handling for g364 graphic card. It removes last_scr_width/last_scr_height whose role was not very clear, and uses qemu_console_resize(), added in r4812.
Hervé
g364fb.c +12 -14
@@ -36,7 +36,6 @@QEMUConsole *console;int graphic_mode;uint32_t scr_width, scr_height;/* in pixels */ -uint32_t last_scr_width, last_scr_height;/* in pixels */ } G364State;/*
@@ -73,9 +72,6 @@static void g364fb_draw_graphic (G364State *s,int full_update) { -if (s->scr_width ==0 || s->scr_height ==0 ) -return ; -switch (s->ds->depth) {case 8 :g364fb_draw_graphic8 (s, full_update);
@@ -94,7 +90,7 @@return ; } -dpy_update (s->ds,0 ,0 , s->last_scr_width, s->last_scr_height); +dpy_update (s->ds,0 ,0 , s->scr_width, s->scr_height); }static void g364fb_draw_blank (G364State *s,int full_update)
@@ -104,17 +100,15 @@if (!full_update)return ; -if (s->last_scr_width <=0 || s->last_scr_height <=0 ) -return ; - w = s->last_scr_width * ((s->ds->depth +7 ) >>3 ); + w = s->scr_width * ((s->ds->depth +7 ) >>3 ); d = s->ds->data; -for (i =0 ; i < s->last_scr_height; i++) { +for (i =0 ; i < s->scr_height; i++) {memset (d,0 , w); d += s->ds->linesize; } -dpy_update (s->ds,0 ,0 , - s->last_scr_width, s->last_scr_height); + +dpy_update (s->ds,0 ,0 , s->scr_width, s->scr_height); }#define GMODE_GRAPH 0
@@ -125,6 +119,9 @@G364State *s = opaque;int full_update, graphic_mode; +if (s->scr_width ==0 || s->scr_height ==0 ) +return ; +if (s->ctla &CTLA_FORCE_BLANK ) graphic_mode =GMODE_BLANK ;else
@@ -134,6 +131,10 @@ s->graphic_mode = graphic_mode; full_update =1 ; } +if (s->scr_width != s->ds->width || s->scr_height != s->ds->height) { +qemu_console_resize (s->console, s->scr_width, s->scr_height); + full_update =1 ; + }switch (graphic_mode) {case GMODE_GRAPH :g364fb_draw_graphic (s, full_update);
@@ -158,7 +159,6 @@memset (s->palette,0 ,sizeof (s->palette)); s->scr_width = s->scr_height =0 ; - s->last_scr_width = s->last_scr_height =0 ;memset (s->vram_buffer,0 , s->vram_size); s->graphic_mode =-1 ;/* force full update */ }
@@ -266,8 +266,6 @@#endif break ; } -if (s->scr_width && s->scr_height) -qemu_console_resize (s->console, s->scr_width, s->scr_height); } s->graphic_mode =-1 ;/* force full update */ }
g364fb_template.h +3 -3
@@ -27,11 +27,11 @@ uint8_t *data_display, *dd; data_buffer = s->vram_buffer; - w_display = s->last_scr_width * PIXEL_WIDTH / 8; + w_display = s->scr_width * PIXEL_WIDTH / 8; data_display = s->ds->data; - for(i = 0; i < s->last_scr_height; i++) { + for(i = 0; i < s->scr_height; i++) { dd = data_display; - for (j = 0; j < s->last_scr_width; j++, dd += PIXEL_WIDTH / 8, data_buffer++) { + for (j = 0; j < s->scr_width; j++, dd += PIXEL_WIDTH / 8, data_buffer++) { uint8_t index = *data_buffer; *((glue(glue(uint, PIXEL_WIDTH), _t) *)dd) = glue(rgb_to_pixel, BPP)( s->palette[index][0],
Aurelien Jarno
AppliedQuoted 7 lines · Hervé Poussineau
Hi,
Attached patches fixes screen resolution handling for g364 graphic card. It removes last_scr_width/last_scr_height whose role was not very clear, and uses
qemu_console_resize(), added in r4812.Hervé
Applied, thanks.
Quoted 110 lines
Index:
hw/g364fb.c
===================================================================g364fb.c +12
-14@@ -36,7 +36,6 @@QEMUConsole *console;int graphic_mode;uint32_t scr_width, scr_height;/* in pixels */ -uint32_t last_scr_width, last_scr_height;/* in pixels */ } G364State;/* @@ -73,9 +72,6 @@static void g364fb_draw_graphic (G364State *s,int full_update) { -if (s->scr_width ==0 || s->scr_height ==0 ) -return ; -switch (s->ds->depth) {case 8 :g364fb_draw_graphic8 (s, full_update);@@ -94,7 +90,7 @@return ; } -dpy_update (s->ds,0 ,0 , s->last_scr_width, s->last_scr_height); +dpy_update (s->ds,0 ,0 , s->scr_width, s->scr_height); }static void g364fb_draw_blank (G364State *s,int full_update)@@ -104,17 +100,15 @@if (!full_update)return ; -if (s->last_scr_width <=0 || s->last_scr_height <=0 ) -return ; - w = s->last_scr_width * ((s->ds->depth +7 ) >>3 ); + w = s->scr_width * ((s->ds->depth +7 ) >>3 ); d = s->ds->data; -for (i =0 ; i < s->last_scr_height; i++) { +for (i =0 ; i < s->scr_height; i++) {memset (d,0 , w); d += s->ds->linesize; } -dpy_update (s->ds,0 ,0 , - s->last_scr_width, s->last_scr_height); + +dpy_update (s->ds,0 ,0 , s->scr_width, s->scr_height); }#define GMODE_GRAPH 0@@ -125,6 +119,9 @@G364State *s = opaque;int full_update, graphic_mode; +if (s->scr_width ==0 || s->scr_height ==0 ) +return ; +if (s->ctla &CTLA_FORCE_BLANK ) graphic_mode =GMODE_BLANK ;else @@ -134,6 +131,10 @@ s->graphic_mode = graphic_mode; full_update =1 ; } +if (s->scr_width != s->ds->width || s->scr_height != s->ds->height) { +qemu_console_resize (s->console, s->scr_width, s->scr_height); + full_update =1 ; + }switch (graphic_mode) {case GMODE_GRAPH :g364fb_draw_graphic (s, full_update);@@ -158,7 +159,6 @@memset (s->palette,0 ,sizeof (s->palette)); s->scr_width = s->scr_height =0 ; - s->last_scr_width = s->last_scr_height =0 ;memset (s->vram_buffer,0 , s->vram_size); s->graphic_mode =-1 ;/* force full update */ }@@ -266,8 +266,6 @@#endif break ; } -if (s->scr_width && s->scr_height) -qemu_console_resize (s->console, s->scr_width, s->scr_height); } s->graphic_mode =-1 ;/* force full update */ }Index:
hw/g364fb_template.h
===================================================================g364fb_template.h +3
-3@@ -27,11 +27,11 @@ uint8_t *data_display, *dd; data_buffer = s->vram_buffer; - w_display = s->last_scr_width * PIXEL_WIDTH / 8; + w_display = s->scr_width * PIXEL_WIDTH / 8; data_display = s->ds->data; - for(i = 0; i < s->last_scr_height; i++) { + for(i = 0; i < s->scr_height; i++) { dd = data_display; - for (j = 0; j < s->last_scr_width; j++, dd += PIXEL_WIDTH / 8, data_buffer++) { + for (j = 0; j < s->scr_width; j++, dd += PIXEL_WIDTH / 8, data_buffer++) { uint8_t index = *data_buffer; *((glue(glue(uint, PIXEL_WIDTH), _t) *)dd) = glue(rgb_to_pixel, BPP)( s->palette[index][0],
Signature · 4 lines
.''`. Aurelien Jarno | GPG: 1024D/F1BCDB73 : :' : Debian developer | Electrical Engineer `. `' [email protected] | [email protected] `- people.debian.org/~aurel32 | www.aurel32.net