From patchwork Wed May 21 16:42:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 891533 Delivered-To: patch@linaro.org Received: by 2002:adf:e88a:0:b0:3a3:61c9:c5d4 with SMTP id d10csp2220889wrm; Wed, 21 May 2025 09:45:43 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCX2LGGJ16a50yMZU6uZxieWKv8Fig3kvl351XgI7J7HEko54isXV1LNN5o5it9BRjByDaQXJg==@linaro.org X-Google-Smtp-Source: AGHT+IFq/YHX70V0iAIrfHJqDwMVQuIvTqDSjiwiP7NXBK4u4mt5DGQENSrjASrNVHaE76837Qqt X-Received: by 2002:a05:6602:380d:b0:864:4aa2:d796 with SMTP id ca18e2360f4ac-86a231e19e9mr2851529439f.8.1747845943173; Wed, 21 May 2025 09:45:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1747845943; cv=none; d=google.com; s=arc-20240605; b=YUqxWl98pk8ZF1iTdMnYS0gsYyXfv8FdHjoC5Wm51H2AteRdQVzMwxZMEj+YzXq4bq VxiuuVEWzDwoAJTweF9zJdNbUCNdjSvxODEsL5DpXKXRVxogLAg/O8ne0n0BJQqhtLR1 lzFbdR0KQTXBpI12BEdoZd97ostqpd88cRNST8++stBqj0F1n448aUHvpbIMd156cpl4 WCx/x9ODwSr9Cg9wGjXHAeQe35hmPjVlHSj4vWwKpuSbNrRtfVh0MKZvA5X6uAgs0uS8 UVqTwv+fmTyXVtaZqsdqks131fJVe4Vdqo4fc5f1TGr0Spk5NH7oeDmoMg6POSRsgq3r 7lyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=pG9XWhKCR2jO9+YNKPkqKviUCLU54wRtte2g15lS7XE=; fh=9dXdp1N/Zv6Tsk/dt5NdOUo246y9Evj9pnzPq91JbJ8=; b=H+7ISQkgUyubLahZYDhGSMcZqd5yKgSjhsPp5JtobeLaMmQBr5uiFZrc6N0okuUutz exxQUUr8s3A1zbxrKNxdPIY4eGimxLafKtCtURs68D4v5wssIHGnL8M+hz58PF5w2xe+ rBTo2cvosmjooOJrCYrm9EpuqagtCkaMqGpWttcDsX6fdFFTRr8p5l/jKLFLeNCiwIpG VBCvsE/bm72MA4YN6ezyRmu9yB49ptROBzl8CQvmmhEp8N8TgMXg1rWdTuHuHXQRlDQd +L/ZI8JjmRwLyR4uFYhjmnj0T5twFPS0jwz+uB025uKQutjfYeqi4zbaQjdzAD0jHecz Q/jw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=uDDC6gqt; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org; dara=neutral header.i=@linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id ca18e2360f4ac-86a236f9e1dsi915271639f.94.2025.05.21.09.45.42 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 21 May 2025 09:45:43 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=uDDC6gqt; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org; dara=neutral header.i=@linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uHmXM-0000ds-4U; Wed, 21 May 2025 12:43:24 -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 1uHmXK-0000dA-Ep for qemu-devel@nongnu.org; Wed, 21 May 2025 12:43:22 -0400 Received: from mail-ed1-x529.google.com ([2a00:1450:4864:20::529]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uHmX5-0006Cx-2s for qemu-devel@nongnu.org; Wed, 21 May 2025 12:43:22 -0400 Received: by mail-ed1-x529.google.com with SMTP id 4fb4d7f45d1cf-60179d8e65fso3079192a12.0 for ; Wed, 21 May 2025 09:43:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1747845785; x=1748450585; 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=pG9XWhKCR2jO9+YNKPkqKviUCLU54wRtte2g15lS7XE=; b=uDDC6gqt5VqdPPoeT9rac3eD+fyLahsBYGPSkWQ8aYrJXCXEsbLLYWyU38bc/ulf7X llMYX9OTiD40FXL2xYs90lOVzYAbhCHPnaW41ZuiGB7YiIf8yoKIoXXMyZemlgqi9szP f31kVl3VW9SUR3Cmzv2XE1XFqnDzOugFDRSKWkWsRWsaQ9Jh4xTNke5MKZaJXFJ+XWFa JLXfgzJk5SqVrR0MeCGJb3wxhFKomwK6qwLRo2ux1wTDaTh9696d+n0lAYifWjcwBirI mSVi045HNa4mIPLBERaq8BM5tjtV7DIitmZtjAYycuay9nRu4udgmVaDKVsH5HhHyo7U vUBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747845785; x=1748450585; 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=pG9XWhKCR2jO9+YNKPkqKviUCLU54wRtte2g15lS7XE=; b=KJnSIZrMPenv5VT0KxK7tx8hDEjykksefG19Uu/ZQR3ShAcwpopIZfzg7xVIWUPPzn mNU+xR8HFaJjuacixHP23Vb9rKRPnuw3cltdGYcqo0odsX0uwU1AGew120I/ZCBEzyXk Mu5uvOPS229SJpvRwOOXTGYalez4m72yuUhe+JBXc2P3dQDJaMTJ21G23A41QHyLb5Ee TJgWs1N0CuTA9BNfaDqYvOzFIojbpuNE7oS2cEPbjSNf1SDrLT2F5n4+VnWNtWYxG36e 00xw6KDUB/NdNqnVA31LLIPXhiGnf5/ONgBsYobJFqb0NkfbrzZTF4c+OLLUcAXxhVRz 3QMw== X-Gm-Message-State: AOJu0Yw8ZlZwHzAhdy9cboYnHh5PcMrle6uIWAegeI7agQ3akBQ2IvFP EQO/NPe/BVH9RYiabuQwoozdCo7U4bTQrWsZ4Rmf0scmMs28YzlqKxKhxLAGUFeSHDs= X-Gm-Gg: ASbGncvnV6flVUaXH8WphI9BjUBNB+axpTnKh8xPwKgryWDYDmAmMpVkffxdxTN6ero 8d+A8M0aAYJmsOFpyBmxalreerYVDTCIF/UMoWGALqpP8WGYewBKukuDA+dWkXATwPJIJfMcVKv ++aJrOerJhD5rRuTy+qe8uOtMAQE+vvaW37JHHjHEwdzOSOqFr92XHKvz07fG1bzpcfFdK/NTtP EJthHauZEWQj8JIDBuBY+Q9a5wdDwKqvaj7zLqCuVf/L0GthsGI8kQPc/LQNp4N3yaGyKhEYojw 0Ez5lH5tr34dnEIAjSkhnQ4MI+oAx7k8drBrAq9Q/Z5dl9ym8/Td X-Received: by 2002:a05:6402:2793:b0:602:1b8b:290c with SMTP id 4fb4d7f45d1cf-6021b8b2c65mr5564251a12.4.1747845784826; Wed, 21 May 2025 09:43:04 -0700 (PDT) Received: from draig.lan ([185.126.160.19]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6005a6e5383sm9093212a12.37.2025.05.21.09.42.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 May 2025 09:43:01 -0700 (PDT) Received: from draig.lan (localhost [IPv6:::1]) by draig.lan (Postfix) with ESMTP id 5D98E5FAF9; Wed, 21 May 2025 17:42:51 +0100 (BST) From: =?utf-8?q?Alex_Benn=C3=A9e?= To: qemu-devel@nongnu.org Cc: Pierrick Bouvier , =?utf-8?q?Alex_Benn?= =?utf-8?q?=C3=A9e?= , Thomas Huth , Paolo Bonzini , Akihiko Odaki , John Snow , Fabiano Rosas , Peter Xu , =?utf-8?q?Ma?= =?utf-8?q?rc-Andr=C3=A9_Lureau?= , Alexandre Iooss , Markus Armbruster , David Hildenbrand , Laurent Vivier , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= , Peter Maydell , qemu-arm@nongnu.org, =?utf-8?q?Ph?= =?utf-8?q?ilippe_Mathieu-Daud=C3=A9?= , Mahmoud Mandour , Sriram Yagnaraman , Dmitry Osipenko , Gustavo Romero , "Michael S. Tsirkin" , Yiwei Zhang , qemu-stable@nongnu.org Subject: [PATCH v3 15/20] virtio-gpu: support context init multiple timeline Date: Wed, 21 May 2025 17:42:45 +0100 Message-Id: <20250521164250.135776-16-alex.bennee@linaro.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250521164250.135776-1-alex.bennee@linaro.org> References: <20250521164250.135776-1-alex.bennee@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::529; envelope-from=alex.bennee@linaro.org; helo=mail-ed1-x529.google.com X-Spam_score_int: 12 X-Spam_score: 1.2 X-Spam_bar: + X-Spam_report: (1.2 / 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, RCVD_IN_SBL_CSS=3.335, SPF_HELO_NONE=0.001, SPF_PASS=-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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org 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: 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] Signed-off-by: Alex Bennée --- 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 32a32879f7..900577a38c 100644 --- a/hw/display/virtio-gpu-virgl.c +++ b/hw/display/virtio-gpu-virgl.c @@ -978,6 +978,15 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g, } trace_virtio_gpu_fence_ctrl(cmd->cmd_hdr.fence_id, cmd->cmd_hdr.type); +#if VIRGL_VERSION_MAJOR >= 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_MERGEABLE, + 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); } @@ -991,6 +1000,11 @@ static void virgl_write_fence(void *opaque, uint32_t fence) * 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 >= 1 + if (cmd->cmd_hdr.flags & VIRTIO_GPU_FLAG_INFO_RING_IDX) { + continue; + } +#endif if (cmd->cmd_hdr.fence_id > fence) { continue; } @@ -1005,6 +1019,29 @@ static void virgl_write_fence(void *opaque, uint32_t fence) } } +#if VIRGL_VERSION_MAJOR >= 1 +static void virgl_write_context_fence(void *opaque, uint32_t ctx_id, + uint32_t ring_idx, uint64_t fence_id) { + VirtIOGPU *g = 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 == ctx_id && cmd->cmd_hdr.ring_idx == ring_idx && + cmd->cmd_hdr.fence_id <= fence_id) { + trace_virtio_gpu_fence_resp(cmd->cmd_hdr.fence_id); + virtio_gpu_ctrl_response_nodata(g, cmd, VIRTIO_GPU_RESP_OK_NODATA); + 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) @@ -1039,11 +1076,18 @@ static int virgl_make_context_current(void *opaque, int scanout_idx, } static struct virgl_renderer_callbacks virtio_gpu_3d_cbs = { +#if VIRGL_VERSION_MAJOR >= 1 + .version = 3, +#else .version = 1, +#endif .write_fence = virgl_write_fence, .create_gl_context = virgl_create_context, .destroy_gl_context = virgl_destroy_context, .make_current = virgl_make_context_current, +#if VIRGL_VERSION_MAJOR >= 1 + .write_context_fence = virgl_write_context_fence, +#endif }; static void virtio_gpu_print_stats(void *opaque)