@samitouri / QOSamiQemu / commits / 1246965b3e

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 }