On Mon, Apr 28, 2025 at 12:22:22 +0200, Kirill Shchetiniuk via Devel wrote:
> From: Kirill Shchetiniuk <kshch...@redhat.com>
> 
> Introduce GTK display support with OpenGL for the QEMU driver.
> 
>  - Add new XML options for GTK display type.
>  - Include capability flags for the QEMU driver.
> 
> Note: The `QEMU_CAPS_GTK_GL` flag cannot yet be checked, so device
> definition validation is incomplete. A placeholder is left for
> future implementation, when the GTK along with OpenGL capability
> check would be available in QEMU.

Can you elaborate? WHy can't it be checked?

> Resolves: https://gitlab.com/libvirt/libvirt/-/issues/570
> 
> Signed-off-by: Kirill Shchetiniuk <kshch...@redhat.com>
> ---

You will need to split this patch.

At least the capability flag needs to be a separate commit that only
adds the capability flag.

I'm also missing qemuxmlconftest test cases and docs/formatdomain.rst
documentation changes.


[...]

>  36 files changed, 218 insertions(+), 2 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 542d6ade91..73550f7fcf 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -960,6 +960,7 @@ VIR_ENUM_IMPL(virDomainGraphics,
>                "spice",
>                "egl-headless",
>                "dbus",
> +              "gtk",
>  );
>  
>  VIR_ENUM_IMPL(virDomainGraphicsListen,
> @@ -2054,6 +2055,12 @@ void virDomainGraphicsDefFree(virDomainGraphicsDef 
> *def)
>          g_free(def->data.dbus.rendernode);
>          break;
>  
> +    case VIR_DOMAIN_GRAPHICS_TYPE_GTK:
> +        g_free(def->data.gtk.display);
> +        g_free(def->data.gtk.xauth);
> +        g_free(def->data.gtk.rendernode);
> +        break;
> +
>      case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
>          break;
>      }
> @@ -12199,6 +12206,39 @@ 
> virDomainGraphicsDefParseXMLDBus(virDomainGraphicsDef *def,
>  }
>  
>  
> +static int
> +virDomainGraphicsDefParseXMLGTK(virDomainGraphicsDef *def,
> +                                xmlNodePtr node,
> +                                xmlXPathContextPtr ctxt)
> +{
> +    VIR_XPATH_NODE_AUTORESTORE(ctxt)
> +    xmlNodePtr glNode;
> +    virTristateBool fullscreen;
> +
> +    ctxt->node = node;
> +
> +    if (virXMLPropTristateBool(node, "fullscreen", VIR_XML_PROP_NONE,
> +                               &fullscreen) < 0)

You parse a tristate ...

> +        return -1;
> +
> +    virTristateBoolToBool(fullscreen, &def->data.gtk.fullscreen);

... but store it only as boolean?

> +    def->data.gtk.xauth = virXMLPropString(node, "xauth");
> +    def->data.gtk.display = virXMLPropString(node, "display");
> +
> +    if ((glNode = virXPathNode("./gl", ctxt))) {
> +        def->data.gtk.rendernode = virXMLPropString(glNode,
> +                                                     "rendernode");
> +
> +        if (virXMLPropTristateBool(glNode, "enable",
> +                                   VIR_XML_PROP_REQUIRED,
> +                                   &def->data.gtk.gl) < 0)
> +            return -1;
> +    }
> +
> +    return 0;
> +}
> +
> +
>  virDomainGraphicsDef *
>  virDomainGraphicsDefNew(virDomainXMLOption *xmlopt)
>  {

[...]

> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index a804335c85..de7ce95499 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -732,6 +732,8 @@ VIR_ENUM_IMPL(virQEMUCaps,
>  
>                /* 475 */
>                "virtio-scsi.iothread-mapping", /* 
> QEMU_CAPS_VIRTIO_SCSI_IOTHREAD_MAPPING */
> +              "gtk", /* QEMU_CAPS_GTK */
> +              "gtk-gl", /* QEMU_CAPS_GTK_GL */
>      );
>  
>  
> @@ -1602,6 +1604,7 @@ static struct virQEMUCapsStringFlags 
> virQEMUCapsQMPSchemaQueries[] = {
>      { "set-numa-node/arg-type/+hmat-lb", QEMU_CAPS_NUMA_HMAT },
>      { "query-cpu-model-expansion/ret-type/deprecated-props", 
> QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS },
>      { "migrate-incoming/arg-type/exit-on-error", 
> QEMU_CAPS_MIGRATE_INCOMING_EXIT_ON_ERROR },
> +    { "query-display-options/ret-type/type/^gtk", QEMU_CAPS_GTK },
>  };
>  
>  typedef struct _virQEMUCapsObjectTypeProps virQEMUCapsObjectTypeProps;
> @@ -6499,6 +6502,8 @@ 
> virQEMUCapsFillDomainDeviceGraphicsCaps(virQEMUDriverConfig *cfg,
>                                       VIR_DOMAIN_GRAPHICS_TYPE_RDP);
>          }
>      }
> +    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_GTK))
> +        VIR_DOMAIN_CAPS_ENUM_SET(dev->type, VIR_DOMAIN_GRAPHICS_TYPE_GTK);
>  }
>  
>  

[...]

> diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
> index b2c3c9e2f6..be92785d71 100644
> --- a/src/qemu/qemu_validate.c
> +++ b/src/qemu/qemu_validate.c
> @@ -4523,6 +4523,17 @@ qemuValidateDomainDeviceDefRDPGraphics(const 
> virDomainGraphicsDef *graphics)
>  }
>  
>  
> +static int
> +qemuValidateDomainDeviceDefGTKGraphics(const virDomainGraphicsDef *graphics 
> G_GNUC_UNUSED,
> +                                       virQEMUCaps *qemuCaps G_GNUC_UNUSED)
> +{
> +    /* TODO: OpenGL check */
> +    /* For now it's not possible to check if gtk-gl capability is available 
> in QEMU */
> +    /* Add cappability check later when will be possible to gather the 
> capability from QEMU */

So why does the patch add the capability then? Or is this comment no
longer applicable?

> +    return 0;
> +}
> +
> +
>  static int
>  qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef *graphics,
>                                      const virDomainDef *def,

Reply via email to