From nobody Thu May 2 17:27:30 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 1489574923707819.5760101040829; Wed, 15 Mar 2017 03:48:43 -0700 (PDT) Received: from localhost ([::1]:35833 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1co6Tx-0007Rz-QM for importer@patchew.org; Wed, 15 Mar 2017 06:48:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46224) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1co6TO-0007RT-1T for qemu-devel@nongnu.org; Wed, 15 Mar 2017 06:48:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1co6TI-000215-VD for qemu-devel@nongnu.org; Wed, 15 Mar 2017 06:48:06 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43100) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1co6TI-00020K-ND for qemu-devel@nongnu.org; Wed, 15 Mar 2017 06:48:00 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (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 DA18D64DA0 for ; Wed, 15 Mar 2017 10:47:59 +0000 (UTC) Received: from nilsson.home.kraxel.org (ovpn-116-31.ams2.redhat.com [10.36.116.31]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2FAlvj4010520; Wed, 15 Mar 2017 06:47:58 -0400 Received: by nilsson.home.kraxel.org (Postfix, from userid 500) id 9E79980945; Wed, 15 Mar 2017 11:47:55 +0100 (CET) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com DA18D64DA0 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 DA18D64DA0 From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Wed, 15 Mar 2017 11:47:52 +0100 Message-Id: <1489574872-8679-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 15 Mar 2017 10:48:00 +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 dst 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" Instead pass around the address (aka offset into vga memory). Calculate the pointer in the rop_* functions, after applying the mask to the address, to make sure the address stays within the valid range. Signed-off-by: Gerd Hoffmann --- hw/display/cirrus_vga.c | 20 +++--- hw/display/cirrus_vga_rop.h | 161 +++++++++++++++++++++++++--------------= ---- hw/display/cirrus_vga_rop2.h | 97 +++++++++++++------------- 3 files changed, 153 insertions(+), 125 deletions(-) diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c index b9e7cb1..f7fb41f 100644 --- a/hw/display/cirrus_vga.c +++ b/hw/display/cirrus_vga.c @@ -178,11 +178,12 @@ =20 struct CirrusVGAState; typedef void (*cirrus_bitblt_rop_t) (struct CirrusVGAState *s, - uint8_t * dst, const uint8_t * src, + uint32_t dstaddr, const uint8_t *src, int dstpitch, int srcpitch, int bltwidth, int bltheight); typedef void (*cirrus_fill_t)(struct CirrusVGAState *s, - uint8_t *dst, int dst_pitch, int width, int = height); + uint32_t dstaddr, int dst_pitch, + int width, int height); =20 typedef struct CirrusVGAState { VGACommonState vga; @@ -320,14 +321,14 @@ static bool blit_is_unsafe(struct CirrusVGAState *s, = bool dst_only) } =20 static void cirrus_bitblt_rop_nop(CirrusVGAState *s, - uint8_t *dst,const uint8_t *src, + uint32_t dstaddr, const uint8_t *src, int dstpitch,int srcpitch, int bltwidth,int bltheight) { } =20 static void cirrus_bitblt_fill_nop(CirrusVGAState *s, - uint8_t *dst, + uint32_t dstaddr, int dstpitch, int bltwidth,int bltheigh= t) { } @@ -677,11 +678,8 @@ static void cirrus_invalidate_region(CirrusVGAState * = s, int off_begin, static int cirrus_bitblt_common_patterncopy(CirrusVGAState *s, bool videos= rc) { uint32_t patternsize; - uint8_t *dst; uint8_t *src; =20 - dst =3D s->vga.vram_ptr + s->cirrus_blt_dstaddr; - if (videosrc) { switch (s->vga.get_bpp(&s->vga)) { case 8: @@ -710,7 +708,7 @@ static int cirrus_bitblt_common_patterncopy(CirrusVGASt= ate *s, bool videosrc) return 0; } =20 - (*s->cirrus_rop) (s, dst, src, + (*s->cirrus_rop) (s, s->cirrus_blt_dstaddr, src, s->cirrus_blt_dstpitch, 0, s->cirrus_blt_width, s->cirrus_blt_height); cirrus_invalidate_region(s, s->cirrus_blt_dstaddr, @@ -729,7 +727,7 @@ static int cirrus_bitblt_solidfill(CirrusVGAState *s, i= nt blt_rop) return 0; } rop_func =3D cirrus_fill[rop_to_index[blt_rop]][s->cirrus_blt_pixelwid= th - 1]; - rop_func(s, s->vga.vram_ptr + s->cirrus_blt_dstaddr, + rop_func(s, s->cirrus_blt_dstaddr, s->cirrus_blt_dstpitch, s->cirrus_blt_width, s->cirrus_blt_height); cirrus_invalidate_region(s, s->cirrus_blt_dstaddr, @@ -801,7 +799,7 @@ static int cirrus_do_copy(CirrusVGAState *s, int dst, i= nt src, int w, int h) if (notify) graphic_hw_update(s->vga.con); =20 - (*s->cirrus_rop) (s, s->vga.vram_ptr + s->cirrus_blt_dstaddr, + (*s->cirrus_rop) (s, s->cirrus_blt_dstaddr, s->vga.vram_ptr + s->cirrus_blt_srcaddr, s->cirrus_blt_dstpitch, s->cirrus_blt_srcpitch, s->cirrus_blt_width, s->cirrus_blt_height); @@ -853,7 +851,7 @@ static void cirrus_bitblt_cputovideo_next(CirrusVGAStat= e * s) } else { /* at least one scan line */ do { - (*s->cirrus_rop)(s, s->vga.vram_ptr + s->cirrus_blt_dstadd= r, + (*s->cirrus_rop)(s, s->cirrus_blt_dstaddr, s->cirrus_bltbuf, 0, 0, s->cirrus_blt_wi= dth, 1); cirrus_invalidate_region(s, s->cirrus_blt_dstaddr, 0, s->cirrus_blt_width, 1); diff --git a/hw/display/cirrus_vga_rop.h b/hw/display/cirrus_vga_rop.h index 0925a00..433f831 100644 --- a/hw/display/cirrus_vga_rop.h +++ b/hw/display/cirrus_vga_rop.h @@ -22,31 +22,65 @@ * THE SOFTWARE. */ =20 -static inline void glue(rop_8_,ROP_NAME)(uint8_t *dst, uint8_t src) +static inline void glue(rop_8_, ROP_NAME)(CirrusVGAState *s, + uint32_t dstaddr, uint8_t src) { + uint8_t *dst =3D &s->vga.vram_ptr[dstaddr & s->cirrus_addr_mask]; *dst =3D ROP_FN(*dst, src); } =20 -static inline void glue(rop_16_,ROP_NAME)(uint16_t *dst, uint16_t src) +static inline void glue(rop_tr_8_, ROP_NAME)(CirrusVGAState *s, + uint32_t dstaddr, uint8_t src, + uint8_t transp) { + uint8_t *dst =3D &s->vga.vram_ptr[dstaddr & s->cirrus_addr_mask]; + uint8_t pixel =3D ROP_FN(*dst, src); + if (pixel !=3D transp) { + *dst =3D pixel; + } +} + +static inline void glue(rop_16_, ROP_NAME)(CirrusVGAState *s, + uint32_t dstaddr, uint16_t src) +{ + uint16_t *dst =3D (uint16_t *) + (&s->vga.vram_ptr[dstaddr & s->cirrus_addr_mask & ~1]); *dst =3D ROP_FN(*dst, src); } =20 -static inline void glue(rop_32_,ROP_NAME)(uint32_t *dst, uint32_t src) +static inline void glue(rop_tr_16_, ROP_NAME)(CirrusVGAState *s, + uint32_t dstaddr, uint16_t s= rc, + uint16_t transp) +{ + uint16_t *dst =3D (uint16_t *) + (&s->vga.vram_ptr[dstaddr & s->cirrus_addr_mask & ~1]); + uint16_t pixel =3D ROP_FN(*dst, src); + if (pixel !=3D transp) { + *dst =3D pixel; + } +} + +static inline void glue(rop_32_, ROP_NAME)(CirrusVGAState *s, + uint32_t dstaddr, uint32_t src) { + uint32_t *dst =3D (uint32_t *) + (&s->vga.vram_ptr[dstaddr & s->cirrus_addr_mask & ~3]); *dst =3D ROP_FN(*dst, src); } =20 -#define ROP_OP(d, s) glue(rop_8_,ROP_NAME)(d, s) -#define ROP_OP_16(d, s) glue(rop_16_,ROP_NAME)(d, s) -#define ROP_OP_32(d, s) glue(rop_32_,ROP_NAME)(d, s) +#define ROP_OP(st, d, s) glue(rop_8_, ROP_NAME)(st, d, s) +#define ROP_OP_TR(st, d, s, t) glue(rop_tr_8_, ROP_NAME)(st, d, s, t) +#define ROP_OP_16(st, d, s) glue(rop_16_, ROP_NAME)(st, d, s) +#define ROP_OP_TR_16(st, d, s, t) glue(rop_tr_16_, ROP_NAME)(st, d, s, t) +#define ROP_OP_32(st, d, s) glue(rop_32_, ROP_NAME)(st, d, s) #undef ROP_FN =20 static void glue(cirrus_bitblt_rop_fwd_, ROP_NAME)(CirrusVGAState *s, - uint8_t *dst,const uint8_t *src, - int dstpitch,int srcpitch, - int bltwidth,int bltheight) + uint32_t dstaddr, + const uint8_t *src, + int dstpitch, int srcpitch, + int bltwidth, int bltheight) { int x,y; dstpitch -=3D bltwidth; @@ -58,133 +92,128 @@ 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(dst, *src); - dst++; + ROP_OP(s, dstaddr, *src); + dstaddr++; src++; } - dst +=3D dstpitch; + dstaddr +=3D dstpitch; src +=3D srcpitch; } } =20 static void glue(cirrus_bitblt_rop_bkwd_, ROP_NAME)(CirrusVGAState *s, - uint8_t *dst,const uint8_t *src, - int dstpitch,int srcpitch, - int bltwidth,int bltheight) + uint32_t dstaddr, + const uint8_t *src, + int dstpitch, int srcpitch, + int bltwidth, int bltheight) { int x,y; dstpitch +=3D bltwidth; srcpitch +=3D bltwidth; for (y =3D 0; y < bltheight; y++) { for (x =3D 0; x < bltwidth; x++) { - ROP_OP(dst, *src); - dst--; + ROP_OP(s, dstaddr, *src); + dstaddr--; src--; } - dst +=3D dstpitch; + dstaddr +=3D dstpitch; src +=3D srcpitch; } } =20 static void glue(glue(cirrus_bitblt_rop_fwd_transp_, ROP_NAME),_8)(CirrusVGAState *s, - uint8_t *dst,const uint8_t *src, - int dstpitch,int srcpitch, - int bltwidth,int bltheight) + uint32_t dstaddr, + const uint8_t *src, + int dstpitch, + int srcpitch, + int bltwidth, + int bltheight) { int x,y; - uint8_t p; + uint8_t transp =3D s->vga.gr[0x34]; dstpitch -=3D bltwidth; srcpitch -=3D bltwidth; for (y =3D 0; y < bltheight; y++) { for (x =3D 0; x < bltwidth; x++) { - p =3D *dst; - ROP_OP(&p, *src); - if (p !=3D s->vga.gr[0x34]) *dst =3D p; - dst++; + ROP_OP_TR(s, dstaddr, *src, transp); + dstaddr++; src++; } - dst +=3D dstpitch; + dstaddr +=3D dstpitch; src +=3D srcpitch; } } =20 static void glue(glue(cirrus_bitblt_rop_bkwd_transp_, ROP_NAME),_8)(CirrusVGAState *s, - uint8_t *dst,const uint8_t *src, - int dstpitch,int srcpitch, - int bltwidth,int bltheight) + uint32_t dstaddr, + const uint8_t *src, + int dstpitch, + int srcpitch, + int bltwidth, + int bltheight) { int x,y; - uint8_t p; + uint8_t transp =3D s->vga.gr[0x34]; dstpitch +=3D bltwidth; srcpitch +=3D bltwidth; for (y =3D 0; y < bltheight; y++) { for (x =3D 0; x < bltwidth; x++) { - p =3D *dst; - ROP_OP(&p, *src); - if (p !=3D s->vga.gr[0x34]) *dst =3D p; - dst--; + ROP_OP_TR(s, dstaddr, *src, transp); + dstaddr--; src--; } - dst +=3D dstpitch; + dstaddr +=3D dstpitch; src +=3D srcpitch; } } =20 static void glue(glue(cirrus_bitblt_rop_fwd_transp_, ROP_NAME),_16)(CirrusVGAState *s, - uint8_t *dst,const uint8_t *src, - int dstpitch,int srcpitch, - int bltwidth,int bltheight) + uint32_t dstaddr, + const uint8_t *src, + int dstpitch, + int srcpitch, + int bltwidth, + int bltheight) { int x,y; - uint8_t p1, p2; + uint16_t transp =3D s->vga.gr[0x34] | (uint16_t)s->vga.gr[0x35] << 8; dstpitch -=3D bltwidth; srcpitch -=3D bltwidth; for (y =3D 0; y < bltheight; y++) { for (x =3D 0; x < bltwidth; x+=3D2) { - p1 =3D *dst; - p2 =3D *(dst+1); - ROP_OP(&p1, *src); - ROP_OP(&p2, *(src + 1)); - if ((p1 !=3D s->vga.gr[0x34]) || (p2 !=3D s->vga.gr[0x35])) { - *dst =3D p1; - *(dst+1) =3D p2; - } - dst+=3D2; - src+=3D2; + ROP_OP_TR_16(s, dstaddr, *(uint16_t *)src, transp); + dstaddr +=3D 2; + src +=3D 2; } - dst +=3D dstpitch; + dstaddr +=3D dstpitch; src +=3D srcpitch; } } =20 static void glue(glue(cirrus_bitblt_rop_bkwd_transp_, ROP_NAME),_16)(CirrusVGAState *s, - uint8_t *dst,const uint8_t *src, - int dstpitch,int srcpitch, - int bltwidth,int bltheight) + uint32_t dstaddr, + const uint8_t *sr= c, + int dstpitch, + int srcpitch, + int bltwidth, + int bltheight) { int x,y; - uint8_t p1, p2; + uint16_t transp =3D s->vga.gr[0x34] | (uint16_t)s->vga.gr[0x35] << 8; dstpitch +=3D bltwidth; srcpitch +=3D bltwidth; for (y =3D 0; y < bltheight; y++) { for (x =3D 0; x < bltwidth; x+=3D2) { - p1 =3D *(dst-1); - p2 =3D *dst; - ROP_OP(&p1, *(src - 1)); - ROP_OP(&p2, *src); - if ((p1 !=3D s->vga.gr[0x34]) || (p2 !=3D s->vga.gr[0x35])) { - *(dst-1) =3D p1; - *dst =3D p2; - } - dst-=3D2; - src-=3D2; + ROP_OP_TR_16(s, dstaddr, *(uint16_t *)src, transp); + dstaddr -=3D 2; + src -=3D 2; } - dst +=3D dstpitch; + dstaddr +=3D dstpitch; src +=3D srcpitch; } } diff --git a/hw/display/cirrus_vga_rop2.h b/hw/display/cirrus_vga_rop2.h index d28bcc6..bc92f0e 100644 --- a/hw/display/cirrus_vga_rop2.h +++ b/hw/display/cirrus_vga_rop2.h @@ -23,27 +23,29 @@ */ =20 #if DEPTH =3D=3D 8 -#define PUTPIXEL() ROP_OP(&d[0], col) +#define PUTPIXEL(s, a, c) ROP_OP(s, a, c) #elif DEPTH =3D=3D 16 -#define PUTPIXEL() ROP_OP_16((uint16_t *)&d[0], col) +#define PUTPIXEL(s, a, c) ROP_OP_16(s, a, c) #elif DEPTH =3D=3D 24 -#define PUTPIXEL() ROP_OP(&d[0], col); \ - ROP_OP(&d[1], (col >> 8)); \ - ROP_OP(&d[2], (col >> 16)) +#define PUTPIXEL(s, a, c) do { \ + ROP_OP(s, a, c); \ + ROP_OP(s, a + 1, (col >> 8)); \ + ROP_OP(s, a + 2, (col >> 16)); \ + } while (0) #elif DEPTH =3D=3D 32 -#define PUTPIXEL() ROP_OP_32(((uint32_t *)&d[0]), col) +#define PUTPIXEL(s, a, c) ROP_OP_32(s, a, c) #else #error unsupported DEPTH #endif =20 static void glue(glue(glue(cirrus_patternfill_, ROP_NAME), _),DEPTH) - (CirrusVGAState * s, uint8_t * dst, - const uint8_t * src, + (CirrusVGAState *s, uint32_t dstaddr, + const uint8_t *src, int dstpitch, int srcpitch, int bltwidth, int bltheight) { - uint8_t *d; + uint32_t addr; int x, y, pattern_y, pattern_pitch, pattern_x; unsigned int col; const uint8_t *src1; @@ -63,7 +65,7 @@ glue(glue(glue(cirrus_patternfill_, ROP_NAME), _),DEPTH) pattern_y =3D s->cirrus_blt_srcaddr & 7; for(y =3D 0; y < bltheight; y++) { pattern_x =3D skipleft; - d =3D dst + skipleft; + addr =3D dstaddr + skipleft; src1 =3D src + pattern_y * pattern_pitch; for (x =3D skipleft; x < bltwidth; x +=3D (DEPTH / 8)) { #if DEPTH =3D=3D 8 @@ -82,23 +84,23 @@ glue(glue(glue(cirrus_patternfill_, ROP_NAME), _),DEPTH) col =3D ((uint32_t *)(src1 + pattern_x))[0]; pattern_x =3D (pattern_x + 4) & 31; #endif - PUTPIXEL(); - d +=3D (DEPTH / 8); + PUTPIXEL(s, addr, col); + addr +=3D (DEPTH / 8); } pattern_y =3D (pattern_y + 1) & 7; - dst +=3D dstpitch; + dstaddr +=3D dstpitch; } } =20 /* NOTE: srcpitch is ignored */ static void glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH) - (CirrusVGAState * s, uint8_t * dst, - const uint8_t * src, + (CirrusVGAState *s, uint32_t dstaddr, + const uint8_t *src, int dstpitch, int srcpitch, int bltwidth, int bltheight) { - uint8_t *d; + uint32_t addr; int x, y; unsigned bits, bits_xor; unsigned int col; @@ -123,7 +125,7 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _= ),DEPTH) for(y =3D 0; y < bltheight; y++) { bitmask =3D 0x80 >> srcskipleft; bits =3D *src++ ^ bits_xor; - d =3D dst + dstskipleft; + addr =3D dstaddr + dstskipleft; for (x =3D dstskipleft; x < bltwidth; x +=3D (DEPTH / 8)) { if ((bitmask & 0xff) =3D=3D 0) { bitmask =3D 0x80; @@ -131,24 +133,24 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME),= _),DEPTH) } index =3D (bits & bitmask); if (index) { - PUTPIXEL(); + PUTPIXEL(s, addr, col); } - d +=3D (DEPTH / 8); + addr +=3D (DEPTH / 8); bitmask >>=3D 1; } - dst +=3D dstpitch; + dstaddr +=3D dstpitch; } } =20 static void glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH) - (CirrusVGAState * s, uint8_t * dst, - const uint8_t * src, + (CirrusVGAState *s, uint32_t dstaddr, + const uint8_t *src, int dstpitch, int srcpitch, int bltwidth, int bltheight) { uint32_t colors[2]; - uint8_t *d; + uint32_t addr; int x, y; unsigned bits; unsigned int col; @@ -161,29 +163,29 @@ glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEP= TH) for(y =3D 0; y < bltheight; y++) { bitmask =3D 0x80 >> srcskipleft; bits =3D *src++; - d =3D dst + dstskipleft; + 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++; } col =3D colors[!!(bits & bitmask)]; - PUTPIXEL(); - d +=3D (DEPTH / 8); + PUTPIXEL(s, addr, col); + addr +=3D (DEPTH / 8); bitmask >>=3D 1; } - dst +=3D dstpitch; + dstaddr +=3D dstpitch; } } =20 static void glue(glue(glue(cirrus_colorexpand_pattern_transp_, ROP_NAME), _),DEPTH) - (CirrusVGAState * s, uint8_t * dst, - const uint8_t * src, + (CirrusVGAState *s, uint32_t dstaddr, + const uint8_t *src, int dstpitch, int srcpitch, int bltwidth, int bltheight) { - uint8_t *d; + uint32_t addr; int x, y, bitpos, pattern_y; unsigned int bits, bits_xor; unsigned int col; @@ -207,28 +209,28 @@ glue(glue(glue(cirrus_colorexpand_pattern_transp_, RO= P_NAME), _),DEPTH) for(y =3D 0; y < bltheight; y++) { bits =3D src[pattern_y] ^ bits_xor; bitpos =3D 7 - srcskipleft; - d =3D dst + dstskipleft; + addr =3D dstaddr + dstskipleft; for (x =3D dstskipleft; x < bltwidth; x +=3D (DEPTH / 8)) { if ((bits >> bitpos) & 1) { - PUTPIXEL(); + PUTPIXEL(s, addr, col); } - d +=3D (DEPTH / 8); + addr +=3D (DEPTH / 8); bitpos =3D (bitpos - 1) & 7; } pattern_y =3D (pattern_y + 1) & 7; - dst +=3D dstpitch; + dstaddr +=3D dstpitch; } } =20 static void glue(glue(glue(cirrus_colorexpand_pattern_, ROP_NAME), _),DEPTH) - (CirrusVGAState * s, uint8_t * dst, - const uint8_t * src, + (CirrusVGAState *s, uint32_t dstaddr, + const uint8_t *src, int dstpitch, int srcpitch, int bltwidth, int bltheight) { uint32_t colors[2]; - uint8_t *d; + uint32_t addr; int x, y, bitpos, pattern_y; unsigned int bits; unsigned int col; @@ -242,38 +244,37 @@ glue(glue(glue(cirrus_colorexpand_pattern_, ROP_NAME)= , _),DEPTH) for(y =3D 0; y < bltheight; y++) { bits =3D src[pattern_y]; bitpos =3D 7 - srcskipleft; - d =3D dst + dstskipleft; + addr =3D dstaddr + dstskipleft; for (x =3D dstskipleft; x < bltwidth; x +=3D (DEPTH / 8)) { col =3D colors[(bits >> bitpos) & 1]; - PUTPIXEL(); - d +=3D (DEPTH / 8); + PUTPIXEL(s, addr, col); + addr +=3D (DEPTH / 8); bitpos =3D (bitpos - 1) & 7; } pattern_y =3D (pattern_y + 1) & 7; - dst +=3D dstpitch; + dstaddr +=3D dstpitch; } } =20 static void glue(glue(glue(cirrus_fill_, ROP_NAME), _),DEPTH) (CirrusVGAState *s, - uint8_t *dst, int dst_pitch, + uint32_t dstaddr, int dst_pitch, int width, int height) { - uint8_t *d, *d1; + uint32_t addr; uint32_t col; int x, y; =20 col =3D s->cirrus_blt_fgcol; =20 - d1 =3D dst; for(y =3D 0; y < height; y++) { - d =3D d1; + addr =3D dstaddr; for(x =3D 0; x < width; x +=3D (DEPTH / 8)) { - PUTPIXEL(); - d +=3D (DEPTH / 8); + PUTPIXEL(s, addr, col); + addr +=3D (DEPTH / 8); } - d1 +=3D dst_pitch; + dstaddr +=3D dst_pitch; } } =20 --=20 1.8.3.1