From nobody Thu Sep 19 00:53:58 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1721214375789952.4219068776126; Wed, 17 Jul 2024 04:06:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sU2TS-0005hu-2v; Wed, 17 Jul 2024 07:05:30 -0400 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 1sU2Sj-0001qM-3g for qemu-devel@nongnu.org; Wed, 17 Jul 2024 07:04:47 -0400 Received: from 89-104-8-17.customer.bnet.at ([89.104.8.17] helo=intel-mbp.local) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sU2Sa-000734-6H for qemu-devel@nongnu.org; Wed, 17 Jul 2024 07:04:41 -0400 Received: by intel-mbp.local (Postfix, from userid 501) id A7D3038F9CC; Wed, 17 Jul 2024 13:04:06 +0200 (CEST) From: Phil Dennis-Jordan To: qemu-devel@nongnu.org, agraf@csgraf.de, pbonzini@redhat.com, phil@philjordan.eu, marcandre.lureau@redhat.com, berrange@redhat.com, thuth@redhat.com, philmd@linaro.org, akihiko.odaki@daynix.com, peter.maydell@linaro.org Subject: [PATCH v2 6/8] hw/display/apple-gfx: Host GPU picking improvements Date: Wed, 17 Jul 2024 13:03:24 +0200 Message-Id: <20240717110326.45230-7-phil@philjordan.eu> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20240717110326.45230-1-phil@philjordan.eu> References: <20240717110326.45230-1-phil@philjordan.eu> 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: none client-ip=89.104.8.17; envelope-from=phil@intel-mbp.local; helo=intel-mbp.local X-Spam_score_int: -5 X-Spam_score: -0.6 X-Spam_bar: / X-Spam_report: (-0.6 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.001, KHOP_HELO_FCRDNS=0.261, NO_DNS_FOR_FROM=0.001, RDNS_DYNAMIC=0.982, SPF_HELO_NONE=0.001, TVD_RCVD_IP=0.001, T_SPF_TEMPERROR=0.01 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: 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-ZM-MESSAGEID: 1721214376451116600 Content-Type: text/plain; charset="utf-8" During startup of the PV graphics device, we need to specify the host GPU to use for PV acceleration of the guest's graphics operations. On a host system, this is trivial: pick the only one. The MTLCreateSystemDefaultDevice() function will do the right thing in this case. It gets a little more complicated on systems with more than one GPU; first and foremost, this applies to x86-64 MacBook Pros with 15/16" displays. However, with eGPUs, in theory any x86-64 Mac can gain one or more additional GPUs. In these cases, the default is often not ideal - usually, discrete GPUs are selected. In my tests, performance tends to be best with iGPUs, however, and they are usually also best in terms of energy consumption. Ideally, we will want to allow the user to manually select a GPU if they so choose. In this patch, I am interested in picking a sensible default. Instead of the built-in default logic, it is now: 1. Select a GPU with unified memory (iGPU) 2. If (1) fails, select a GPU that is built-in, not an eGPU. 3. If (2) fails, fall back to system default. Signed-off-by: Phil Dennis-Jordan --- hw/display/apple-gfx.m | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/hw/display/apple-gfx.m b/hw/display/apple-gfx.m index 6f374455f9..018db8bf19 100644 --- a/hw/display/apple-gfx.m +++ b/hw/display/apple-gfx.m @@ -500,6 +500,32 @@ static void apple_gfx_register_task_mapping_handlers(A= ppleGFXState *s, return mode_array; } =20 +static id copy_suitable_metal_device(void) +{ + id dev =3D nil; + NSArray> *devs =3D MTLCopyAllDevices(); + + /* Prefer a unified memory GPU. Failing that, pick a non-removable GPU= . */ + for (size_t i =3D 0; i < devs.count; ++i) { + if (devs[i].hasUnifiedMemory) { + dev =3D devs[i]; + break; + } + if (!devs[i].removable) { + dev =3D devs[i]; + } + } + + if (dev !=3D nil) { + [dev retain]; + } else { + dev =3D MTLCreateSystemDefaultDevice(); + } + [devs release]; + + return dev; +} + void apple_gfx_common_realize(AppleGFXState *s, PGDeviceDescriptor *desc) { PGDisplayDescriptor *disp_desc =3D nil; @@ -507,7 +533,7 @@ void apple_gfx_common_realize(AppleGFXState *s, PGDevic= eDescriptor *desc) QTAILQ_INIT(&s->tasks); s->render_queue =3D dispatch_queue_create("apple-gfx.render", DISPATCH_QUEUE_SERIAL); - s->mtl =3D MTLCreateSystemDefaultDevice(); + s->mtl =3D copy_suitable_metal_device(); s->mtl_queue =3D [s->mtl newCommandQueue]; =20 desc.device =3D s->mtl; --=20 2.39.3 (Apple Git-146)