From: Joelle van Dyne <j@getutm.app>
To: qemu-devel@nongnu.org
Cc: "Joelle van Dyne" <j@getutm.app>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Akihiko Odaki" <odaki@rsg.ci.i.u-tokyo.ac.jp>,
"Dmitry Osipenko" <dmitry.osipenko@collabora.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>
Subject: [PATCH RFC 7/7] virtio-gpu-virgl: add support for native blob scanout
Date: Tue, 2 Dec 2025 20:07:54 -0800 [thread overview]
Message-ID: <20251203040754.94487-8-j@getutm.app> (raw)
In-Reply-To: <20251203040754.94487-1-j@getutm.app>
On macOS we do not have dmabuf and so we use MTLTexture as our scanout
source. For blob scanout, the buffer is untyped and so we cannot get a
MTLTexture until we pass more information to virglrenderer (surface size,
pixel format, etc). The new API to do this is currently unstable so we
need to define `VIRGL_RENDERER_UNSTABLE_APIS`. This should be removed after
the ABI becomes stable.
Signed-off-by: Joelle van Dyne <j@getutm.app>
---
meson.build | 5 +++
hw/display/virtio-gpu-virgl.c | 60 +++++++++++++++++++++++++++++++++++
2 files changed, 65 insertions(+)
diff --git a/meson.build b/meson.build
index 05bad66376..8917aff044 100644
--- a/meson.build
+++ b/meson.build
@@ -2549,6 +2549,11 @@ config_host_data.set('CONFIG_VNC', vnc.found())
config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
config_host_data.set('CONFIG_VNC_SASL', sasl.found())
if virgl.found()
+ config_host_data.set('HAVE_VIRGL_RENDERER_NATIVE_SCANOUT',
+ cc.has_function('virgl_renderer_create_handle_for_scanout',
+ args: '-DVIRGL_RENDERER_UNSTABLE_APIS',
+ prefix: '#include <virglrenderer.h>',
+ dependencies: virgl))
config_host_data.set('VIRGL_VERSION_MAJOR', virgl.version().split('.')[0])
endif
config_host_data.set('CONFIG_VIRTFS', have_virtfs)
diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
index b7bc095676..3ef37645ca 100644
--- a/hw/display/virtio-gpu-virgl.c
+++ b/hw/display/virtio-gpu-virgl.c
@@ -22,6 +22,7 @@
#include "ui/egl-helpers.h"
+#define VIRGL_RENDERER_UNSTABLE_APIS
#include <virglrenderer.h>
#define SUPPORTED_VIRGL_INFO_EXT_VERSION (1)
@@ -848,6 +849,59 @@ static void virgl_cmd_resource_unmap_blob(VirtIOGPU *g,
}
}
+#if defined(HAVE_VIRGL_RENDERER_NATIVE_SCANOUT)
+static void virgl_scanout_native_blob_cleanup(ScanoutTextureNative *native)
+{
+ assert(native->type == SCANOUT_TEXTURE_NATIVE_TYPE_METAL);
+ virgl_renderer_release_handle_for_scanout(VIRGL_NATIVE_HANDLE_METAL_TEXTURE,
+ native->u.metal_texture);
+}
+
+static bool virgl_scanout_native_blob(VirtIOGPU *g,
+ struct virtio_gpu_set_scanout_blob *ss)
+{
+ struct virtio_gpu_scanout *scanout = &g->parent_obj.scanout[ss->scanout_id];
+ enum virgl_renderer_native_handle_type type;
+ virgl_renderer_native_handle handle;
+ ScanoutTextureNative native;
+
+ type = virgl_renderer_create_handle_for_scanout(ss->resource_id,
+ ss->width,
+ ss->height,
+ ss->format,
+ ss->padding,
+ ss->strides[0],
+ ss->offsets[0],
+ &handle);
+#ifdef CONFIG_METAL
+ if (type == VIRGL_NATIVE_HANDLE_METAL_TEXTURE) {
+ native = (ScanoutTextureNative){
+ .type = SCANOUT_TEXTURE_NATIVE_TYPE_METAL,
+ .u.metal_texture = handle,
+ };
+ qemu_console_resize(scanout->con,
+ ss->r.width, ss->r.height);
+ dpy_gl_scanout_texture(
+ scanout->con, 0,
+ false,
+ ss->width, ss->height,
+ ss->r.x, ss->r.y, ss->r.width, ss->r.height,
+ native, virgl_scanout_native_blob_cleanup);
+ scanout->resource_id = ss->resource_id;
+
+ return true;
+ }
+#endif
+
+ /* don't leak memory if handle type is unknown */
+ if (type != VIRGL_NATIVE_HANDLE_NONE) {
+ virgl_renderer_release_handle_for_scanout(type, handle);
+ }
+
+ return false;
+}
+#endif
+
static void virgl_cmd_set_scanout_blob(VirtIOGPU *g,
struct virtio_gpu_ctrl_command *cmd)
{
@@ -886,6 +940,12 @@ static void virgl_cmd_set_scanout_blob(VirtIOGPU *g,
return;
}
+#if defined(HAVE_VIRGL_RENDERER_NATIVE_SCANOUT)
+ if (virgl_scanout_native_blob(g, &ss)) {
+ return;
+ }
+#endif
+
res = virtio_gpu_virgl_find_resource(g, ss.resource_id);
if (!res) {
qemu_log_mask(LOG_GUEST_ERROR, "%s: resource does not exist %d\n",
--
2.41.0
prev parent reply other threads:[~2025-12-03 4:09 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-03 4:07 [PATCH RFC 0/7] virtio-gpu-virgl: introduce Venus support for macOS Joelle van Dyne
2025-12-03 4:07 ` [PATCH RFC 1/7] egl-helpers: store handle to native device Joelle van Dyne
2025-12-04 6:29 ` Akihiko Odaki
2025-12-03 4:07 ` [PATCH RFC 2/7] virtio-gpu-virgl: check page alignment of blob mapping Joelle van Dyne
2025-12-04 2:55 ` Akihiko Odaki
2025-12-04 4:01 ` Joelle van Dyne
2025-12-04 5:31 ` Akihiko Odaki
2025-12-11 4:09 ` Mohamed Mediouni
2025-12-03 4:07 ` [PATCH RFC 3/7] console: rename `d3d_tex2d` to `native` Joelle van Dyne
2025-12-04 6:40 ` Akihiko Odaki
2025-12-04 10:53 ` Marc-André Lureau
2025-12-03 4:07 ` [PATCH RFC 4/7] virtio-gpu-virgl: update virglrenderer defines Joelle van Dyne
2025-12-04 7:13 ` Akihiko Odaki
2025-12-04 10:57 ` Marc-André Lureau
2025-12-03 4:07 ` [PATCH RFC 5/7] virtio-gpu-virgl: support scanout of Metal textures Joelle van Dyne
2025-12-04 3:06 ` Akihiko Odaki
2025-12-03 4:07 ` [PATCH RFC 6/7] console: add cleanup callback for ScanoutTexture Joelle van Dyne
2025-12-04 6:23 ` Akihiko Odaki
2025-12-03 4:07 ` Joelle van Dyne [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251203040754.94487-8-j@getutm.app \
--to=j@getutm.app \
--cc=alex.bennee@linaro.org \
--cc=berrange@redhat.com \
--cc=dmitry.osipenko@collabora.com \
--cc=marcandre.lureau@redhat.com \
--cc=mst@redhat.com \
--cc=odaki@rsg.ci.i.u-tokyo.ac.jp \
--cc=pbonzini@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).