On 16/03/2017 16:34, Gerd Hoffmann wrote: > Well, not *that* simple. vga checks the dirty bitmap with scanline > granularity, like that: > > foreach (scanline) { > if (get_dirty(scanline)) > update_scanline() > } > reset_dirty(framebuffer) > > I suspect simply transforming that to > > foreach (scanline) { > if (test_and_clear_dirty(scanline)) > update_scanline() > } > > is not going to fly due to page tracking working with page granularity. > With two subsequent scanlines within one page the second scanline will > never be updated because updating first clears the dirty bit of the > page ... > > Looping twice over all scanlines, with the first loop just figuring > which scanlines are modified, then clear dirty bits, then update in a > second loop should work I think. It'll duplicate a bunch of code > though, because in reality the loop isn't just three lines because of > doublescan, interlave and other funky stuff coming from CGA > compatibility. > > Given that probably pretty much every display adapter is affected I'd > tend to take Alex patch for 2.9, then sort the mess in the 2.10 devel > cycle and revert the patch when done.
You're right; an alternative is to copy the dirty bitmap to a local one and clear the global one (the dirty bitmap for an 8 MB full HD frame buffer is just 256 bytes). With the right API to abstract the job, it should be relatively easy to fix all adapters. Paolo