Commit d85d0d3883f5a567fa2969a0396e42e0a662b3fa
1 parent
753b4053
Fix hardware accelerated video to video copy on Cirrus VGA (Brian Kress)
cirrus_do_copy() in hw/cirrus_vga.c seems to make some incorrect assumptions about video memory layout. It tries to convert addresses to coordinates assuming that one row of data is (width * depth) bytes long. The correct way seems to be to use the pitch fields in the CirrusVGAState structure instead. Without this patch, I get lots of screen corruption when I try to drag a window under X as it's passing the wrong coordinates to the display surface for the copy. With this patch I can drag a window with no screen corruption. Signed-off-by: Brian Kress <kressb@moose.net> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6622 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
4 additions
and
4 deletions
hw/cirrus_vga.c
... | ... | @@ -730,10 +730,10 @@ static void cirrus_do_copy(CirrusVGAState *s, int dst, int src, int w, int h) |
730 | 730 | s->get_resolution((VGAState *)s, &width, &height); |
731 | 731 | |
732 | 732 | /* extra x, y */ |
733 | - sx = (src % (width * depth)) / depth; | |
734 | - sy = (src / (width * depth)); | |
735 | - dx = (dst % (width *depth)) / depth; | |
736 | - dy = (dst / (width * depth)); | |
733 | + sx = (src % ABS(s->cirrus_blt_srcpitch)) / depth; | |
734 | + sy = (src / ABS(s->cirrus_blt_srcpitch)); | |
735 | + dx = (dst % ABS(s->cirrus_blt_dstpitch)) / depth; | |
736 | + dy = (dst / ABS(s->cirrus_blt_dstpitch)); | |
737 | 737 | |
738 | 738 | /* normalize width */ |
739 | 739 | w /= depth; | ... | ... |