Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2202591/?format=api
{ "id": 2202591, "url": "http://patchwork.ozlabs.org/api/patches/2202591/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260227203944.746471-12-chad@jablonski.xyz/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260227203944.746471-12-chad@jablonski.xyz>", "list_archive_url": null, "date": "2026-02-27T20:39:37", "name": "[v9,11/18] ati-vga: Introduce ATI2DCtx struct for 2D blit context", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "b0e0a6c1585307ecd29402a4f1d1994454ae08e1", "submitter": { "id": 91805, "url": "http://patchwork.ozlabs.org/api/people/91805/?format=api", "name": "Chad Jablonski", "email": "chad@jablonski.xyz" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260227203944.746471-12-chad@jablonski.xyz/mbox/", "series": [ { "id": 493814, "url": "http://patchwork.ozlabs.org/api/series/493814/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=493814", "date": "2026-02-27T20:39:27", "name": "ati-vga: Implement HOST_DATA transfers to enable X.org text rendering", "version": 9, "mbox": "http://patchwork.ozlabs.org/series/493814/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2202591/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2202591/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=jablonski.xyz header.i=@jablonski.xyz\n header.a=rsa-sha256 header.s=fm2 header.b=mAMoqQWa;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=messagingengine.com header.i=@messagingengine.com\n header.a=rsa-sha256 header.s=fm3 header.b=SJTcPqn9;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fN0cN6PjDz1xyQ\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 28 Feb 2026 07:41:56 +1100 (AEDT)", "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1vw4eD-0002bX-6U; Fri, 27 Feb 2026 15:41:18 -0500", "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <chad@jablonski.xyz>)\n id 1vw4e2-0001Vz-3Q\n for qemu-devel@nongnu.org; Fri, 27 Feb 2026 15:41:06 -0500", "from fhigh-a7-smtp.messagingengine.com ([103.168.172.158])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <chad@jablonski.xyz>)\n id 1vw4dz-0007Q8-5B\n for qemu-devel@nongnu.org; Fri, 27 Feb 2026 15:41:05 -0500", "from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42])\n by mailfhigh.phl.internal (Postfix) with ESMTP id 0C23F14001F7;\n Fri, 27 Feb 2026 15:41:01 -0500 (EST)", "from phl-frontend-03 ([10.202.2.162])\n by phl-compute-02.internal (MEProxy); Fri, 27 Feb 2026 15:41:01 -0500", "by mail.messagingengine.com (Postfix) with ESMTPA; Fri,\n 27 Feb 2026 15:41:00 -0500 (EST)", "from localhost (chomposaur [local])\n by chomposaur (OpenSMTPD) with ESMTPA id 77aaef6b;\n Fri, 27 Feb 2026 20:40:55 +0000 (UTC)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz;\n h=cc:cc:content-transfer-encoding:content-type:date:date:from\n :from:in-reply-to:in-reply-to:message-id:mime-version:references\n :reply-to:subject:subject:to:to; s=fm2; t=1772224861; x=\n 1772311261; bh=WU6cZD7VMvAe2lt4ksMZ8qKTpaE4lnZg2DgkHNwr9uU=; b=m\n AMoqQWaqKShJ9Wjw7CSXCbUPwUuM64EeFH/Z3k/BimYZYGxRzHtxE00mLOO3xplg\n qzBfF14EeZaeNNK1amcl4xXA7lGglwx+M9PGTfZZrveDRZ5PIsQ31wHbipJgq84F\n NORZ6xaXbWAe7W+btGwyQFWcC0ByHBTtKhxBWNm/omM+oRt9LjUV1CaCoM/BFDWh\n vTIjnNxCeg1Ctz4z7xUvHgqq+KLpYUvcKDDcCwZmU2zfiV3ngsrB1XU0DZkhwvo/\n +6BhmfC521RK/4F4AbUkYeuiW2iIfwa70AFSxZOTRjMrFLUF68BLm22RsaNXyLko\n NuL8mn41ejmh8VsvSHpKw==", "v=1; a=rsa-sha256; c=relaxed/relaxed; d=\n messagingengine.com; h=cc:cc:content-transfer-encoding\n :content-type:date:date:feedback-id:feedback-id:from:from\n :in-reply-to:in-reply-to:message-id:mime-version:references\n :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender\n :x-me-sender:x-sasl-enc; s=fm3; t=1772224861; x=1772311261; bh=W\n U6cZD7VMvAe2lt4ksMZ8qKTpaE4lnZg2DgkHNwr9uU=; b=SJTcPqn9Vhr/Qjosf\n +t8h4cjvx9xCaX1wPhz/ukNbUvtJekqEwAAPHAepgoXIA+WYemcozz5IiwWtM6dQ\n fEj0nGdbxKArLG4/7Elj7hu8F8XoLAimbBOliar6rH0pbHrFNR59NZTiHXFXwlsu\n YRIS6+Pxq2p/GMef6IiRBMj1G5zMmYNfv8DRVj3zy4w5iBr0iqECEKPe60Vo+VfT\n dJiLF6hxcLkLyEp3LnJ/nGJU6j4ic2Bvl/2qacBiaJI8o3Jev2OKTpnVIx9eiJm/\n lTHkXXpuR2QkxPKjsRQj9Rf0ic+uinV53a5PMxmgnnuYTaUCXjh3zHMLpPyjUedu\n h0Xdw==" ], "X-ME-Sender": "<xms:XAGiaa23ZBWHpxJ971HKK6g0YVFmdyyagHk3piS2uJz48EcE9aOtnQ>\n <xme:XAGiaT-JkA2zTV6HtAe_E5TpNrNs0RPg5R5O_OMoUT9wYxRvMsUQvTkP8Scd_EHGq\n iVQFo7WVEq7mq5dMvDWuD9A4hCo9T6IGnYPb0vklO3iNVl4pMsuwDLk>", "X-ME-Received": "\n <xmr:XAGiabOc_2zVQtjJBHGM2QrYsiGcB_TAz3cnwxOe_j8ix1F8pYQouHuTiv99>", "X-ME-Proxy-Cause": "\n gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgddvgeelleekucetufdoteggodetrf\n dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu\n rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnegfrh\n hlucfvnfffucdljedtmdenucfjughrpefhvfevufffkffojghfggfgsedtkeertdertddt\n necuhfhrohhmpeevhhgrugculfgrsghlohhnshhkihcuoegthhgrugesjhgrsghlohhnsh\n hkihdrgiihiieqnecuggftrfgrthhtvghrnhepgfeiteejhfelheefieetjefgleejfffh\n ueffvdduieejgfeuueeuvddvkeejhfelnecuvehluhhsthgvrhfuihiivgeptdenucfrrg\n hrrghmpehmrghilhhfrhhomheptghhrggusehjrggslhhonhhskhhirdighiiipdhnsggp\n rhgtphhtthhopeehpdhmohguvgepshhmthhpohhuthdprhgtphhtthhopehkrhgrgigvlh\n esrhgvughhrghtrdgtohhmpdhrtghpthhtohepsggrlhgrthhonhesvghikhdrsghmvgdr\n hhhupdhrtghpthhtohepqhgvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprhgtph\n htthhopehmrghrtggrnhgurhgvrdhluhhrvggruhesrhgvughhrghtrdgtohhmpdhrtghp\n thhtoheptghhrggusehjrggslhhonhhskhhirdighiii", "X-ME-Proxy": "<xmx:XAGiaXe0Q0TiFj6DxqhmRlrHitnj92GJ08GRh-760wCZjhy8GTEkrw>\n <xmx:XAGiaaV9wKmtYM8VDP1f-AM01LavA-i0sNEB3tYH33K4BpxQ8iSECQ>\n <xmx:XAGiafgW8CUmlrvPeph01aj9ZkBOndcqWsnW9g9Q_gGD30fja8hNgA>\n <xmx:XAGiaZ_ftW70nDGWEzySzcjXfAD-vHQ7CDYr_MQ3btdGTzj1Tk2Zww>\n <xmx:XQGiaUbyqslEtZRG0Aptte55Y12otTMDFe6mpGX6Yqc4CyiFWnyWWInK>", "Feedback-ID": "ib26944c1:Fastmail", "From": "Chad Jablonski <chad@jablonski.xyz>", "To": "qemu-devel@nongnu.org", "Cc": "BALATON Zoltan <balaton@eik.bme.hu>, Gerd Hoffmann <kraxel@redhat.com>,\n\t=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n Chad Jablonski <chad@jablonski.xyz>", "Subject": "[PATCH v9 11/18] ati-vga: Introduce ATI2DCtx struct for 2D blit\n context", "Date": "Fri, 27 Feb 2026 15:39:37 -0500", "Message-ID": "<20260227203944.746471-12-chad@jablonski.xyz>", "X-Mailer": "git-send-email 2.52.0", "In-Reply-To": "<20260227203944.746471-1-chad@jablonski.xyz>", "References": "<20260227203944.746471-1-chad@jablonski.xyz>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Received-SPF": "pass client-ip=103.168.172.158;\n envelope-from=chad@jablonski.xyz;\n helo=fhigh-a7-smtp.messagingengine.com", "X-Spam_score_int": "8", "X-Spam_score": "0.8", "X-Spam_bar": "/", "X-Spam_report": "(0.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1,\n DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.5,\n PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7,\n RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.706,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.401,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001,\n UNPARSEABLE_RELAY=0.001 autolearn=no autolearn_force=no", "X-Spam_action": "no action", "X-BeenThere": "qemu-devel@nongnu.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "qemu development <qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org" }, "content": "Previously all state derived from registers was moved to locals. Now we\ncan mechanically replace those locals with fields on the new ATI2DCtx\nstruct.\n\nSigned-off-by: Chad Jablonski <chad@jablonski.xyz>\nReviewed-by: BALATON Zoltan <balaton@eik.bme.hu>\n---\n hw/display/ati_2d.c | 221 +++++++++++++++++++++++++-------------------\n 1 file changed, 126 insertions(+), 95 deletions(-)", "diff": "diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c\nindex 689b07b4d0..d43268ba5f 100644\n--- a/hw/display/ati_2d.c\n+++ b/hw/display/ati_2d.c\n@@ -13,6 +13,7 @@\n #include \"qemu/log.h\"\n #include \"ui/pixel_ops.h\"\n #include \"ui/console.h\"\n+#include \"ui/rect.h\"\n \n /*\n * NOTE:\n@@ -43,21 +44,39 @@ static int ati_bpp_from_datatype(ATIVGAState *s)\n }\n }\n \n-static void ati_set_dirty(ATIVGAState *s,\n- const uint8_t *dst_bits, unsigned dst_y)\n+typedef struct {\n+ int bpp;\n+ uint32_t rop3;\n+ bool left_to_right;\n+ bool top_to_bottom;\n+ uint32_t frgd_clr;\n+ const uint8_t *palette;\n+ const uint8_t *vram_end;\n+\n+ QemuRect dst;\n+ int dst_stride;\n+ uint8_t *dst_bits;\n+ uint32_t dst_offset;\n+\n+ QemuRect src;\n+ int src_stride;\n+ const uint8_t *src_bits;\n+} ATI2DCtx;\n+\n+static void ati_set_dirty(VGACommonState *vga, const ATI2DCtx *ctx)\n {\n- VGACommonState *vga = &s->vga;\n DisplaySurface *ds = qemu_console_surface(vga->con);\n \n DPRINTF(\"%p %u ds: %p %d %d rop: %x\\n\", vga->vram_ptr, vga->vbe_start_addr,\n surface_data(ds), surface_stride(ds), surface_bits_per_pixel(ds),\n- (s->regs.dp_mix & GMC_ROP3_MASK) >> 16);\n- if (dst_bits >= vga->vram_ptr + vga->vbe_start_addr &&\n- dst_bits < vga->vram_ptr + vga->vbe_start_addr +\n+ ctx->rop3 >> 16);\n+ if (ctx->dst_bits >= vga->vram_ptr + vga->vbe_start_addr &&\n+ ctx->dst_bits < vga->vram_ptr + vga->vbe_start_addr +\n vga->vbe_regs[VBE_DISPI_INDEX_YRES] * vga->vbe_line_offset) {\n memory_region_set_dirty(&vga->vram, vga->vbe_start_addr +\n- s->regs.dst_offset + dst_y * surface_stride(ds),\n- s->regs.dst_height * surface_stride(ds));\n+ ctx->dst_offset + ctx->dst.y\n+ * surface_stride(ds),\n+ ctx->dst.height * surface_stride(ds));\n }\n }\n \n@@ -67,100 +86,106 @@ void ati_2d_blt(ATIVGAState *s)\n /* rewritten but for now as a start just to get some output: */\n bool use_pixman_fill = s->use_pixman & BIT(0);\n bool use_pixman_blt = s->use_pixman & BIT(1);\n- uint32_t rop3 = s->regs.dp_mix & GMC_ROP3_MASK;\n- bool left_to_right = s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT;\n- bool top_to_bottom = s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM;\n- uint32_t frgd_clr = s->regs.dp_brush_frgd_clr;\n- uint8_t *palette = s->vga.palette;\n- unsigned dst_offset = s->regs.dst_offset;\n- unsigned dst_width = s->regs.dst_width;\n- unsigned dst_height = s->regs.dst_height;\n- unsigned dst_x = (left_to_right ?\n- s->regs.dst_x : s->regs.dst_x + 1 - dst_width);\n- unsigned dst_y = (top_to_bottom ?\n- s->regs.dst_y : s->regs.dst_y + 1 - dst_height);\n- int bpp = ati_bpp_from_datatype(s);\n- if (!bpp) {\n+ ATI2DCtx ctx_;\n+ ATI2DCtx *ctx = &ctx_;\n+ ctx->rop3 = s->regs.dp_mix & GMC_ROP3_MASK;\n+ ctx->left_to_right = s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT;\n+ ctx->top_to_bottom = s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM;\n+ ctx->frgd_clr = s->regs.dp_brush_frgd_clr;\n+ ctx->palette = s->vga.palette;\n+ ctx->dst_offset = s->regs.dst_offset;\n+ ctx->dst.width = s->regs.dst_width;\n+ ctx->dst.height = s->regs.dst_height;\n+ ctx->dst.x = (ctx->left_to_right ?\n+ s->regs.dst_x : s->regs.dst_x + 1 - ctx->dst.width);\n+ ctx->dst.y = (ctx->top_to_bottom ?\n+ s->regs.dst_y : s->regs.dst_y + 1 - ctx->dst.height);\n+ ctx->bpp = ati_bpp_from_datatype(s);\n+ if (!ctx->bpp) {\n qemu_log_mask(LOG_GUEST_ERROR, \"Invalid bpp\\n\");\n return;\n }\n- int dst_stride = s->regs.dst_pitch;\n- if (!dst_stride) {\n+ ctx->dst_stride = s->regs.dst_pitch;\n+ if (!ctx->dst_stride) {\n qemu_log_mask(LOG_GUEST_ERROR, \"Zero dest pitch\\n\");\n return;\n }\n- uint8_t *dst_bits = s->vga.vram_ptr + dst_offset;\n+ ctx->dst_bits = s->vga.vram_ptr + ctx->dst_offset;\n \n if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) {\n- dst_bits += s->regs.crtc_offset & 0x07ffffff;\n- dst_stride *= bpp;\n+ ctx->dst_bits += s->regs.crtc_offset & 0x07ffffff;\n+ ctx->dst_stride *= ctx->bpp;\n }\n- int dst_stride_words = dst_stride / sizeof(uint32_t);\n- uint8_t *end = s->vga.vram_ptr + s->vga.vram_size;\n- if (dst_x > 0x3fff || dst_y > 0x3fff || dst_bits >= end\n- || dst_bits + dst_x + (dst_y + dst_height) * dst_stride >= end) {\n+ int dst_stride_words = ctx->dst_stride / sizeof(uint32_t);\n+ ctx->vram_end = s->vga.vram_ptr + s->vga.vram_size;\n+ if (ctx->dst.x > 0x3fff || ctx->dst.y > 0x3fff\n+ || ctx->dst_bits >= ctx->vram_end || ctx->dst_bits + ctx->dst.x\n+ + (ctx->dst.y + ctx->dst.height) * ctx->dst_stride >= ctx->vram_end) {\n qemu_log_mask(LOG_UNIMP, \"blt outside vram not implemented\\n\");\n return;\n }\n DPRINTF(\"%d %d %d, %d %d %d, (%d,%d) -> (%d,%d) %dx%d %c %c\\n\",\n- s->regs.src_offset, dst_offset, s->regs.default_offset,\n- s->regs.src_pitch, dst_stride, s->regs.default_pitch,\n- s->regs.src_x, s->regs.src_y, dst_x, dst_y,\n- dst_width, dst_height,\n- (left_to_right ? '>' : '<'),\n- (top_to_bottom ? 'v' : '^'));\n- switch (rop3) {\n+ s->regs.src_offset, ctx->dst_offset, s->regs.default_offset,\n+ ctx->src_stride, ctx->dst_stride, s->regs.default_pitch,\n+ ctx->src.x, ctx->src.y, ctx->dst.x, ctx->dst.y,\n+ ctx->dst.width, ctx->dst.height,\n+ (ctx->left_to_right ? '>' : '<'),\n+ (ctx->top_to_bottom ? 'v' : '^'));\n+ switch (ctx->rop3) {\n case ROP3_SRCCOPY:\n {\n bool fallback = false;\n- unsigned src_x = (left_to_right ?\n- s->regs.src_x : s->regs.src_x + 1 - dst_width);\n- unsigned src_y = (top_to_bottom ?\n- s->regs.src_y : s->regs.src_y + 1 - dst_height);\n- int src_stride = s->regs.src_pitch;\n- if (!src_stride) {\n+ ctx->src.x = (ctx->left_to_right ?\n+ s->regs.src_x : s->regs.src_x + 1 - ctx->dst.width);\n+ ctx->src.y = (ctx->top_to_bottom ?\n+ s->regs.src_y : s->regs.src_y + 1 - ctx->dst.height);\n+ ctx->src_stride = s->regs.src_pitch;\n+ if (!ctx->src_stride) {\n qemu_log_mask(LOG_GUEST_ERROR, \"Zero source pitch\\n\");\n return;\n }\n- uint8_t *src_bits = s->vga.vram_ptr + s->regs.src_offset;\n+ ctx->src_bits = s->vga.vram_ptr + s->regs.src_offset;\n \n if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) {\n- src_bits += s->regs.crtc_offset & 0x07ffffff;\n- src_stride *= bpp;\n+ ctx->src_bits += s->regs.crtc_offset & 0x07ffffff;\n+ ctx->src_stride *= ctx->bpp;\n }\n- int src_stride_words = src_stride / sizeof(uint32_t);\n- if (src_x > 0x3fff || src_y > 0x3fff || src_bits >= end\n- || src_bits + src_x\n- + (src_y + dst_height) * src_stride >= end) {\n+ int src_stride_words = ctx->src_stride / sizeof(uint32_t);\n+ if (ctx->src.x > 0x3fff || ctx->src.y > 0x3fff\n+ || ctx->src_bits >= ctx->vram_end\n+ || ctx->src_bits + ctx->src.x + (ctx->src.y + ctx->dst.height)\n+ * ctx->src_stride >= ctx->vram_end) {\n qemu_log_mask(LOG_UNIMP, \"blt outside vram not implemented\\n\");\n return;\n }\n \n DPRINTF(\"pixman_blt(%p, %p, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)\\n\",\n- src_bits, dst_bits, src_stride_words, dst_stride_words,\n- bpp, bpp, src_x, src_y, dst_x, dst_y,\n- dst_width, dst_height);\n+ ctx->src_bits, ctx->dst_bits, src_stride_words,\n+ dst_stride_words, ctx->bpp, ctx->bpp, ctx->src.x, ctx->src.y,\n+ ctx->dst.x, ctx->dst.y, ctx->dst.width, ctx->dst.height);\n #ifdef CONFIG_PIXMAN\n- if (use_pixman_blt && left_to_right && top_to_bottom) {\n- fallback = !pixman_blt((uint32_t *)src_bits, (uint32_t *)dst_bits,\n- src_stride_words, dst_stride_words, bpp, bpp,\n- src_x, src_y, dst_x, dst_y,\n- dst_width, dst_height);\n+ if (use_pixman_blt && ctx->left_to_right && ctx->top_to_bottom) {\n+ fallback = !pixman_blt((uint32_t *)ctx->src_bits,\n+ (uint32_t *)ctx->dst_bits, src_stride_words,\n+ dst_stride_words, ctx->bpp, ctx->bpp,\n+ ctx->src.x, ctx->src.y, ctx->dst.x,\n+ ctx->dst.y, ctx->dst.width, ctx->dst.height);\n } else if (use_pixman_blt) {\n /* FIXME: We only really need a temporary if src and dst overlap */\n- int llb = dst_width * (bpp / 8);\n+ int llb = ctx->dst.width * (ctx->bpp / 8);\n int tmp_stride_words = DIV_ROUND_UP(llb, sizeof(uint32_t));\n uint32_t *tmp = g_malloc(tmp_stride_words * sizeof(uint32_t) *\n- dst_height);\n- fallback = !pixman_blt((uint32_t *)src_bits, tmp,\n- src_stride_words, tmp_stride_words, bpp, bpp,\n- src_x, src_y, 0, 0,\n- dst_width, dst_height);\n+ ctx->dst.height);\n+ fallback = !pixman_blt((uint32_t *)ctx->src_bits, tmp,\n+ src_stride_words, tmp_stride_words, ctx->bpp,\n+ ctx->bpp, ctx->src.x, ctx->src.y, 0, 0,\n+ ctx->dst.width, ctx->dst.height);\n if (!fallback) {\n- fallback = !pixman_blt(tmp, (uint32_t *)dst_bits,\n+ fallback = !pixman_blt(tmp, (uint32_t *)ctx->dst_bits,\n tmp_stride_words, dst_stride_words,\n- bpp, bpp, 0, 0, dst_x, dst_y,\n- dst_width, dst_height);\n+ ctx->bpp, ctx->bpp, 0, 0,\n+ ctx->dst.x, ctx->dst.y,\n+ ctx->dst.width, ctx->dst.height);\n }\n g_free(tmp);\n } else\n@@ -169,18 +194,21 @@ void ati_2d_blt(ATIVGAState *s)\n fallback = true;\n }\n if (fallback) {\n- unsigned int y, i, j, bypp = bpp / 8;\n- for (y = 0; y < dst_height; y++) {\n- i = dst_x * bypp;\n- j = src_x * bypp;\n- if (top_to_bottom) {\n- i += (dst_y + y) * dst_stride;\n- j += (src_y + y) * src_stride;\n+ unsigned int y, i, j, bypp = ctx->bpp / 8;\n+ for (y = 0; y < ctx->dst.height; y++) {\n+ i = ctx->dst.x * bypp;\n+ j = ctx->src.x * bypp;\n+ if (ctx->top_to_bottom) {\n+ i += (ctx->dst.y + y) * ctx->dst_stride;\n+ j += (ctx->src.y + y) * ctx->src_stride;\n } else {\n- i += (dst_y + dst_height - 1 - y) * dst_stride;\n- j += (src_y + dst_height - 1 - y) * src_stride;\n+ i += (ctx->dst.y + ctx->dst.height - 1 - y)\n+ * ctx->dst_stride;\n+ j += (ctx->src.y + ctx->dst.height - 1 - y)\n+ * ctx->src_stride;\n }\n- memmove(&dst_bits[i], &src_bits[j], dst_width * bypp);\n+ memmove(&ctx->dst_bits[i], &ctx->src_bits[j],\n+ ctx->dst.width * bypp);\n }\n }\n break;\n@@ -191,35 +219,38 @@ void ati_2d_blt(ATIVGAState *s)\n {\n uint32_t filler = 0;\n \n- switch (rop3) {\n+ switch (ctx->rop3) {\n case ROP3_PATCOPY:\n- filler = frgd_clr;\n+ filler = ctx->frgd_clr;\n break;\n case ROP3_BLACKNESS:\n- filler = 0xffUL << 24 | rgb_to_pixel32(palette[0], palette[1],\n- palette[2]);\n+ filler = 0xffUL << 24 | rgb_to_pixel32(ctx->palette[0],\n+ ctx->palette[1],\n+ ctx->palette[2]);\n break;\n case ROP3_WHITENESS:\n- filler = 0xffUL << 24 | rgb_to_pixel32(palette[3], palette[4],\n- palette[5]);\n+ filler = 0xffUL << 24 | rgb_to_pixel32(ctx->palette[3],\n+ ctx->palette[4],\n+ ctx->palette[5]);\n break;\n }\n \n DPRINTF(\"pixman_fill(%p, %d, %d, %d, %d, %d, %d, %x)\\n\",\n- dst_bits, dst_stride_words, bpp, dst_x, dst_y,\n- dst_width, dst_height, filler);\n+ ctx->dst_bits, dst_stride_words, ctx->bpp, ctx->dst.x,\n+ ctx->dst.y, ctx->dst.width, ctx->dst.height, filler);\n #ifdef CONFIG_PIXMAN\n if (!use_pixman_fill ||\n- !pixman_fill((uint32_t *)dst_bits, dst_stride_words, bpp, dst_x,\n- dst_y, dst_width, dst_height, filler))\n+ !pixman_fill((uint32_t *)ctx->dst_bits, dst_stride_words, ctx->bpp,\n+ ctx->dst.x, ctx->dst.y,\n+ ctx->dst.width, ctx->dst.height, filler))\n #endif\n {\n /* fallback when pixman failed or we don't want to call it */\n- unsigned int x, y, i, bypp = bpp / 8;\n- for (y = 0; y < dst_height; y++) {\n- i = dst_x * bypp + (dst_y + y) * dst_stride;\n- for (x = 0; x < dst_width; x++, i += bypp) {\n- stn_he_p(&dst_bits[i], bypp, filler);\n+ unsigned int x, y, i, bypp = ctx->bpp / 8;\n+ for (y = 0; y < ctx->dst.height; y++) {\n+ i = ctx->dst.x * bypp + (ctx->dst.y + y) * ctx->dst_stride;\n+ for (x = 0; x < ctx->dst.width; x++, i += bypp) {\n+ stn_he_p(&ctx->dst_bits[i], bypp, filler);\n }\n }\n }\n@@ -227,9 +258,9 @@ void ati_2d_blt(ATIVGAState *s)\n }\n default:\n qemu_log_mask(LOG_UNIMP, \"Unimplemented ati_2d blt op %x\\n\",\n- rop3 >> 16);\n+ ctx->rop3 >> 16);\n return;\n }\n \n- ati_set_dirty(s, dst_bits, dst_y);\n+ ati_set_dirty(&s->vga, ctx);\n }\n", "prefixes": [ "v9", "11/18" ] }