all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [PATCH qemu-server/pve-manager v3 0/2] add virtio-vga-gl OpenGL 4.6 & Vulkan (venus) support
@ 2026-06-26 14:07 Markus Frank
  2026-06-26 14:07 ` [PATCH qemu-server v3 1/2] virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
  2026-06-26 14:07 ` [PATCH pve-manager v3 2/2] ui: qemu: add VirGl feature selection in DisplayEdit Markus Frank
  0 siblings, 2 replies; 5+ messages in thread
From: Markus Frank @ 2026-06-26 14:07 UTC (permalink / raw)
  To: pve-devel

v3:
ran `make tidy` in both repos and applied the changes

v2:
The QEMU documentation got updated and now explains that adding blob and
hostmem alone with or without "venus=on" enabled support for OpenGL 4.6.
So I decided to let the user decide which "feature set" to use:
* the default with up to OpenGL 4.3 support
* OpenGL 4.6 (hostmem=<size>G,blob=true)
* Vulkan & OpenGL 4.6 (hostmem=<size>G,blob=true,venus=true)
https://www.qemu.org/docs/master/system/devices/virtio/virtio-gpu.html

There is also a patch on the qemu-devel list which separates Vulkan from
OpenGL.
https://lists.gnu.org/archive/html/qemu-devel/2026-03/msg05502.html
So in the future we could add a "vulkan without opengl" or "drm" option.

The hostmem option allocates a host memory region that acts as virtual
VRAM, enabling virglrenderer to map graphics 'blobs' directly to fixed
memory addresses.
https://www.mail-archive.com/qemu-devel@nongnu.org/msg1173963.html


qemu-server:

Markus Frank (1):
  virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support

 src/PVE/QemuServer.pm | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)


pve-manager:

Markus Frank (1):
  ui: qemu: add VirGl feature selection in DisplayEdit

 www/manager6/qemu/DisplayEdit.js | 72 +++++++++++++++++++++++++++++++-
 1 file changed, 71 insertions(+), 1 deletion(-)

-- 
2.47.3





^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH qemu-server v3 1/2] virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support
  2026-06-26 14:07 [PATCH qemu-server/pve-manager v3 0/2] add virtio-vga-gl OpenGL 4.6 & Vulkan (venus) support Markus Frank
@ 2026-06-26 14:07 ` Markus Frank
  2026-07-03 11:52   ` Dominik Csapak
  2026-06-26 14:07 ` [PATCH pve-manager v3 2/2] ui: qemu: add VirGl feature selection in DisplayEdit Markus Frank
  1 sibling, 1 reply; 5+ messages in thread
From: Markus Frank @ 2026-06-26 14:07 UTC (permalink / raw)
  To: pve-devel

Adding the 'blob=on,hostmem=<size>' parameters to the 'virtio-gpu-gl'
device allows the VM to use OpenGL 4.6. By default virtio-gpu-gl only
supports up to OpenGL 4.3.

If Vulkan support is needed, the 'venus=on' parameter is added to the
'virtio-gpu-gl' device, in addition to the two parameters required for
OpenGL 4.6.

The Venus protocol facilitates the translation of Vulkan API calls via
the virglrenderer. To use it, the virgl-server package must be installed
on the host.

Set the default VirGL memory window to 2048 MiB, as having less could
lead to instability inside the VM.

Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
 src/PVE/QemuServer.pm | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 55e9f520..30d08f32 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -170,6 +170,20 @@ my $vga_fmt = {
             qw(cirrus qxl qxl2 qxl3 qxl4 none serial0 serial1 serial2 serial3 std virtio virtio-gl vmware)
         ],
     },
+    'virgl-features' => {
+        description => 'Enable support for OpenGL 4.6 and Vulkan with the VirGL GPU.',
+        type => 'string',
+        optional => 1,
+        enum => ['opengl4.6', 'opengl4.6+vulkan'],
+    },
+    'virgl-memory-window' => {
+        description => 'Set the VirGL host memory window. This option allocates'
+            . ' host memory to act as VRAM in the VM.',
+        type => 'string',
+        default => '2048',
+        optional => 1,
+        enum => ['512', '1024', '2048', '4096', '8192'],
+    },
     memory => {
         description => "Sets the VGA memory (in MiB). Has no effect with serial display.",
         type => 'integer',
@@ -1524,6 +1538,21 @@ sub print_vga_device {
         $pciaddr = print_pci_addr($vgaid, $bridges, $arch);
     }
 
+    my $virgl_param = "";
+    my $virgl_mode = $vga->{'virgl-features'};
+    if ($virgl_mode) {
+        my $virgl_memory_window = $vga->{'virgl-memory-window'}
+            // $vga_fmt->{'virgl-memory-window'}->{'default'};
+        $virgl_param = ",hostmem=${virgl_memory_window}M,blob=on";
+
+        if ($virgl_mode eq 'opengl4.6+vulkan') {
+            $virgl_param .= ",venus=on";
+            log_warn(
+                "missing virgl render server for Vulkan (Venus) support! Please install 'virgl-server'.\n"
+            ) if !-e "/usr/libexec/virgl_render_server";
+        }
+    }
+
     if ($vga->{type} eq 'virtio-gl') {
         my $base = '/usr/lib/x86_64-linux-gnu/lib';
         die "missing libraries for '$vga->{type}' detected! Please install 'libgl1' and 'libegl1'\n"
@@ -1532,9 +1561,12 @@ sub print_vga_device {
         die
             "no DRM render node detected (/dev/dri/renderD*), no GPU? - needed for '$vga->{type}' display\n"
             if !PVE::Tools::dir_glob_regex('/dev/dri/', "renderD.*");
+
+    } elsif ($virgl_mode) {
+        die "You need to use virtio-gl to enable OpenGL 4.6 or Vulkan support!\n";
     }
 
-    return "$type,id=${vgaid}${memory}${max_outputs}${pciaddr}${edidoff}";
+    return "$type,id=${vgaid}${memory}${max_outputs}${pciaddr}${edidoff}${virgl_param}";
 }
 
 sub vm_is_volid_owner {
-- 
2.47.3





^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH pve-manager v3 2/2] ui: qemu: add VirGl feature selection in DisplayEdit
  2026-06-26 14:07 [PATCH qemu-server/pve-manager v3 0/2] add virtio-vga-gl OpenGL 4.6 & Vulkan (venus) support Markus Frank
  2026-06-26 14:07 ` [PATCH qemu-server v3 1/2] virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
@ 2026-06-26 14:07 ` Markus Frank
  2026-07-03 11:57   ` Dominik Csapak
  1 sibling, 1 reply; 5+ messages in thread
From: Markus Frank @ 2026-06-26 14:07 UTC (permalink / raw)
  To: pve-devel

The user can choose which feature set to use:
- the default option with OpenGL 4.3 support
- a option with OpenGL 4.6 support
- a option with both OpenGL 4.6 and Vulkan support

As the feature sets other than the default require a VirGL memory
window, the user can change the size of the default window in a
different combo box.

Add a controller to reset the combo boxes when they cannot be used and
add formulars to disable them.

Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
 www/manager6/qemu/DisplayEdit.js | 72 +++++++++++++++++++++++++++++++-
 1 file changed, 71 insertions(+), 1 deletion(-)

diff --git a/www/manager6/qemu/DisplayEdit.js b/www/manager6/qemu/DisplayEdit.js
index 3f583adb..e05f8f22 100644
--- a/www/manager6/qemu/DisplayEdit.js
+++ b/www/manager6/qemu/DisplayEdit.js
@@ -11,12 +11,42 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
         return { vga: ret };
     },
 
+    controller: {
+        xclass: 'Ext.app.ViewController',
+
+        onTypeChange: function (type) {
+            let me = this;
+            let vm = me.getViewModel();
+
+            if (type.getValue() !== 'virtio-gl') {
+                vm.set('virglMemoryWindow', '__default__');
+                vm.set('virglFeatures', '__default__');
+                vm.notify();
+            }
+        },
+
+        onFeaturesChange: function (features) {
+            let me = this;
+            let vm = me.getViewModel();
+
+            if (features.getValue() === '__default__') {
+                vm.set('virglMemoryWindow', '__default__');
+                vm.notify();
+            }
+        },
+    },
+
     viewModel: {
         data: {
             type: '__default__',
             clipboard: '__default__',
+            virglFeatures: '__default__',
+            virglMemoryWindow: '__default__',
         },
         formulas: {
+            isVirgl: function (get) {
+                return get('type') === 'virtio-gl';
+            },
             matchNonGUIOption: function (get) {
                 return get('type').match(/^(serial\d|none)$/);
             },
@@ -35,6 +65,7 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
                     return Proxmox.Utils.defaultText;
                 }
             },
+            virglIsDefault: (get) => get('virglFeatures') === '__default__',
             isVNC: (get) => get('clipboard') === 'vnc',
             hideDefaultHint: (get) => get('isVNC') || get('matchNonGUIOption'),
             hideVNCHint: (get) => !get('isVNC') || get('matchNonGUIOption'),
@@ -58,6 +89,7 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
                 }
                 return true;
             },
+            listeners: { change: 'onTypeChange' },
             bind: {
                 value: '{type}',
             },
@@ -78,6 +110,40 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
     ],
 
     advancedItems: [
+        {
+            xtype: 'proxmoxKVComboBox',
+            name: 'virgl-features',
+            deleteEmpty: false,
+            fieldLabel: gettext('VirGL Features'),
+            listeners: { change: 'onFeaturesChange' },
+            comboItems: [
+                ['__default__', Proxmox.Utils.defaultText + ' (OpenGL 4.3)'],
+                ['opengl4.6', 'OpenGL 4.6 support'],
+                ['opengl4.6+vulkan', 'OpenGL 4.6 and Vulkan support'],
+            ],
+            bind: {
+                value: '{virglFeatures}',
+                disabled: '{!isVirgl}',
+            },
+        },
+        {
+            xtype: 'proxmoxKVComboBox',
+            name: 'virgl-memory-window',
+            deleteEmpty: false,
+            fieldLabel: gettext('VirGL Host Memory Window'),
+            comboItems: [
+                ['__default__', Proxmox.Utils.defaultText + ' (2048 MiB)'],
+                ['512', '512 MiB'],
+                ['1024', '1024 MiB'],
+                ['2048', '2048 MiB'],
+                ['4096', '4096 MiB'],
+                ['8192', '8192 MiB'],
+            ],
+            bind: {
+                value: '{virglMemoryWindow}',
+                disabled: '{virglIsDefault}',
+            },
+        },
         {
             xtype: 'proxmoxKVComboBox',
             name: 'clipboard',
@@ -141,7 +207,11 @@ Ext.define('PVE.qemu.DisplayEdit', {
     vmconfig: undefined,
 
     subject: gettext('Display'),
-    width: 350,
+    width: 450,
+
+    fieldDefaults: {
+        labelWidth: 180,
+    },
 
     items: [
         {
-- 
2.47.3





^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH qemu-server v3 1/2] virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support
  2026-06-26 14:07 ` [PATCH qemu-server v3 1/2] virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
@ 2026-07-03 11:52   ` Dominik Csapak
  0 siblings, 0 replies; 5+ messages in thread
From: Dominik Csapak @ 2026-07-03 11:52 UTC (permalink / raw)
  To: Markus Frank, pve-devel

a few comments inline

On 6/26/26 4:12 PM, Markus Frank wrote:
> Adding the 'blob=on,hostmem=<size>' parameters to the 'virtio-gpu-gl'
> device allows the VM to use OpenGL 4.6. By default virtio-gpu-gl only
> supports up to OpenGL 4.3.
> 
> If Vulkan support is needed, the 'venus=on' parameter is added to the
> 'virtio-gpu-gl' device, in addition to the two parameters required for
> OpenGL 4.6.
> 
> The Venus protocol facilitates the translation of Vulkan API calls via
> the virglrenderer. To use it, the virgl-server package must be installed
> on the host.
> 
> Set the default VirGL memory window to 2048 MiB, as having less could
> lead to instability inside the VM.
> 
> Signed-off-by: Markus Frank <m.frank@proxmox.com>
> ---
>   src/PVE/QemuServer.pm | 34 +++++++++++++++++++++++++++++++++-
>   1 file changed, 33 insertions(+), 1 deletion(-)
> 
> diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
> index 55e9f520..30d08f32 100644
> --- a/src/PVE/QemuServer.pm
> +++ b/src/PVE/QemuServer.pm
> @@ -170,6 +170,20 @@ my $vga_fmt = {
>               qw(cirrus qxl qxl2 qxl3 qxl4 none serial0 serial1 serial2 serial3 std virtio virtio-gl vmware)
>           ],
>       },
> +    'virgl-features' => {
> +        description => 'Enable support for OpenGL 4.6 and Vulkan with the VirGL GPU.',

nit: fine for now, but as soon as we get more options here this
description needs an update, i'd maybe let it be more generic like:

'Enable additional features on VirGL GPU'.

not a must fix though


> +        type => 'string',
> +        optional => 1,
> +        enum => ['opengl4.6', 'opengl4.6+vulkan'],
> +    },
> +    'virgl-memory-window' => {
> +        description => 'Set the VirGL host memory window. This option allocates'
> +            . ' host memory to act as VRAM in the VM.',
> +        type => 'string',
> +        default => '2048',
> +        optional => 1,
> +        enum => ['512', '1024', '2048', '4096', '8192'],
> +    },

not sure if i mentioned it offline to you already, but would't it be
possible to reuse the 'memory' property (just below) ?

(we could then enforce the 512/1024, etc. limits in the code instead of
the api)

i guess it'll be confusing for the users why there are multiple
'memory' settings for the gpu.

if we don't reuse it we should probably explain the difference (e.g. in 
the docs)


>       memory => {
>           description => "Sets the VGA memory (in MiB). Has no effect with serial display.",
>           type => 'integer',
> @@ -1524,6 +1538,21 @@ sub print_vga_device {
>           $pciaddr = print_pci_addr($vgaid, $bridges, $arch);
>       }
>   
> +    my $virgl_param = "";
> +    my $virgl_mode = $vga->{'virgl-features'};
> +    if ($virgl_mode) {
> +        my $virgl_memory_window = $vga->{'virgl-memory-window'}
> +            // $vga_fmt->{'virgl-memory-window'}->{'default'};
> +        $virgl_param = ",hostmem=${virgl_memory_window}M,blob=on";

does the hostmem parameter anything on it's own?

if yes, we should maybe set that independently of the virgl-features flags
if no we should also check if it's set without the virgl-features and 
cancel, otherwise some users might set it altough it does not have any 
effect..

> +
> +        if ($virgl_mode eq 'opengl4.6+vulkan') {
> +            $virgl_param .= ",venus=on";
> +            log_warn(
> +                "missing virgl render server for Vulkan (Venus) support! Please install 'virgl-server'.\n"
> +            ) if !-e "/usr/libexec/virgl_render_server";
> +        }
> +    }
> +
>       if ($vga->{type} eq 'virtio-gl') {
>           my $base = '/usr/lib/x86_64-linux-gnu/lib';
>           die "missing libraries for '$vga->{type}' detected! Please install 'libgl1' and 'libegl1'\n"
> @@ -1532,9 +1561,12 @@ sub print_vga_device {
>           die
>               "no DRM render node detected (/dev/dri/renderD*), no GPU? - needed for '$vga->{type}' display\n"
>               if !PVE::Tools::dir_glob_regex('/dev/dri/', "renderD.*");
> +
> +    } elsif ($virgl_mode) {
> +        die "You need to use virtio-gl to enable OpenGL 4.6 or Vulkan support!\n";
>       }
>   
> -    return "$type,id=${vgaid}${memory}${max_outputs}${pciaddr}${edidoff}";
> +    return "$type,id=${vgaid}${memory}${max_outputs}${pciaddr}${edidoff}${virgl_param}";
>   }
>   
>   sub vm_is_volid_owner {





^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH pve-manager v3 2/2] ui: qemu: add VirGl feature selection in DisplayEdit
  2026-06-26 14:07 ` [PATCH pve-manager v3 2/2] ui: qemu: add VirGl feature selection in DisplayEdit Markus Frank
@ 2026-07-03 11:57   ` Dominik Csapak
  0 siblings, 0 replies; 5+ messages in thread
From: Dominik Csapak @ 2026-07-03 11:57 UTC (permalink / raw)
  To: Markus Frank, pve-devel

one nit inline, but not a blocker for me

Reviewed-by: Dominik Csapak <d.csapak@proxmox.com>

On 6/26/26 4:12 PM, Markus Frank wrote:
> The user can choose which feature set to use:
> - the default option with OpenGL 4.3 support
> - a option with OpenGL 4.6 support
> - a option with both OpenGL 4.6 and Vulkan support
> 
> As the feature sets other than the default require a VirGL memory
> window, the user can change the size of the default window in a
> different combo box.
> 
> Add a controller to reset the combo boxes when they cannot be used and
> add formulars to disable them.
> 
> Signed-off-by: Markus Frank <m.frank@proxmox.com>
> ---
>   www/manager6/qemu/DisplayEdit.js | 72 +++++++++++++++++++++++++++++++-
>   1 file changed, 71 insertions(+), 1 deletion(-)
> 
> diff --git a/www/manager6/qemu/DisplayEdit.js b/www/manager6/qemu/DisplayEdit.js
> index 3f583adb..e05f8f22 100644
> --- a/www/manager6/qemu/DisplayEdit.js
> +++ b/www/manager6/qemu/DisplayEdit.js
> @@ -11,12 +11,42 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
>           return { vga: ret };
>       },
>   
> +    controller: {
> +        xclass: 'Ext.app.ViewController',
> +
> +        onTypeChange: function (type) {
> +            let me = this;
> +            let vm = me.getViewModel();
> +
> +            if (type.getValue() !== 'virtio-gl') {
> +                vm.set('virglMemoryWindow', '__default__');
> +                vm.set('virglFeatures', '__default__');
> +                vm.notify();
> +            }
> +        },
> +
> +        onFeaturesChange: function (features) {
> +            let me = this;
> +            let vm = me.getViewModel();
> +
> +            if (features.getValue() === '__default__') {
> +                vm.set('virglMemoryWindow', '__default__');
> +                vm.notify();
> +            }
> +        },
> +    },
> +
>       viewModel: {
>           data: {
>               type: '__default__',
>               clipboard: '__default__',
> +            virglFeatures: '__default__',
> +            virglMemoryWindow: '__default__',
>           },
>           formulas: {
> +            isVirgl: function (get) {
> +                return get('type') === 'virtio-gl';
> +            },

this could be in the same one line style as the other below


isVirgl: (get) => get('type') === 'virtio-gl',



>               matchNonGUIOption: function (get) {
>                   return get('type').match(/^(serial\d|none)$/);
>               },
> @@ -35,6 +65,7 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
>                       return Proxmox.Utils.defaultText;
>                   }
>               },
> +            virglIsDefault: (get) => get('virglFeatures') === '__default__',
>               isVNC: (get) => get('clipboard') === 'vnc',
>               hideDefaultHint: (get) => get('isVNC') || get('matchNonGUIOption'),
>               hideVNCHint: (get) => !get('isVNC') || get('matchNonGUIOption'),
> @@ -58,6 +89,7 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
>                   }
>                   return true;
>               },
> +            listeners: { change: 'onTypeChange' },
>               bind: {
>                   value: '{type}',
>               },
> @@ -78,6 +110,40 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
>       ],
>   
>       advancedItems: [
> +        {
> +            xtype: 'proxmoxKVComboBox',
> +            name: 'virgl-features',
> +            deleteEmpty: false,
> +            fieldLabel: gettext('VirGL Features'),
> +            listeners: { change: 'onFeaturesChange' },
> +            comboItems: [
> +                ['__default__', Proxmox.Utils.defaultText + ' (OpenGL 4.3)'],
> +                ['opengl4.6', 'OpenGL 4.6 support'],
> +                ['opengl4.6+vulkan', 'OpenGL 4.6 and Vulkan support'],
> +            ],
> +            bind: {
> +                value: '{virglFeatures}',
> +                disabled: '{!isVirgl}',
> +            },
> +        },
> +        {
> +            xtype: 'proxmoxKVComboBox',
> +            name: 'virgl-memory-window',
> +            deleteEmpty: false,
> +            fieldLabel: gettext('VirGL Host Memory Window'),
> +            comboItems: [
> +                ['__default__', Proxmox.Utils.defaultText + ' (2048 MiB)'],
> +                ['512', '512 MiB'],
> +                ['1024', '1024 MiB'],
> +                ['2048', '2048 MiB'],
> +                ['4096', '4096 MiB'],
> +                ['8192', '8192 MiB'],
> +            ],
> +            bind: {
> +                value: '{virglMemoryWindow}',
> +                disabled: '{virglIsDefault}',
> +            },
> +        },
>           {
>               xtype: 'proxmoxKVComboBox',
>               name: 'clipboard',
> @@ -141,7 +207,11 @@ Ext.define('PVE.qemu.DisplayEdit', {
>       vmconfig: undefined,
>   
>       subject: gettext('Display'),
> -    width: 350,
> +    width: 450,
> +
> +    fieldDefaults: {
> +        labelWidth: 180,
> +    },
>   
>       items: [
>           {





^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-07-03 11:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-26 14:07 [PATCH qemu-server/pve-manager v3 0/2] add virtio-vga-gl OpenGL 4.6 & Vulkan (venus) support Markus Frank
2026-06-26 14:07 ` [PATCH qemu-server v3 1/2] virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
2026-07-03 11:52   ` Dominik Csapak
2026-06-26 14:07 ` [PATCH pve-manager v3 2/2] ui: qemu: add VirGl feature selection in DisplayEdit Markus Frank
2026-07-03 11:57   ` Dominik Csapak

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal