From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531475; cv=none; d=zohomail.com; s=zohoarc; b=jyT4ZnfcdYzxnCsw2bMD+EbJBfdAU77pM6rpNloTQaNvEJn1KoknAPT+jYveATOuwBZmM1VE37mOgz/VJEJrVgQ5HIQsQcCv7tyDLfAvRs/bq8cQalFD5yQrxgXv4EnhtLZfseyhs7KYbub0td0EG5mt/Q+mYO06Ylx84rSHAQI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531475; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=u7rZ6j9Txp/nW85uLyC9G5+YxXS6fGPWCPNR4E53FU8=; b=gUSHSS2cATyYCe3ZD/5TTCHZ/Xmgn354u/wIMVRjJey+MKNwHuayz+o6lN6GBIslksyPJidNIuudVyonZQu4RY4tKTO56ttrYSrg7OqVL/ydYTEO+AqO+v1yLrIh3Jf/1MQ0XfKx5n7eHKMoxc3fdXPs5w7Fv9kHYjiqd77ORq4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768531474963220.40849872671163; Thu, 15 Jan 2026 18:44:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoQ-0005xA-8I; Thu, 15 Jan 2026 21:43:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnx-0005qA-2T for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:22 -0500 Received: from fout-b8-smtp.messagingengine.com ([202.12.124.151]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnt-0002QI-Uq for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:16 -0500 Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42]) by mailfout.stl.internal (Postfix) with ESMTP id C80ED1D0007E; Thu, 15 Jan 2026 21:43:10 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-02.internal (MEProxy); Thu, 15 Jan 2026 21:43:10 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:10 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 0b85a8ea; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531390; x= 1768617790; bh=u7rZ6j9Txp/nW85uLyC9G5+YxXS6fGPWCPNR4E53FU8=; b=b Oz+OiirSpRZvZzR7ZYlTZpcYip/RzhEWd8k8Ysa3HN/TWHPYgVncotESfvWsMA4t E2XVqxhnZUE1tIiH8H4CNhMBN9oVIiRX5UThE2lYb/j5TJa0m9q0R24ZZugUYtdQ Q+3L+ndbs6cf5XVM49NVNZQpFGtWxzAe4R59kM6xdWLu+eZxc3k5IrMW1WdcMRIK 3lyBkBBWwSMsDpYq3zVlysBnCbMbHOKwIqDwJBQaBQc2cSG4/oB2EyCrDGQENglD KgufUrQrpx1agv1jMR+GgnkfQw0W65sfJ1dz+XSueu0OAsw0XFveXkEzragi08/8 xT0ZOdGQwoMy//rkQ7NaA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531390; x=1768617790; bh=u 7rZ6j9Txp/nW85uLyC9G5+YxXS6fGPWCPNR4E53FU8=; b=ftPdNk2liy0oXo81j bxAvgyCLDzupO5NtZQ9zHkJmDSLWYaGXf9rTYGNVj/KkM57suIa7hq2MRJALDOpf sMWCmLVFdA8US3lj71/N/1JQ3YDY4ZPU7ojDtVwphDE0eVrWdIXRD2XncKPd8d8D t4XA24bHwRbVpllqzW5bhzxxTrGvkZDuWb4tOd2bWeDptEF+ICd/lrAyN+BwpJGU EeFNymq3aMIgVxL2g1Dl29jfF9qPk3YY8GPOGlB+YRJOW7CDOBkL4LzlaBiPflnd 6ibg0aZeV8H3ox1w/FXiw6Cawnoa2TkUOKHJYo42XDz6I2hADglSpVOXaAAo8cde i2aqw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopegsrghlrghtohhnsegvihhkrdgsmhgvrdhhuhdprhgtphhtthhope hqvghmuhdquggvvhgvlhesnhhonhhgnhhurdhorhhgpdhrtghpthhtoheptghhrggusehj rggslhhonhhskhhirdighiii X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 01/12] ati-vga: Fix DST_PITCH and SRC_PITCH reads Date: Thu, 15 Jan 2026 21:42:47 -0500 Message-ID: <20260116024258.1487173-2-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.151; envelope-from=chad@jablonski.xyz; helo=fout-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531477586158500 Content-Type: text/plain; charset="utf-8" Reading DST_PITCH and SRC_PITCH on the Rage 128 is broken. The read handlers attempt to construct the value from pitch and tile bits in the register state but mistakenly AND them instead of ORing them. This means the pitch is always zero on read. Signed-off-by: Chad Jablonski Reviewed-by: BALATON Zoltan --- hw/display/ati.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/display/ati.c b/hw/display/ati.c index e9c3ad2cd1..6967cc0ad9 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -438,7 +438,7 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr, = unsigned int size) case DST_PITCH: val =3D s->regs.dst_pitch; if (s->dev_id =3D=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { - val &=3D s->regs.dst_tile << 16; + val |=3D s->regs.dst_tile << 16; } break; case DST_WIDTH: @@ -468,7 +468,7 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr, = unsigned int size) case SRC_PITCH: val =3D s->regs.src_pitch; if (s->dev_id =3D=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { - val &=3D s->regs.src_tile << 16; + val |=3D s->regs.src_tile << 16; } break; case DP_BRUSH_BKGD_CLR: --=20 2.51.2 From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531496; cv=none; d=zohomail.com; s=zohoarc; b=MfsovB6mIYEJcPfIRT8bTqkQQuqjqHMcK8u/+XH2M+rcES3SxmpfTk7wudtKW3b2rCqDpY7Jp7PVqzYAt8NUQjM/Ej4IIhz7MrT52DOvREZPWs3jGfzmcczLHgG+3rPIkrpdVlCRMkzy0KY/qLN3Q9mi4xsmsNKjIDpNE4LN+qQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531496; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=xXARdxSoThdAoSgU0MiSr+42Qqr3VDhiqVj+t/lO+Og=; b=CMZsXS1LfqRNFdPLGdFO02ucgDo9Z2BsCw0q6fyQxePpN+v0e48l6tUbwDLQwkrFL9MjcqLEUUeQNiXAA2BZW85D4YIuMO9duSwEb8Y/SqrTGvrZBO0pDGNzZfZ9QFIPdBo03bXKXEnANoB26nAhug3J67jlSIO/Tpbei4wYXE4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768531496875830.8417173371598; Thu, 15 Jan 2026 18:44:56 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoU-0005zI-1t; Thu, 15 Jan 2026 21:43:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZo0-0005qW-OG for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:22 -0500 Received: from fout-b8-smtp.messagingengine.com ([202.12.124.151]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnt-0002QM-VF for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:17 -0500 Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailfout.stl.internal (Postfix) with ESMTP id EA7BE1D0007A; Thu, 15 Jan 2026 21:43:10 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-05.internal (MEProxy); Thu, 15 Jan 2026 21:43:11 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:10 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 4f7071b3; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531390; x= 1768617790; bh=xXARdxSoThdAoSgU0MiSr+42Qqr3VDhiqVj+t/lO+Og=; b=I 3atU2UJ9lJIyyGXC9f2RzKvSTlJyIwMQXyPUgJct6qPHZWWyJBuhUyzUhGYEx5n2 HiZt2lnPL15iwhTUQLqqMbNuoVJ8frwdw29fy0DBRb9hNyvMyOKou5S4sAk+/35Z CjNnd/cLlp0LgnieFcPcmu9KCtltgWtBuhJAqWA1+J3khT2tHfmzwzzizujIlD6P 0e5XyLNssMDdS2C+pExcZ1mNTGR1Y4yno4djnJh5mLvvp4O2jk4nnKeuc++HPUV2 +0z4NLd5OQJ6dYhyROmm0mrI384X3YS8F97ThB5SqleArdXodtpSzYoF9yIbuoSU 3FrpMwRxjUzEeLf9WJDRQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531390; x=1768617790; bh=x XARdxSoThdAoSgU0MiSr+42Qqr3VDhiqVj+t/lO+Og=; b=pkG3eoagc6qpNbzEf FdizzNpy3n6NP5ZbKWAMWIi/5G2sL3slFQiVDsmY72qa4PYl3YfpVKSHBaofkNFQ uQ0u8irEA1n0vRc6EphzgMtRQLjVt2+Z/05OfD/QzPM63bpWHYKSoykp1OMlvkES srGbbDN524Jq1RBpLbDbQGLPg6sNh9v+GzU8uParr2z2FJSrc7Ev3BGuZpss5xjV y7e/g9Ha93zkq+UEisJLoXCkGgM3C5PsSOOWVO/KDZw28Mf6EJ/IpXUwgTH/KneU hMGum8jgSBXQ64ie/SjezDVTIn3hVUzSwhRw+O/Um67zsp/IKVs04QQLlqC3Gjny z21Wg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopegthhgrugesjhgrsghlohhnshhkihdrgiihiidprhgtphhtthhope hqvghmuhdquggvvhgvlhesnhhonhhgnhhurdhorhhgpdhrtghpthhtohepsggrlhgrthho nhesvghikhdrsghmvgdrhhhu X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 02/12] ati-vga: Read aliased values from DP_GUI_MASTER_CNTL Date: Thu, 15 Jan 2026 21:42:48 -0500 Message-ID: <20260116024258.1487173-3-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.151; envelope-from=chad@jablonski.xyz; helo=fout-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531497299158500 Content-Type: text/plain; charset="utf-8" DP_GUI_MASTER_CNTL aliases several fields from DP_DATATYPE and DP_MIX. These were being written correctly but not returned on a read of GP_GUI_MASTER_CNTL. Signed-off-by: Chad Jablonski --- hw/display/ati.c | 17 +++++++++++++++-- hw/display/ati_regs.h | 5 +++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/hw/display/ati.c b/hw/display/ati.c index 6967cc0ad9..b0c87f9f80 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -459,9 +459,22 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr,= unsigned int size) case DST_Y: val =3D s->regs.dst_y; break; - case DP_GUI_MASTER_CNTL: - val =3D s->regs.dp_gui_master_cntl; + case DP_GUI_MASTER_CNTL: { + /* DP_GUI_MASTER_CNTL aliases fields from DP_MIX and DP_DATATYPE */ + uint32_t dst_datatype =3D s->regs.dp_datatype & DP_DST_DATATYPE; + uint32_t brush_datatype =3D (s->regs.dp_datatype & + DP_BRUSH_DATATYPE) >> 8; + uint32_t src_datatype =3D (s->regs.dp_datatype & DP_SRC_DATATYPE) = >> 16; + uint32_t src_source =3D (s->regs.dp_mix & DP_SRC_SOURCE) >> 8; + uint32_t rop3 =3D (s->regs.dp_mix & DP_ROP3) >> 16; + val =3D s->regs.dp_gui_master_cntl | + (brush_datatype << 4) | + (dst_datatype << 8) | + (src_datatype << 12) | + (rop3 << 16) | + (src_source << 24); break; + } case SRC_OFFSET: val =3D s->regs.src_offset; break; diff --git a/hw/display/ati_regs.h b/hw/display/ati_regs.h index d7127748ff..0a0825db04 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -386,6 +386,9 @@ #define DST_16BPP 0x00000004 #define DST_24BPP 0x00000005 #define DST_32BPP 0x00000006 +#define DP_DST_DATATYPE 0x0000000f +#define DP_BRUSH_DATATYPE 0x00000f00 +#define DP_SRC_DATATYPE 0x00030000 =20 #define BRUSH_SOLIDCOLOR 0x00000d00 =20 @@ -437,6 +440,8 @@ #define DP_SRC_RECT 0x00000200 #define DP_SRC_HOST 0x00000300 #define DP_SRC_HOST_BYTEALIGN 0x00000400 +#define DP_SRC_SOURCE 0x00000700 +#define DP_ROP3 0x00ff0000 =20 /* LVDS_GEN_CNTL constants */ #define LVDS_BL_MOD_LEVEL_MASK 0x0000ff00 --=20 2.51.2 From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531494; cv=none; d=zohomail.com; s=zohoarc; b=OeH2PPXVXbDd7Agw3u/EH8KOpxoZDOOCZ2c3mxU0mf3TDTuVKghdXr0Q1ddecT0QA8B9kbLyDylfLBuzcUtDfk+AnpL9tXHJ+oh6qDpvSoQTtfaaA581m3c+epNvOV0ASRTfdZU9eIpNrZfiDGq31XtXg/anNQMo2r6Xskjz20c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531494; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=x+hJwFq/v++I+0iKZQ1ocG4h1Obu0oQ6673P/8kKcsI=; b=cp4BEieLYCKztQHhq38WbWEr/Cs4HPQI4lNt++74e1FjoJDUBVvOSaMEh3aN4pLFNjdm12YaJLXi6ELQg5CK82P+rqr0zRZ+6SZ5PWvzZ7at0LT2sWpsV1p+4jpd+oGAsLxBOo7wALNxHDnlLw1FDFu5mQhq5BP1RMO51qBV+GY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17685314948366.93529160170101; Thu, 15 Jan 2026 18:44:54 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoM-0005we-Od; Thu, 15 Jan 2026 21:43:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnx-0005qB-3c for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:22 -0500 Received: from fhigh-b8-smtp.messagingengine.com ([202.12.124.159]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnu-0002QZ-0e for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:16 -0500 Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailfhigh.stl.internal (Postfix) with ESMTP id 7E2957A00B6; Thu, 15 Jan 2026 21:43:11 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-05.internal (MEProxy); Thu, 15 Jan 2026 21:43:11 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:11 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id b7009cdb; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531391; x= 1768617791; bh=x+hJwFq/v++I+0iKZQ1ocG4h1Obu0oQ6673P/8kKcsI=; b=K qGYizXq6kvRGXIqZYsssI/TeCeXKjvTixuuYc/seE4KYzwInmFEDRrjsW+4ROib2 zKJqmuO6roqoDPSXXLHzYHCnIyHBzw4r+0b2CjrzOubLGYMWOkrhdQBAUPWWQiDK Q1eBk7Ei606kzD5Tec+df0hM6AWRF95+0sxKUUj5OFOph0X5HUDOHYfK1HjOADTe wkPffUQ3Dz5CzzJ0ej7bVOtCovcqzMAp8FyiA7kvWdD8DE2P7qBOMM/pPsECI8DW oQDRpouw32qaTFzkUbfrJndqueRZ7tIgzFEVsSdSITcOsLHz4Xso9uh3QMBnernQ fw5ZhvBOufHp+MhHGkhyg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531391; x=1768617791; bh=x +hJwFq/v++I+0iKZQ1ocG4h1Obu0oQ6673P/8kKcsI=; b=f5XtQcrHoPeBT73Fi sl82s2hqYQT9VLNSKLTdu5g/VuB2PFu3GpDfqPfNCapbcqFWSaRI2FVQj7CVtxcY mukaTAGpI9lhquANh1gTuiviRs6s/cvdGSl6Dkk6sYflqJlThpM2k1hJhNWJHruh 9Yy5x/Ty9oTaEJ23shsL2k63XN+HIEPEFul6mRYzq8vtXL/cNfpybzUJHmv7NJmP C+T+Lft4vZvRtCaCV/DHQj8vkU++NInXWrJntuxvuN08JgEW5Hecih2662Cj3kAz 0KhmbVqO0JMSSTxim598Y19WbmfD179yNnOPxAj3eJNdOsW/qKQgRrBNej5Phgdc eNtRw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopegthhgrugesjhgrsghlohhnshhkihdrgiihiidprhgtphhtthhope hqvghmuhdquggvvhgvlhesnhhonhhgnhhurdhorhhgpdhrtghpthhtohepsggrlhgrthho nhesvghikhdrsghmvgdrhhhu X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 03/12] ati-vga: Latch src and dst pitch and offset on master_cntl default Date: Thu, 15 Jan 2026 21:42:49 -0500 Message-ID: <20260116024258.1487173-4-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.159; envelope-from=chad@jablonski.xyz; helo=fhigh-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531495243158500 Content-Type: text/plain; charset="utf-8" Hardware testing on the Rage 128 confirms that (SRC/DST)_OFFSET, and (SRC/DST)_PITCH are latched when (SRC/DST)_PITCH_OFFSET_CNTL bits in DP_GUI_MASTER_CNTL are set to "default". The earlier approach looked at the state of the (SRC/DST)_PITCH_OFFSET_CNTL bits when offset and pitch registers were used. This meant that when (SRC/DST)_PITCH_OFFSET_CNTL was reset to "leave alone" the old values stored in the registers would return. This is not how the real hardware works. Signed-off-by: Chad Jablonski Reviewed-by: BALATON Zoltan --- hw/display/ati.c | 9 +++++++++ hw/display/ati_2d.c | 13 ++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/hw/display/ati.c b/hw/display/ati.c index b0c87f9f80..bd48b0db49 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -875,6 +875,15 @@ static void ati_mm_write(void *opaque, hwaddr addr, s->regs.dp_datatype =3D (data & 0x0f00) >> 8 | (data & 0x30f0) << = 4 | (data & 0x4000) << 16; s->regs.dp_mix =3D (data & GMC_ROP3_MASK) | (data & 0x7000000) >> = 16; + + if (!(data & GMC_SRC_PITCH_OFFSET_CNTL)) { + s->regs.src_offset =3D s->regs.default_offset; + s->regs.src_pitch =3D s->regs.default_pitch; + } + if (!(data & GMC_DST_PITCH_OFFSET_CNTL)) { + s->regs.dst_offset =3D s->regs.default_offset; + s->regs.dst_pitch =3D s->regs.default_pitch; + } break; case DST_WIDTH_X: s->regs.dst_x =3D data & 0x3fff; diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c index 309bb5ccb6..a8c4c534b9 100644 --- a/hw/display/ati_2d.c +++ b/hw/display/ati_2d.c @@ -43,8 +43,6 @@ static int ati_bpp_from_datatype(ATIVGAState *s) } } =20 -#define DEFAULT_CNTL (s->regs.dp_gui_master_cntl & GMC_DST_PITCH_OFFSET_CN= TL) - void ati_2d_blt(ATIVGAState *s) { /* FIXME it is probably more complex than this and may need to be */ @@ -63,13 +61,12 @@ void ati_2d_blt(ATIVGAState *s) qemu_log_mask(LOG_GUEST_ERROR, "Invalid bpp\n"); return; } - int dst_stride =3D DEFAULT_CNTL ? s->regs.dst_pitch : s->regs.default_= pitch; + int dst_stride =3D s->regs.dst_pitch; if (!dst_stride) { qemu_log_mask(LOG_GUEST_ERROR, "Zero dest pitch\n"); return; } - uint8_t *dst_bits =3D s->vga.vram_ptr + (DEFAULT_CNTL ? - s->regs.dst_offset : s->regs.default_offset); + uint8_t *dst_bits =3D s->vga.vram_ptr + s->regs.dst_offset; =20 if (s->dev_id =3D=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { dst_bits +=3D s->regs.crtc_offset & 0x07ffffff; @@ -97,14 +94,12 @@ void ati_2d_blt(ATIVGAState *s) s->regs.src_x : s->regs.src_x + 1 - s->regs.dst_wid= th); unsigned src_y =3D (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ? s->regs.src_y : s->regs.src_y + 1 - s->regs.dst_hei= ght); - int src_stride =3D DEFAULT_CNTL ? - s->regs.src_pitch : s->regs.default_pitch; + int src_stride =3D s->regs.src_pitch; if (!src_stride) { qemu_log_mask(LOG_GUEST_ERROR, "Zero source pitch\n"); return; } - uint8_t *src_bits =3D s->vga.vram_ptr + (DEFAULT_CNTL ? - s->regs.src_offset : s->regs.default_offset); + uint8_t *src_bits =3D s->vga.vram_ptr + s->regs.src_offset; =20 if (s->dev_id =3D=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { src_bits +=3D s->regs.crtc_offset & 0x07ffffff; --=20 2.51.2 From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531453; cv=none; d=zohomail.com; s=zohoarc; b=ecS2nTU1DkjTqgjWnuzEQCJo2e6SzVifq+vb3xtXXad8LEWg0t4Q1c6hijQIevGP1eoDbgQkG8pxhprfh7ascgP8eI4JwvdcKn1ZcKjW1zI7yvDt91pgX3SW5ulVzE5b9eTIOWebMAR9WmlwG56IKlwsBOYd4Fyeonniq7CYWkM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531453; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=MPTvvi/Y+YfuFgg85NWsFyUoSSdQMTrv3ot/dXj9/yw=; b=cmoIIVBqMM13UrzbEY6d88863PasGQCyQg3LvIb4+2FOuLUXFKmq9l96fulsOU2BTYA3xxB8TI076kB1F6ezDw4xFrpqDVmQkKf/lhZ/glb75Kh8N1UKqu7FOB4yyRfxOed9rfXicguhhD6WHmzqRQdmBe4SUO6dvARVwWxDHzQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768531453110161.94878761941538; Thu, 15 Jan 2026 18:44:13 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoG-0005r6-9c; Thu, 15 Jan 2026 21:43:39 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnv-0005q1-MC for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:15 -0500 Received: from fout-b8-smtp.messagingengine.com ([202.12.124.151]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnu-0002Qd-18 for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:15 -0500 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfout.stl.internal (Postfix) with ESMTP id A6AB71D00084; Thu, 15 Jan 2026 21:43:11 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-03.internal (MEProxy); Thu, 15 Jan 2026 21:43:11 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:11 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id a0904409; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531391; x= 1768617791; bh=MPTvvi/Y+YfuFgg85NWsFyUoSSdQMTrv3ot/dXj9/yw=; b=H gQPX/ch+xrJG4CundJGYjwCevVkcck9hhQI0fkTC7Z9nPuAbKACm4j2KnIX1wIST YnTIyAip8jf3OVuFu08p7aCLKj4lDsEqVdgxZICeWdRM+KBP8J0WXY4/fW/7UZ4P hD3Ff9nND8EIzwSbRE5+ObCnLh/VW2TfdyKc0dihBGsDrLRCc4pRAZZQLEpjjE32 ZtAhlK9fEuu66CZc7aheM4w3aeOkS0khBFZcuQ0Qq2jcP29uRzGCCuoqcewSC3Cz cVaK5VT2hVs8Its0vCQKrdb7AGbC2XAaNzP4dfDhI9CNAQE+6M9r/AdKySXdheS+ OQQvvhqS6awhDBnA0HZmQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531391; x=1768617791; bh=M PTvvi/Y+YfuFgg85NWsFyUoSSdQMTrv3ot/dXj9/yw=; b=UsrC1pKZGiC+2b5TS 8MBl13nAjryt4LLwyiOBiEg5JurqjSnH0h0ZKe3ozw2wofmbOfGrm2GNeYAswL7s bQK0Cicv2DhYEYSlSyymzRMBBWoZj0W/WZwtfGpmZVdeg5eL7kpxl8bHm2vJLBZT QqP1DjvcOayGB81KJ2aYuUV0TWCF62FlYhvkc3XmYGlsD+OlK67VYvkM8etG+rXZ 21DAB4CGcAA2+OOe4gyVx15QoUeZyByKUxGVzishzspcXybvcdQxhJgzmHAQoiuQ +6J9o36BwT5QqbOQfJymNAORHLzMIAGVyi9pioLrXqehOzEdkHCB/NrQcYKy3iNv 9EftA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopegsrghlrghtohhnsegvihhkrdgsmhgvrdhhuhdprhgtphhtthhope gthhgrugesjhgrsghlohhnshhkihdrgiihiidprhgtphhtthhopehqvghmuhdquggvvhgv lhesnhhonhhgnhhurdhorhhg X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 04/12] ati-vga: Implement foreground and background color register writes Date: Thu, 15 Jan 2026 21:42:50 -0500 Message-ID: <20260116024258.1487173-5-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.151; envelope-from=chad@jablonski.xyz; helo=fout-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531455697158500 Content-Type: text/plain; charset="utf-8" These are straightforward 32-bit register write handlers. They're necessary for a future patch which will use them for color expansion from monochrome host data transfers. Signed-off-by: Chad Jablonski Reviewed-by: BALATON Zoltan --- hw/display/ati.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/display/ati.c b/hw/display/ati.c index bd48b0db49..968ee4efca 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -931,6 +931,12 @@ static void ati_mm_write(void *opaque, hwaddr addr, case DP_CNTL: s->regs.dp_cntl =3D data; break; + case DP_SRC_FRGD_CLR: + s->regs.dp_src_frgd_clr =3D data; + break; + case DP_SRC_BKGD_CLR: + s->regs.dp_src_bkgd_clr =3D data; + break; case DP_DATATYPE: s->regs.dp_datatype =3D data & 0xe0070f0f; break; --=20 2.51.2 From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531488; cv=none; d=zohomail.com; s=zohoarc; b=O47O2HCc6GZONaGmeMCdijTMnHY4YXYw/UTGmhqq/1OGvEWnaxdChLC1SCMoLl18kbH5w3joRa55/P6VZcA+rrLShludfKJ7xhdTEkXjcXEkvIl4yVQRqBxreMnOd8xkfZx0xuIYVOnj0mEizIfudbppsfM5UvLb08CbjC0SdhU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531488; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=0Tl03cgecGKjXYtcXZ4+OVa+Y5ZQQ6GNH8CYh7APoiA=; b=X4I1vZOmHDdLqZMWpI7lHo6jVm0UCEAs0fiFDslpFexunWzR1b8kixzdCgO61Nc87bGTDED3iizYrvay8UhA3hmRhFLsHHtqW0zaUqvpiUeg5sn4yNQqFtvVKicQrj0zhGldXtasRW+K3lbmcydFRerHwgYBWvEYWzMHSynMH9s= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768531488556798.6308841126437; Thu, 15 Jan 2026 18:44:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoP-0005x8-V7; Thu, 15 Jan 2026 21:43:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnw-0005q9-L7 for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:22 -0500 Received: from fhigh-b8-smtp.messagingengine.com ([202.12.124.159]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnt-0002Qo-VS for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:16 -0500 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfhigh.stl.internal (Postfix) with ESMTP id 32A087A00E7; Thu, 15 Jan 2026 21:43:12 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-03.internal (MEProxy); Thu, 15 Jan 2026 21:43:12 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:11 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 7594ef31; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531392; x= 1768617792; bh=0Tl03cgecGKjXYtcXZ4+OVa+Y5ZQQ6GNH8CYh7APoiA=; b=B 4vqjNOzHWRGRFl8eZiLE7qvHfTPsPl2tBJveM/wwSXCb2RLDqduzn1lIl8MmUX8n 8Uss4bFpDZS8+snm3jY+mSxwlIiTcY0qDAzL6NR4+yvlDcgMrEyoj2TsRBFlSTDb xetUHsdUvzYieM/8bMiHz2NFLIKZWWPqLjkZVl6pTTSjZ+P007BYOwk7eRUKkI/a O5LMtDtmlocSe6ZubUq/WM1RaeDqnJl1sqMvzLdoKzy3kF2sgOWkDBHbCH4Wq0Sb 9bTduSqMONLsqm2Y9eK5/7YnVqdod2OKmHSUnxFNKydF3QOsKJN1agWLR9Dm4fuo ieMW4gfDDPLd+RPDDnm1w== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531392; x=1768617792; bh=0 Tl03cgecGKjXYtcXZ4+OVa+Y5ZQQ6GNH8CYh7APoiA=; b=FmMQD/Qy5vj4vLmfe 9DaH0RbduawmjyxBfa3p5dKkiIcHWo9b3Vq2FBk2+fQkCkFWsDnnlItoA+v8xcn0 g1ZUn+TDi1ZSjX6WfLBk/dyj1FKhRm4gscCnFgMsXiQyJ7kOOl5XRMB5jKWaVwwa z6jZcBqsC4oYtZldLV4ZYmKCBEfKkYchUZ0sSos1AwuHKyh/ywx5BvfTlTiJYGO6 4G+8Zc+zUu2Y7Q7GtGxo2BVIvqcjaHeW0C5r7yykt+aDZBkQvJA0Ql6FJviVK5Hs gvC9mL62bmuYEKoZMBsbo0taFU6jOaGozAEo3AjXK4Ls71KLaatiEnMvXQaLkVgc zmpVQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopegsrghlrghtohhnsegvihhkrdgsmhgvrdhhuhdprhgtphhtthhope gthhgrugesjhgrsghlohhnshhkihdrgiihiidprhgtphhtthhopehqvghmuhdquggvvhgv lhesnhhonhhgnhhurdhorhhg X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 05/12] ati-vga: Add scissor clipping register support Date: Thu, 15 Jan 2026 21:42:51 -0500 Message-ID: <20260116024258.1487173-6-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.159; envelope-from=chad@jablonski.xyz; helo=fhigh-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531489403158500 Content-Type: text/plain; charset="utf-8" Implement read and write operations on SC_TOP_LEFT, SC_BOTTOM_RIGHT, and SRC_SC_BOTTOM_RIGHT registers. These registers are also updated when the src and/or dst clipping fields on DP_GUI_MASTER_CNTL are set to default clipping. Scissor clipping is used when rendering text in X.org. The r128 driver sends host data much wider than is necessary to draw a glyph and cuts it down to size using clipping before rendering. The actual clipping implementation follows in a future patch. This also includes a very minor refactor of the combined default_sc_bottom_right field in the registers struct to default_sc_bottom and default_sc_right. This was done to stay consistent with the other scissor registers and prevent repeated masking and extraction. Signed-off-by: Chad Jablonski Reviewed-by: BALATON Zoltan --- v5: Removed unused default_sc_bottom_right field --- hw/display/ati.c | 70 +++++++++++++++++++++++++++++++++++++++++-- hw/display/ati_int.h | 9 +++++- hw/display/ati_regs.h | 2 ++ 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/hw/display/ati.c b/hw/display/ati.c index 968ee4efca..21339d7e26 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -521,7 +521,32 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr,= unsigned int size) val |=3D s->regs.default_tile << 16; break; case DEFAULT_SC_BOTTOM_RIGHT: - val =3D s->regs.default_sc_bottom_right; + val =3D (s->regs.default_sc_bottom << 16) | + s->regs.default_sc_right; + break; + case SC_TOP: + val =3D s->regs.sc_top; + break; + case SC_LEFT: + val =3D s->regs.sc_left; + break; + case SC_BOTTOM: + val =3D s->regs.sc_bottom; + break; + case SC_RIGHT: + val =3D s->regs.sc_right; + break; + case SRC_SC_BOTTOM: + val =3D s->regs.src_sc_bottom; + break; + case SRC_SC_RIGHT: + val =3D s->regs.src_sc_right; + break; + case SC_TOP_LEFT: + case SC_BOTTOM_RIGHT: + case SRC_SC_BOTTOM_RIGHT: + qemu_log_mask(LOG_GUEST_ERROR, + "Read from write-only register 0x%x\n", (unsigned)ad= dr); break; default: break; @@ -884,6 +909,16 @@ static void ati_mm_write(void *opaque, hwaddr addr, s->regs.dst_offset =3D s->regs.default_offset; s->regs.dst_pitch =3D s->regs.default_pitch; } + if (!(data & GMC_SRC_CLIPPING)) { + s->regs.src_sc_right =3D s->regs.default_sc_right; + s->regs.src_sc_bottom =3D s->regs.default_sc_bottom; + } + if (!(data & GMC_DST_CLIPPING)) { + s->regs.sc_top =3D 0; + s->regs.sc_left =3D 0; + s->regs.sc_right =3D s->regs.default_sc_right; + s->regs.sc_bottom =3D s->regs.default_sc_bottom; + } break; case DST_WIDTH_X: s->regs.dst_x =3D data & 0x3fff; @@ -963,7 +998,38 @@ static void ati_mm_write(void *opaque, hwaddr addr, } break; case DEFAULT_SC_BOTTOM_RIGHT: - s->regs.default_sc_bottom_right =3D data & 0x3fff3fff; + s->regs.default_sc_right =3D data & 0x3fff; + s->regs.default_sc_bottom =3D (data >> 16) & 0x3fff; + break; + case SC_TOP_LEFT: + s->regs.sc_left =3D data & 0x3fff; + s->regs.sc_top =3D (data >> 16) & 0x3fff; + break; + case SC_LEFT: + s->regs.sc_left =3D data & 0x3fff; + break; + case SC_TOP: + s->regs.sc_top =3D data & 0x3fff; + break; + case SC_BOTTOM_RIGHT: + s->regs.sc_right =3D data & 0x3fff; + s->regs.sc_bottom =3D (data >> 16) & 0x3fff; + break; + case SC_RIGHT: + s->regs.sc_right =3D data & 0x3fff; + break; + case SC_BOTTOM: + s->regs.sc_bottom =3D data & 0x3fff; + break; + case SRC_SC_BOTTOM_RIGHT: + s->regs.src_sc_right =3D data & 0x3fff; + s->regs.src_sc_bottom =3D (data >> 16) & 0x3fff; + break; + case SRC_SC_RIGHT: + s->regs.src_sc_right =3D data & 0x3fff; + break; + case SRC_SC_BOTTOM: + s->regs.src_sc_bottom =3D data & 0x3fff; break; default: break; diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h index f5a47b82b0..7cf0933fa1 100644 --- a/hw/display/ati_int.h +++ b/hw/display/ati_int.h @@ -81,7 +81,14 @@ typedef struct ATIVGARegs { uint32_t default_offset; uint32_t default_pitch; uint32_t default_tile; - uint32_t default_sc_bottom_right; + uint16_t default_sc_bottom; + uint16_t default_sc_right; + uint16_t sc_top; + uint16_t sc_left; + uint16_t sc_bottom; + uint16_t sc_right; + uint16_t src_sc_bottom; + uint16_t src_sc_right; } ATIVGARegs; =20 struct ATIVGAState { diff --git a/hw/display/ati_regs.h b/hw/display/ati_regs.h index 0a0825db04..3999edb9b7 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -397,6 +397,8 @@ #define GMC_DST_PITCH_OFFSET_CNTL 0x00000002 #define GMC_SRC_CLIP_DEFAULT 0x00000000 #define GMC_DST_CLIP_DEFAULT 0x00000000 +#define GMC_SRC_CLIPPING 0x00000004 +#define GMC_DST_CLIPPING 0x00000008 #define GMC_BRUSH_SOLIDCOLOR 0x000000d0 #define GMC_SRC_DSTCOLOR 0x00003000 #define GMC_BYTE_ORDER_MSB_TO_LSB 0x00000000 --=20 2.51.2 From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531467; cv=none; d=zohomail.com; s=zohoarc; b=guunfMFaCcTxiR+79ak3zKUvxs0KYvhUw+dBamGWHW0OAq2sLnHQJVhbF/iTL7NwsO9eXC/6fxJAYkB4E6qsIEZPscT3bx289JXohxzYRTJx/cnULZtlgP5AGVe3FGOKFyJLOHjFSvAUXVnZ6hmSOCEf5nqQwgVMkx3QEBdprpk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531467; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=xcGTQxYooEV7acDTJpYUIDY2KtNsL1X3AN5+oPbdfcs=; b=nxYYVg+Vw21wgFc6hO3Px4k4NU6diIwjXNJYz3IP+U1kKTGhN/nlF7sTOUMwFMqeVbEc4G9BUoathcogVpasZNLPAaKf+aQn4NLDl7jarWdi2cJg2pF4JtiKCkta43czxPMh4zFOpmqBMOcj2GQ+T5rBjSdKXJTS5Wngkg7EJ60= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768531467043287.6078815933372; Thu, 15 Jan 2026 18:44:27 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoR-0005xr-M4; Thu, 15 Jan 2026 21:43:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnx-0005qN-Mx for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:22 -0500 Received: from fout-b8-smtp.messagingengine.com ([202.12.124.151]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnu-0002Qt-0m for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:17 -0500 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfout.stl.internal (Postfix) with ESMTP id 5F1071D0007F; Thu, 15 Jan 2026 21:43:12 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-03.internal (MEProxy); Thu, 15 Jan 2026 21:43:12 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:11 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 8f6fe13e; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531392; x= 1768617792; bh=xcGTQxYooEV7acDTJpYUIDY2KtNsL1X3AN5+oPbdfcs=; b=M iH8BikwgL+4h8ISvdwiS60gCxujnruCm8mYrGm/bT19cdcfe0peFWZrvf0DwCJyx uUNJiOROg4lIzp6NPALL77IDW2XYoT4JuZA+DV7oZb29cb8ibqn245nz5iaPMo2d iVSHxDXu2wavSVu19JTtMW1qklDnyuy6C2t2pQ8IudbdwuGIdIFfbCGwa0eZS3h0 Bmu+MDq+owxDVIvOxKzme0Y9M8KcIe1NxUielgJdjxgfqVhEhIoLzlW/YIEMmpOi tjEH0LBR6a+N0C3S33V7WTvdq9pZtYBJ7RZiiGkI6BYM2e3uL1IIu0zDGgKSj3Ob S3+MwRGmkgfAwAAt/L0eA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531392; x=1768617792; bh=x cGTQxYooEV7acDTJpYUIDY2KtNsL1X3AN5+oPbdfcs=; b=iMdt5huNZ5rZ0s8Cc VPEKjPTASzoLyaZQgySoBxrjIcC3Ex8NQgGM0R2v3XQoNWz7EZqtzjTvdUt4R/wK EjL+G7SSvIRPbdtihSkCLxwtHw192wMEpBmon3FYTDOpfXhMokuv8f7HSIIoDPEF WrSe0Pbclgqsz6Uilg/ftrRCnoY0oh74CY0ZexC/d5+Z0hOgGl//6VUq5wPDvEN3 bmBjdlI6fXPv3uKOkAh8deuESpKhfEMfYVGvxPeze1ByGybeAuGPBrzcaaPO4VeS uvzfFxVh/E9sJqQURlHKBGKeocMnIrVbq1DyrYrFY1vQ/NYTu2aCp14qyWx9fgSZ nDzIg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopehqvghmuhdquggvvhgvlhesnhhonhhgnhhurdhorhhgpdhrtghpth htoheptghhrggusehjrggslhhonhhskhhirdighiiipdhrtghpthhtohepsggrlhgrthho nhesvghikhdrsghmvgdrhhhu X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 06/12] ati-vga: Create setup_2d_blt_dst helper Date: Thu, 15 Jan 2026 21:42:52 -0500 Message-ID: <20260116024258.1487173-7-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.151; envelope-from=chad@jablonski.xyz; helo=fout-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531469205158500 Content-Type: text/plain; charset="utf-8" A large amount of the common setup involved in a blit deals with the destination. This moves that setup to a helper function which initializes a struct (ATIBltDst) holding all of the dst state. This setup will be shared between blits from memory as well as from HOST_DATA. Otherwise this is a pure refactor of the ati_2d_blt function to make use of the setup_2d_blt_dst helper and the struct it initializes. There should be no change in behavior in this patch. Signed-off-by: Chad Jablonski --- hw/display/ati_2d.c | 195 +++++++++++++++++++++++++------------------- 1 file changed, 112 insertions(+), 83 deletions(-) diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c index a8c4c534b9..75bd38e9b0 100644 --- a/hw/display/ati_2d.c +++ b/hw/display/ati_2d.c @@ -13,6 +13,7 @@ #include "qemu/log.h" #include "ui/pixel_ops.h" #include "ui/console.h" +#include "ui/rect.h" =20 /* * NOTE: @@ -24,7 +25,16 @@ * possible. */ =20 -static int ati_bpp_from_datatype(ATIVGAState *s) +typedef struct { + QemuRect rect; + int bpp; + int stride; + bool top_to_bottom; + bool left_to_right; + uint8_t *bits; +} ATIBltDst; + +static int ati_bpp_from_datatype(const ATIVGAState *s) { switch (s->regs.dp_datatype & 0xf) { case 2: @@ -43,57 +53,76 @@ static int ati_bpp_from_datatype(ATIVGAState *s) } } =20 +static void setup_2d_blt_dst(const ATIVGAState *s, ATIBltDst *dst) +{ + unsigned dst_x, dst_y; + dst->bpp =3D ati_bpp_from_datatype(s); + dst->stride =3D s->regs.dst_pitch; + dst->left_to_right =3D s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT; + dst->top_to_bottom =3D s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM; + dst->bits =3D s->vga.vram_ptr + s->regs.dst_offset; + dst_x =3D (dst->left_to_right ? + s->regs.dst_x : s->regs.dst_x + 1 - s->regs.dst_width); + dst_y =3D (dst->top_to_bottom ? + s->regs.dst_y : s->regs.dst_y + 1 - s->regs.dst_height); + qemu_rect_init(&dst->rect, dst_x, dst_y, + s->regs.dst_width, s->regs.dst_height); + if (s->dev_id =3D=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { + dst->bits +=3D s->regs.crtc_offset & 0x07ffffff; + dst->stride *=3D dst->bpp; + } +} + void ati_2d_blt(ATIVGAState *s) { /* FIXME it is probably more complex than this and may need to be */ /* rewritten but for now as a start just to get some output: */ DisplaySurface *ds =3D qemu_console_surface(s->vga.con); + uint8_t *end =3D s->vga.vram_ptr + s->vga.vram_size; + int dst_stride_words; + ATIBltDst _dst; /* TEMP: avoid churn in future patches */ + ATIBltDst *dst =3D &_dst; + DPRINTF("%p %u ds: %p %d %d rop: %x\n", s->vga.vram_ptr, s->vga.vbe_start_addr, surface_data(ds), surface_stride(ds), surface_bits_per_pixel(ds), (s->regs.dp_mix & GMC_ROP3_MASK) >> 16); - unsigned dst_x =3D (s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT ? - s->regs.dst_x : s->regs.dst_x + 1 - s->regs.dst_widt= h); - unsigned dst_y =3D (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ? - s->regs.dst_y : s->regs.dst_y + 1 - s->regs.dst_heig= ht); - int bpp =3D ati_bpp_from_datatype(s); - if (!bpp) { + + setup_2d_blt_dst(s, dst); + + if (!dst->bpp) { qemu_log_mask(LOG_GUEST_ERROR, "Invalid bpp\n"); return; } - int dst_stride =3D s->regs.dst_pitch; - if (!dst_stride) { + if (!dst->stride) { qemu_log_mask(LOG_GUEST_ERROR, "Zero dest pitch\n"); return; } - uint8_t *dst_bits =3D s->vga.vram_ptr + s->regs.dst_offset; - - if (s->dev_id =3D=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { - dst_bits +=3D s->regs.crtc_offset & 0x07ffffff; - dst_stride *=3D bpp; - } - uint8_t *end =3D s->vga.vram_ptr + s->vga.vram_size; - if (dst_x > 0x3fff || dst_y > 0x3fff || dst_bits >=3D end - || dst_bits + dst_x - + (dst_y + s->regs.dst_height) * dst_stride >=3D end) { + if (dst->rect.x > 0x3fff || dst->rect.y > 0x3fff || dst->bits >=3D end + || dst->bits + dst->rect.x + + (dst->rect.y + dst->rect.height) * dst->stride >=3D end) { qemu_log_mask(LOG_UNIMP, "blt outside vram not implemented\n"); return; } + + dst_stride_words =3D dst->stride / sizeof(uint32_t); + DPRINTF("%d %d %d, %d %d %d, (%d,%d) -> (%d,%d) %dx%d %c %c\n", s->regs.src_offset, s->regs.dst_offset, s->regs.default_offset, - s->regs.src_pitch, s->regs.dst_pitch, s->regs.default_pitch, - s->regs.src_x, s->regs.src_y, dst_x, dst_y, - s->regs.dst_width, s->regs.dst_height, - (s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT ? '>' : '<'), - (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ? 'v' : '^')); + s->regs.src_pitch, dst->stride, s->regs.default_pitch, + s->regs.src_x, s->regs.src_y, dst->rect.x, dst->rect.y, + dst->rect.width, dst->rect.height, + (dst->left_to_right ? '>' : '<'), + (dst->top_to_bottom ? 'v' : '^')); + switch (s->regs.dp_mix & GMC_ROP3_MASK) { case ROP3_SRCCOPY: { bool fallback =3D false; - unsigned src_x =3D (s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT ? - s->regs.src_x : s->regs.src_x + 1 - s->regs.dst_wid= th); - unsigned src_y =3D (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ? - s->regs.src_y : s->regs.src_y + 1 - s->regs.dst_hei= ght); + unsigned src_x =3D (dst->left_to_right ? + s->regs.src_x : s->regs.src_x + 1 - dst->rect.width= ); + unsigned src_y =3D (dst->top_to_bottom ? + s->regs.src_y : s->regs.src_y + 1 - dst->rect.heigh= t); int src_stride =3D s->regs.src_pitch; if (!src_stride) { qemu_log_mask(LOG_GUEST_ERROR, "Zero source pitch\n"); @@ -103,44 +132,47 @@ void ati_2d_blt(ATIVGAState *s) =20 if (s->dev_id =3D=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { src_bits +=3D s->regs.crtc_offset & 0x07ffffff; - src_stride *=3D bpp; + src_stride *=3D dst->bpp; } if (src_x > 0x3fff || src_y > 0x3fff || src_bits >=3D end || src_bits + src_x - + (src_y + s->regs.dst_height) * src_stride >=3D end) { + + (src_y + dst->rect.height) * src_stride >=3D end) { qemu_log_mask(LOG_UNIMP, "blt outside vram not implemented\n"); return; } =20 src_stride /=3D sizeof(uint32_t); - dst_stride /=3D sizeof(uint32_t); DPRINTF("pixman_blt(%p, %p, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d= )\n", - src_bits, dst_bits, src_stride, dst_stride, bpp, bpp, - src_x, src_y, dst_x, dst_y, - s->regs.dst_width, s->regs.dst_height); + src_bits, dst->bits, + src_stride, dst_stride_words, + dst->bpp, dst->bpp, + src_x, src_y, dst->rect.x, dst->rect.y, + dst->rect.width, dst->rect.height); #ifdef CONFIG_PIXMAN if ((s->use_pixman & BIT(1)) && - s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT && - s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM) { - fallback =3D !pixman_blt((uint32_t *)src_bits, (uint32_t *)dst= _bits, - src_stride, dst_stride, bpp, bpp, - src_x, src_y, dst_x, dst_y, - s->regs.dst_width, s->regs.dst_height); + dst->left_to_right && dst->top_to_bottom) { + fallback =3D !pixman_blt((uint32_t *)src_bits, (uint32_t *)dst= ->bits, + src_stride, dst_stride_words, + dst->bpp, dst->bpp, + src_x, src_y, dst->rect.x, dst->rect.y, + dst->rect.width, dst->rect.height); } else if (s->use_pixman & BIT(1)) { /* FIXME: We only really need a temporary if src and dst overl= ap */ - int llb =3D s->regs.dst_width * (bpp / 8); + int llb =3D dst->rect.width * (dst->bpp / 8); int tmp_stride =3D DIV_ROUND_UP(llb, sizeof(uint32_t)); uint32_t *tmp =3D g_malloc(tmp_stride * sizeof(uint32_t) * - s->regs.dst_height); + dst->rect.height); fallback =3D !pixman_blt((uint32_t *)src_bits, tmp, - src_stride, tmp_stride, bpp, bpp, + src_stride, tmp_stride, + dst->bpp, dst->bpp, src_x, src_y, 0, 0, - s->regs.dst_width, s->regs.dst_height); + dst->rect.width, dst->rect.height); if (!fallback) { - fallback =3D !pixman_blt(tmp, (uint32_t *)dst_bits, - tmp_stride, dst_stride, bpp, bpp, - 0, 0, dst_x, dst_y, - s->regs.dst_width, s->regs.dst_heig= ht); + fallback =3D !pixman_blt(tmp, (uint32_t *)dst->bits, + tmp_stride, dst_stride_words, + dst->bpp, dst->bpp, + 0, 0, dst->rect.x, dst->rect.y, + dst->rect.width, dst->rect.height); } g_free(tmp); } else @@ -149,35 +181,33 @@ void ati_2d_blt(ATIVGAState *s) fallback =3D true; } if (fallback) { - unsigned int y, i, j, bypp =3D bpp / 8; + unsigned int y, i, j, bypp =3D dst->bpp / 8; unsigned int src_pitch =3D src_stride * sizeof(uint32_t); - unsigned int dst_pitch =3D dst_stride * sizeof(uint32_t); - - for (y =3D 0; y < s->regs.dst_height; y++) { - i =3D dst_x * bypp; + for (y =3D 0; y < dst->rect.height; y++) { + i =3D dst->rect.x * bypp; j =3D src_x * bypp; - if (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM) { - i +=3D (dst_y + y) * dst_pitch; + if (dst->top_to_bottom) { + i +=3D (dst->rect.y + y) * dst->stride; j +=3D (src_y + y) * src_pitch; } else { - i +=3D (dst_y + s->regs.dst_height - 1 - y) * dst_pitc= h; - j +=3D (src_y + s->regs.dst_height - 1 - y) * src_pitc= h; + i +=3D (dst->rect.y + dst->rect.height - 1 - y) * dst-= >stride; + j +=3D (src_y + dst->rect.height - 1 - y) * src_pitch; } - memmove(&dst_bits[i], &src_bits[j], s->regs.dst_width * by= pp); + memmove(&dst->bits[i], &src_bits[j], dst->rect.width * byp= p); } } - if (dst_bits >=3D s->vga.vram_ptr + s->vga.vbe_start_addr && - dst_bits < s->vga.vram_ptr + s->vga.vbe_start_addr + + if (dst->bits >=3D s->vga.vram_ptr + s->vga.vbe_start_addr && + dst->bits < s->vga.vram_ptr + s->vga.vbe_start_addr + s->vga.vbe_regs[VBE_DISPI_INDEX_YRES] * s->vga.vbe_line_offset= ) { memory_region_set_dirty(&s->vga.vram, s->vga.vbe_start_addr + s->regs.dst_offset + - dst_y * surface_stride(ds), - s->regs.dst_height * surface_stride(ds= )); + dst->rect.y * surface_stride(ds), + dst->rect.height * surface_stride(ds)); } - s->regs.dst_x =3D (s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT ? - dst_x + s->regs.dst_width : dst_x); - s->regs.dst_y =3D (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ? - dst_y + s->regs.dst_height : dst_y); + s->regs.dst_x =3D (dst->left_to_right ? + dst->rect.x + dst->rect.width : dst->rect.x); + s->regs.dst_y =3D (dst->top_to_bottom ? + dst->rect.y + dst->rect.height : dst->rect.y); break; } case ROP3_PATCOPY: @@ -200,36 +230,35 @@ void ati_2d_blt(ATIVGAState *s) break; } =20 - dst_stride /=3D sizeof(uint32_t); DPRINTF("pixman_fill(%p, %d, %d, %d, %d, %d, %d, %x)\n", - dst_bits, dst_stride, bpp, dst_x, dst_y, - s->regs.dst_width, s->regs.dst_height, filler); + dst->bits, dst_stride_words, dst->bpp, dst->rect.x, dst->r= ect.y, + dst->rect.width, dst->rect.height, filler); #ifdef CONFIG_PIXMAN if (!(s->use_pixman & BIT(0)) || - !pixman_fill((uint32_t *)dst_bits, dst_stride, bpp, dst_x, dst= _y, - s->regs.dst_width, s->regs.dst_height, filler)) + !pixman_fill((uint32_t *)dst->bits, + dst_stride_words, dst->bpp, dst->rect.x, dst->rect.y, + dst->rect.width, dst->rect.height, filler)) #endif { /* fallback when pixman failed or we don't want to call it */ - unsigned int x, y, i, bypp =3D bpp / 8; - unsigned int dst_pitch =3D dst_stride * sizeof(uint32_t); - for (y =3D 0; y < s->regs.dst_height; y++) { - i =3D dst_x * bypp + (dst_y + y) * dst_pitch; - for (x =3D 0; x < s->regs.dst_width; x++, i +=3D bypp) { - stn_he_p(&dst_bits[i], bypp, filler); + unsigned int x, y, i, bypp =3D dst->bpp / 8; + for (y =3D 0; y < dst->rect.height; y++) { + i =3D dst->rect.x * bypp + (dst->rect.y + y) * dst->stride; + for (x =3D 0; x < dst->rect.width; x++, i +=3D bypp) { + stn_he_p(&dst->bits[i], bypp, filler); } } } - if (dst_bits >=3D s->vga.vram_ptr + s->vga.vbe_start_addr && - dst_bits < s->vga.vram_ptr + s->vga.vbe_start_addr + + if (dst->bits >=3D s->vga.vram_ptr + s->vga.vbe_start_addr && + dst->bits < s->vga.vram_ptr + s->vga.vbe_start_addr + s->vga.vbe_regs[VBE_DISPI_INDEX_YRES] * s->vga.vbe_line_offset= ) { memory_region_set_dirty(&s->vga.vram, s->vga.vbe_start_addr + s->regs.dst_offset + - dst_y * surface_stride(ds), - s->regs.dst_height * surface_stride(ds= )); + dst->rect.y * surface_stride(ds), + dst->rect.height * surface_stride(ds)); } - s->regs.dst_y =3D (s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM ? - dst_y + s->regs.dst_height : dst_y); + s->regs.dst_y =3D (dst->top_to_bottom ? + dst->rect.y + dst->rect.height : dst->rect.y); break; } default: --=20 2.51.2 From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531453; cv=none; d=zohomail.com; s=zohoarc; b=LM2Bvj90Qj39lQVt+rqC+GYdS64fvLcYPH9MgBDVJ9NnGhxqHolj4rxmdtedPANuRtQPpCY0TStHEb83fIYntQDCE4x8eTdK7YzZVv+sPiKdFWPziuBahkhF18bF4DX2zRmOhoQJgS2EBL+Gr60K2qssKpohqzLNUHtzQvpzDIc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531453; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vPQDpUt6s4t6qzdjQu1QltXUX8nqG/MKbC89zGDfm7E=; b=YkyssBU6sU9LUOR2N+SnlvcYeGDCRyJjulNA8ZsABZfkuoszFRm/xHeeT1KbzVZBuvLwICEDxLEGRfTGuNo2SFNOqUWtc3Lu/3BkHC2/qtbr3CFtKpRPm/pgd0Q50j30F7HR/ivI4IAqKlVChn0vBUdazDCKskESgCA1HXrMxfY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768531453742842.2765185913511; Thu, 15 Jan 2026 18:44:13 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoO-0005wp-Lp; Thu, 15 Jan 2026 21:43:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZo0-0005qX-OH for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:23 -0500 Received: from fout-b8-smtp.messagingengine.com ([202.12.124.151]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnw-0002RZ-9M for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:18 -0500 Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailfout.stl.internal (Postfix) with ESMTP id E086F1D00089; Thu, 15 Jan 2026 21:43:12 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-05.internal (MEProxy); Thu, 15 Jan 2026 21:43:13 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:12 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id ff1c2f02; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531392; x= 1768617792; bh=vPQDpUt6s4t6qzdjQu1QltXUX8nqG/MKbC89zGDfm7E=; b=u cf3TEYubiHAWAH+Qx5iVeU2Z4RRRZQNGeMcQTVpA3UKaD0r7U8fA5XHt+clTQN/e lV5vV3P5IqCzXFBrJserzp6TP3lGZFSRpJH85hRX0Jum/V9N6F7Ow0a2EwnB9fuN hvh9MpCGb6RQ3/7oVvOhM9GcZkmMuVxlrzSPRe8YvkiWqa37WdKKEw2dxnPbzVMz hv5Ml8JvKlSCuDk1xpDx435DH9k7/jc/VUZouh/UsAf8YlIoYKIX9VVSpvxFiGLf Y9x6HZvwkSI4qI1qy1gEgEFfllVS0ORhhGhcPaLTx7Dfyj1XVqsVjUoZO4X3Qmok 7meIRVR/vDPBYs4lVH8WQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531392; x=1768617792; bh=v PQDpUt6s4t6qzdjQu1QltXUX8nqG/MKbC89zGDfm7E=; b=gsyPRDfU60z4My+lR IszmPSJjo+M2CtY8um5MRFCzJdPts9LBzwmw5X53C1Jg3JrSmVi6exEC8JItMo9o OYLwjrzctFaI5yF89vDxPG9Y+m5l7yNedo7oultZrlov6rMVgfn3zALPh1lvpOpm E0PmHHaUtNM/R4Q0Dx3GGdtq7c5LMIJ/GNz5J2MZq5DisYQCw2PhzUnqnrUfyxUb 0NIk0PIVCfiwMc/EIFFmNSs4MVTmxE7n//pKbKCdQt93bCZoVKWC4gKSGFcaJUsW mNYvN2iVjN53DiT+m1mmY9mp2IJ29S2sWLulHcyzS9DKN5hvbxInK57RvKNjuDzd vh44g== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopegthhgrugesjhgrsghlohhnshhkihdrgiihiidprhgtphhtthhope gsrghlrghtohhnsegvihhkrdgsmhgvrdhhuhdprhgtphhtthhopehqvghmuhdquggvvhgv lhesnhhonhhgnhhurdhorhhg X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 07/12] ati-vga: Create and use ATIBltSrc struct Date: Thu, 15 Jan 2026 21:42:53 -0500 Message-ID: <20260116024258.1487173-8-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.151; envelope-from=chad@jablonski.xyz; helo=fout-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531455774158500 Content-Type: text/plain; charset="utf-8" This creates a struct to hold all src state relevant to a blit. A future patch implements the actual blit as a function accepting a src and dst. This will be important for implementation of HOST_DATA which sources data from a buffer and not VRAM. The majority of the changes in this patch involve mechanically changing src data references to use this new struct. There should be no change in behavior. Signed-off-by: Chad Jablonski --- hw/display/ati_2d.c | 77 ++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c index 75bd38e9b0..91fd3b7827 100644 --- a/hw/display/ati_2d.c +++ b/hw/display/ati_2d.c @@ -25,6 +25,13 @@ * possible. */ =20 +typedef struct { + int x; + int y; + int stride; + uint8_t *bits; +} ATIBltSrc; + typedef struct { QemuRect rect; int bpp; @@ -79,9 +86,11 @@ void ati_2d_blt(ATIVGAState *s) /* rewritten but for now as a start just to get some output: */ DisplaySurface *ds =3D qemu_console_surface(s->vga.con); uint8_t *end =3D s->vga.vram_ptr + s->vga.vram_size; - int dst_stride_words; + int dst_stride_words, src_stride_words; ATIBltDst _dst; /* TEMP: avoid churn in future patches */ ATIBltDst *dst =3D &_dst; + ATIBltSrc _src; /* TEMP: avoid churn in future patches */ + ATIBltSrc *src =3D &_src; =20 DPRINTF("%p %u ds: %p %d %d rop: %x\n", s->vga.vram_ptr, s->vga.vbe_start_addr, surface_data(ds), surface_stride(ds), @@ -90,6 +99,19 @@ void ati_2d_blt(ATIVGAState *s) =20 setup_2d_blt_dst(s, dst); =20 + src->x =3D (dst->left_to_right ? + s->regs.src_x : + s->regs.src_x + 1 - dst->rect.width); + src->y =3D (dst->top_to_bottom ? + s->regs.src_y : + s->regs.src_y + 1 - dst->rect.height); + src->stride =3D s->regs.src_pitch; + src->bits =3D s->vga.vram_ptr + s->regs.src_offset; + if (s->dev_id =3D=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { + src->bits +=3D s->regs.crtc_offset & 0x07ffffff; + src->stride *=3D dst->bpp; + } + if (!dst->bpp) { qemu_log_mask(LOG_GUEST_ERROR, "Invalid bpp\n"); return; @@ -106,11 +128,12 @@ void ati_2d_blt(ATIVGAState *s) } =20 dst_stride_words =3D dst->stride / sizeof(uint32_t); + src_stride_words =3D src->stride / sizeof(uint32_t); =20 DPRINTF("%d %d %d, %d %d %d, (%d,%d) -> (%d,%d) %dx%d %c %c\n", s->regs.src_offset, s->regs.dst_offset, s->regs.default_offset, - s->regs.src_pitch, dst->stride, s->regs.default_pitch, - s->regs.src_x, s->regs.src_y, dst->rect.x, dst->rect.y, + src->stride, dst->stride, s->regs.default_pitch, + src->x, src->y, dst->rect.x, dst->rect.y, dst->rect.width, dst->rect.height, (dst->left_to_right ? '>' : '<'), (dst->top_to_bottom ? 'v' : '^')); @@ -119,42 +142,31 @@ void ati_2d_blt(ATIVGAState *s) case ROP3_SRCCOPY: { bool fallback =3D false; - unsigned src_x =3D (dst->left_to_right ? - s->regs.src_x : s->regs.src_x + 1 - dst->rect.width= ); - unsigned src_y =3D (dst->top_to_bottom ? - s->regs.src_y : s->regs.src_y + 1 - dst->rect.heigh= t); - int src_stride =3D s->regs.src_pitch; - if (!src_stride) { + + if (!src->stride) { qemu_log_mask(LOG_GUEST_ERROR, "Zero source pitch\n"); return; } - uint8_t *src_bits =3D s->vga.vram_ptr + s->regs.src_offset; - - if (s->dev_id =3D=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { - src_bits +=3D s->regs.crtc_offset & 0x07ffffff; - src_stride *=3D dst->bpp; - } - if (src_x > 0x3fff || src_y > 0x3fff || src_bits >=3D end - || src_bits + src_x - + (src_y + dst->rect.height) * src_stride >=3D end) { + if (src->x > 0x3fff || src->y > 0x3fff || src->bits >=3D end + || src->bits + src->x + + (src->y + dst->rect.height) * src->stride >=3D end) { qemu_log_mask(LOG_UNIMP, "blt outside vram not implemented\n"); return; } =20 - src_stride /=3D sizeof(uint32_t); DPRINTF("pixman_blt(%p, %p, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d= )\n", - src_bits, dst->bits, - src_stride, dst_stride_words, + src->bits, dst->bits, + src_stride_words, dst_stride_words, dst->bpp, dst->bpp, - src_x, src_y, dst->rect.x, dst->rect.y, + src->x, src->y, dst->rect.x, dst->rect.y, dst->rect.width, dst->rect.height); #ifdef CONFIG_PIXMAN if ((s->use_pixman & BIT(1)) && dst->left_to_right && dst->top_to_bottom) { - fallback =3D !pixman_blt((uint32_t *)src_bits, (uint32_t *)dst= ->bits, - src_stride, dst_stride_words, + fallback =3D !pixman_blt((uint32_t *)src->bits, (uint32_t *)ds= t->bits, + src_stride_words, dst_stride_words, dst->bpp, dst->bpp, - src_x, src_y, dst->rect.x, dst->rect.y, + src->x, src->y, dst->rect.x, dst->rect.= y, dst->rect.width, dst->rect.height); } else if (s->use_pixman & BIT(1)) { /* FIXME: We only really need a temporary if src and dst overl= ap */ @@ -162,10 +174,10 @@ void ati_2d_blt(ATIVGAState *s) int tmp_stride =3D DIV_ROUND_UP(llb, sizeof(uint32_t)); uint32_t *tmp =3D g_malloc(tmp_stride * sizeof(uint32_t) * dst->rect.height); - fallback =3D !pixman_blt((uint32_t *)src_bits, tmp, - src_stride, tmp_stride, + fallback =3D !pixman_blt((uint32_t *)src->bits, tmp, + src_stride_words, tmp_stride, dst->bpp, dst->bpp, - src_x, src_y, 0, 0, + src->x, src->y, 0, 0, dst->rect.width, dst->rect.height); if (!fallback) { fallback =3D !pixman_blt(tmp, (uint32_t *)dst->bits, @@ -182,18 +194,17 @@ void ati_2d_blt(ATIVGAState *s) } if (fallback) { unsigned int y, i, j, bypp =3D dst->bpp / 8; - unsigned int src_pitch =3D src_stride * sizeof(uint32_t); for (y =3D 0; y < dst->rect.height; y++) { i =3D dst->rect.x * bypp; - j =3D src_x * bypp; + j =3D src->x * bypp; if (dst->top_to_bottom) { i +=3D (dst->rect.y + y) * dst->stride; - j +=3D (src_y + y) * src_pitch; + j +=3D (src->y + y) * src->stride; } else { i +=3D (dst->rect.y + dst->rect.height - 1 - y) * dst-= >stride; - j +=3D (src_y + dst->rect.height - 1 - y) * src_pitch; + j +=3D (src->y + dst->rect.height - 1 - y) * src->stri= de; } - memmove(&dst->bits[i], &src_bits[j], dst->rect.width * byp= p); + memmove(&dst->bits[i], &src->bits[j], dst->rect.width * by= pp); } } if (dst->bits >=3D s->vga.vram_ptr + s->vga.vbe_start_addr && --=20 2.51.2 From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531455; cv=none; d=zohomail.com; s=zohoarc; b=MYsqWvBh3m9oedgm7SHtEjrawNlMxCps2yixiAayFzCGIfOXIq8Rl215UDCpZIC/YnpOoMfb7z2ZMcvWH1hox9mUrpod6w84kbNnm2NcACBC5mwLz18ByJ7YsIC5ale1w5/l6VJHVXC8CrONJzsrRc/nIwqJsc851zNBmx84vuU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531455; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=+/FyD+vMcIQ9VqCK0mlHx+J4DTJhXkCV6w8jNgGWsJY=; b=mIN8z76jO4NkMduMd+llj/YWtxFGwnoZEZHtwEajVHU2ez2PILzMKZag3WP9sFaTJlXAT1UUOX1jVxWYlf9jj5DF8AzwJHg9bh4XKUA0wUVjb+2KzKg7RSYrZ8K3i+dLdPWlRJq2Xb0fxvf49b2YiWyNrQXZ9oAn2HmhwGaX0/I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768531454859966.0147373080832; Thu, 15 Jan 2026 18:44:14 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoU-00060Y-WF; Thu, 15 Jan 2026 21:43:51 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZo0-0005qY-Om for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:23 -0500 Received: from fout-b8-smtp.messagingengine.com ([202.12.124.151]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZnw-0002Ra-Dj for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:18 -0500 Received: from phl-compute-01.internal (phl-compute-01.internal [10.202.2.41]) by mailfout.stl.internal (Postfix) with ESMTP id 1E9A51D00091; Thu, 15 Jan 2026 21:43:13 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-01.internal (MEProxy); Thu, 15 Jan 2026 21:43:13 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:12 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id ab29ab07; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531392; x= 1768617792; bh=+/FyD+vMcIQ9VqCK0mlHx+J4DTJhXkCV6w8jNgGWsJY=; b=f tCYX8VxzOiCSBS7/oaxPxWC18g5yAfKqaB8dP241l/5f+IOUDfaZJEw061aihrXa dIHkRIiFFfrsyZb09uzCx07jZ9PmN7wUaOxFzZSLhFXRz/AiacNceAxTOv3js0aK 7Z+B/uzX0ed40KdUzkzsRN7dSzdz154dlfu0e4bSmdWsGgqlXBYUR9wPTlzLsqlN Hm02wDX09585pMJyTofbx5zZZ58k1pFZCuL13ULfc3NAApNtSJpyfd3Smm7ZkNf0 L0sm598NE4QaTFQyw5NzngBHES62BFleEL+lEBWWbOcP9lNuKIdPihafbb0tPKom 27iXuaXdDa3W4+QUY6eZQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531392; x=1768617792; bh=+ /FyD+vMcIQ9VqCK0mlHx+J4DTJhXkCV6w8jNgGWsJY=; b=XrwnQoSALE+jlpj5y hncevzHxYZgcDjukbpn6bJ1tHUMiU0kogvmhT28NS/F1dZhaSpzOgHJimNQly1VY 5qkvHyEqIQP137sXodgatD5/VNUL/M3igfRbKqa7hHnfM91++iKUm8EjDC+YAfj4 epJT7Q7WLrrESQovOxxtOIPN31mga9p6F4TGrrjJbLrIzvLv5VUsiFp2r8gB0r11 RiaHC4MgJMRP5+/yUu6hfmpwQoxkwyz2YPu51rc5xohZNrrButSR/bChSaoLWbk7 34cHFFsp005psKUKBFUJBj7uU5h+Dcs4oF3rkER/fvbTNjy+oB0q0CW0VazCDVep i+trg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopehqvghmuhdquggvvhgvlhesnhhonhhgnhhurdhorhhgpdhrtghpth htohepsggrlhgrthhonhesvghikhdrsghmvgdrhhhupdhrtghpthhtoheptghhrggusehj rggslhhonhhskhhirdighiii X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 08/12] ati-vga: Consolidate set dirty and dst update Date: Thu, 15 Jan 2026 21:42:54 -0500 Message-ID: <20260116024258.1487173-9-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.151; envelope-from=chad@jablonski.xyz; helo=fout-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531457108158500 Content-Type: text/plain; charset="utf-8" Both supported ROPs follow the same memory set dirty logic. This consolidates that logic to remove the duplication. Hardware testing revealed that the Rage 128 does not update dst_x or dst_y after a blit, regardless of the source. This removes the update for the Rage 128 device. Note that there is a behavior change here in that previously the "fill" ROPs updated only dst_y and SRC_COPY updated dst_y and dst_x. The Mobility M6 register reference (DST_HEIGHT_WIDTH) states that dst_y is updated after a blit but doesn't mention dst_x. Signed-off-by: Chad Jablonski --- I plan to validate the above Radeon behavior in the future but I don't have the best test environment set up for that card at the moment. Zoltan if you've seen the dst_x behavior is required then we can modify this but otherwise it felt safe to me to follow the docs for now. --- hw/display/ati_2d.c | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c index 91fd3b7827..38390f2da8 100644 --- a/hw/display/ati_2d.c +++ b/hw/display/ati_2d.c @@ -207,18 +207,6 @@ void ati_2d_blt(ATIVGAState *s) memmove(&dst->bits[i], &src->bits[j], dst->rect.width * by= pp); } } - if (dst->bits >=3D s->vga.vram_ptr + s->vga.vbe_start_addr && - dst->bits < s->vga.vram_ptr + s->vga.vbe_start_addr + - s->vga.vbe_regs[VBE_DISPI_INDEX_YRES] * s->vga.vbe_line_offset= ) { - memory_region_set_dirty(&s->vga.vram, s->vga.vbe_start_addr + - s->regs.dst_offset + - dst->rect.y * surface_stride(ds), - dst->rect.height * surface_stride(ds)); - } - s->regs.dst_x =3D (dst->left_to_right ? - dst->rect.x + dst->rect.width : dst->rect.x); - s->regs.dst_y =3D (dst->top_to_bottom ? - dst->rect.y + dst->rect.height : dst->rect.y); break; } case ROP3_PATCOPY: @@ -260,20 +248,29 @@ void ati_2d_blt(ATIVGAState *s) } } } - if (dst->bits >=3D s->vga.vram_ptr + s->vga.vbe_start_addr && - dst->bits < s->vga.vram_ptr + s->vga.vbe_start_addr + - s->vga.vbe_regs[VBE_DISPI_INDEX_YRES] * s->vga.vbe_line_offset= ) { - memory_region_set_dirty(&s->vga.vram, s->vga.vbe_start_addr + - s->regs.dst_offset + - dst->rect.y * surface_stride(ds), - dst->rect.height * surface_stride(ds)); - } - s->regs.dst_y =3D (dst->top_to_bottom ? - dst->rect.y + dst->rect.height : dst->rect.y); break; } default: qemu_log_mask(LOG_UNIMP, "Unimplemented ati_2d blt op %x\n", (s->regs.dp_mix & GMC_ROP3_MASK) >> 16); } + + if (s->dev_id !=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { + /* + * Hardware testing shows that dst is _not_ updated for Rage 128. + * The M6 (R100/Radeon) docs state however that dst_y is updated. + * This has not yet been validated on R100 hardware. + */ + s->regs.dst_y =3D (dst->top_to_bottom ? + dst->rect.y + dst->rect.height : dst->rect.y); + } + + if (dst->bits >=3D s->vga.vram_ptr + s->vga.vbe_start_addr && + dst->bits < s->vga.vram_ptr + s->vga.vbe_start_addr + + s->vga.vbe_regs[VBE_DISPI_INDEX_YRES] * s->vga.vbe_line_offset) { + memory_region_set_dirty(&s->vga.vram, s->vga.vbe_start_addr + + s->regs.dst_offset + + dst->rect.y * surface_stride(ds), + dst->rect.height * surface_stride(ds)); + } } --=20 2.51.2 From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531490; cv=none; d=zohomail.com; s=zohoarc; b=ecHkqFNmNevotPbhc3FI+nmsyXql+xFvyJEfESaxt3GgPLmpOJrKQUD+PrmKsm6JBfiycBkbhWUyjRO/CMcSNJtJulEOMFchjaXSfvgkTCqardwLeUCFtTBtY+Ug5CGsHowb+lhApwvEN2kJFsnatY8XSWpzpkMAwWQMa6eL+LU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531490; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=6SW+LMri3vFEXJCJjGvFcKszWaLzdvchvSDF9eawbwE=; b=X9wMAH58vMX7hGi8kRy7tBJglNdM+DfZvEQBWmttp/Cng2pqA2MIDiQMh2BHexeldD1lqNWRpj6ufs6NyWyslvQdOdcfXOQfg7XfZ2DfoFPlMgEB0+hxPDAFfhyNg3159TD8amKmJdvR5XxEjbGxn1g+k9Fw/nWiVZgLUHX/AwU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768531490038988.8681065528532; Thu, 15 Jan 2026 18:44:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoU-0005zs-3z; Thu, 15 Jan 2026 21:43:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZo2-0005qZ-7c for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:23 -0500 Received: from fout-b8-smtp.messagingengine.com ([202.12.124.151]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZo0-0002SA-F1 for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:21 -0500 Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42]) by mailfout.stl.internal (Postfix) with ESMTP id 455D81D00094; Thu, 15 Jan 2026 21:43:13 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-02.internal (MEProxy); Thu, 15 Jan 2026 21:43:13 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:12 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id bf9e8395; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531393; x= 1768617793; bh=6SW+LMri3vFEXJCJjGvFcKszWaLzdvchvSDF9eawbwE=; b=n N2a9bsqJA+8YXvRHW4/RA1FZDFY+3uqz+UT23Ed+IJa4gBeZLVhxCVrL88vNMs6v StjoEXrUZ+o/BFEqWHCPV4O7QLVlQhN+K8Y138F9+zyIqrmNhbvnznPcdmXnCH3I VFxenoFRFul0ffOmrrgyfwIoZ23o5l5kw4mGgE3yYnNz+ljE+qmpPcvA6qBiuPGu pAlmSbVIY+tBYKjaPVXSiaXHlSc5m1qoUODZn5vFATlHJep3fXdj9/41O0XAOUXr UKQAXPuEDKI7ZGmRPh5lD/1kRtUjWPgTueW0XYzjIJMxN356GytcLTbJZN1M66ru IfK0Jl89B8yc2zB5xeAww== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531393; x=1768617793; bh=6 SW+LMri3vFEXJCJjGvFcKszWaLzdvchvSDF9eawbwE=; b=mdzuat9qESGuEa0hy sldhWgXqfLBNYDUjm+wlWBnsXa+7khphHLRM5EzZ66gu3nXyfNni2QP0l1I1XsH9 4Zk/DUuokh44KPFaRz/ABeagtf8jLEddcFG2V4JkDJ+kCgxtu1xbgVUnegRPpHk+ njKgeBR1bipr8UpugExfWpZdK+QbqU0BWd1SXOEV9M5PMcN7szn3EKr33Q9uluKr tZPEgrp0eFc4T7Um6LP6KmCguiYOmQkzv98neSIcayze6rDxrzASNkG4FEhOWENM 0e4Y92PfzrlfCwdyjfoRAATtc7RCDERPdIdH/6t95HrSjH2+XYg7mtnif4GfbNfE zLPeA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopegsrghlrghtohhnsegvihhkrdgsmhgvrdhhuhdprhgtphhtthhope hqvghmuhdquggvvhgvlhesnhhonhhgnhhurdhorhhgpdhrtghpthhtoheptghhrggusehj rggslhhonhhskhhirdighiii X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 09/12] ati-vga: Add internal ati_2d_do_blt accepting src and dst Date: Thu, 15 Jan 2026 21:42:55 -0500 Message-ID: <20260116024258.1487173-10-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.151; envelope-from=chad@jablonski.xyz; helo=fout-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531491239158500 Content-Type: text/plain; charset="utf-8" Separate the implementation of the blit and the src and dst setup. This maintains the public interface of ati_2d_blt while allowing for flexibility in how the blit is performed. The ati_2d_blt function becomes the function that sets up the src and dst for a VRAM blit and then calls ati_2d_do_blt. A later patch will set up the src and dst for a HOST_DATA blit before calling ati_2d_do_blt. Signed-off-by: Chad Jablonski --- hw/display/ati_2d.c | 59 +++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c index 38390f2da8..691e0f0702 100644 --- a/hw/display/ati_2d.c +++ b/hw/display/ati_2d.c @@ -80,38 +80,19 @@ static void setup_2d_blt_dst(const ATIVGAState *s, ATIB= ltDst *dst) } } =20 -void ati_2d_blt(ATIVGAState *s) +static void ati_2d_do_blt(ATIVGAState *s, const ATIBltSrc *src, ATIBltDst = *dst) { /* FIXME it is probably more complex than this and may need to be */ /* rewritten but for now as a start just to get some output: */ DisplaySurface *ds =3D qemu_console_surface(s->vga.con); uint8_t *end =3D s->vga.vram_ptr + s->vga.vram_size; int dst_stride_words, src_stride_words; - ATIBltDst _dst; /* TEMP: avoid churn in future patches */ - ATIBltDst *dst =3D &_dst; - ATIBltSrc _src; /* TEMP: avoid churn in future patches */ - ATIBltSrc *src =3D &_src; =20 DPRINTF("%p %u ds: %p %d %d rop: %x\n", s->vga.vram_ptr, s->vga.vbe_start_addr, surface_data(ds), surface_stride(ds), surface_bits_per_pixel(ds), (s->regs.dp_mix & GMC_ROP3_MASK) >> 16); =20 - setup_2d_blt_dst(s, dst); - - src->x =3D (dst->left_to_right ? - s->regs.src_x : - s->regs.src_x + 1 - dst->rect.width); - src->y =3D (dst->top_to_bottom ? - s->regs.src_y : - s->regs.src_y + 1 - dst->rect.height); - src->stride =3D s->regs.src_pitch; - src->bits =3D s->vga.vram_ptr + s->regs.src_offset; - if (s->dev_id =3D=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { - src->bits +=3D s->regs.crtc_offset & 0x07ffffff; - src->stride *=3D dst->bpp; - } - if (!dst->bpp) { qemu_log_mask(LOG_GUEST_ERROR, "Invalid bpp\n"); return; @@ -147,12 +128,6 @@ void ati_2d_blt(ATIVGAState *s) qemu_log_mask(LOG_GUEST_ERROR, "Zero source pitch\n"); return; } - if (src->x > 0x3fff || src->y > 0x3fff || src->bits >=3D end - || src->bits + src->x - + (src->y + dst->rect.height) * src->stride >=3D end) { - qemu_log_mask(LOG_UNIMP, "blt outside vram not implemented\n"); - return; - } =20 DPRINTF("pixman_blt(%p, %p, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d= )\n", src->bits, dst->bits, @@ -274,3 +249,35 @@ void ati_2d_blt(ATIVGAState *s) dst->rect.height * surface_stride(ds)); } } + +void ati_2d_blt(ATIVGAState *s) +{ + uint8_t *end =3D s->vga.vram_ptr + s->vga.vram_size; + ATIBltDst dst; + ATIBltSrc src; + + setup_2d_blt_dst(s, &dst); + + /* Setup src to point at VRAM */ + src.x =3D (dst.left_to_right ? + s->regs.src_x : + s->regs.src_x + 1 - dst.rect.width); + src.y =3D (dst.top_to_bottom ? + s->regs.src_y : + s->regs.src_y + 1 - dst.rect.height); + src.stride =3D s->regs.src_pitch; + src.bits =3D s->vga.vram_ptr + s->regs.src_offset; + if (s->dev_id =3D=3D PCI_DEVICE_ID_ATI_RAGE128_PF) { + src.bits +=3D s->regs.crtc_offset & 0x07ffffff; + src.stride *=3D dst.bpp; + } + + if (src.x > 0x3fff || src.y > 0x3fff || src.bits >=3D end + || src.bits + src.x + + (src.y + dst.rect.height) * src.stride >=3D end) { + qemu_log_mask(LOG_UNIMP, "blt src outside vram not implemented\n"); + return; + } + + ati_2d_do_blt(s, &src, &dst); +} --=20 2.51.2 From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531465; cv=none; d=zohomail.com; s=zohoarc; b=MdFOhCbn66getBuc7869Z1OPNe9cvujhSHKY0Vk6+FURaX3YqqNxF1oto6S5UQXcNCHRGEhThAR5EA6IokGYgEK4lg/LOn0RlZJ4LG1EYoD/GE/JVH8UHWKu6neodTRyKflEgnWIxBQelac864ILoRTUmkeKIcbuEOjtRpTqlqA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531465; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=d1iXvXcdM9g7qg5Sr1ETV1BMhOz1njZpEnObm+hPq08=; b=U0rxnlHJVBmD5aL0sMkgRh5YMkxyFAM2ZP6Nc8sDCQB04qoNjAmUjmg4dE/6qulzQgN1qRFWQV7bawJeIXHXaQwjHERcz4qPoB9mNchtw8klYFITJYdL87HdWb5H7MXOhE+PjYG3vTA7t4OZDG+jxhE11gJ7Cx8EJYTYpTya+V0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17685314653641010.9398936882329; Thu, 15 Jan 2026 18:44:25 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoP-0005x9-VB; Thu, 15 Jan 2026 21:43:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZo2-0005qa-EH for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:27 -0500 Received: from fout-b8-smtp.messagingengine.com ([202.12.124.151]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZo0-0002SB-Fp for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:22 -0500 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfout.stl.internal (Postfix) with ESMTP id 971B21D00099; Thu, 15 Jan 2026 21:43:13 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-03.internal (MEProxy); Thu, 15 Jan 2026 21:43:13 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:13 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 52e9db10; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531393; x= 1768617793; bh=d1iXvXcdM9g7qg5Sr1ETV1BMhOz1njZpEnObm+hPq08=; b=T bqbsGib0aDDHgsZkepriJzEuNbR7HurBFGy41xL8z+IVO9DT27lEy1De0A5ujPFy AgqOg2iPWedgWNy3pt9Nl5CHNtpHEZVSr/ILHZLiX2sfpilWOtvYfkCmJZSYFjJs wLXWw85bfmXHNWs0z4wtoM1+IYFk9/WbXpsS5zrKIXaZAJvZk6Y8AHAGX/cAy/zl xZotzMu0HtcJp4N4zB26kaiA/b/QJowguhgS6Jnn4PWlRd4qV17NV+kA1Ep6ujZR neQ5tM8mMTw0NAKlCObud+cyrXBFp2v+wMcdQ8Gof37JiMoh6xZfM9DQyH30qmRx 4TLdKwRJQdkdOwhSlTj1g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531393; x=1768617793; bh=d 1iXvXcdM9g7qg5Sr1ETV1BMhOz1njZpEnObm+hPq08=; b=EF2VbzsIDpPzQKj33 yCaKyJ4xNz/x9HK8x7DxCQpPV6Iy3+UnO6T/ZDyEntAokjLvsUn8Lmxa3cPabzqG nOcVAD91PM1OJUkBwPyeI68sRU1jYv05HhFrxp/dibU2UwKxdInkP7KabrYazLah +MbhVbkmrNYjAV2zhE1xIh4SKEOfa1bu6/Sgyi4QfK3or6FBHNVg1vVX6D/yRbje OEAovqRZrX7wDY1pdiBiPltAotG7CGWSKgkKtcAND6LNoGigiMqN71zr/h/x4nWs gspVsG4/NnVjWwAx4aejck1JcZmbnGnHQHIJm0uTP/ywbYKz0mIpKaDA3uA4lE3W CIJbA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgepfeenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopehqvghmuhdquggvvhgvlhesnhhonhhgnhhurdhorhhgpdhrtghpth htoheptghhrggusehjrggslhhonhhskhhirdighiiipdhrtghpthhtohepsggrlhgrthho nhesvghikhdrsghmvgdrhhhu X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 10/12] ati-vga: Implement scissor rectangle clipping for 2D operations Date: Thu, 15 Jan 2026 21:42:56 -0500 Message-ID: <20260116024258.1487173-11-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.151; envelope-from=chad@jablonski.xyz; helo=fout-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531467505158500 Content-Type: text/plain; charset="utf-8" Use scissor registers to clip blit operations. This is required for text rendering in X using the r128 driver. Without it overly-wide glyphs are drawn and create all sorts of chaos. The visible destination rectangle (vis_dst) is the intersection of the scissor rectangle and the destination rectangle (dst.rect). The src also needs to be offset if clipped on the top and/or left sides to ensure that src data is read correctly and appears clipped when drawn rather than shifted. Signed-off-by: Chad Jablonski --- hw/display/ati_2d.c | 81 ++++++++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c index 691e0f0702..a5dc5ba98e 100644 --- a/hw/display/ati_2d.c +++ b/hw/display/ati_2d.c @@ -86,7 +86,8 @@ static void ati_2d_do_blt(ATIVGAState *s, const ATIBltSrc= *src, ATIBltDst *dst) /* rewritten but for now as a start just to get some output: */ DisplaySurface *ds =3D qemu_console_surface(s->vga.con); uint8_t *end =3D s->vga.vram_ptr + s->vga.vram_size; - int dst_stride_words, src_stride_words; + int dst_stride_words, src_stride_words, vis_src_x, vis_src_y; + QemuRect scissor, vis_dst; =20 DPRINTF("%p %u ds: %p %d %d rop: %x\n", s->vga.vram_ptr, s->vga.vbe_start_addr, surface_data(ds), surface_stride(ds), @@ -108,14 +109,32 @@ static void ati_2d_do_blt(ATIVGAState *s, const ATIBl= tSrc *src, ATIBltDst *dst) return; } =20 + qemu_rect_init(&scissor, + s->regs.sc_left, s->regs.sc_top, + s->regs.sc_right - s->regs.sc_left + 1, + s->regs.sc_bottom - s->regs.sc_top + 1); + qemu_rect_intersect(&dst->rect, &scissor, &vis_dst); + if (!vis_dst.height || !vis_dst.width) { + /* Nothing to do, completely clipped */ + return; + } + dst_stride_words =3D dst->stride / sizeof(uint32_t); src_stride_words =3D src->stride / sizeof(uint32_t); + /* + * The src must be offset if clipping is applied to the dst. + * This is so that when the source is blit to a dst clipped + * on the top or left the src image is not shifted into the + * clipped region but actually clipped. + */ + vis_src_x =3D src->x + (vis_dst.x - dst->rect.x); + vis_src_y =3D src->y + (vis_dst.y - dst->rect.y); =20 DPRINTF("%d %d %d, %d %d %d, (%d,%d) -> (%d,%d) %dx%d %c %c\n", s->regs.src_offset, s->regs.dst_offset, s->regs.default_offset, src->stride, dst->stride, s->regs.default_pitch, - src->x, src->y, dst->rect.x, dst->rect.y, - dst->rect.width, dst->rect.height, + vis_src_x, vis_src_y, vis_dst.x, vis_dst.y, + vis_dst.width, vis_dst.height, (dst->left_to_right ? '>' : '<'), (dst->top_to_bottom ? 'v' : '^')); =20 @@ -133,33 +152,33 @@ static void ati_2d_do_blt(ATIVGAState *s, const ATIBl= tSrc *src, ATIBltDst *dst) src->bits, dst->bits, src_stride_words, dst_stride_words, dst->bpp, dst->bpp, - src->x, src->y, dst->rect.x, dst->rect.y, - dst->rect.width, dst->rect.height); + vis_src_x, vis_src_y, vis_dst.x, vis_dst.y, + vis_dst.width, vis_dst.height); #ifdef CONFIG_PIXMAN if ((s->use_pixman & BIT(1)) && dst->left_to_right && dst->top_to_bottom) { fallback =3D !pixman_blt((uint32_t *)src->bits, (uint32_t *)ds= t->bits, src_stride_words, dst_stride_words, dst->bpp, dst->bpp, - src->x, src->y, dst->rect.x, dst->rect.= y, - dst->rect.width, dst->rect.height); + vis_src_x, vis_src_y, vis_dst.x, vis_ds= t.y, + vis_dst.width, vis_dst.height); } else if (s->use_pixman & BIT(1)) { /* FIXME: We only really need a temporary if src and dst overl= ap */ - int llb =3D dst->rect.width * (dst->bpp / 8); + int llb =3D vis_dst.width * (dst->bpp / 8); int tmp_stride =3D DIV_ROUND_UP(llb, sizeof(uint32_t)); uint32_t *tmp =3D g_malloc(tmp_stride * sizeof(uint32_t) * - dst->rect.height); + vis_dst.height); fallback =3D !pixman_blt((uint32_t *)src->bits, tmp, src_stride_words, tmp_stride, dst->bpp, dst->bpp, - src->x, src->y, 0, 0, - dst->rect.width, dst->rect.height); + vis_src_x, vis_src_y, 0, 0, + vis_dst.width, vis_dst.height); if (!fallback) { fallback =3D !pixman_blt(tmp, (uint32_t *)dst->bits, tmp_stride, dst_stride_words, dst->bpp, dst->bpp, - 0, 0, dst->rect.x, dst->rect.y, - dst->rect.width, dst->rect.height); + 0, 0, vis_dst.x, vis_dst.y, + vis_dst.width, vis_dst.height); } g_free(tmp); } else @@ -169,17 +188,17 @@ static void ati_2d_do_blt(ATIVGAState *s, const ATIBl= tSrc *src, ATIBltDst *dst) } if (fallback) { unsigned int y, i, j, bypp =3D dst->bpp / 8; - for (y =3D 0; y < dst->rect.height; y++) { - i =3D dst->rect.x * bypp; - j =3D src->x * bypp; + for (y =3D 0; y < vis_dst.height; y++) { + i =3D vis_dst.x * bypp; + j =3D vis_src_x * bypp; if (dst->top_to_bottom) { - i +=3D (dst->rect.y + y) * dst->stride; - j +=3D (src->y + y) * src->stride; + i +=3D (vis_dst.y + y) * dst->stride; + j +=3D (vis_src_y + y) * src->stride; } else { - i +=3D (dst->rect.y + dst->rect.height - 1 - y) * dst-= >stride; - j +=3D (src->y + dst->rect.height - 1 - y) * src->stri= de; + i +=3D (vis_dst.y + vis_dst.height - 1 - y) * dst->str= ide; + j +=3D (vis_src_y + vis_dst.height - 1 - y) * src->str= ide; } - memmove(&dst->bits[i], &src->bits[j], dst->rect.width * by= pp); + memmove(&dst->bits[i], &src->bits[j], vis_dst.width * bypp= ); } } break; @@ -205,20 +224,20 @@ static void ati_2d_do_blt(ATIVGAState *s, const ATIBl= tSrc *src, ATIBltDst *dst) } =20 DPRINTF("pixman_fill(%p, %d, %d, %d, %d, %d, %d, %x)\n", - dst->bits, dst_stride_words, dst->bpp, dst->rect.x, dst->r= ect.y, - dst->rect.width, dst->rect.height, filler); + dst->bits, dst_stride_words, dst->bpp, vis_dst.x, vis_dst.= y, + vis_dst.width, vis_dst.height, filler); #ifdef CONFIG_PIXMAN if (!(s->use_pixman & BIT(0)) || !pixman_fill((uint32_t *)dst->bits, - dst_stride_words, dst->bpp, dst->rect.x, dst->rect.y, - dst->rect.width, dst->rect.height, filler)) + dst_stride_words, dst->bpp, vis_dst.x, vis_dst.y, + vis_dst.width, vis_dst.height, filler)) #endif { /* fallback when pixman failed or we don't want to call it */ unsigned int x, y, i, bypp =3D dst->bpp / 8; - for (y =3D 0; y < dst->rect.height; y++) { - i =3D dst->rect.x * bypp + (dst->rect.y + y) * dst->stride; - for (x =3D 0; x < dst->rect.width; x++, i +=3D bypp) { + for (y =3D 0; y < vis_dst.height; y++) { + i =3D vis_dst.x * bypp + (vis_dst.y + y) * dst->stride; + for (x =3D 0; x < vis_dst.width; x++, i +=3D bypp) { stn_he_p(&dst->bits[i], bypp, filler); } } @@ -237,7 +256,7 @@ static void ati_2d_do_blt(ATIVGAState *s, const ATIBltS= rc *src, ATIBltDst *dst) * This has not yet been validated on R100 hardware. */ s->regs.dst_y =3D (dst->top_to_bottom ? - dst->rect.y + dst->rect.height : dst->rect.y); + vis_dst.y + vis_dst.height : vis_dst.y); } =20 if (dst->bits >=3D s->vga.vram_ptr + s->vga.vbe_start_addr && @@ -245,8 +264,8 @@ static void ati_2d_do_blt(ATIVGAState *s, const ATIBltS= rc *src, ATIBltDst *dst) s->vga.vbe_regs[VBE_DISPI_INDEX_YRES] * s->vga.vbe_line_offset) { memory_region_set_dirty(&s->vga.vram, s->vga.vbe_start_addr + s->regs.dst_offset + - dst->rect.y * surface_stride(ds), - dst->rect.height * surface_stride(ds)); + vis_dst.y * surface_stride(ds), + vis_dst.height * surface_stride(ds)); } } =20 --=20 2.51.2 From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531488; cv=none; d=zohomail.com; s=zohoarc; b=Zxw0nJ/cDzDEccj19LSMTQWiuB1S91rviDIaYP1hjxorNR+Ma2KP1cYXyZqWlzniaSnNh8lpDLI9hvVTAo/OlX5QHiNEjkL5aZ9CHgOa7eHeHNxCTjH1yBglpmrgZN4LQ35OcjeHlTsvzB9rmnYh6T0vKg8tVHYd1csTzHISf2I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531488; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Giln19+GMzGW7pT7qiuYF/kVzM9612KAuacwxQUBTcc=; b=jFjc4Qd49d21lYsP8Abm6ArwS1wd2YmIgZau/CxVEGQumSCt3F1xRv2OEujuQuAvTh94zLdpG7Nlve+aQZRZYSxttpeE+W2AKTqNVOiWpGT0JZ+w39HqjnWiD2xx9sXKLR8Dj6w8IsPZmUsmSrSG4ZXKHr2xStEXM/r9wtcc4zI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768531488568371.43048757948804; Thu, 15 Jan 2026 18:44:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoR-0005xO-Hl; Thu, 15 Jan 2026 21:43:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZoK-0005wS-D3 for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:42 -0500 Received: from fout-b8-smtp.messagingengine.com ([202.12.124.151]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZoA-0002SQ-IT for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:40 -0500 Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailfout.stl.internal (Postfix) with ESMTP id C83FD1D0009A; Thu, 15 Jan 2026 21:43:13 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-05.internal (MEProxy); Thu, 15 Jan 2026 21:43:13 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:13 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id 40158071; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531393; x= 1768617793; bh=Giln19+GMzGW7pT7qiuYF/kVzM9612KAuacwxQUBTcc=; b=T qevX60al9i2LXhLG8JV8cyhX/x59cK0efwBM493Q39P/dC0G93S01fzVsC6hhV3z 3WOUGWIrpPG7DDQxz3VUhjgVywpiM6j6yqBhiy80uPt20OnI3JLYkUZ/wkEOryIE Mu4GjQyYmMc6CR43vMu7SkPERgecOOK5am4dMU8ai+x7FnkRE/Ai1EOhqErqdK4W xwIWSqnICpFj5jegHQ2ShLBXzGwXlx+vYBrfH0e3yFyCLnRXt0nUyDN9D9SRLb0F umCqfldGduzsDu9dZAKXU0RU985L1zkKGhuhHcn1kAN8XMGwe841+rsDz3+P0nVZ jGmB0biUVLWD43hCwRiRA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531393; x=1768617793; bh=G iln19+GMzGW7pT7qiuYF/kVzM9612KAuacwxQUBTcc=; b=icPchWDTzi6dgHsOp /qe9qX9CUJF2FzDwww6Mt0pXuFjsJ0F3XwmjXOx98KmrIxadvWsaC4cxJmtc7Xo6 rAx8gWKcAhIYvvcSyhldKxm8JpFhM7pIfsr9VfpWrHXpc7pg6oVpLx0kpVXPPNjq KZTzUm7FXaMt/waQKfoHUW6xbRKkJG1n7d2dxgQMoxITFXuih6C4Ad6rEqtiYOjA q8x6rrstpQL/LGOLyvTavwiu7ODfnRNAyzxTjlF/VURvbaTHf8HP+X31ef0g8RWm CwtjV/tJXgOzqMTMEBNHM6o+m/NxDE1TP3gPdbXS08wN2hZxcmkpg4goCo8dw+Wn iCb1A== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopegthhgrugesjhgrsghlohhnshhkihdrgiihiidprhgtphhtthhope hqvghmuhdquggvvhgvlhesnhhonhhgnhhurdhorhhgpdhrtghpthhtohepsggrlhgrthho nhesvghikhdrsghmvgdrhhhu X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 11/12] ati-vga: Implement HOST_DATA register writes Date: Thu, 15 Jan 2026 21:42:57 -0500 Message-ID: <20260116024258.1487173-12-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.151; envelope-from=chad@jablonski.xyz; helo=fout-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531489369158500 Content-Type: text/plain; charset="utf-8" Writing to any of the HOST_DATA0-7 registers pushes the written data into a 128-bit accumulator. When the accumulator is full a flush is triggered to copy it to the framebuffer. A final write to HOST_DATA_LAST will also initiate a flush. The flush itself is left for the next patch. Unaligned HOST_DATA* writes result in, from what I can tell, undefined behavior on real hardware. A well-behaved driver shouldn't be doing this anyway. For that reason they are not handled here at all. Signed-off-by: Chad Jablonski --- hw/display/ati.c | 32 ++++++++++++++++++++++++++++++++ hw/display/ati_dbg.c | 9 +++++++++ hw/display/ati_int.h | 8 ++++++++ hw/display/ati_regs.h | 9 +++++++++ 4 files changed, 58 insertions(+) diff --git a/hw/display/ati.c b/hw/display/ati.c index 21339d7e26..e6868ddb8b 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -568,6 +568,13 @@ static inline void ati_reg_write_offs(uint32_t *reg, i= nt offs, } } =20 +static void ati_host_data_reset(ATIHostDataState *hd) +{ + hd->next =3D 0; + hd->row =3D 0; + hd->col =3D 0; +} + static void ati_mm_write(void *opaque, hwaddr addr, uint64_t data, unsigned int size) { @@ -843,6 +850,7 @@ static void ati_mm_write(void *opaque, hwaddr addr, break; case DST_WIDTH: s->regs.dst_width =3D data & 0x3fff; + ati_host_data_reset(&s->host_data); ati_2d_blt(s); break; case DST_HEIGHT: @@ -893,6 +901,7 @@ static void ati_mm_write(void *opaque, hwaddr addr, case DST_HEIGHT_WIDTH: s->regs.dst_width =3D data & 0x3fff; s->regs.dst_height =3D (data >> 16) & 0x3fff; + ati_host_data_reset(&s->host_data); ati_2d_blt(s); break; case DP_GUI_MASTER_CNTL: @@ -923,6 +932,7 @@ static void ati_mm_write(void *opaque, hwaddr addr, case DST_WIDTH_X: s->regs.dst_x =3D data & 0x3fff; s->regs.dst_width =3D (data >> 16) & 0x3fff; + ati_host_data_reset(&s->host_data); ati_2d_blt(s); break; case SRC_X_Y: @@ -936,6 +946,7 @@ static void ati_mm_write(void *opaque, hwaddr addr, case DST_WIDTH_HEIGHT: s->regs.dst_height =3D data & 0x3fff; s->regs.dst_width =3D (data >> 16) & 0x3fff; + ati_host_data_reset(&s->host_data); ati_2d_blt(s); break; case DST_HEIGHT_Y: @@ -1031,6 +1042,25 @@ static void ati_mm_write(void *opaque, hwaddr addr, case SRC_SC_BOTTOM: s->regs.src_sc_bottom =3D data & 0x3fff; break; + case HOST_DATA0: + case HOST_DATA1: + case HOST_DATA2: + case HOST_DATA3: + case HOST_DATA4: + case HOST_DATA5: + case HOST_DATA6: + case HOST_DATA7: + s->host_data.acc[s->host_data.next++] =3D data; + if (s->host_data.next >=3D 4) { + qemu_log_mask(LOG_UNIMP, "HOST_DATA flush not yet implemented\= n"); + s->host_data.next =3D 0; + } + break; + case HOST_DATA_LAST: + s->host_data.acc[s->host_data.next] =3D data; + qemu_log_mask(LOG_UNIMP, "HOST_DATA flush not yet implemented\n"); + ati_host_data_reset(&s->host_data); + break; default: break; } @@ -1124,6 +1154,8 @@ static void ati_vga_reset(DeviceState *dev) /* reset vga */ vga_common_reset(&s->vga); s->mode =3D VGA_MODE; + + ati_host_data_reset(&s->host_data); } =20 static void ati_vga_exit(PCIDevice *dev) diff --git a/hw/display/ati_dbg.c b/hw/display/ati_dbg.c index 3ffa7f35df..5c799d540a 100644 --- a/hw/display/ati_dbg.c +++ b/hw/display/ati_dbg.c @@ -252,6 +252,15 @@ static struct ati_regdesc ati_reg_names[] =3D { {"MC_SRC1_CNTL", 0x19D8}, {"TEX_CNTL", 0x1800}, {"RAGE128_MPP_TB_CONFIG", 0x01c0}, + {"HOST_DATA0", 0x17c0}, + {"HOST_DATA1", 0x17c4}, + {"HOST_DATA2", 0x17c8}, + {"HOST_DATA3", 0x17cc}, + {"HOST_DATA4", 0x17d0}, + {"HOST_DATA5", 0x17d4}, + {"HOST_DATA6", 0x17d8}, + {"HOST_DATA7", 0x17dc}, + {"HOST_DATA_LAST", 0x17e0}, {NULL, -1} }; =20 diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h index 7cf0933fa1..38725c57fa 100644 --- a/hw/display/ati_int.h +++ b/hw/display/ati_int.h @@ -91,6 +91,13 @@ typedef struct ATIVGARegs { uint16_t src_sc_right; } ATIVGARegs; =20 +typedef struct ATIHostDataState { + uint32_t row; + uint32_t col; + uint32_t next; + uint32_t acc[4]; +} ATIHostDataState; + struct ATIVGAState { PCIDevice dev; VGACommonState vga; @@ -107,6 +114,7 @@ struct ATIVGAState { MemoryRegion io; MemoryRegion mm; ATIVGARegs regs; + ATIHostDataState host_data; }; =20 const char *ati_reg_name(int num); diff --git a/hw/display/ati_regs.h b/hw/display/ati_regs.h index 3999edb9b7..48f15e9b1d 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -252,6 +252,15 @@ #define DP_T12_CNTL 0x178c #define DST_BRES_T1_LNTH 0x1790 #define DST_BRES_T2_LNTH 0x1794 +#define HOST_DATA0 0x17c0 +#define HOST_DATA1 0x17c4 +#define HOST_DATA2 0x17c8 +#define HOST_DATA3 0x17cc +#define HOST_DATA4 0x17d0 +#define HOST_DATA5 0x17d4 +#define HOST_DATA6 0x17d8 +#define HOST_DATA7 0x17dc +#define HOST_DATA_LAST 0x17e0 #define SCALE_SRC_HEIGHT_WIDTH 0x1994 #define SCALE_OFFSET_0 0x1998 #define SCALE_PITCH 0x199c --=20 2.51.2 From nobody Sat Feb 7 04:55:05 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=jablonski.xyz ARC-Seal: i=1; a=rsa-sha256; t=1768531523; cv=none; d=zohomail.com; s=zohoarc; b=bq7aj2a9jZ4BmMWEOsBxX5UYVBfTqcbJdnlv6LEWwhV/tTwMnznTFAzwQWL2n3vrJIvD43NEfRZ0aG5YK2Y1e5t493KNZHkBxkjYUKFxodW0CC29LSgqW23cgA4kCguEJrYi2/uIPctSf2scRv1N0Zgy0eoOmjjlLzM4bcHBGsU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768531523; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=zGvttkKy0pDSpTQds3P1akklhdg1e4l+VNLCN/ge4Jw=; b=GXPE0768yfYJHI3o1CzsF3sxiw42tq+RWSeK9hsciggKaaarz7ZiTFyHz3McYCS9A6YwfuGiixc+ssfMkxSvV2yeOEQA5bJR72w8xzDqWz9BJxt3FmLq/g6tCGLN2oTk9GRSElRVb6XBz44m1GlyxIoSz1NAbLJyrmfyfquZitw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768531523915236.75077697007453; Thu, 15 Jan 2026 18:45:23 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vgZoR-0005xT-II; Thu, 15 Jan 2026 21:43:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZo4-0005qo-N5 for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:28 -0500 Received: from fout-b8-smtp.messagingengine.com ([202.12.124.151]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vgZo0-0002SS-Hf for qemu-devel@nongnu.org; Thu, 15 Jan 2026 21:43:24 -0500 Received: from phl-compute-06.internal (phl-compute-06.internal [10.202.2.46]) by mailfout.stl.internal (Postfix) with ESMTP id 0C83A1D000A0; Thu, 15 Jan 2026 21:43:14 -0500 (EST) Received: from phl-frontend-03 ([10.202.2.162]) by phl-compute-06.internal (MEProxy); Thu, 15 Jan 2026 21:43:14 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 15 Jan 2026 21:43:13 -0500 (EST) Received: from localhost (chomposaur [local]) by chomposaur (OpenSMTPD) with ESMTPA id aa2df0d7; Fri, 16 Jan 2026 02:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1768531393; x= 1768617793; bh=zGvttkKy0pDSpTQds3P1akklhdg1e4l+VNLCN/ge4Jw=; b=B 9bRBmS63uO4ViZ8rV3SWK75EC0aTOWqTYUKEzWwXPhzx6oBePx4s5YiGUfqiYbTb 7/0bo5PYc2R7qWB15/97lY4rp66fqZLDvUKFqvkYZEHVP60b4qqfdyAl5jT7V7zk NJ5C1kjIhiRRcWempAbYENyi4DjnIOAR0F47Cbz25QbR79O2NlBgzuy2mw37+G+K fy07q9LDBKv9vjTtj0Igy/BWSf7HLn5mqx4T9MeFaRNxe2hSOVsPKoOhOdlvjqJN GI9n+k7xP43hDjT+WYm/LuTjCI7EHQQ4M8v+ZyHn+cbyjSAFYl9yXusYIXZrmeEy 32a0YZlGyF2FuXAiQh5bA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; t=1768531393; x=1768617793; bh=z GvttkKy0pDSpTQds3P1akklhdg1e4l+VNLCN/ge4Jw=; b=hAWPNqGf12XL5ePBb LeK2CUlO8YX8PZzBO+Wv85zLn40ivZPEcxnLRz6eM9J4v8RV5ngI9vHA93n5IUQe AZt7PT9Uu+Z+qmQxrjk6A2KVKovtlLD8by1l3lGFuyBSwZ/3h/c0czNHsx2+K3tf xhKTbXgbSUklPCMcO9mbMOMvPg2xQylUL5i2Zaa9e68al2qlxW5AYCJYsI7ValgS 0NBqtaVAclLPhY5TCmRdVCHZnSpT/Y0hvrDEdkrVwBFOJiRT2XlP5W4AYzBJMm22 eogvEsbPaiU9pdu3fXsFuThj2cFvU/kuEGLy9fAtMRiHNB4M5/Gldf97bxgWN7OX iq8yg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduvdejjeejucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdljedtmdenucfjughrpefhvfevuf ffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeevhhgrugculfgrsghlohhnshhk ihcuoegthhgrugesjhgrsghlohhnshhkihdrgiihiieqnecuggftrfgrthhtvghrnhepgf eiteejhfelheefieetjefgleejfffhueffvdduieejgfeuueeuvddvkeejhfelnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheptghhrggusehjrg gslhhonhhskhhirdighiiipdhnsggprhgtphhtthhopeefpdhmohguvgepshhmthhpohhu thdprhgtphhtthhopegthhgrugesjhgrsghlohhnshhkihdrgiihiidprhgtphhtthhope hqvghmuhdquggvvhgvlhesnhhonhhgnhhurdhorhhgpdhrtghpthhtohepsggrlhgrthho nhesvghikhdrsghmvgdrhhhu X-ME-Proxy: Feedback-ID: ib26944c1:Fastmail From: Chad Jablonski To: qemu-devel@nongnu.org Cc: balaton@eik.bme.hu, Chad Jablonski Subject: [PATCH v5 12/12] ati-vga: Implement HOST_DATA flush to VRAM Date: Thu, 15 Jan 2026 21:42:58 -0500 Message-ID: <20260116024258.1487173-13-chad@jablonski.xyz> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260116024258.1487173-1-chad@jablonski.xyz> References: <20260116024258.1487173-1-chad@jablonski.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=202.12.124.151; envelope-from=chad@jablonski.xyz; helo=fout-b8-smtp.messagingengine.com X-Spam_score_int: -2 X-Spam_score: -0.3 X-Spam_bar: / X-Spam_report: (-0.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.499, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @jablonski.xyz) X-ZM-MESSAGEID: 1768531525465158500 Content-Type: text/plain; charset="utf-8" Implement flushing the 128-bit HOST_DATA accumulator to VRAM to enable text rendering in X. Currently supports only the monochrome foreground/background datatype. The flush is broken up into two steps. First, expansion of the monochrome bits to the destination color depth. Then the expanded pixels are sent to the ati_2d_do_blt one scanline at a time. ati_2d_do_blt then clips and performs the blit. Signed-off-by: Chad Jablonski --- hw/display/ati.c | 4 +- hw/display/ati_2d.c | 85 ++++++++++++++++++++++++++++++++++++++++++- hw/display/ati_int.h | 3 ++ hw/display/ati_regs.h | 4 ++ 4 files changed, 93 insertions(+), 3 deletions(-) diff --git a/hw/display/ati.c b/hw/display/ati.c index e6868ddb8b..aa13c25f59 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -1052,13 +1052,13 @@ static void ati_mm_write(void *opaque, hwaddr addr, case HOST_DATA7: s->host_data.acc[s->host_data.next++] =3D data; if (s->host_data.next >=3D 4) { - qemu_log_mask(LOG_UNIMP, "HOST_DATA flush not yet implemented\= n"); + ati_flush_host_data(s); s->host_data.next =3D 0; } break; case HOST_DATA_LAST: s->host_data.acc[s->host_data.next] =3D data; - qemu_log_mask(LOG_UNIMP, "HOST_DATA flush not yet implemented\n"); + ati_flush_host_data(s); ati_host_data_reset(&s->host_data); break; default: diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c index a5dc5ba98e..5a0e918810 100644 --- a/hw/display/ati_2d.c +++ b/hw/display/ati_2d.c @@ -274,6 +274,12 @@ void ati_2d_blt(ATIVGAState *s) uint8_t *end =3D s->vga.vram_ptr + s->vga.vram_size; ATIBltDst dst; ATIBltSrc src; + uint32_t src_source =3D s->regs.dp_mix & DP_SRC_SOURCE; + + if (src_source =3D=3D DP_SRC_HOST || src_source =3D=3D DP_SRC_HOST_BYT= EALIGN) { + /* HOST_DATA sources are handled by ati_flush_host_data() */ + return; + } =20 setup_2d_blt_dst(s, &dst); =20 @@ -290,7 +296,6 @@ void ati_2d_blt(ATIVGAState *s) src.bits +=3D s->regs.crtc_offset & 0x07ffffff; src.stride *=3D dst.bpp; } - if (src.x > 0x3fff || src.y > 0x3fff || src.bits >=3D end || src.bits + src.x + (src.y + dst.rect.height) * src.stride >=3D end) { @@ -300,3 +305,81 @@ void ati_2d_blt(ATIVGAState *s) =20 ati_2d_do_blt(s, &src, &dst); } + +void ati_flush_host_data(ATIVGAState *s) +{ + ATIBltDst dst, chunk; + ATIBltSrc src; + uint32_t fg, bg; + unsigned bypp, row, col, idx; + uint8_t pix_buf[ATI_HOST_DATA_ACC_BITS * sizeof(uint32_t)]; + uint32_t byte_pix_order =3D s->regs.dp_datatype & DP_BYTE_PIX_ORDER; + + if ((s->regs.dp_mix & DP_SRC_SOURCE) !=3D DP_SRC_HOST) { + qemu_log_mask(LOG_UNIMP, "host_data_blt: only DP_SRC_HOST supporte= d\n"); + return; + } + if ((s->regs.dp_datatype & DP_SRC_DATATYPE) !=3D SRC_MONO_FRGD_BKGD) { + qemu_log_mask(LOG_UNIMP, + "host_data_blt: only SRC_MONO_FRGD_BKGD supported\n"= ); + return; + } + + setup_2d_blt_dst(s, &dst); + + if (!dst.left_to_right || !dst.top_to_bottom) { + qemu_log_mask(LOG_UNIMP, "host_data_blt: only L->R, T->B supported= \n"); + return; + } + + fg =3D s->regs.dp_src_frgd_clr; + bg =3D s->regs.dp_src_bkgd_clr; + bypp =3D dst.bpp / 8; + + /* Expand monochrome bits to color pixels */ + idx =3D 0; + for (int word =3D 0; word < 4; word++) { + for (int byte =3D 0; byte < 4; byte++) { + uint8_t byte_val =3D s->host_data.acc[word] >> (byte * 8); + for (int i =3D 0; i < 8; i++) { + int bit =3D byte_pix_order ? i : (7 - i); + bool is_fg =3D extract8(byte_val, bit, 1); + uint32_t color =3D is_fg ? fg : bg; + stn_he_p(&pix_buf[idx * bypp], bypp, color); + idx +=3D 1; + } + } + } + + /* Set up source to point at pix_buf (treated as a single row) */ + src.bits =3D pix_buf; + src.y =3D 0; + src.stride =3D ATI_HOST_DATA_ACC_BITS * bypp; + + /* Copy to VRAM one scanline chunk at a time */ + row =3D s->host_data.row; + col =3D s->host_data.col; + idx =3D 0; + chunk =3D dst; + while (idx < ATI_HOST_DATA_ACC_BITS && row < dst.rect.height) { + unsigned pix_in_scanline =3D MIN(ATI_HOST_DATA_ACC_BITS - idx, + dst.rect.width - col); + src.x =3D idx; + /* Build a rect for this scanline chunk */ + qemu_rect_init(&chunk.rect, + dst.rect.x + col, + dst.rect.y + row, + pix_in_scanline, 1); + ati_2d_do_blt(s, &src, &chunk); + idx +=3D pix_in_scanline; + col +=3D pix_in_scanline; + if (col >=3D dst.rect.width) { + col =3D 0; + row +=3D 1; + } + } + + /* Track state of the overall blit for use by the next flush */ + s->host_data.row =3D row; + s->host_data.col =3D col; +} diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h index 38725c57fa..ff7148a71a 100644 --- a/hw/display/ati_int.h +++ b/hw/display/ati_int.h @@ -29,6 +29,8 @@ /* Radeon RV100 (VE) */ #define PCI_DEVICE_ID_ATI_RADEON_QY 0x5159 =20 +#define ATI_HOST_DATA_ACC_BITS 128 + #define TYPE_ATI_VGA "ati-vga" OBJECT_DECLARE_SIMPLE_TYPE(ATIVGAState, ATI_VGA) =20 @@ -120,5 +122,6 @@ struct ATIVGAState { const char *ati_reg_name(int num); =20 void ati_2d_blt(ATIVGAState *s); +void ati_flush_host_data(ATIVGAState *s); =20 #endif /* ATI_INT_H */ diff --git a/hw/display/ati_regs.h b/hw/display/ati_regs.h index 48f15e9b1d..9d08d3e956 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -397,7 +397,11 @@ #define DST_32BPP 0x00000006 #define DP_DST_DATATYPE 0x0000000f #define DP_BRUSH_DATATYPE 0x00000f00 +#define SRC_MONO_FRGD_BKGD 0x00000000 +#define SRC_MONO_FRGD 0x00010000 +#define SRC_COLOR 0x00020000 #define DP_SRC_DATATYPE 0x00030000 +#define DP_BYTE_PIX_ORDER 0x40000000 =20 #define BRUSH_SOLIDCOLOR 0x00000d00 =20 --=20 2.51.2