ati-vga: Consolidate dirty region tracking in ati_2d_blt
Both supported ROPs follow the same memory set dirty logic. This consolidates that logic to remove the duplication. Signed-off-by: Chad Jablonski <chad@jablonski.xyz> Reviewed-by: BALATON Zoltan <balaton@eik.bme.hu> Message-ID: <20260303024730.1489136-9-chad@jablonski.xyz> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Chad Jablonski committed
Mar 2, 2026 at 21:47 UTC
1246965b3e799311d59cb52fca0cbe46265275a9
1 file changed
+22
-21
hw/display/ati_2d.c
+22
-21
@@ -43,15 +43,29 @@ static int ati_bpp_from_datatype(ATIVGAState *s)
43
}
44
}
45
46
+static void ati_set_dirty(ATIVGAState *s,
47
+ const uint8_t *dst_bits, unsigned dst_y)
48
+{
49
+ VGACommonState *vga = &s->vga;
50
+ DisplaySurface *ds = qemu_console_surface(vga->con);
51
+
52
+ DPRINTF("%p %u ds: %p %d %d rop: %x\n", vga->vram_ptr, vga->vbe_start_addr,
53
+ surface_data(ds), surface_stride(ds), surface_bits_per_pixel(ds),
54
+ (s->regs.dp_mix & GMC_ROP3_MASK) >> 16);
55
+ if (dst_bits >= vga->vram_ptr + vga->vbe_start_addr &&
56
+ dst_bits < vga->vram_ptr + vga->vbe_start_addr +
57
+ vga->vbe_regs[VBE_DISPI_INDEX_YRES] * vga->vbe_line_offset) {
58
+ memory_region_set_dirty(&vga->vram,
59
+ vga->vbe_start_addr + s->regs.dst_offset
60
+ + dst_y * surface_stride(ds),
61
+ s->regs.dst_height * surface_stride(ds));
62
+ }
63
+}
64
+
65
void ati_2d_blt(ATIVGAState *s)
66
{
67
/* FIXME it is probably more complex than this and may need to be */
68
/* rewritten but for now as a start just to get some output: */
50
- DisplaySurface *ds = qemu_console_surface(s->vga.con);
51
- DPRINTF("%p %u ds: %p %d %d rop: %x\n", s->vga.vram_ptr,
52
- s->vga.vbe_start_addr, surface_data(ds), surface_stride(ds),
53
- surface_bits_per_pixel(ds),
54
- (s->regs.dp_mix & GMC_ROP3_MASK) >> 16);
69
unsigned dst_x = (s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT ?
70
s->regs.dst_x : s->regs.dst_x + 1 - s->regs.dst_width);
71
unsigned dst_y = (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ?
@@ -166,14 +180,6 @@ void ati_2d_blt(ATIVGAState *s)
180
memmove(&dst_bits[i], &src_bits[j], s->regs.dst_width * bypp);
181
}
182
}
169
- if (dst_bits >= s->vga.vram_ptr + s->vga.vbe_start_addr &&
170
- dst_bits < s->vga.vram_ptr + s->vga.vbe_start_addr +
171
- s->vga.vbe_regs[VBE_DISPI_INDEX_YRES] * s->vga.vbe_line_offset) {
172
- memory_region_set_dirty(&s->vga.vram, s->vga.vbe_start_addr +
173
- s->regs.dst_offset +
174
- dst_y * surface_stride(ds),
175
- s->regs.dst_height * surface_stride(ds));
176
- }
183
break;
184
}
185
case ROP3_PATCOPY:
@@ -216,18 +222,13 @@ void ati_2d_blt(ATIVGAState *s)
222
}
223
}
224
}
219
- if (dst_bits >= s->vga.vram_ptr + s->vga.vbe_start_addr &&
220
- dst_bits < s->vga.vram_ptr + s->vga.vbe_start_addr +
221
- s->vga.vbe_regs[VBE_DISPI_INDEX_YRES] * s->vga.vbe_line_offset) {
222
- memory_region_set_dirty(&s->vga.vram, s->vga.vbe_start_addr +
223
- s->regs.dst_offset +
224
- dst_y * surface_stride(ds),
225
- s->regs.dst_height * surface_stride(ds));
226
- }
225
break;
226
}
227
default:
228
qemu_log_mask(LOG_UNIMP, "Unimplemented ati_2d blt op %x\n",
229
(s->regs.dp_mix & GMC_ROP3_MASK) >> 16);
230
+ return;
231
}
232
+
233
+ ati_set_dirty(s, dst_bits, dst_y);
234
}