all lists on 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 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