Commit 95219897ff4e6d0502b920c521fccc612ad913dd

Authored by pbrook
1 parent 07435f74

Allow multiple graphics devices.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1803 c046a42c-6fe2-441c-8c8c-71466251a162
@@ -365,8 +365,8 @@ static void cocoa_refresh(DisplayState *ds) @@ -365,8 +365,8 @@ static void cocoa_refresh(DisplayState *ds)
365 pool = [ [ NSAutoreleasePool alloc ] init ]; 365 pool = [ [ NSAutoreleasePool alloc ] init ];
366 distantPast = [ NSDate distantPast ]; 366 distantPast = [ NSDate distantPast ];
367 367
368 - if (is_active_console(vga_console))  
369 - vga_update_display(); 368 + vga_hw_update();
  369 +
370 do { 370 do {
371 event = [ NSApp nextEventMatchingMask:NSAnyEventMask untilDate:distantPast 371 event = [ NSApp nextEventMatchingMask:NSAnyEventMask untilDate:distantPast
372 inMode: NSDefaultRunLoopMode dequeue:YES ]; 372 inMode: NSDefaultRunLoopMode dequeue:YES ];
@@ -382,7 +382,7 @@ static void cocoa_refresh(DisplayState *ds) @@ -382,7 +382,7 @@ static void cocoa_refresh(DisplayState *ds)
382 /* emulate caps lock and num lock keydown and keyup */ 382 /* emulate caps lock and num lock keydown and keyup */
383 kbd_put_keycode(keycode); 383 kbd_put_keycode(keycode);
384 kbd_put_keycode(keycode | 0x80); 384 kbd_put_keycode(keycode | 0x80);
385 - } else if (is_active_console(vga_console)) { 385 + } else if (is_graphic_console()) {
386 if (keycode & 0x80) 386 if (keycode & 0x80)
387 kbd_put_keycode(0xe0); 387 kbd_put_keycode(0xe0);
388 if (modifiers_state[keycode] == 0) { 388 if (modifiers_state[keycode] == 0) {
@@ -429,15 +429,12 @@ static void cocoa_refresh(DisplayState *ds) @@ -429,15 +429,12 @@ static void cocoa_refresh(DisplayState *ds)
429 /* toggle Monitor */ 429 /* toggle Monitor */
430 case 0x02 ... 0x0a: /* '1' to '9' keys */ 430 case 0x02 ... 0x0a: /* '1' to '9' keys */
431 console_select(keycode - 0x02); 431 console_select(keycode - 0x02);
432 - if (is_active_console(vga_console)) {  
433 - /* tell the vga console to redisplay itself */  
434 - vga_invalidate_display();  
435 break; 432 break;
436 } 433 }
437 } 434 }
438 } else { 435 } else {
439 /* handle standard key events */ 436 /* handle standard key events */
440 - if (is_active_console(vga_console)) { 437 + if (is_graphic_console()) {
441 if (keycode & 0x80) //check bit for e0 in front 438 if (keycode & 0x80) //check bit for e0 in front
442 kbd_put_keycode(0xe0); 439 kbd_put_keycode(0xe0);
443 kbd_put_keycode(keycode & 0x7f); //remove e0 bit in front 440 kbd_put_keycode(keycode & 0x7f); //remove e0 bit in front
@@ -468,7 +465,7 @@ static void cocoa_refresh(DisplayState *ds) @@ -468,7 +465,7 @@ static void cocoa_refresh(DisplayState *ds)
468 case NSKeyUp: 465 case NSKeyUp:
469 { 466 {
470 int keycode = cocoa_keycode_to_qemu([event keyCode]); 467 int keycode = cocoa_keycode_to_qemu([event keyCode]);
471 - if (is_active_console(vga_console)) { 468 + if (is_graphic_console()) {
472 if (keycode & 0x80) 469 if (keycode & 0x80)
473 kbd_put_keycode(0xe0); 470 kbd_put_keycode(0xe0);
474 kbd_put_keycode(keycode | 0x80); //add 128 to signal release of key 471 kbd_put_keycode(keycode | 0x80); //add 128 to signal release of key
console.c
@@ -53,10 +53,17 @@ enum TTYState { @@ -53,10 +53,17 @@ enum TTYState {
53 TTY_STATE_CSI, 53 TTY_STATE_CSI,
54 }; 54 };
55 55
56 - 56 +/* ??? This is mis-named.
  57 + It is used for both text and graphical consoles. */
57 struct TextConsole { 58 struct TextConsole {
58 int text_console; /* true if text console */ 59 int text_console; /* true if text console */
59 DisplayState *ds; 60 DisplayState *ds;
  61 + /* Graphic console state. */
  62 + vga_hw_update_ptr hw_update;
  63 + vga_hw_invalidate_ptr hw_invalidate;
  64 + vga_hw_screen_dump_ptr hw_screen_dump;
  65 + void *hw;
  66 +
60 int g_width, g_height; 67 int g_width, g_height;
61 int width; 68 int width;
62 int height; 69 int height;
@@ -82,6 +89,26 @@ static TextConsole *active_console; @@ -82,6 +89,26 @@ static TextConsole *active_console;
82 static TextConsole *consoles[MAX_CONSOLES]; 89 static TextConsole *consoles[MAX_CONSOLES];
83 static int nb_consoles = 0; 90 static int nb_consoles = 0;
84 91
  92 +void vga_hw_update(void)
  93 +{
  94 + if (active_console->hw_update)
  95 + active_console->hw_update(active_console->hw);
  96 +}
  97 +
  98 +void vga_hw_invalidate(void)
  99 +{
  100 + if (active_console->hw_invalidate)
  101 + active_console->hw_invalidate(active_console->hw);
  102 +}
  103 +
  104 +void vga_hw_screen_dump(const char *filename)
  105 +{
  106 + /* There is currently no was of specifying which screen we want to dump,
  107 + so always dump the dirst one. */
  108 + if (consoles[0]->hw_screen_dump)
  109 + consoles[0]->hw_screen_dump(consoles[0]->hw, filename);
  110 +}
  111 +
85 /* convert a RGBA color to a color index usable in graphic primitives */ 112 /* convert a RGBA color to a color index usable in graphic primitives */
86 static unsigned int vga_get_color(DisplayState *ds, unsigned int rgba) 113 static unsigned int vga_get_color(DisplayState *ds, unsigned int rgba)
87 { 114 {
@@ -782,8 +809,10 @@ void console_select(unsigned int index) @@ -782,8 +809,10 @@ void console_select(unsigned int index)
782 s->g_width = s->ds->width; 809 s->g_width = s->ds->width;
783 s->g_height = s->ds->height; 810 s->g_height = s->ds->height;
784 text_console_resize(s); 811 text_console_resize(s);
785 - } 812 + }
786 console_refresh(s); 813 console_refresh(s);
  814 + } else {
  815 + vga_hw_invalidate();
787 } 816 }
788 } 817 }
789 } 818 }
@@ -874,9 +903,10 @@ void kbd_put_keysym(int keysym) @@ -874,9 +903,10 @@ void kbd_put_keysym(int keysym)
874 } 903 }
875 } 904 }
876 905
877 -TextConsole *graphic_console_init(DisplayState *ds) 906 +static TextConsole *new_console(DisplayState *ds, int text)
878 { 907 {
879 TextConsole *s; 908 TextConsole *s;
  909 + int i;
880 910
881 if (nb_consoles >= MAX_CONSOLES) 911 if (nb_consoles >= MAX_CONSOLES)
882 return NULL; 912 return NULL;
@@ -884,16 +914,44 @@ TextConsole *graphic_console_init(DisplayState *ds) @@ -884,16 +914,44 @@ TextConsole *graphic_console_init(DisplayState *ds)
884 if (!s) { 914 if (!s) {
885 return NULL; 915 return NULL;
886 } 916 }
887 - if (!active_console) 917 + if (!active_console || (active_console->text_console && !text))
888 active_console = s; 918 active_console = s;
889 s->ds = ds; 919 s->ds = ds;
890 - consoles[nb_consoles++] = s; 920 + s->text_console = text;
  921 + if (text) {
  922 + consoles[nb_consoles++] = s;
  923 + } else {
  924 + /* HACK: Put graphical consoles before text consoles. */
  925 + for (i = nb_consoles; i > 0; i--) {
  926 + if (!consoles[i - 1]->text_console)
  927 + break;
  928 + consoles[i] = consoles[i - 1];
  929 + }
  930 + consoles[i] = s;
  931 + }
  932 + return s;
  933 +}
  934 +
  935 +TextConsole *graphic_console_init(DisplayState *ds, vga_hw_update_ptr update,
  936 + vga_hw_invalidate_ptr invalidate,
  937 + vga_hw_screen_dump_ptr screen_dump,
  938 + void *opaque)
  939 +{
  940 + TextConsole *s;
  941 +
  942 + s = new_console(ds, 0);
  943 + if (!s)
  944 + return NULL;
  945 + s->hw_update = update;
  946 + s->hw_invalidate = invalidate;
  947 + s->hw_screen_dump = screen_dump;
  948 + s->hw = opaque;
891 return s; 949 return s;
892 } 950 }
893 951
894 -int is_active_console(TextConsole *s) 952 +int is_graphic_console(void)
895 { 953 {
896 - return s == active_console; 954 + return !active_console->text_console;
897 } 955 }
898 956
899 CharDriverState *text_console_init(DisplayState *ds) 957 CharDriverState *text_console_init(DisplayState *ds)
@@ -906,12 +964,11 @@ CharDriverState *text_console_init(DisplayState *ds) @@ -906,12 +964,11 @@ CharDriverState *text_console_init(DisplayState *ds)
906 chr = qemu_mallocz(sizeof(CharDriverState)); 964 chr = qemu_mallocz(sizeof(CharDriverState));
907 if (!chr) 965 if (!chr)
908 return NULL; 966 return NULL;
909 - s = graphic_console_init(ds); 967 + s = new_console(ds, 1);
910 if (!s) { 968 if (!s) {
911 free(chr); 969 free(chr);
912 return NULL; 970 return NULL;
913 } 971 }
914 - s->text_console = 1;  
915 chr->opaque = s; 972 chr->opaque = s;
916 chr->chr_write = console_puts; 973 chr->chr_write = console_puts;
917 chr->chr_add_read_handler = console_chr_add_read_handler; 974 chr->chr_add_read_handler = console_chr_add_read_handler;
hw/integratorcp.c
@@ -27,22 +27,6 @@ void irq_info(void) @@ -27,22 +27,6 @@ void irq_info(void)
27 { 27 {
28 } 28 }
29 29
30 -static void *lcd;  
31 -  
32 -void vga_update_display(void)  
33 -{  
34 - pl110_update_display(lcd);  
35 -}  
36 -  
37 -void vga_screen_dump(const char *filename)  
38 -{  
39 -}  
40 -  
41 -void vga_invalidate_display(void)  
42 -{  
43 - pl110_invalidate_display(lcd);  
44 -}  
45 -  
46 void DMA_run (void) 30 void DMA_run (void)
47 { 31 {
48 } 32 }
@@ -1210,7 +1194,7 @@ static void integratorcp_init(int ram_size, int vga_ram_size, int boot_device, @@ -1210,7 +1194,7 @@ static void integratorcp_init(int ram_size, int vga_ram_size, int boot_device,
1210 exit (1); 1194 exit (1);
1211 } 1195 }
1212 } 1196 }
1213 - lcd = pl110_init(ds, 0xc0000000, pic, 22); 1197 + pl110_init(ds, 0xc0000000, pic, 22, 0);
1214 1198
1215 /* Load the kernel. */ 1199 /* Load the kernel. */
1216 if (!kernel_filename) { 1200 if (!kernel_filename) {
hw/pl110.c
@@ -89,7 +89,7 @@ static int pl110_enabled(pl110_state *s) @@ -89,7 +89,7 @@ static int pl110_enabled(pl110_state *s)
89 return (s->cr & PL110_CR_EN) && (s->cr & PL110_CR_PWR); 89 return (s->cr & PL110_CR_EN) && (s->cr & PL110_CR_PWR);
90 } 90 }
91 91
92 -void pl110_update_display(void *opaque) 92 +static void pl110_update_display(void *opaque)
93 { 93 {
94 pl110_state *s = (pl110_state *)opaque; 94 pl110_state *s = (pl110_state *)opaque;
95 drawfn* fntable; 95 drawfn* fntable;
@@ -205,7 +205,7 @@ void pl110_update_display(void *opaque) @@ -205,7 +205,7 @@ void pl110_update_display(void *opaque)
205 dpy_update(s->ds, 0, first, s->cols, last - first + 1); 205 dpy_update(s->ds, 0, first, s->cols, last - first + 1);
206 } 206 }
207 207
208 -void pl110_invalidate_display(void * opaque) 208 +static void pl110_invalidate_display(void * opaque)
209 { 209 {
210 pl110_state *s = (pl110_state *)opaque; 210 pl110_state *s = (pl110_state *)opaque;
211 s->invalidate = 1; 211 s->invalidate = 1;
@@ -378,7 +378,8 @@ static CPUWriteMemoryFunc *pl110_writefn[] = { @@ -378,7 +378,8 @@ static CPUWriteMemoryFunc *pl110_writefn[] = {
378 pl110_write 378 pl110_write
379 }; 379 };
380 380
381 -void *pl110_init(DisplayState *ds, uint32_t base, void *pic, int irq) 381 +void *pl110_init(DisplayState *ds, uint32_t base, void *pic, int irq,
  382 + int versatile)
382 { 383 {
383 pl110_state *s; 384 pl110_state *s;
384 int iomemtype; 385 int iomemtype;
@@ -386,11 +387,13 @@ void *pl110_init(DisplayState *ds, uint32_t base, void *pic, int irq) @@ -386,11 +387,13 @@ void *pl110_init(DisplayState *ds, uint32_t base, void *pic, int irq)
386 s = (pl110_state *)qemu_mallocz(sizeof(pl110_state)); 387 s = (pl110_state *)qemu_mallocz(sizeof(pl110_state));
387 iomemtype = cpu_register_io_memory(0, pl110_readfn, 388 iomemtype = cpu_register_io_memory(0, pl110_readfn,
388 pl110_writefn, s); 389 pl110_writefn, s);
389 - cpu_register_physical_memory(base, 0x007fffff, iomemtype); 390 + cpu_register_physical_memory(base, 0x00000fff, iomemtype);
390 s->base = base; 391 s->base = base;
391 s->ds = ds; 392 s->ds = ds;
392 s->pic = pic; 393 s->pic = pic;
393 s->irq = irq; 394 s->irq = irq;
  395 + graphic_console_init(ds, pl110_update_display, pl110_invalidate_display,
  396 + NULL, s);
394 /* ??? Save/restore. */ 397 /* ??? Save/restore. */
395 return s; 398 return s;
396 } 399 }
hw/sun4m.c
@@ -187,23 +187,6 @@ void pic_set_irq_cpu(int irq, int level, unsigned int cpu) @@ -187,23 +187,6 @@ void pic_set_irq_cpu(int irq, int level, unsigned int cpu)
187 slavio_pic_set_irq_cpu(slavio_intctl, irq, level, cpu); 187 slavio_pic_set_irq_cpu(slavio_intctl, irq, level, cpu);
188 } 188 }
189 189
190 -static void *tcx;  
191 -  
192 -void vga_update_display()  
193 -{  
194 - tcx_update_display(tcx);  
195 -}  
196 -  
197 -void vga_invalidate_display()  
198 -{  
199 - tcx_invalidate_display(tcx);  
200 -}  
201 -  
202 -void vga_screen_dump(const char *filename)  
203 -{  
204 - tcx_screen_dump(tcx, filename);  
205 -}  
206 -  
207 static void *iommu; 190 static void *iommu;
208 191
209 uint32_t iommu_translate(uint32_t addr) 192 uint32_t iommu_translate(uint32_t addr)
@@ -256,7 +239,7 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device, @@ -256,7 +239,7 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device,
256 slavio_intctl_set_cpu(slavio_intctl, i, envs[i]); 239 slavio_intctl_set_cpu(slavio_intctl, i, envs[i]);
257 } 240 }
258 241
259 - tcx = tcx_init(ds, PHYS_JJ_TCX_FB, phys_ram_base + ram_size, ram_size, vram_size, graphic_width, graphic_height); 242 + tcx_init(ds, PHYS_JJ_TCX_FB, phys_ram_base + ram_size, ram_size, vram_size, graphic_width, graphic_height);
260 if (nd_table[0].vlan) { 243 if (nd_table[0].vlan) {
261 if (nd_table[0].model == NULL 244 if (nd_table[0].model == NULL
262 || strcmp(nd_table[0].model, "lance") == 0) { 245 || strcmp(nd_table[0].model, "lance") == 0) {
hw/tcx.c
@@ -37,6 +37,8 @@ typedef struct TCXState { @@ -37,6 +37,8 @@ typedef struct TCXState {
37 uint8_t dac_index, dac_state; 37 uint8_t dac_index, dac_state;
38 } TCXState; 38 } TCXState;
39 39
  40 +static void tcx_screen_dump(void *opaque, const char *filename);
  41 +
40 static void tcx_draw_line32(TCXState *s1, uint8_t *d, 42 static void tcx_draw_line32(TCXState *s1, uint8_t *d,
41 const uint8_t *s, int width) 43 const uint8_t *s, int width)
42 { 44 {
@@ -81,7 +83,7 @@ static void tcx_draw_line8(TCXState *s1, uint8_t *d, @@ -81,7 +83,7 @@ static void tcx_draw_line8(TCXState *s1, uint8_t *d,
81 83
82 /* Fixed line length 1024 allows us to do nice tricks not possible on 84 /* Fixed line length 1024 allows us to do nice tricks not possible on
83 VGA... */ 85 VGA... */
84 -void tcx_update_display(void *opaque) 86 +static void tcx_update_display(void *opaque)
85 { 87 {
86 TCXState *ts = opaque; 88 TCXState *ts = opaque;
87 uint32_t page; 89 uint32_t page;
@@ -158,7 +160,7 @@ void tcx_update_display(void *opaque) @@ -158,7 +160,7 @@ void tcx_update_display(void *opaque)
158 } 160 }
159 } 161 }
160 162
161 -void tcx_invalidate_display(void *opaque) 163 +static void tcx_invalidate_display(void *opaque)
162 { 164 {
163 TCXState *s = opaque; 165 TCXState *s = opaque;
164 int i; 166 int i;
@@ -269,15 +271,15 @@ static CPUWriteMemoryFunc *tcx_dac_write[3] = { @@ -269,15 +271,15 @@ static CPUWriteMemoryFunc *tcx_dac_write[3] = {
269 tcx_dac_writel, 271 tcx_dac_writel,
270 }; 272 };
271 273
272 -void *tcx_init(DisplayState *ds, uint32_t addr, uint8_t *vram_base,  
273 - unsigned long vram_offset, int vram_size, int width, int height) 274 +void tcx_init(DisplayState *ds, uint32_t addr, uint8_t *vram_base,
  275 + unsigned long vram_offset, int vram_size, int width, int height)
274 { 276 {
275 TCXState *s; 277 TCXState *s;
276 int io_memory; 278 int io_memory;
277 279
278 s = qemu_mallocz(sizeof(TCXState)); 280 s = qemu_mallocz(sizeof(TCXState));
279 if (!s) 281 if (!s)
280 - return NULL; 282 + return;
281 s->ds = ds; 283 s->ds = ds;
282 s->addr = addr; 284 s->addr = addr;
283 s->vram = vram_base; 285 s->vram = vram_base;
@@ -289,14 +291,15 @@ void *tcx_init(DisplayState *ds, uint32_t addr, uint8_t *vram_base, @@ -289,14 +291,15 @@ void *tcx_init(DisplayState *ds, uint32_t addr, uint8_t *vram_base,
289 io_memory = cpu_register_io_memory(0, tcx_dac_read, tcx_dac_write, s); 291 io_memory = cpu_register_io_memory(0, tcx_dac_read, tcx_dac_write, s);
290 cpu_register_physical_memory(addr + 0x200000, TCX_DAC_NREGS, io_memory); 292 cpu_register_physical_memory(addr + 0x200000, TCX_DAC_NREGS, io_memory);
291 293
  294 + graphic_console_init(s->ds, tcx_update_display, tcx_invalidate_display,
  295 + tcx_screen_dump, s);
292 register_savevm("tcx", addr, 1, tcx_save, tcx_load, s); 296 register_savevm("tcx", addr, 1, tcx_save, tcx_load, s);
293 qemu_register_reset(tcx_reset, s); 297 qemu_register_reset(tcx_reset, s);
294 tcx_reset(s); 298 tcx_reset(s);
295 dpy_resize(s->ds, width, height); 299 dpy_resize(s->ds, width, height);
296 - return s;  
297 } 300 }
298 301
299 -void tcx_screen_dump(void *opaque, const char *filename) 302 +static void tcx_screen_dump(void *opaque, const char *filename)
300 { 303 {
301 TCXState *s = opaque; 304 TCXState *s = opaque;
302 FILE *f; 305 FILE *f;
hw/vga.c
@@ -146,6 +146,8 @@ static uint8_t expand4to8[16]; @@ -146,6 +146,8 @@ static uint8_t expand4to8[16];
146 VGAState *vga_state; 146 VGAState *vga_state;
147 int vga_io_memory; 147 int vga_io_memory;
148 148
  149 +static void vga_screen_dump(void *opaque, const char *filename);
  150 +
149 static uint32_t vga_ioport_read(void *opaque, uint32_t addr) 151 static uint32_t vga_ioport_read(void *opaque, uint32_t addr)
150 { 152 {
151 VGAState *s = opaque; 153 VGAState *s = opaque;
@@ -1482,9 +1484,9 @@ static void vga_draw_blank(VGAState *s, int full_update) @@ -1482,9 +1484,9 @@ static void vga_draw_blank(VGAState *s, int full_update)
1482 #define GMODE_GRAPH 1 1484 #define GMODE_GRAPH 1
1483 #define GMODE_BLANK 2 1485 #define GMODE_BLANK 2
1484 1486
1485 -void vga_update_display(void) 1487 +static void vga_update_display(void *opaque)
1486 { 1488 {
1487 - VGAState *s = vga_state; 1489 + VGAState *s = (VGAState *)opaque;
1488 int full_update, graphic_mode; 1490 int full_update, graphic_mode;
1489 1491
1490 if (s->ds->depth == 0) { 1492 if (s->ds->depth == 0) {
@@ -1532,9 +1534,9 @@ void vga_update_display(void) @@ -1532,9 +1534,9 @@ void vga_update_display(void)
1532 } 1534 }
1533 1535
1534 /* force a full display refresh */ 1536 /* force a full display refresh */
1535 -void vga_invalidate_display(void) 1537 +static void vga_invalidate_display(void *opaque)
1536 { 1538 {
1537 - VGAState *s = vga_state; 1539 + VGAState *s = (VGAState *)opaque;
1538 1540
1539 s->last_width = -1; 1541 s->last_width = -1;
1540 s->last_height = -1; 1542 s->last_height = -1;
@@ -1698,6 +1700,8 @@ void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base, @@ -1698,6 +1700,8 @@ void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base,
1698 s->get_bpp = vga_get_bpp; 1700 s->get_bpp = vga_get_bpp;
1699 s->get_offsets = vga_get_offsets; 1701 s->get_offsets = vga_get_offsets;
1700 s->get_resolution = vga_get_resolution; 1702 s->get_resolution = vga_get_resolution;
  1703 + graphic_console_init(s->ds, vga_update_display, vga_invalidate_display,
  1704 + vga_screen_dump, s);
1701 /* XXX: currently needed for display */ 1705 /* XXX: currently needed for display */
1702 vga_state = s; 1706 vga_state = s;
1703 } 1707 }
@@ -1854,13 +1858,13 @@ static int ppm_save(const char *filename, uint8_t *data, @@ -1854,13 +1858,13 @@ static int ppm_save(const char *filename, uint8_t *data,
1854 1858
1855 /* save the vga display in a PPM image even if no display is 1859 /* save the vga display in a PPM image even if no display is
1856 available */ 1860 available */
1857 -void vga_screen_dump(const char *filename) 1861 +static void vga_screen_dump(void *opaque, const char *filename)
1858 { 1862 {
1859 - VGAState *s = vga_state; 1863 + VGAState *s = (VGAState *)opaque;
1860 DisplayState *saved_ds, ds1, *ds = &ds1; 1864 DisplayState *saved_ds, ds1, *ds = &ds1;
1861 1865
1862 /* XXX: this is a little hackish */ 1866 /* XXX: this is a little hackish */
1863 - vga_invalidate_display(); 1867 + vga_invalidate_display(s);
1864 saved_ds = s->ds; 1868 saved_ds = s->ds;
1865 1869
1866 memset(ds, 0, sizeof(DisplayState)); 1870 memset(ds, 0, sizeof(DisplayState));
@@ -1871,7 +1875,7 @@ void vga_screen_dump(const char *filename) @@ -1871,7 +1875,7 @@ void vga_screen_dump(const char *filename)
1871 1875
1872 s->ds = ds; 1876 s->ds = ds;
1873 s->graphic_mode = -1; 1877 s->graphic_mode = -1;
1874 - vga_update_display(); 1878 + vga_update_display(s);
1875 1879
1876 if (ds->data) { 1880 if (ds->data) {
1877 ppm_save(filename, ds->data, vga_save_w, vga_save_h, 1881 ppm_save(filename, ds->data, vga_save_w, vga_save_h,
monitor.c
@@ -356,7 +356,7 @@ static void do_change(const char *device, const char *filename) @@ -356,7 +356,7 @@ static void do_change(const char *device, const char *filename)
356 356
357 static void do_screen_dump(const char *filename) 357 static void do_screen_dump(const char *filename)
358 { 358 {
359 - vga_screen_dump(filename); 359 + vga_hw_screen_dump(filename);
360 } 360 }
361 361
362 static void do_log(const char *items) 362 static void do_log(const char *items)
@@ -314,8 +314,8 @@ static void toggle_full_screen(DisplayState *ds) @@ -314,8 +314,8 @@ static void toggle_full_screen(DisplayState *ds)
314 if (!gui_saved_grab) 314 if (!gui_saved_grab)
315 sdl_grab_end(); 315 sdl_grab_end();
316 } 316 }
317 - vga_invalidate_display();  
318 - vga_update_display(); 317 + vga_hw_invalidate();
  318 + vga_hw_update();
319 } 319 }
320 320
321 static void sdl_refresh(DisplayState *ds) 321 static void sdl_refresh(DisplayState *ds)
@@ -328,8 +328,7 @@ static void sdl_refresh(DisplayState *ds) @@ -328,8 +328,7 @@ static void sdl_refresh(DisplayState *ds)
328 sdl_update_caption(); 328 sdl_update_caption();
329 } 329 }
330 330
331 - if (is_active_console(vga_console))  
332 - vga_update_display(); 331 + vga_hw_update();
333 332
334 while (SDL_PollEvent(ev)) { 333 while (SDL_PollEvent(ev)) {
335 switch (ev->type) { 334 switch (ev->type) {
@@ -352,10 +351,7 @@ static void sdl_refresh(DisplayState *ds) @@ -352,10 +351,7 @@ static void sdl_refresh(DisplayState *ds)
352 break; 351 break;
353 case 0x02 ... 0x0a: /* '1' to '9' keys */ 352 case 0x02 ... 0x0a: /* '1' to '9' keys */
354 console_select(keycode - 0x02); 353 console_select(keycode - 0x02);
355 - if (is_active_console(vga_console)) {  
356 - /* tell the vga console to redisplay itself */  
357 - vga_invalidate_display();  
358 - } else { 354 + if (!is_graphic_console()) {
359 /* display grab if going to a text console */ 355 /* display grab if going to a text console */
360 if (gui_grab) 356 if (gui_grab)
361 sdl_grab_end(); 357 sdl_grab_end();
@@ -365,7 +361,7 @@ static void sdl_refresh(DisplayState *ds) @@ -365,7 +361,7 @@ static void sdl_refresh(DisplayState *ds)
365 default: 361 default:
366 break; 362 break;
367 } 363 }
368 - } else if (!is_active_console(vga_console)) { 364 + } else if (!is_graphic_console()) {
369 int keysym; 365 int keysym;
370 keysym = 0; 366 keysym = 0;
371 if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) { 367 if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) {
@@ -420,7 +416,7 @@ static void sdl_refresh(DisplayState *ds) @@ -420,7 +416,7 @@ static void sdl_refresh(DisplayState *ds)
420 } 416 }
421 } 417 }
422 } 418 }
423 - if (is_active_console(vga_console)) 419 + if (is_graphic_console())
424 sdl_process_key(&ev->key); 420 sdl_process_key(&ev->key);
425 break; 421 break;
426 case SDL_QUIT: 422 case SDL_QUIT:
@@ -137,7 +137,6 @@ int graphic_height = 600; @@ -137,7 +137,6 @@ int graphic_height = 600;
137 #endif 137 #endif
138 int graphic_depth = 15; 138 int graphic_depth = 15;
139 int full_screen = 0; 139 int full_screen = 0;
140 -TextConsole *vga_console;  
141 CharDriverState *serial_hds[MAX_SERIAL_PORTS]; 140 CharDriverState *serial_hds[MAX_SERIAL_PORTS];
142 CharDriverState *parallel_hds[MAX_PARALLEL_PORTS]; 141 CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
143 #ifdef TARGET_I386 142 #ifdef TARGET_I386
@@ -2994,7 +2993,7 @@ static void dumb_resize(DisplayState *ds, int w, int h) @@ -2994,7 +2993,7 @@ static void dumb_resize(DisplayState *ds, int w, int h)
2994 2993
2995 static void dumb_refresh(DisplayState *ds) 2994 static void dumb_refresh(DisplayState *ds)
2996 { 2995 {
2997 - vga_update_display(); 2996 + vga_hw_update();
2998 } 2997 }
2999 2998
3000 void dumb_display_init(DisplayState *ds) 2999 void dumb_display_init(DisplayState *ds)
@@ -5123,8 +5122,6 @@ int main(int argc, char **argv) @@ -5123,8 +5122,6 @@ int main(int argc, char **argv)
5123 #endif 5122 #endif
5124 } 5123 }
5125 5124
5126 - vga_console = graphic_console_init(ds);  
5127 -  
5128 monitor_hd = qemu_chr_open(monitor_device); 5125 monitor_hd = qemu_chr_open(monitor_device);
5129 if (!monitor_hd) { 5126 if (!monitor_hd) {
5130 fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device); 5127 fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
@@ -254,10 +254,19 @@ int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg); @@ -254,10 +254,19 @@ int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg);
254 typedef struct DisplayState DisplayState; 254 typedef struct DisplayState DisplayState;
255 typedef struct TextConsole TextConsole; 255 typedef struct TextConsole TextConsole;
256 256
257 -extern TextConsole *vga_console;  
258 -  
259 -TextConsole *graphic_console_init(DisplayState *ds);  
260 -int is_active_console(TextConsole *s); 257 +typedef void (*vga_hw_update_ptr)(void *);
  258 +typedef void (*vga_hw_invalidate_ptr)(void *);
  259 +typedef void (*vga_hw_screen_dump_ptr)(void *, const char *);
  260 +
  261 +TextConsole *graphic_console_init(DisplayState *ds, vga_hw_update_ptr update,
  262 + vga_hw_invalidate_ptr invalidate,
  263 + vga_hw_screen_dump_ptr screen_dump,
  264 + void *opaque);
  265 +void vga_hw_update(void);
  266 +void vga_hw_invalidate(void);
  267 +void vga_hw_screen_dump(const char *filename);
  268 +
  269 +int is_graphic_console(void);
261 CharDriverState *text_console_init(DisplayState *ds); 270 CharDriverState *text_console_init(DisplayState *ds);
262 void console_select(unsigned int index); 271 void console_select(unsigned int index);
263 272
@@ -673,9 +682,6 @@ static inline void dpy_resize(DisplayState *s, int w, int h) @@ -673,9 +682,6 @@ static inline void dpy_resize(DisplayState *s, int w, int h)
673 int vga_initialize(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base, 682 int vga_initialize(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base,
674 unsigned long vga_ram_offset, int vga_ram_size, 683 unsigned long vga_ram_offset, int vga_ram_size,
675 unsigned long vga_bios_offset, int vga_bios_size); 684 unsigned long vga_bios_offset, int vga_bios_size);
676 -void vga_update_display(void);  
677 -void vga_invalidate_display(void);  
678 -void vga_screen_dump(const char *filename);  
679 685
680 /* cirrus_vga.c */ 686 /* cirrus_vga.c */
681 void pci_cirrus_vga_init(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base, 687 void pci_cirrus_vga_init(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base,
@@ -844,11 +850,8 @@ uint32_t iommu_translate_local(void *opaque, uint32_t addr); @@ -844,11 +850,8 @@ uint32_t iommu_translate_local(void *opaque, uint32_t addr);
844 void lance_init(NICInfo *nd, int irq, uint32_t leaddr, uint32_t ledaddr); 850 void lance_init(NICInfo *nd, int irq, uint32_t leaddr, uint32_t ledaddr);
845 851
846 /* tcx.c */ 852 /* tcx.c */
847 -void *tcx_init(DisplayState *ds, uint32_t addr, uint8_t *vram_base, 853 +void tcx_init(DisplayState *ds, uint32_t addr, uint8_t *vram_base,
848 unsigned long vram_offset, int vram_size, int width, int height); 854 unsigned long vram_offset, int vram_size, int width, int height);
849 -void tcx_update_display(void *opaque);  
850 -void tcx_invalidate_display(void *opaque);  
851 -void tcx_screen_dump(void *opaque, const char *filename);  
852 855
853 /* slavio_intctl.c */ 856 /* slavio_intctl.c */
854 void *slavio_intctl_init(); 857 void *slavio_intctl_init();
@@ -976,9 +979,7 @@ void ps2_keyboard_set_translation(void *opaque, int mode); @@ -976,9 +979,7 @@ void ps2_keyboard_set_translation(void *opaque, int mode);
976 void smc91c111_init(NICInfo *, uint32_t, void *, int); 979 void smc91c111_init(NICInfo *, uint32_t, void *, int);
977 980
978 /* pl110.c */ 981 /* pl110.c */
979 -void *pl110_init(DisplayState *ds, uint32_t base, void *pic, int irq);  
980 -void pl110_update_display(void *opaque);  
981 -void pl110_invalidate_display(void *opaque); 982 +void *pl110_init(DisplayState *ds, uint32_t base, void *pic, int irq, int);
982 983
983 #endif /* defined(QEMU_TOOL) */ 984 #endif /* defined(QEMU_TOOL) */
984 985