提交 22382bb9 编写于 作者: G Gerd Hoffmann

move hw cursor pos from cirrus to vga

上级 b9fd11b8
...@@ -202,8 +202,6 @@ typedef struct CirrusVGAState { ...@@ -202,8 +202,6 @@ typedef struct CirrusVGAState {
uint32_t cirrus_bank_base[2]; uint32_t cirrus_bank_base[2];
uint32_t cirrus_bank_limit[2]; uint32_t cirrus_bank_limit[2];
uint8_t cirrus_hidden_palette[48]; uint8_t cirrus_hidden_palette[48];
uint32_t hw_cursor_x;
uint32_t hw_cursor_y;
int cirrus_blt_pixelwidth; int cirrus_blt_pixelwidth;
int cirrus_blt_width; int cirrus_blt_width;
int cirrus_blt_height; int cirrus_blt_height;
...@@ -1328,7 +1326,7 @@ static void cirrus_vga_write_sr(CirrusVGAState * s, uint32_t val) ...@@ -1328,7 +1326,7 @@ static void cirrus_vga_write_sr(CirrusVGAState * s, uint32_t val)
case 0xd0: case 0xd0:
case 0xf0: // Graphics Cursor X case 0xf0: // Graphics Cursor X
s->vga.sr[0x10] = val; s->vga.sr[0x10] = val;
s->hw_cursor_x = (val << 3) | (s->vga.sr_index >> 5); s->vga.hw_cursor_x = (val << 3) | (s->vga.sr_index >> 5);
break; break;
case 0x11: case 0x11:
case 0x31: case 0x31:
...@@ -1339,7 +1337,7 @@ static void cirrus_vga_write_sr(CirrusVGAState * s, uint32_t val) ...@@ -1339,7 +1337,7 @@ static void cirrus_vga_write_sr(CirrusVGAState * s, uint32_t val)
case 0xd1: case 0xd1:
case 0xf1: // Graphics Cursor Y case 0xf1: // Graphics Cursor Y
s->vga.sr[0x11] = val; s->vga.sr[0x11] = val;
s->hw_cursor_y = (val << 3) | (s->vga.sr_index >> 5); s->vga.hw_cursor_y = (val << 3) | (s->vga.sr_index >> 5);
break; break;
case 0x07: // Extended Sequencer Mode case 0x07: // Extended Sequencer Mode
cirrus_update_memory_access(s); cirrus_update_memory_access(s);
...@@ -2195,14 +2193,14 @@ static void cirrus_cursor_invalidate(VGACommonState *s1) ...@@ -2195,14 +2193,14 @@ static void cirrus_cursor_invalidate(VGACommonState *s1)
} }
/* invalidate last cursor and new cursor if any change */ /* invalidate last cursor and new cursor if any change */
if (s->last_hw_cursor_size != size || if (s->last_hw_cursor_size != size ||
s->last_hw_cursor_x != s->hw_cursor_x || s->last_hw_cursor_x != s->vga.hw_cursor_x ||
s->last_hw_cursor_y != s->hw_cursor_y) { s->last_hw_cursor_y != s->vga.hw_cursor_y) {
invalidate_cursor1(s); invalidate_cursor1(s);
s->last_hw_cursor_size = size; s->last_hw_cursor_size = size;
s->last_hw_cursor_x = s->hw_cursor_x; s->last_hw_cursor_x = s->vga.hw_cursor_x;
s->last_hw_cursor_y = s->hw_cursor_y; s->last_hw_cursor_y = s->vga.hw_cursor_y;
/* compute the real cursor min and max y */ /* compute the real cursor min and max y */
cirrus_cursor_compute_yrange(s); cirrus_cursor_compute_yrange(s);
invalidate_cursor1(s); invalidate_cursor1(s);
...@@ -2259,14 +2257,15 @@ static void cirrus_cursor_draw_line(VGACommonState *s1, uint8_t *d1, int scr_y) ...@@ -2259,14 +2257,15 @@ static void cirrus_cursor_draw_line(VGACommonState *s1, uint8_t *d1, int scr_y)
} else { } else {
h = 32; h = 32;
} }
if (scr_y < s->hw_cursor_y || if (scr_y < s->vga.hw_cursor_y ||
scr_y >= (s->hw_cursor_y + h)) scr_y >= (s->vga.hw_cursor_y + h)) {
return; return;
}
src = s->vga.vram_ptr + s->real_vram_size - 16 * 1024; src = s->vga.vram_ptr + s->real_vram_size - 16 * 1024;
if (s->vga.sr[0x12] & CIRRUS_CURSOR_LARGE) { if (s->vga.sr[0x12] & CIRRUS_CURSOR_LARGE) {
src += (s->vga.sr[0x13] & 0x3c) * 256; src += (s->vga.sr[0x13] & 0x3c) * 256;
src += (scr_y - s->hw_cursor_y) * 16; src += (scr_y - s->vga.hw_cursor_y) * 16;
poffset = 8; poffset = 8;
content = ((uint32_t *)src)[0] | content = ((uint32_t *)src)[0] |
((uint32_t *)src)[1] | ((uint32_t *)src)[1] |
...@@ -2274,7 +2273,7 @@ static void cirrus_cursor_draw_line(VGACommonState *s1, uint8_t *d1, int scr_y) ...@@ -2274,7 +2273,7 @@ static void cirrus_cursor_draw_line(VGACommonState *s1, uint8_t *d1, int scr_y)
((uint32_t *)src)[3]; ((uint32_t *)src)[3];
} else { } else {
src += (s->vga.sr[0x13] & 0x3f) * 256; src += (s->vga.sr[0x13] & 0x3f) * 256;
src += (scr_y - s->hw_cursor_y) * 4; src += (scr_y - s->vga.hw_cursor_y) * 4;
poffset = 128; poffset = 128;
...@@ -2286,10 +2285,10 @@ static void cirrus_cursor_draw_line(VGACommonState *s1, uint8_t *d1, int scr_y) ...@@ -2286,10 +2285,10 @@ static void cirrus_cursor_draw_line(VGACommonState *s1, uint8_t *d1, int scr_y)
return; return;
w = h; w = h;
x1 = s->hw_cursor_x; x1 = s->vga.hw_cursor_x;
if (x1 >= s->vga.last_scr_width) if (x1 >= s->vga.last_scr_width)
return; return;
x2 = s->hw_cursor_x + w; x2 = s->vga.hw_cursor_x + w;
if (x2 > s->vga.last_scr_width) if (x2 > s->vga.last_scr_width)
x2 = s->vga.last_scr_width; x2 = s->vga.last_scr_width;
w = x2 - x1; w = x2 - x1;
...@@ -2778,8 +2777,8 @@ static const VMStateDescription vmstate_cirrus_vga = { ...@@ -2778,8 +2777,8 @@ static const VMStateDescription vmstate_cirrus_vga = {
VMSTATE_INT32(vga.bank_offset, CirrusVGAState), VMSTATE_INT32(vga.bank_offset, CirrusVGAState),
VMSTATE_UINT8(cirrus_hidden_dac_lockindex, CirrusVGAState), VMSTATE_UINT8(cirrus_hidden_dac_lockindex, CirrusVGAState),
VMSTATE_UINT8(cirrus_hidden_dac_data, CirrusVGAState), VMSTATE_UINT8(cirrus_hidden_dac_data, CirrusVGAState),
VMSTATE_UINT32(hw_cursor_x, CirrusVGAState), VMSTATE_UINT32(vga.hw_cursor_x, CirrusVGAState),
VMSTATE_UINT32(hw_cursor_y, CirrusVGAState), VMSTATE_UINT32(vga.hw_cursor_y, CirrusVGAState),
/* XXX: we do not save the bitblt state - we assume we do not save /* XXX: we do not save the bitblt state - we assume we do not save
the state when the blitter is active */ the state when the blitter is active */
VMSTATE_END_OF_LIST() VMSTATE_END_OF_LIST()
......
...@@ -163,6 +163,8 @@ typedef struct VGACommonState { ...@@ -163,6 +163,8 @@ typedef struct VGACommonState {
bool default_endian_fb; bool default_endian_fb;
/* hardware mouse cursor support */ /* hardware mouse cursor support */
uint32_t invalidated_y_table[VGA_MAX_HEIGHT / 32]; uint32_t invalidated_y_table[VGA_MAX_HEIGHT / 32];
uint32_t hw_cursor_x;
uint32_t hw_cursor_y;
void (*cursor_invalidate)(struct VGACommonState *s); void (*cursor_invalidate)(struct VGACommonState *s);
void (*cursor_draw_line)(struct VGACommonState *s, uint8_t *d, int y); void (*cursor_draw_line)(struct VGACommonState *s, uint8_t *d, int y);
/* tell for each page if it has been updated since the last time */ /* tell for each page if it has been updated since the last time */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册