From nobody Thu May 2 15:32:32 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1489584575465206.03033262668214; Wed, 15 Mar 2017 06:29:35 -0700 (PDT) Received: from localhost ([::1]:37218 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1co8ze-00036B-5P for importer@patchew.org; Wed, 15 Mar 2017 09:29:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46313) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1co8yR-0002zL-Hv for qemu-devel@nongnu.org; Wed, 15 Mar 2017 09:28:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1co8yO-0001fo-EO for qemu-devel@nongnu.org; Wed, 15 Mar 2017 09:28:19 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52626) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1co8yO-0001fR-5l for qemu-devel@nongnu.org; Wed, 15 Mar 2017 09:28:16 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D5879342C5E for ; Wed, 15 Mar 2017 13:28:15 +0000 (UTC) Received: from nilsson.home.kraxel.org (ovpn-116-31.ams2.redhat.com [10.36.116.31]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2FDSDNE025542; Wed, 15 Mar 2017 09:28:14 -0400 Received: by nilsson.home.kraxel.org (Postfix, from userid 500) id E283080BBA; Wed, 15 Mar 2017 14:28:11 +0100 (CET) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com D5879342C5E Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=kraxel@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com D5879342C5E From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Wed, 15 Mar 2017 14:28:07 +0100 Message-Id: <1489584487-3489-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 15 Mar 2017 13:28:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH] cirrus: stop passing around src pointers in the blitter X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Does basically the same as "cirrus: stop passing around dst pointers in the blitter", just for the src pointer instead of the dst pointer. For the src we have to care about cputovideo blits though and fetch the data from s->cirrus_bltbuf instead of vga memory. The cirrus_src*() helper functions handle that. Signed-off-by: Gerd Hoffmann --- hw/display/cirrus_vga.c | 61 +++++++++++++++++++++++++++++++++++-----= ---- hw/display/cirrus_vga_rop.h | 48 +++++++++++++++++----------------- hw/display/cirrus_vga_rop2.h | 38 ++++++++++++++------------- 3 files changed, 93 insertions(+), 54 deletions(-) diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c index 02f6b7e..1d831bc 100644 --- a/hw/display/cirrus_vga.c +++ b/hw/display/cirrus_vga.c @@ -178,7 +178,7 @@ =20 struct CirrusVGAState; typedef void (*cirrus_bitblt_rop_t) (struct CirrusVGAState *s, - uint32_t dstaddr, const uint8_t *src, + uint32_t dstaddr, uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, int bltheight); typedef void (*cirrus_fill_t)(struct CirrusVGAState *s, @@ -321,7 +321,7 @@ static bool blit_is_unsafe(struct CirrusVGAState *s, bo= ol dst_only) } =20 static void cirrus_bitblt_rop_nop(CirrusVGAState *s, - uint32_t dstaddr, const uint8_t *src, + uint32_t dstaddr, uint32_t srcaddr, int dstpitch,int srcpitch, int bltwidth,int bltheight) { @@ -333,6 +333,45 @@ static void cirrus_bitblt_fill_nop(CirrusVGAState *s, { } =20 +static inline uint8_t cirrus_src(CirrusVGAState *s, uint32_t srcaddr) +{ + if (s->cirrus_srccounter) { + /* cputovideo */ + return s->cirrus_bltbuf[srcaddr & (CIRRUS_BLTBUFSIZE - 1)]; + } else { + /* videotovideo */ + return s->vga.vram_ptr[srcaddr & s->cirrus_addr_mask]; + } +} + +static inline uint16_t cirrus_src16(CirrusVGAState *s, uint32_t srcaddr) +{ + uint16_t *src; + + if (s->cirrus_srccounter) { + /* cputovideo */ + src =3D (void *)&s->cirrus_bltbuf[srcaddr & (CIRRUS_BLTBUFSIZE - 1= ) & ~1]; + } else { + /* videotovideo */ + src =3D (void *)&s->vga.vram_ptr[srcaddr & s->cirrus_addr_mask & ~= 1]; + } + return *src; +} + +static inline uint32_t cirrus_src32(CirrusVGAState *s, uint32_t srcaddr) +{ + uint32_t *src; + + if (s->cirrus_srccounter) { + /* cputovideo */ + src =3D (void *)&s->cirrus_bltbuf[srcaddr & (CIRRUS_BLTBUFSIZE - 1= ) & ~3]; + } else { + /* videotovideo */ + src =3D (void *)&s->vga.vram_ptr[srcaddr & s->cirrus_addr_mask & ~= 3]; + } + return *src; +} + #define ROP_NAME 0 #define ROP_FN(d, s) 0 #include "cirrus_vga_rop.h" @@ -675,10 +714,10 @@ static void cirrus_invalidate_region(CirrusVGAState *= s, int off_begin, } } =20 -static int cirrus_bitblt_common_patterncopy(CirrusVGAState *s, bool videos= rc) +static int cirrus_bitblt_common_patterncopy(CirrusVGAState *s) { uint32_t patternsize; - uint8_t *src; + bool videosrc =3D !s->cirrus_srccounter; =20 if (videosrc) { switch (s->vga.get_bpp(&s->vga)) { @@ -699,16 +738,14 @@ static int cirrus_bitblt_common_patterncopy(CirrusVGA= State *s, bool videosrc) if (s->cirrus_blt_srcaddr + patternsize > s->vga.vram_size) { return 0; } - src =3D s->vga.vram_ptr + s->cirrus_blt_srcaddr; - } else { - src =3D s->cirrus_bltbuf; } =20 if (blit_is_unsafe(s, true)) { return 0; } =20 - (*s->cirrus_rop) (s, s->cirrus_blt_dstaddr, src, + (*s->cirrus_rop) (s, s->cirrus_blt_dstaddr, + videosrc ? s->cirrus_blt_srcaddr : 0, s->cirrus_blt_dstpitch, 0, s->cirrus_blt_width, s->cirrus_blt_height); cirrus_invalidate_region(s, s->cirrus_blt_dstaddr, @@ -745,7 +782,7 @@ static int cirrus_bitblt_solidfill(CirrusVGAState *s, i= nt blt_rop) =20 static int cirrus_bitblt_videotovideo_patterncopy(CirrusVGAState * s) { - return cirrus_bitblt_common_patterncopy(s, true); + return cirrus_bitblt_common_patterncopy(s); } =20 static int cirrus_do_copy(CirrusVGAState *s, int dst, int src, int w, int = h) @@ -800,7 +837,7 @@ static int cirrus_do_copy(CirrusVGAState *s, int dst, i= nt src, int w, int h) graphic_hw_update(s->vga.con); =20 (*s->cirrus_rop) (s, s->cirrus_blt_dstaddr, - s->vga.vram_ptr + s->cirrus_blt_srcaddr, + s->cirrus_blt_srcaddr, s->cirrus_blt_dstpitch, s->cirrus_blt_srcpitch, s->cirrus_blt_width, s->cirrus_blt_height); =20 @@ -844,7 +881,7 @@ static void cirrus_bitblt_cputovideo_next(CirrusVGAStat= e * s) =20 if (s->cirrus_srccounter > 0) { if (s->cirrus_blt_mode & CIRRUS_BLTMODE_PATTERNCOPY) { - cirrus_bitblt_common_patterncopy(s, false); + cirrus_bitblt_common_patterncopy(s); the_end: s->cirrus_srccounter =3D 0; cirrus_bitblt_reset(s); @@ -852,7 +889,7 @@ static void cirrus_bitblt_cputovideo_next(CirrusVGAStat= e * s) /* at least one scan line */ do { (*s->cirrus_rop)(s, s->cirrus_blt_dstaddr, - s->cirrus_bltbuf, 0, 0, s->cirrus_blt_wi= dth, 1); + 0, 0, 0, s->cirrus_blt_width, 1); cirrus_invalidate_region(s, s->cirrus_blt_dstaddr, 0, s->cirrus_blt_width, 1); s->cirrus_blt_dstaddr +=3D s->cirrus_blt_dstpitch; diff --git a/hw/display/cirrus_vga_rop.h b/hw/display/cirrus_vga_rop.h index 433f831..f1068d5 100644 --- a/hw/display/cirrus_vga_rop.h +++ b/hw/display/cirrus_vga_rop.h @@ -78,7 +78,7 @@ static inline void glue(rop_32_, ROP_NAME)(CirrusVGAState= *s, static void glue(cirrus_bitblt_rop_fwd_, ROP_NAME)(CirrusVGAState *s, uint32_t dstaddr, - const uint8_t *src, + uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, int bltheight) { @@ -92,19 +92,19 @@ glue(cirrus_bitblt_rop_fwd_, ROP_NAME)(CirrusVGAState *= s, =20 for (y =3D 0; y < bltheight; y++) { for (x =3D 0; x < bltwidth; x++) { - ROP_OP(s, dstaddr, *src); + ROP_OP(s, dstaddr, cirrus_src(s, srcaddr)); dstaddr++; - src++; + srcaddr++; } dstaddr +=3D dstpitch; - src +=3D srcpitch; + srcaddr +=3D srcpitch; } } =20 static void glue(cirrus_bitblt_rop_bkwd_, ROP_NAME)(CirrusVGAState *s, uint32_t dstaddr, - const uint8_t *src, + uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, int bltheight) { @@ -113,19 +113,19 @@ glue(cirrus_bitblt_rop_bkwd_, ROP_NAME)(CirrusVGAStat= e *s, srcpitch +=3D bltwidth; for (y =3D 0; y < bltheight; y++) { for (x =3D 0; x < bltwidth; x++) { - ROP_OP(s, dstaddr, *src); + ROP_OP(s, dstaddr, cirrus_src(s, srcaddr)); dstaddr--; - src--; + srcaddr--; } dstaddr +=3D dstpitch; - src +=3D srcpitch; + srcaddr +=3D srcpitch; } } =20 static void glue(glue(cirrus_bitblt_rop_fwd_transp_, ROP_NAME),_8)(CirrusVGAState *s, uint32_t dstaddr, - const uint8_t *src, + uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, @@ -137,19 +137,19 @@ glue(glue(cirrus_bitblt_rop_fwd_transp_, ROP_NAME),_8= )(CirrusVGAState *s, srcpitch -=3D bltwidth; for (y =3D 0; y < bltheight; y++) { for (x =3D 0; x < bltwidth; x++) { - ROP_OP_TR(s, dstaddr, *src, transp); + ROP_OP_TR(s, dstaddr, cirrus_src(s, srcaddr), transp); dstaddr++; - src++; + srcaddr++; } dstaddr +=3D dstpitch; - src +=3D srcpitch; + srcaddr +=3D srcpitch; } } =20 static void glue(glue(cirrus_bitblt_rop_bkwd_transp_, ROP_NAME),_8)(CirrusVGAState *s, uint32_t dstaddr, - const uint8_t *src, + uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, @@ -161,19 +161,19 @@ glue(glue(cirrus_bitblt_rop_bkwd_transp_, ROP_NAME),_= 8)(CirrusVGAState *s, srcpitch +=3D bltwidth; for (y =3D 0; y < bltheight; y++) { for (x =3D 0; x < bltwidth; x++) { - ROP_OP_TR(s, dstaddr, *src, transp); + ROP_OP_TR(s, dstaddr, cirrus_src(s, srcaddr), transp); dstaddr--; - src--; + srcaddr--; } dstaddr +=3D dstpitch; - src +=3D srcpitch; + srcaddr +=3D srcpitch; } } =20 static void glue(glue(cirrus_bitblt_rop_fwd_transp_, ROP_NAME),_16)(CirrusVGAState *s, uint32_t dstaddr, - const uint8_t *src, + uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, @@ -185,19 +185,19 @@ glue(glue(cirrus_bitblt_rop_fwd_transp_, ROP_NAME),_1= 6)(CirrusVGAState *s, srcpitch -=3D bltwidth; for (y =3D 0; y < bltheight; y++) { for (x =3D 0; x < bltwidth; x+=3D2) { - ROP_OP_TR_16(s, dstaddr, *(uint16_t *)src, transp); + ROP_OP_TR_16(s, dstaddr, cirrus_src16(s, srcaddr), transp); dstaddr +=3D 2; - src +=3D 2; + srcaddr +=3D 2; } dstaddr +=3D dstpitch; - src +=3D srcpitch; + srcaddr +=3D srcpitch; } } =20 static void glue(glue(cirrus_bitblt_rop_bkwd_transp_, ROP_NAME),_16)(CirrusVGAState *s, uint32_t dstaddr, - const uint8_t *sr= c, + uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, @@ -209,12 +209,12 @@ glue(glue(cirrus_bitblt_rop_bkwd_transp_, ROP_NAME),_= 16)(CirrusVGAState *s, srcpitch +=3D bltwidth; for (y =3D 0; y < bltheight; y++) { for (x =3D 0; x < bltwidth; x+=3D2) { - ROP_OP_TR_16(s, dstaddr, *(uint16_t *)src, transp); + ROP_OP_TR_16(s, dstaddr, cirrus_src16(s, srcaddr), transp); dstaddr -=3D 2; - src -=3D 2; + srcaddr -=3D 2; } dstaddr +=3D dstpitch; - src +=3D srcpitch; + srcaddr +=3D srcpitch; } } =20 diff --git a/hw/display/cirrus_vga_rop2.h b/hw/display/cirrus_vga_rop2.h index bc92f0e..b86bcd6 100644 --- a/hw/display/cirrus_vga_rop2.h +++ b/hw/display/cirrus_vga_rop2.h @@ -41,14 +41,14 @@ static void glue(glue(glue(cirrus_patternfill_, ROP_NAME), _),DEPTH) (CirrusVGAState *s, uint32_t dstaddr, - const uint8_t *src, + uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, int bltheight) { uint32_t addr; int x, y, pattern_y, pattern_pitch, pattern_x; unsigned int col; - const uint8_t *src1; + uint32_t src1addr; #if DEPTH =3D=3D 24 int skipleft =3D s->vga.gr[0x2f] & 0x1f; #else @@ -66,22 +66,24 @@ glue(glue(glue(cirrus_patternfill_, ROP_NAME), _),DEPTH) for(y =3D 0; y < bltheight; y++) { pattern_x =3D skipleft; addr =3D dstaddr + skipleft; - src1 =3D src + pattern_y * pattern_pitch; + src1addr =3D srcaddr + pattern_y * pattern_pitch; for (x =3D skipleft; x < bltwidth; x +=3D (DEPTH / 8)) { #if DEPTH =3D=3D 8 - col =3D src1[pattern_x]; + col =3D cirrus_src(s, src1addr + pattern_x); pattern_x =3D (pattern_x + 1) & 7; #elif DEPTH =3D=3D 16 - col =3D ((uint16_t *)(src1 + pattern_x))[0]; + col =3D cirrus_src16(s, src1addr + pattern_x); pattern_x =3D (pattern_x + 2) & 15; #elif DEPTH =3D=3D 24 { - const uint8_t *src2 =3D src1 + pattern_x * 3; - col =3D src2[0] | (src2[1] << 8) | (src2[2] << 16); + uint32_t src2addr =3D src1addr + pattern_x * 3; + col =3D cirrus_src(s, src2addr) | + (cirrus_src(s, src2addr + 1) << 8) | + (cirrus_src(s, src2addr + 2) << 16); pattern_x =3D (pattern_x + 1) & 7; } #else - col =3D ((uint32_t *)(src1 + pattern_x))[0]; + col =3D cirrus_src32(s, src1addr + pattern_x); pattern_x =3D (pattern_x + 4) & 31; #endif PUTPIXEL(s, addr, col); @@ -96,7 +98,7 @@ glue(glue(glue(cirrus_patternfill_, ROP_NAME), _),DEPTH) static void glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH) (CirrusVGAState *s, uint32_t dstaddr, - const uint8_t *src, + uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, int bltheight) { @@ -124,12 +126,12 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME),= _),DEPTH) =20 for(y =3D 0; y < bltheight; y++) { bitmask =3D 0x80 >> srcskipleft; - bits =3D *src++ ^ bits_xor; + bits =3D cirrus_src(s, srcaddr++) ^ bits_xor; addr =3D dstaddr + dstskipleft; for (x =3D dstskipleft; x < bltwidth; x +=3D (DEPTH / 8)) { if ((bitmask & 0xff) =3D=3D 0) { bitmask =3D 0x80; - bits =3D *src++ ^ bits_xor; + bits =3D cirrus_src(s, srcaddr++) ^ bits_xor; } index =3D (bits & bitmask); if (index) { @@ -145,7 +147,7 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _= ),DEPTH) static void glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH) (CirrusVGAState *s, uint32_t dstaddr, - const uint8_t *src, + uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, int bltheight) { @@ -162,12 +164,12 @@ glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEP= TH) colors[1] =3D s->cirrus_blt_fgcol; for(y =3D 0; y < bltheight; y++) { bitmask =3D 0x80 >> srcskipleft; - bits =3D *src++; + bits =3D cirrus_src(s, srcaddr++); addr =3D dstaddr + dstskipleft; for (x =3D dstskipleft; x < bltwidth; x +=3D (DEPTH / 8)) { if ((bitmask & 0xff) =3D=3D 0) { bitmask =3D 0x80; - bits =3D *src++; + bits =3D cirrus_src(s, srcaddr++); } col =3D colors[!!(bits & bitmask)]; PUTPIXEL(s, addr, col); @@ -181,7 +183,7 @@ glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH) static void glue(glue(glue(cirrus_colorexpand_pattern_transp_, ROP_NAME), _),DEPTH) (CirrusVGAState *s, uint32_t dstaddr, - const uint8_t *src, + uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, int bltheight) { @@ -207,7 +209,7 @@ glue(glue(glue(cirrus_colorexpand_pattern_transp_, ROP_= NAME), _),DEPTH) pattern_y =3D s->cirrus_blt_srcaddr & 7; =20 for(y =3D 0; y < bltheight; y++) { - bits =3D src[pattern_y] ^ bits_xor; + bits =3D cirrus_src(s, srcaddr + pattern_y) ^ bits_xor; bitpos =3D 7 - srcskipleft; addr =3D dstaddr + dstskipleft; for (x =3D dstskipleft; x < bltwidth; x +=3D (DEPTH / 8)) { @@ -225,7 +227,7 @@ glue(glue(glue(cirrus_colorexpand_pattern_transp_, ROP_= NAME), _),DEPTH) static void glue(glue(glue(cirrus_colorexpand_pattern_, ROP_NAME), _),DEPTH) (CirrusVGAState *s, uint32_t dstaddr, - const uint8_t *src, + uint32_t srcaddr, int dstpitch, int srcpitch, int bltwidth, int bltheight) { @@ -242,7 +244,7 @@ glue(glue(glue(cirrus_colorexpand_pattern_, ROP_NAME), = _),DEPTH) pattern_y =3D s->cirrus_blt_srcaddr & 7; =20 for(y =3D 0; y < bltheight; y++) { - bits =3D src[pattern_y]; + bits =3D cirrus_src(s, srcaddr + pattern_y); bitpos =3D 7 - srcskipleft; addr =3D dstaddr + dstskipleft; for (x =3D dstskipleft; x < bltwidth; x +=3D (DEPTH / 8)) { --=20 1.8.3.1