From nobody Tue Feb 10 07:00:10 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1751024027; cv=none; d=zohomail.com; s=zohoarc; b=A7CQNUCrt9V56TG41pEE3AKeo4uLnlZ4k5DtBQTjRA9m661m0Ipc9fnastXx80EQaf22rZm/34PIcIiez0bb1b5izrVU9GZ96NfT0m0OGWWlLtGzEV61Yv9FSely7h+PgTjEoVvmE3CuStPASvFymjdCbV8ORo8KaAKSe0PyFwE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1751024027; h=Content-Type: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=soWxuif64h/OC65E1QvfLFWlQOaNN3QDI4MloSvMEPg=; b=fxK0lvKETAuM+4m08ZFb4bcF+HlhDoVOCn7jN0XWQitllDedNhVrXfgFYdekSAnDMliZnbrI+NNiBJihXARJGtduWv6nMrlQc1LtWPKvEWK74oE/CvyYlrxK84jsUdlvyCjyoau7dlfHzUxpYmkGZis+NwfkGZnC0jpRbIXGcVU= 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 1751024027294959.7442743648451; Fri, 27 Jun 2025 04:33:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uV7Kk-0000Se-BD; Fri, 27 Jun 2025 07:33: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 1uV7KT-0000NF-2F for qemu-devel@nongnu.org; Fri, 27 Jun 2025 07:33:13 -0400 Received: from mail-wr1-x42a.google.com ([2a00:1450:4864:20::42a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uV7KP-0001Vr-63 for qemu-devel@nongnu.org; Fri, 27 Jun 2025 07:33:12 -0400 Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-3a50fc819f2so1456530f8f.2 for ; Fri, 27 Jun 2025 04:33:08 -0700 (PDT) Received: from draig.lan ([185.126.160.19]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45380d0f15esm69934365e9.1.2025.06.27.04.33.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Jun 2025 04:33:04 -0700 (PDT) Received: from draig.lan (localhost [IPv6:::1]) by draig.lan (Postfix) with ESMTP id AD1A35F924; Fri, 27 Jun 2025 12:25:13 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1751023987; x=1751628787; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=soWxuif64h/OC65E1QvfLFWlQOaNN3QDI4MloSvMEPg=; b=dcXLxxlNuF9/coLBX23SNN7ses5WPCmRExq/H8SGDGFjqnAgapEKPX3deD17byb7ls 7qlTXCfBQ0UoCXIzGbGL4BGLeyVOSGOm5Nn9Rh0++9z1yezCKR01a3/H4nSQeAIMyfgT rol7Jcr2Kkf91TZaeCE5NM/Y12oJChq8Sb2wgUzpi1mNxrHZ+3ck6dKbM3tcShQx3Aae 38D/+NDYqyKpaXiz8vZvIhxc0RDYm5/igcYBHY1v77eCbdtKzMXBbWY4FCSdwZu5Ntgv 3C/UKkB5Y0hKOo4NZBl+cAiNBdIAuxJPjDfYfH/bIQxzzMMgWmYoqleXiRuOHKq9V1zS nsyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751023987; x=1751628787; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=soWxuif64h/OC65E1QvfLFWlQOaNN3QDI4MloSvMEPg=; b=ucLWO33JMGSAMMMGBbx1LbA+ZDm/s+a5Lq0+9xgQcR3VhIFxL7oWu8ST99yqgSg5Fe fnvHxrWXJzVtf2FfNSyCjyV2kBomgbkh/LsHcGGL36tRa981sXz/j1jrVmGoesV+oveO oNqwEj8FFPsgFUvq6YXjiSg5Q54kQ7FTLH5ld6QTNE/8TKKCmv14PtDWAij3cPMjA+kO VBOTzZOq78P+4YhVBpOKh317ULK0rHTcEnvThOEhmkca1gbtuJpqRUaCFFzOngNr2keD OMhZeo/WqUgAKxd7FqD5gODUr2pJmiwxbFG/awA8u74gCSvCa4ENg7beQQlxln/+0VEM YKhw== X-Gm-Message-State: AOJu0Yynb7aMGEufA60/JIcEsYFfsk1oJfOlExDTIxFXNKD5WsI+OxrM 6RtvfgEAF28aSowAOQWkgIRMfz+8EXQjPqkYgNR8jF8LqsVTrZyFlBArxMwSTWtXOiY= X-Gm-Gg: ASbGncsyIODX1gcQh7SAKcL1eIuN1dV2KyFZ0QOkyRyKJESw05vjZaXv6JLqygGs4N8 HuOXO7f1TuGwj7VkbokKd7cOJ13hj8ViN8tHvOOKVCUZuuo84yCpjD4vYEHE0vAwpklhw+F36WD nzEH9GbzbOZDfryvyWbof3ZW4k7hYdWceOvvJ9SbizIqSFlDXt5A3IOCoamBoQ3WrG5SVWL9IJZ TUlzGGSVtUE/xJRc5TuMJQdg7YfVxWzD+CUG1J9gs71VB8DFSx0L+/wpStBwDezRbVz72qmT870 Jv7PMn4u3u9q96xnZRaOBJCr1q4Em1ga95BpSVcYXZDTc6B5jNN6gnRnpggAMjmqKaf3161hrw= = X-Google-Smtp-Source: AGHT+IEraiR9fU256rtMKCUJ5oYR82VOMyqYS7B5g9SZnIsu9lH2V56HIcyhtm3ZWv1SvRrrM/2l/w== X-Received: by 2002:a05:6000:490a:b0:3a5:2949:6c38 with SMTP id ffacd0b85a97d-3a91846d660mr2762903f8f.52.1751023986998; Fri, 27 Jun 2025 04:33:06 -0700 (PDT) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: Thomas Huth , qemu-arm@nongnu.org, Gustavo Romero , Dmitry Osipenko , Pierrick Bouvier , Mahmoud Mandour , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Richard Henderson , Paolo Bonzini , Yanan Wang , qemu-s390x@nongnu.org, Eduardo Habkost , "Michael S. Tsirkin" , Marcel Apfelbaum , Zhao Liu , Akihiko Odaki , Alexandre Iooss , Yiwei Zhang , qemu-stable@nongnu.org Subject: [PATCH 15/15] virtio-gpu: support context init multiple timeline Date: Fri, 27 Jun 2025 12:25:11 +0100 Message-ID: <20250627112512.1880708-16-alex.bennee@linaro.org> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250627112512.1880708-1-alex.bennee@linaro.org> References: <20250627112512.1880708-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 client-ip=2a00:1450:4864:20::42a; envelope-from=alex.bennee@linaro.org; helo=mail-wr1-x42a.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1751024030789116600 From: Yiwei Zhang Venus and later native contexts have their own fence context along with multiple timelines within. Fences wtih VIRTIO_GPU_FLAG_INFO_RING_IDX in the flags must be dispatched to be created on the target context. Fence signaling also has to be handled on the specific timeline within that target context. Before this change, venus fencing is completely broken if the host driver doesn't support implicit fencing with external memory objects. Frames can go backwards along with random artifacts on screen if the host driver doesn't attach an implicit fence to the render target. The symptom could be hidden by certain guest wsi backend that waits on a venus native VkFence object for the actual payload with limited present modes or under special configs. e.g. x11 mailbox or xwayland. After this change, everything related to venus fencing starts making sense. Confirmed this via guest and host side perfetto tracing. Cc: qemu-stable@nongnu.org Fixes: 94d0ea1c1928 ("virtio-gpu: Support Venus context") Signed-off-by: Yiwei Zhang Reviewed-by: Dmitry Osipenko Message-Id: <20250518152651.334115-1-zzyiwei@gmail.com> [AJB: remove version history from commit message] Tested-by: Dmitry Osipenko Signed-off-by: Alex Benn=C3=A9e Message-ID: <20250603110204.838117-13-alex.bennee@linaro.org> --- hw/display/virtio-gpu-virgl.c | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c index 145a0b3879..94ddc01f91 100644 --- a/hw/display/virtio-gpu-virgl.c +++ b/hw/display/virtio-gpu-virgl.c @@ -970,6 +970,15 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g, } =20 trace_virtio_gpu_fence_ctrl(cmd->cmd_hdr.fence_id, cmd->cmd_hdr.type); +#if VIRGL_VERSION_MAJOR >=3D 1 + if (cmd->cmd_hdr.flags & VIRTIO_GPU_FLAG_INFO_RING_IDX) { + virgl_renderer_context_create_fence(cmd->cmd_hdr.ctx_id, + VIRGL_RENDERER_FENCE_FLAG_MERG= EABLE, + cmd->cmd_hdr.ring_idx, + cmd->cmd_hdr.fence_id); + return; + } +#endif virgl_renderer_create_fence(cmd->cmd_hdr.fence_id, cmd->cmd_hdr.type); } =20 @@ -983,6 +992,11 @@ static void virgl_write_fence(void *opaque, uint32_t f= ence) * the guest can end up emitting fences out of order * so we should check all fenced cmds not just the first one. */ +#if VIRGL_VERSION_MAJOR >=3D 1 + if (cmd->cmd_hdr.flags & VIRTIO_GPU_FLAG_INFO_RING_IDX) { + continue; + } +#endif if (cmd->cmd_hdr.fence_id > fence) { continue; } @@ -997,6 +1011,29 @@ static void virgl_write_fence(void *opaque, uint32_t = fence) } } =20 +#if VIRGL_VERSION_MAJOR >=3D 1 +static void virgl_write_context_fence(void *opaque, uint32_t ctx_id, + uint32_t ring_idx, uint64_t fence_id= ) { + VirtIOGPU *g =3D opaque; + struct virtio_gpu_ctrl_command *cmd, *tmp; + + QTAILQ_FOREACH_SAFE(cmd, &g->fenceq, next, tmp) { + if (cmd->cmd_hdr.flags & VIRTIO_GPU_FLAG_INFO_RING_IDX && + cmd->cmd_hdr.ctx_id =3D=3D ctx_id && cmd->cmd_hdr.ring_idx =3D= =3D ring_idx && + cmd->cmd_hdr.fence_id <=3D fence_id) { + trace_virtio_gpu_fence_resp(cmd->cmd_hdr.fence_id); + virtio_gpu_ctrl_response_nodata(g, cmd, VIRTIO_GPU_RESP_OK_NOD= ATA); + QTAILQ_REMOVE(&g->fenceq, cmd, next); + g_free(cmd); + g->inflight--; + if (virtio_gpu_stats_enabled(g->parent_obj.conf)) { + trace_virtio_gpu_dec_inflight_fences(g->inflight); + } + } + } +} +#endif + static virgl_renderer_gl_context virgl_create_context(void *opaque, int scanout_idx, struct virgl_renderer_gl_ctx_param *params) @@ -1031,11 +1068,18 @@ static int virgl_make_context_current(void *opaque,= int scanout_idx, } =20 static struct virgl_renderer_callbacks virtio_gpu_3d_cbs =3D { +#if VIRGL_VERSION_MAJOR >=3D 1 + .version =3D 3, +#else .version =3D 1, +#endif .write_fence =3D virgl_write_fence, .create_gl_context =3D virgl_create_context, .destroy_gl_context =3D virgl_destroy_context, .make_current =3D virgl_make_context_current, +#if VIRGL_VERSION_MAJOR >=3D 1 + .write_context_fence =3D virgl_write_context_fence, +#endif }; =20 static void virtio_gpu_print_stats(void *opaque) --=20 2.47.2