[PATCH RFC 4/7] virtio-gpu-virgl: update virglrenderer defines

Joelle van Dyne posted 7 patches 3 days, 19 hours ago
Maintainers: "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>, "Marc-André Lureau" <marcandre.lureau@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, "Daniel P. Berrangé" <berrange@redhat.com>, "Philippe Mathieu-Daudé" <philmd@linaro.org>
[PATCH RFC 4/7] virtio-gpu-virgl: update virglrenderer defines
Posted by Joelle van Dyne 3 days, 19 hours ago
In order to support additional native texture types, we need to update the
defines in virglrenderer. The changes are backwards compatible and so
builds should work with either the new version or the old version.

Signed-off-by: Joelle van Dyne <j@getutm.app>
---
 hw/display/virtio-gpu-virgl.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
index d0e6ad4b17..36c670f988 100644
--- a/hw/display/virtio-gpu-virgl.c
+++ b/hw/display/virtio-gpu-virgl.c
@@ -24,6 +24,8 @@
 
 #include <virglrenderer.h>
 
+#define SUPPORTED_VIRGL_INFO_EXT_VERSION (1)
+
 struct virtio_gpu_virgl_resource {
     struct virtio_gpu_simple_resource base;
     MemoryRegion *mr;
@@ -441,12 +443,30 @@ static void virgl_cmd_set_scanout(VirtIOGPU *g,
         memset(&ext, 0, sizeof(ext));
         ret = virgl_renderer_resource_get_info_ext(ss.resource_id, &ext);
         info = ext.base;
+        /* fallback to older version */
         native = (ScanoutTextureNative){
             .type = ext.d3d_tex2d ? SCANOUT_TEXTURE_NATIVE_TYPE_D3D :
                                     SCANOUT_TEXTURE_NATIVE_TYPE_NONE,
             .u.d3d_tex2d = ext.d3d_tex2d,
         };
-#else
+#if VIRGL_RENDERER_RESOURCE_INFO_EXT_VERSION >= SUPPORTED_VIRGL_INFO_EXT_VERSION
+        if (ext.version >= VIRGL_RENDERER_RESOURCE_INFO_EXT_VERSION) {
+            switch (ext.native_type) {
+            case VIRGL_NATIVE_HANDLE_NONE:
+            case VIRGL_NATIVE_HANDLE_D3D_TEX2D: {
+                /* already handled above */
+                break;
+            }
+            default: {
+                qemu_log_mask(LOG_GUEST_ERROR,
+                            "%s: unsupported native texture type %d\n",
+                            __func__, ext.native_type);
+                break;
+            }
+            }
+        }
+#endif
+#else /* VIRGL_VERSION_MAJOR < 1 */
         memset(&info, 0, sizeof(info));
         ret = virgl_renderer_resource_get_info(ss.resource_id, &info);
 #endif
@@ -1169,11 +1189,13 @@ int virtio_gpu_virgl_init(VirtIOGPU *g)
         virtio_gpu_3d_cbs.get_egl_display = virgl_get_egl_display;
     }
 #endif
-#ifdef VIRGL_RENDERER_D3D11_SHARE_TEXTURE
     if (qemu_egl_angle_native_device) {
+#if defined(VIRGL_RENDERER_NATIVE_SHARE_TEXTURE)
+        flags |= VIRGL_RENDERER_NATIVE_SHARE_TEXTURE;
+#elif defined(VIRGL_RENDERER_D3D11_SHARE_TEXTURE) && defined(WIN32)
         flags |= VIRGL_RENDERER_D3D11_SHARE_TEXTURE;
-    }
 #endif
+    }
 #if VIRGL_VERSION_MAJOR >= 1
     if (virtio_gpu_venus_enabled(g->parent_obj.conf)) {
         flags |= VIRGL_RENDERER_VENUS | VIRGL_RENDERER_RENDER_SERVER;
-- 
2.41.0
Re: [PATCH RFC 4/7] virtio-gpu-virgl: update virglrenderer defines
Posted by Marc-André Lureau 2 days, 12 hours ago
Hi

On Wed, Dec 3, 2025 at 8:10 AM Joelle van Dyne <j@getutm.app> wrote:
>
> In order to support additional native texture types, we need to update the
> defines in virglrenderer. The changes are backwards compatible and so
> builds should work with either the new version or the old version.
>
> Signed-off-by: Joelle van Dyne <j@getutm.app>

Please add a link to the pending MR.

> ---
>  hw/display/virtio-gpu-virgl.c | 28 +++++++++++++++++++++++++---
>  1 file changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
> index d0e6ad4b17..36c670f988 100644
> --- a/hw/display/virtio-gpu-virgl.c
> +++ b/hw/display/virtio-gpu-virgl.c
> @@ -24,6 +24,8 @@
>
>  #include <virglrenderer.h>
>
> +#define SUPPORTED_VIRGL_INFO_EXT_VERSION (1)
> +
>  struct virtio_gpu_virgl_resource {
>      struct virtio_gpu_simple_resource base;
>      MemoryRegion *mr;
> @@ -441,12 +443,30 @@ static void virgl_cmd_set_scanout(VirtIOGPU *g,
>          memset(&ext, 0, sizeof(ext));
>          ret = virgl_renderer_resource_get_info_ext(ss.resource_id, &ext);
>          info = ext.base;
> +        /* fallback to older version */
>          native = (ScanoutTextureNative){
>              .type = ext.d3d_tex2d ? SCANOUT_TEXTURE_NATIVE_TYPE_D3D :
>                                      SCANOUT_TEXTURE_NATIVE_TYPE_NONE,
>              .u.d3d_tex2d = ext.d3d_tex2d,
>          };
> -#else
> +#if VIRGL_RENDERER_RESOURCE_INFO_EXT_VERSION >= SUPPORTED_VIRGL_INFO_EXT_VERSION
> +        if (ext.version >= VIRGL_RENDERER_RESOURCE_INFO_EXT_VERSION) {
> +            switch (ext.native_type) {
> +            case VIRGL_NATIVE_HANDLE_NONE:
> +            case VIRGL_NATIVE_HANDLE_D3D_TEX2D: {
> +                /* already handled above */
> +                break;
> +            }
> +            default: {
> +                qemu_log_mask(LOG_GUEST_ERROR,
> +                            "%s: unsupported native texture type %d\n",
> +                            __func__, ext.native_type);
> +                break;
> +            }
> +            }
> +        }
> +#endif
> +#else /* VIRGL_VERSION_MAJOR < 1 */
>          memset(&info, 0, sizeof(info));
>          ret = virgl_renderer_resource_get_info(ss.resource_id, &info);
>  #endif
> @@ -1169,11 +1189,13 @@ int virtio_gpu_virgl_init(VirtIOGPU *g)
>          virtio_gpu_3d_cbs.get_egl_display = virgl_get_egl_display;
>      }
>  #endif
> -#ifdef VIRGL_RENDERER_D3D11_SHARE_TEXTURE
>      if (qemu_egl_angle_native_device) {
> +#if defined(VIRGL_RENDERER_NATIVE_SHARE_TEXTURE)
> +        flags |= VIRGL_RENDERER_NATIVE_SHARE_TEXTURE;
> +#elif defined(VIRGL_RENDERER_D3D11_SHARE_TEXTURE) && defined(WIN32)
>          flags |= VIRGL_RENDERER_D3D11_SHARE_TEXTURE;
> -    }
>  #endif
> +    }
>  #if VIRGL_VERSION_MAJOR >= 1
>      if (virtio_gpu_venus_enabled(g->parent_obj.conf)) {
>          flags |= VIRGL_RENDERER_VENUS | VIRGL_RENDERER_RENDER_SERVER;
> --
> 2.41.0
>
>


-- 
Marc-André Lureau
Re: [PATCH RFC 4/7] virtio-gpu-virgl: update virglrenderer defines
Posted by Akihiko Odaki 2 days, 16 hours ago
On 2025/12/03 13:07, Joelle van Dyne wrote:
> In order to support additional native texture types, we need to update the
> defines in virglrenderer. The changes are backwards compatible and so
> builds should work with either the new version or the old version.
> 
> Signed-off-by: Joelle van Dyne <j@getutm.app>
> ---
>   hw/display/virtio-gpu-virgl.c | 28 +++++++++++++++++++++++++---
>   1 file changed, 25 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
> index d0e6ad4b17..36c670f988 100644
> --- a/hw/display/virtio-gpu-virgl.c
> +++ b/hw/display/virtio-gpu-virgl.c
> @@ -24,6 +24,8 @@
>   
>   #include <virglrenderer.h>
>   
> +#define SUPPORTED_VIRGL_INFO_EXT_VERSION (1)

This naming is a bit confusing because version 0 is also supported.

> +
>   struct virtio_gpu_virgl_resource {
>       struct virtio_gpu_simple_resource base;
>       MemoryRegion *mr;
> @@ -441,12 +443,30 @@ static void virgl_cmd_set_scanout(VirtIOGPU *g,
>           memset(&ext, 0, sizeof(ext));
>           ret = virgl_renderer_resource_get_info_ext(ss.resource_id, &ext);
>           info = ext.base;
> +        /* fallback to older version */
>           native = (ScanoutTextureNative){
>               .type = ext.d3d_tex2d ? SCANOUT_TEXTURE_NATIVE_TYPE_D3D :
>                                       SCANOUT_TEXTURE_NATIVE_TYPE_NONE,
>               .u.d3d_tex2d = ext.d3d_tex2d,
>           };
> -#else
> +#if VIRGL_RENDERER_RESOURCE_INFO_EXT_VERSION >= SUPPORTED_VIRGL_INFO_EXT_VERSION
> +        if (ext.version >= VIRGL_RENDERER_RESOURCE_INFO_EXT_VERSION) {
> +            switch (ext.native_type) {
> +            case VIRGL_NATIVE_HANDLE_NONE:
> +            case VIRGL_NATIVE_HANDLE_D3D_TEX2D: {
> +                /* already handled above */
> +                break;
> +            }
> +            default: {
> +                qemu_log_mask(LOG_GUEST_ERROR,
> +                            "%s: unsupported native texture type %d\n",
> +                            __func__, ext.native_type);

It is not an error condition; the d3d_tex2d field is an optional hint 
that allows zero-copy inter-process sharing and the tex_id field is used 
if it is missing or inter-process sharing is unnecessary. It should be 
fine to dismiss the native handle unless the semantic changes.

Regards,
Akihiko Odaki

> +                break;
> +            }
> +            }
> +        }
> +#endif
> +#else /* VIRGL_VERSION_MAJOR < 1 */
>           memset(&info, 0, sizeof(info));
>           ret = virgl_renderer_resource_get_info(ss.resource_id, &info);
>   #endif
> @@ -1169,11 +1189,13 @@ int virtio_gpu_virgl_init(VirtIOGPU *g)
>           virtio_gpu_3d_cbs.get_egl_display = virgl_get_egl_display;
>       }
>   #endif
> -#ifdef VIRGL_RENDERER_D3D11_SHARE_TEXTURE
>       if (qemu_egl_angle_native_device) {
> +#if defined(VIRGL_RENDERER_NATIVE_SHARE_TEXTURE)
> +        flags |= VIRGL_RENDERER_NATIVE_SHARE_TEXTURE;
> +#elif defined(VIRGL_RENDERER_D3D11_SHARE_TEXTURE) && defined(WIN32)
>           flags |= VIRGL_RENDERER_D3D11_SHARE_TEXTURE;
> -    }
>   #endif
> +    }
>   #if VIRGL_VERSION_MAJOR >= 1
>       if (virtio_gpu_venus_enabled(g->parent_obj.conf)) {
>           flags |= VIRGL_RENDERER_VENUS | VIRGL_RENDERER_RENDER_SERVER;