Commit f707cfba9a5ee2d4ea6edc3d0588163141f285ad
1 parent
1eb5207b
Allow VMware-SVGA operation enable before command FIFO is configured. Implement…
… "screendump" for 32 bit colour depth. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2808 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
31 additions
and
23 deletions
hw/vga.c
... | ... | @@ -2036,8 +2036,8 @@ static void vga_save_dpy_refresh(DisplayState *s) |
2036 | 2036 | { |
2037 | 2037 | } |
2038 | 2038 | |
2039 | -static int ppm_save(const char *filename, uint8_t *data, | |
2040 | - int w, int h, int linesize) | |
2039 | +int ppm_save(const char *filename, uint8_t *data, | |
2040 | + int w, int h, int linesize) | |
2041 | 2041 | { |
2042 | 2042 | FILE *f; |
2043 | 2043 | uint8_t *d, *d1; | ... | ... |
hw/vga_int.h
... | ... | @@ -166,6 +166,8 @@ void vga_init(VGAState *s); |
166 | 166 | uint32_t vga_mem_readb(void *opaque, target_phys_addr_t addr); |
167 | 167 | void vga_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val); |
168 | 168 | void vga_invalidate_scanlines(VGAState *s, int y1, int y2); |
169 | +int ppm_save(const char *filename, uint8_t *data, | |
170 | + int w, int h, int linesize); | |
169 | 171 | |
170 | 172 | void vga_draw_cursor_line_8(uint8_t *d1, const uint8_t *src1, |
171 | 173 | int poffset, int w, | ... | ... |
hw/vmware_vga.c
... | ... | @@ -226,18 +226,19 @@ enum { |
226 | 226 | #ifdef VERBOSE |
227 | 227 | # define GUEST_OS_BASE 0x5001 |
228 | 228 | static const char *vmsvga_guest_id[] = { |
229 | - [0x0] = "Dos", | |
230 | - [0x1] = "Windows 3.1", | |
231 | - [0x2] = "Windows 95", | |
232 | - [0x3] = "Windows 98", | |
233 | - [0x4] = "Windows ME", | |
234 | - [0x5] = "Windows NT", | |
235 | - [0x6] = "Windows 2000", | |
236 | - [0x7] = "Linux", | |
237 | - [0x8] = "OS/2", | |
238 | - [0x9] = "Unknown", | |
239 | - [0xa] = "BSD", | |
240 | - [0xb] = "Whistler", | |
229 | + [0x00 ... 0x15] = "an unknown OS", | |
230 | + [0x00] = "Dos", | |
231 | + [0x01] = "Windows 3.1", | |
232 | + [0x02] = "Windows 95", | |
233 | + [0x03] = "Windows 98", | |
234 | + [0x04] = "Windows ME", | |
235 | + [0x05] = "Windows NT", | |
236 | + [0x06] = "Windows 2000", | |
237 | + [0x07] = "Linux", | |
238 | + [0x08] = "OS/2", | |
239 | + [0x0a] = "BSD", | |
240 | + [0x0b] = "Whistler", | |
241 | + [0x15] = "Windows 2003", | |
241 | 242 | }; |
242 | 243 | #endif |
243 | 244 | |
... | ... | @@ -459,7 +460,7 @@ static inline void vmsvga_cursor_define(struct vmsvga_state_s *s, |
459 | 460 | static inline int vmsvga_fifo_empty(struct vmsvga_state_s *s) |
460 | 461 | { |
461 | 462 | if (!s->config || !s->enable) |
462 | - return 0; | |
463 | + return 1; | |
463 | 464 | return (s->cmd->next_cmd == s->cmd->stop); |
464 | 465 | } |
465 | 466 | |
... | ... | @@ -619,7 +620,7 @@ static uint32_t vmsvga_value_read(void *opaque, uint32_t address) |
619 | 620 | return SVGA_MAX_WIDTH; |
620 | 621 | |
621 | 622 | case SVGA_REG_MAX_HEIGHT: |
622 | - return SVGA_MAX_WIDTH; | |
623 | + return SVGA_MAX_HEIGHT; | |
623 | 624 | |
624 | 625 | case SVGA_REG_DEPTH: |
625 | 626 | return s->depth; |
... | ... | @@ -727,7 +728,8 @@ static void vmsvga_value_write(void *opaque, uint32_t address, uint32_t value) |
727 | 728 | break; |
728 | 729 | |
729 | 730 | case SVGA_REG_ENABLE: |
730 | - s->enable = s->config = value & s->config; | |
731 | + s->enable = value; | |
732 | + s->config &= !!value; | |
731 | 733 | s->width = -1; |
732 | 734 | s->height = -1; |
733 | 735 | s->invalidated = 1; |
... | ... | @@ -770,7 +772,7 @@ static void vmsvga_value_write(void *opaque, uint32_t address, uint32_t value) |
770 | 772 | if (s->cmd->max < s->cmd->min + 10 * 1024) |
771 | 773 | break; |
772 | 774 | } |
773 | - s->config = value; | |
775 | + s->config = !!value; | |
774 | 776 | break; |
775 | 777 | |
776 | 778 | case SVGA_REG_SYNC: |
... | ... | @@ -902,14 +904,14 @@ static void vmsvga_reset(struct vmsvga_state_s *s) |
902 | 904 | s->wblue = 0x0000f800; |
903 | 905 | break; |
904 | 906 | case 24: |
905 | - s->wred = 0x000000ff; | |
907 | + s->wred = 0x00ff0000; | |
906 | 908 | s->wgreen = 0x0000ff00; |
907 | - s->wblue = 0x00ff0000; | |
909 | + s->wblue = 0x000000ff; | |
908 | 910 | break; |
909 | 911 | case 32: |
910 | - s->wred = 0x000000ff; | |
912 | + s->wred = 0x00ff0000; | |
911 | 913 | s->wgreen = 0x0000ff00; |
912 | - s->wblue = 0x00ff0000; | |
914 | + s->wblue = 0x000000ff; | |
913 | 915 | break; |
914 | 916 | } |
915 | 917 | s->syncing = 0; |
... | ... | @@ -928,6 +930,8 @@ static void vmsvga_invalidate_display(void *opaque) |
928 | 930 | s->invalidated = 1; |
929 | 931 | } |
930 | 932 | |
933 | +/* save the vga display in a PPM image even if no display is | |
934 | + available */ | |
931 | 935 | static void vmsvga_screen_dump(void *opaque, const char *filename) |
932 | 936 | { |
933 | 937 | struct vmsvga_state_s *s = (struct vmsvga_state_s *) opaque; |
... | ... | @@ -938,7 +942,9 @@ static void vmsvga_screen_dump(void *opaque, const char *filename) |
938 | 942 | return; |
939 | 943 | } |
940 | 944 | |
941 | - /* TODO */ | |
945 | + if (s->depth == 32) { | |
946 | + ppm_save(filename, s->vram, s->width, s->height, s->ds->linesize); | |
947 | + } | |
942 | 948 | } |
943 | 949 | |
944 | 950 | #ifdef DIRECT_VRAM | ... | ... |