]>
Commit | Line | Data |
---|---|---|
70a446d9 WB |
1 | From cf9c099a7694eb47ded529e1ed40ee8789f32d31 Mon Sep 17 00:00:00 2001 |
2 | From: Wolfgang Bumiller <w.bumiller@proxmox.com> | |
3 | Date: Tue, 24 Jan 2017 16:35:38 +0100 | |
4 | Subject: [PATCH 2/4] cirrus: allow zero source pitch in pattern fill rops | |
5 | ||
6 | The rops used by cirrus_bitblt_common_patterncopy only use | |
7 | the destination pitch, so the source pitch shoul allowed to | |
8 | be zero and the blit with used for the range check around the | |
9 | source address. | |
10 | ||
11 | Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com> | |
12 | Message-id: 1485272138-23249-1-git-send-email-w.bumiller@proxmox.com | |
13 | Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> | |
14 | --- | |
15 | hw/display/cirrus_vga.c | 27 +++++++++++++++++++-------- | |
16 | 1 file changed, 19 insertions(+), 8 deletions(-) | |
17 | ||
18 | diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c | |
19 | index 0f05e45..98f089e 100644 | |
20 | --- a/hw/display/cirrus_vga.c | |
21 | +++ b/hw/display/cirrus_vga.c | |
22 | @@ -272,9 +272,6 @@ static void cirrus_update_memory_access(CirrusVGAState *s); | |
23 | static bool blit_region_is_unsafe(struct CirrusVGAState *s, | |
24 | int32_t pitch, int32_t addr) | |
25 | { | |
26 | - if (!pitch) { | |
27 | - return true; | |
28 | - } | |
29 | if (pitch < 0) { | |
30 | int64_t min = addr | |
31 | + ((int64_t)s->cirrus_blt_height-1) * pitch; | |
32 | @@ -294,8 +291,11 @@ static bool blit_region_is_unsafe(struct CirrusVGAState *s, | |
33 | return false; | |
34 | } | |
35 | ||
36 | -static bool blit_is_unsafe(struct CirrusVGAState *s, bool dst_only) | |
37 | +static bool blit_is_unsafe(struct CirrusVGAState *s, bool dst_only, | |
38 | + bool zero_src_pitch_ok) | |
39 | { | |
40 | + int32_t check_pitch; | |
41 | + | |
42 | /* should be the case, see cirrus_bitblt_start */ | |
43 | assert(s->cirrus_blt_width > 0); | |
44 | assert(s->cirrus_blt_height > 0); | |
45 | @@ -304,6 +304,10 @@ static bool blit_is_unsafe(struct CirrusVGAState *s, bool dst_only) | |
46 | return true; | |
47 | } | |
48 | ||
49 | + if (!s->cirrus_blt_dstpitch) { | |
50 | + return true; | |
51 | + } | |
52 | + | |
53 | if (blit_region_is_unsafe(s, s->cirrus_blt_dstpitch, | |
54 | s->cirrus_blt_dstaddr & s->cirrus_addr_mask)) { | |
55 | return true; | |
56 | @@ -311,7 +315,13 @@ static bool blit_is_unsafe(struct CirrusVGAState *s, bool dst_only) | |
57 | if (dst_only) { | |
58 | return false; | |
59 | } | |
60 | - if (blit_region_is_unsafe(s, s->cirrus_blt_srcpitch, | |
61 | + | |
62 | + check_pitch = s->cirrus_blt_srcpitch; | |
63 | + if (!zero_src_pitch_ok && !check_pitch) { | |
64 | + check_pitch = s->cirrus_blt_width; | |
65 | + } | |
66 | + | |
67 | + if (blit_region_is_unsafe(s, check_pitch, | |
68 | s->cirrus_blt_srcaddr & s->cirrus_addr_mask)) { | |
69 | return true; | |
70 | } | |
71 | @@ -681,8 +691,9 @@ static int cirrus_bitblt_common_patterncopy(CirrusVGAState * s, | |
72 | ||
73 | dst = s->vga.vram_ptr + (s->cirrus_blt_dstaddr & s->cirrus_addr_mask); | |
74 | ||
75 | - if (blit_is_unsafe(s, false)) | |
76 | + if (blit_is_unsafe(s, false, true)) { | |
77 | return 0; | |
78 | + } | |
79 | ||
80 | (*s->cirrus_rop) (s, dst, src, | |
81 | s->cirrus_blt_dstpitch, 0, | |
82 | @@ -699,7 +710,7 @@ static int cirrus_bitblt_solidfill(CirrusVGAState *s, int blt_rop) | |
83 | { | |
84 | cirrus_fill_t rop_func; | |
85 | ||
86 | - if (blit_is_unsafe(s, true)) { | |
87 | + if (blit_is_unsafe(s, true, true)) { | |
88 | return 0; | |
89 | } | |
90 | rop_func = cirrus_fill[rop_to_index[blt_rop]][s->cirrus_blt_pixelwidth - 1]; | |
91 | @@ -803,7 +814,7 @@ static int cirrus_do_copy(CirrusVGAState *s, int dst, int src, int w, int h) | |
92 | ||
93 | static int cirrus_bitblt_videotovideo_copy(CirrusVGAState * s) | |
94 | { | |
95 | - if (blit_is_unsafe(s, false)) | |
96 | + if (blit_is_unsafe(s, false, false)) | |
97 | return 0; | |
98 | ||
99 | return cirrus_do_copy(s, s->cirrus_blt_dstaddr - s->vga.start_addr, | |
100 | -- | |
101 | 2.1.4 | |
102 |