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

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



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] 3+ messages in thread

* [PATCH qemu-server v2 1/2] virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support
  2026-06-26 13:54 [PATCH qemu-server/pve-manager v2 0/2] add virtio-vga-gl OpenGL 4.6 & Vulkan (venus) support Markus Frank
@ 2026-06-26 13:54 ` Markus Frank
  2026-06-26 13:54 ` [PATCH pve-manager v2 2/2] ui: qemu: add VirGl feature selection in DisplayEdit Markus Frank
  1 sibling, 0 replies; 3+ messages in thread
From: Markus Frank @ 2026-06-26 13:54 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..0b9f8dcd 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -170,6 +170,21 @@ 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 +1539,20 @@ 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] 3+ messages in thread

* [PATCH pve-manager v2 2/2] ui: qemu: add VirGl feature selection in DisplayEdit
  2026-06-26 13:54 [PATCH qemu-server/pve-manager v2 0/2] add virtio-vga-gl OpenGL 4.6 & Vulkan (venus) support Markus Frank
  2026-06-26 13:54 ` [PATCH qemu-server v2 1/2] virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
@ 2026-06-26 13:54 ` Markus Frank
  1 sibling, 0 replies; 3+ messages in thread
From: Markus Frank @ 2026-06-26 13:54 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..98c62efb 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] 3+ messages in thread

end of thread, other threads:[~2026-06-26 13:56 UTC | newest]

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal