* [PATCH qemu-server/pve-manager/docs v4 0/1] add virtio-vga-gl OpenGL 4.6 & Vulkan (venus) support
@ 2026-08-31 9:38 Markus Frank
2026-08-31 9:38 ` [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Markus Frank @ 2026-08-31 9:38 UTC (permalink / raw)
To: pve-devel
v4:
* added docs patch
* pve-manager: change the memory label to '2D Memory Limit' when using
VirtIO to make the difference to the 'Host Memory Window' clearer
* qemu-server: made the description of virgl-features more general
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
qeme-server:
Markus Frank (1):
fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support
src/PVE/QemuServer.pm | 36 +++++++++++++++++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
pve-manager:
Markus Frank (1):
ui: qemu: add VirGl feature selection in DisplayEdit
www/manager6/qemu/DisplayEdit.js | 79 +++++++++++++++++++++++++++++++-
1 file changed, 77 insertions(+), 2 deletions(-)
docs:
Markus Frank (1):
VirGL: add info about feature sets with OpenGL4.6 and vulkan
qm.adoc | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
--
2.47.3
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support
2026-08-31 9:38 [PATCH qemu-server/pve-manager/docs v4 0/1] add virtio-vga-gl OpenGL 4.6 & Vulkan (venus) support Markus Frank
@ 2026-08-31 9:38 ` Markus Frank
2026-08-31 15:29 ` DERUMIER, Alexandre
` (2 more replies)
2026-08-31 9:38 ` [PATCH pve-manager v4 2/3] ui: qemu: add VirGl feature selection in DisplayEdit Markus Frank
2026-08-31 9:38 ` [PATCH docs v4 3/3] VirGL: add info about feature sets with OpenGL4.6 and vulkan Markus Frank
2 siblings, 3 replies; 10+ messages in thread
From: Markus Frank @ 2026-08-31 9:38 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>
---
v4:
* made the description of virgl-features more general
* added bugzilla number to commit message
src/PVE/QemuServer.pm | 36 +++++++++++++++++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 63d8c135..65c4a804 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -171,6 +171,20 @@ my $vga_fmt = {
qw(cirrus qxl qxl2 qxl3 qxl4 none serial0 serial1 serial2 serial3 std virtio virtio-gl vmware)
],
},
+ 'virgl-features' => {
+ description => 'Enable additional features on 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',
@@ -1549,6 +1563,23 @@ 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";
+ }
+ } elsif ($vga->{'virgl-memory-window'}) {
+ die "To use a VirGL host memory window, please select a compatible VirGL feature set.\n";
+ }
+
if ($vga->{type} eq 'virtio-gl') {
# VirGL renders on the host, so the guest arch is irrelevant for the library lookup
my $host_arch = get_host_arch();
@@ -1560,9 +1591,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] 10+ messages in thread
* [PATCH pve-manager v4 2/3] ui: qemu: add VirGl feature selection in DisplayEdit
2026-08-31 9:38 [PATCH qemu-server/pve-manager/docs v4 0/1] add virtio-vga-gl OpenGL 4.6 & Vulkan (venus) support Markus Frank
2026-08-31 9:38 ` [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
@ 2026-08-31 9:38 ` Markus Frank
2026-09-01 11:35 ` Dominik Csapak
2026-08-31 9:38 ` [PATCH docs v4 3/3] VirGL: add info about feature sets with OpenGL4.6 and vulkan Markus Frank
2 siblings, 1 reply; 10+ messages in thread
From: Markus Frank @ 2026-08-31 9:38 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>
---
v4: change the memory label to '2D Memory Limit' when using VirtIO to
make the difference to the 'Host Memory Window' clearer.
www/manager6/qemu/DisplayEdit.js | 79 +++++++++++++++++++++++++++++++-
1 file changed, 77 insertions(+), 2 deletions(-)
diff --git a/www/manager6/qemu/DisplayEdit.js b/www/manager6/qemu/DisplayEdit.js
index 3f583adb..62624589 100644
--- a/www/manager6/qemu/DisplayEdit.js
+++ b/www/manager6/qemu/DisplayEdit.js
@@ -11,10 +11,37 @@ 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: {
matchNonGUIOption: function (get) {
@@ -35,6 +62,15 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
return Proxmox.Utils.defaultText;
}
},
+ memoryLabel: function (get) {
+ if (get('type').match(/^virtio/)) {
+ return gettext('2D Memory Limit') + ' (MiB)';
+ } else {
+ return gettext('Memory') + ' (MiB)';
+ }
+ },
+ isVirgl: (get) => get('type') === 'virtio-gl',
+ virglIsDefault: (get) => get('virglFeatures') === '__default__',
isVNC: (get) => get('clipboard') === 'vnc',
hideDefaultHint: (get) => get('isVNC') || get('matchNonGUIOption'),
hideVNCHint: (get) => !get('isVNC') || get('matchNonGUIOption'),
@@ -58,6 +94,7 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
}
return true;
},
+ listeners: { change: 'onTypeChange' },
bind: {
value: '{type}',
},
@@ -65,16 +102,50 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
{
xtype: 'proxmoxintegerfield',
emptyText: Proxmox.Utils.defaultText,
- fieldLabel: gettext('Memory') + ' (MiB)',
minValue: 4,
maxValue: 512,
step: 4,
name: 'memory',
bind: {
+ fieldLabel: '{memoryLabel}',
emptyText: '{memoryEmptyText}',
disabled: '{matchNonGUIOption}',
},
},
+ {
+ 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}',
+ },
+ },
],
advancedItems: [
@@ -141,7 +212,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] 10+ messages in thread
* [PATCH docs v4 3/3] VirGL: add info about feature sets with OpenGL4.6 and vulkan
2026-08-31 9:38 [PATCH qemu-server/pve-manager/docs v4 0/1] add virtio-vga-gl OpenGL 4.6 & Vulkan (venus) support Markus Frank
2026-08-31 9:38 ` [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
2026-08-31 9:38 ` [PATCH pve-manager v4 2/3] ui: qemu: add VirGl feature selection in DisplayEdit Markus Frank
@ 2026-08-31 9:38 ` Markus Frank
2026-09-01 11:39 ` Dominik Csapak
2 siblings, 1 reply; 10+ messages in thread
From: Markus Frank @ 2026-08-31 9:38 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
new to v4
qm.adoc | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/qm.adoc b/qm.adoc
index 18a4fbe..12c1752 100644
--- a/qm.adoc
+++ b/qm.adoc
@@ -1047,6 +1047,9 @@ default due to being relatively big and also not available as open source for
all GPU models/vendors. For most setups you'll just need to do:
`apt install libgl1 libegl1`
+To use Vulkan (Venus) you also need to install the virgl-server:
+`apt install virgl-server`
+
You can edit the amount of memory given to the virtual GPU, by setting
the 'memory' option. This can enable higher resolutions inside the VM,
especially with SPICE/QXL.
@@ -1066,6 +1069,20 @@ Selecting `serialX` as display 'type' disables the VGA output, and redirects
the Web Console to the selected serial port. A configured display 'memory'
setting will be ignored in that case.
+.VirGL Feature Sets
+
+|===
+|Feature Set |Description
+|`opengl4.3 (Default)` |The default VirGL implementation; does not require a host memory window for blob resources
+|`opengl4.6` |Adds support for OpenGL 4.6 by adding a host memory window (Default = 2048MiB) for blob resources
+|`opengl4.6+vulkan` |Adds for OpenGL 4.6 and Vulkan by adding a host memory window for blob resources and enabling venus
+|===
+
+The VirGL host memory window and blob resources allow a guest VM to
+directly map and write to host GPU VRAM or system memory without copying
+overhead, enabling the zero-copy buffer sharing and persistent memory
+mapping required for Vulkan and OpenGL 4.6.
+
.VNC clipboard
You can enable the VNC clipboard by setting `clipboard` to `vnc`.
--
2.47.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support
2026-08-31 9:38 ` [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
@ 2026-08-31 15:29 ` DERUMIER, Alexandre
2026-08-31 15:43 ` DERUMIER, Alexandre
2026-09-01 11:28 ` Dominik Csapak
2 siblings, 0 replies; 10+ messages in thread
From: DERUMIER, Alexandre @ 2026-08-31 15:29 UTC (permalink / raw)
To: pve-devel@lists.proxmox.com, m.frank@proxmox.com
Hi,
thanks for the patch serie!
I'll rebase my kyber console patches serie over it, as I was adding
venus support
https://lore.proxmox.com/pve-devel/20260826074347.1256659-6-alexandre.derumier@groupe-cyllene.com/T/#u
One question, I didn't need virgl-server to enable venus and get it
work with gpu offloading from my amd gpu.
Maybe is it because I'm using dbus display for output ?
(I really don't known how virgl-server to be honest, dont have read the
doc yet)
Best regards,
Alexandre
Le lundi 31 août 2026 à 11:38 +0200, Markus Frank a écrit :
> 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>
> ---
> v4:
> * made the description of virgl-features more general
> * added bugzilla number to commit message
>
> src/PVE/QemuServer.pm | 36 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
> index 63d8c135..65c4a804 100644
> --- a/src/PVE/QemuServer.pm
> +++ b/src/PVE/QemuServer.pm
> @@ -171,6 +171,20 @@ my $vga_fmt = {
> qw(cirrus qxl qxl2 qxl3 qxl4 none serial0 serial1
> serial2 serial3 std virtio virtio-gl vmware)
> ],
> },
> + 'virgl-features' => {
> + description => 'Enable additional features on 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',
> @@ -1549,6 +1563,23 @@ 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";
> + }
> + } elsif ($vga->{'virgl-memory-window'}) {
> + die "To use a VirGL host memory window, please select a
> compatible VirGL feature set.\n";
> + }
> +
> if ($vga->{type} eq 'virtio-gl') {
> # VirGL renders on the host, so the guest arch is irrelevant
> for the library lookup
> my $host_arch = get_host_arch();
> @@ -1560,9 +1591,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] 10+ messages in thread
* Re: [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support
2026-08-31 9:38 ` [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
2026-08-31 15:29 ` DERUMIER, Alexandre
@ 2026-08-31 15:43 ` DERUMIER, Alexandre
2026-09-01 6:24 ` Dominik Csapak
2026-09-01 11:28 ` Dominik Csapak
2 siblings, 1 reply; 10+ messages in thread
From: DERUMIER, Alexandre @ 2026-08-31 15:43 UTC (permalink / raw)
To: pve-devel@lists.proxmox.com, m.frank@proxmox.com
also,
I think it's missing the memory backend
-object memory-backend-memfd,id=mem1,size=2G
-machine memory-backend=mem1
(or maybe virgl-server avoid it ?)
Le lundi 31 août 2026 à 11:38 +0200, Markus Frank a écrit :
> 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>
> ---
> v4:
> * made the description of virgl-features more general
> * added bugzilla number to commit message
>
> src/PVE/QemuServer.pm | 36 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
> index 63d8c135..65c4a804 100644
> --- a/src/PVE/QemuServer.pm
> +++ b/src/PVE/QemuServer.pm
> @@ -171,6 +171,20 @@ my $vga_fmt = {
> qw(cirrus qxl qxl2 qxl3 qxl4 none serial0 serial1
> serial2 serial3 std virtio virtio-gl vmware)
> ],
> },
> + 'virgl-features' => {
> + description => 'Enable additional features on 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',
> @@ -1549,6 +1563,23 @@ 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";
> + }
> + } elsif ($vga->{'virgl-memory-window'}) {
> + die "To use a VirGL host memory window, please select a
> compatible VirGL feature set.\n";
> + }
> +
> if ($vga->{type} eq 'virtio-gl') {
> # VirGL renders on the host, so the guest arch is irrelevant
> for the library lookup
> my $host_arch = get_host_arch();
> @@ -1560,9 +1591,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] 10+ messages in thread
* Re: [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support
2026-08-31 15:43 ` DERUMIER, Alexandre
@ 2026-09-01 6:24 ` Dominik Csapak
0 siblings, 0 replies; 10+ messages in thread
From: Dominik Csapak @ 2026-09-01 6:24 UTC (permalink / raw)
To: DERUMIER, Alexandre, pve-devel@lists.proxmox.com,
m.frank@proxmox.com
answering for markus now because i looked this up
On 8/31/26 5:44 PM, DERUMIER, Alexandre wrote:
> also,
>
> I think it's missing the memory backend
>
> -object memory-backend-memfd,id=mem1,size=2G
> -machine memory-backend=mem1
>
> (or maybe virgl-server avoid it ?)
for virtio-vga-gl,blob=on,venus=on no memory backend is needed.
this is only needed when turning on blob=on on a 'regular' virtio-gpu
device (non-gl)
for virtio-vga-gl, the virgl-server allocates the memory...
>
>
>
> Le lundi 31 août 2026 à 11:38 +0200, Markus Frank a écrit :
>> 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>
>> ---
>> v4:
>> * made the description of virgl-features more general
>> * added bugzilla number to commit message
>>
>> src/PVE/QemuServer.pm | 36 +++++++++++++++++++++++++++++++++++-
>> 1 file changed, 35 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
>> index 63d8c135..65c4a804 100644
>> --- a/src/PVE/QemuServer.pm
>> +++ b/src/PVE/QemuServer.pm
>> @@ -171,6 +171,20 @@ my $vga_fmt = {
>> qw(cirrus qxl qxl2 qxl3 qxl4 none serial0 serial1
>> serial2 serial3 std virtio virtio-gl vmware)
>> ],
>> },
>> + 'virgl-features' => {
>> + description => 'Enable additional features on 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',
>> @@ -1549,6 +1563,23 @@ 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";
>> + }
>> + } elsif ($vga->{'virgl-memory-window'}) {
>> + die "To use a VirGL host memory window, please select a
>> compatible VirGL feature set.\n";
>> + }
>> +
>> if ($vga->{type} eq 'virtio-gl') {
>> # VirGL renders on the host, so the guest arch is irrelevant
>> for the library lookup
>> my $host_arch = get_host_arch();
>> @@ -1560,9 +1591,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] 10+ messages in thread
* Re: [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support
2026-08-31 9:38 ` [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
2026-08-31 15:29 ` DERUMIER, Alexandre
2026-08-31 15:43 ` DERUMIER, Alexandre
@ 2026-09-01 11:28 ` Dominik Csapak
2 siblings, 0 replies; 10+ messages in thread
From: Dominik Csapak @ 2026-09-01 11:28 UTC (permalink / raw)
To: Markus Frank, pve-devel
some comments inline
On 8/31/26 11:46 AM, 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>
> ---
> v4:
> * made the description of virgl-features more general
> * added bugzilla number to commit message
>
> src/PVE/QemuServer.pm | 36 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
> index 63d8c135..65c4a804 100644
> --- a/src/PVE/QemuServer.pm
> +++ b/src/PVE/QemuServer.pm
> @@ -171,6 +171,20 @@ my $vga_fmt = {
> qw(cirrus qxl qxl2 qxl3 qxl4 none serial0 serial1 serial2 serial3 std virtio virtio-gl vmware)
> ],
> },
> + 'virgl-features' => {
> + description => 'Enable additional features on VirGL GPU.',
> + type => 'string',
> + optional => 1,
> + enum => ['opengl4.6', 'opengl4.6+vulkan'],
for now that seems fine, but I hope that does not explode when there
are more (possibly independent) features arrive, e.g. consider
that 2 new features (a, b) arrive and they don't depend
on each other and also not on vulkan, we'd now have to add:
'opengl4.6+a', 'opengl4.6+b', 'opengl4.6+a+b'
and the same for 'opengl4.6.+vulkan'
so in total 6 new enum values for 2 new features
That assumes of course that these new features are independent
and directly related to virgl, which seems unlikely
A feature list: 'opengl4.6;vulkan' could maybe help with that,
but then it's not really possible to properly encode
dependencies
Not a blocker for me, but wanted to spell it out for others to read
> + },
> + 'virgl-memory-window' => {
> + description => 'Set the VirGL host memory window. This option allocates'
> + . ' host memory to act as VRAM in the VM.',
Here the unit is missing, please add something like below (e.g. 'in MiB')
also, writing that these have to be powers of two can make sense here
and explains why it's an enum of strings, instead of a number
> + 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',
> @@ -1549,6 +1563,23 @@ 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";
> + }
> + } elsif ($vga->{'virgl-memory-window'}) {
> + die "To use a VirGL host memory window, please select a compatible VirGL feature set.\n";
> + }
> +
> if ($vga->{type} eq 'virtio-gl') {
> # VirGL renders on the host, so the guest arch is irrelevant for the library lookup
> my $host_arch = get_host_arch();
> @@ -1560,9 +1591,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";
> }
in addition to checking here on vm start, it might make sense to check
these also in the api while setting, but not a must from me
>
> - 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] 10+ messages in thread
* Re: [PATCH pve-manager v4 2/3] ui: qemu: add VirGl feature selection in DisplayEdit
2026-08-31 9:38 ` [PATCH pve-manager v4 2/3] ui: qemu: add VirGl feature selection in DisplayEdit Markus Frank
@ 2026-09-01 11:35 ` Dominik Csapak
0 siblings, 0 replies; 10+ messages in thread
From: Dominik Csapak @ 2026-09-01 11:35 UTC (permalink / raw)
To: Markus Frank, pve-devel
code looks good to me, but a small feedback on ux:
IMO i would prefer it to now show the virgl fields
at all when non virgl display types are selected,
this is distracting and the user does not gain anything
by always seeing options that don't make sense for the
majority of users.
So either only show them when virgl is selected
(should be easy, just bind on hidden too, not only disabled)
or move them to the advanced section.
Also i find it a bit weird that the memory label
chagnes too when virtio-gpu is selected.
It's not wrong per se, but the '2d memory limit' label
really only makes sense with the other virgl options together.
So i'd limit that change to viritio-gl gpus.
On 8/31/26 11:46 AM, 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>
> ---
> v4: change the memory label to '2D Memory Limit' when using VirtIO to
> make the difference to the 'Host Memory Window' clearer.
>
> www/manager6/qemu/DisplayEdit.js | 79 +++++++++++++++++++++++++++++++-
> 1 file changed, 77 insertions(+), 2 deletions(-)
>
> diff --git a/www/manager6/qemu/DisplayEdit.js b/www/manager6/qemu/DisplayEdit.js
> index 3f583adb..62624589 100644
> --- a/www/manager6/qemu/DisplayEdit.js
> +++ b/www/manager6/qemu/DisplayEdit.js
> @@ -11,10 +11,37 @@ 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: {
> matchNonGUIOption: function (get) {
> @@ -35,6 +62,15 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
> return Proxmox.Utils.defaultText;
> }
> },
> + memoryLabel: function (get) {
> + if (get('type').match(/^virtio/)) {
> + return gettext('2D Memory Limit') + ' (MiB)';
> + } else {
> + return gettext('Memory') + ' (MiB)';
> + }
> + },
> + isVirgl: (get) => get('type') === 'virtio-gl',
> + virglIsDefault: (get) => get('virglFeatures') === '__default__',
> isVNC: (get) => get('clipboard') === 'vnc',
> hideDefaultHint: (get) => get('isVNC') || get('matchNonGUIOption'),
> hideVNCHint: (get) => !get('isVNC') || get('matchNonGUIOption'),
> @@ -58,6 +94,7 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
> }
> return true;
> },
> + listeners: { change: 'onTypeChange' },
> bind: {
> value: '{type}',
> },
> @@ -65,16 +102,50 @@ Ext.define('PVE.qemu.DisplayInputPanel', {
> {
> xtype: 'proxmoxintegerfield',
> emptyText: Proxmox.Utils.defaultText,
> - fieldLabel: gettext('Memory') + ' (MiB)',
> minValue: 4,
> maxValue: 512,
> step: 4,
> name: 'memory',
> bind: {
> + fieldLabel: '{memoryLabel}',
> emptyText: '{memoryEmptyText}',
> disabled: '{matchNonGUIOption}',
> },
> },
> + {
> + 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}',
> + },
> + },
> ],
>
> advancedItems: [
> @@ -141,7 +212,11 @@ Ext.define('PVE.qemu.DisplayEdit', {
> vmconfig: undefined,
>
> subject: gettext('Display'),
> - width: 350,
> + width: 450,
> +
> + fieldDefaults: {
> + labelWidth: 180,
> + },
>
> items: [
> {
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH docs v4 3/3] VirGL: add info about feature sets with OpenGL4.6 and vulkan
2026-08-31 9:38 ` [PATCH docs v4 3/3] VirGL: add info about feature sets with OpenGL4.6 and vulkan Markus Frank
@ 2026-09-01 11:39 ` Dominik Csapak
0 siblings, 0 replies; 10+ messages in thread
From: Dominik Csapak @ 2026-09-01 11:39 UTC (permalink / raw)
To: Markus Frank, pve-devel
one comment inline
Otherwise consider this
Reviewed-by: Dominik Csapak <d.csapak@proxmox.com>
On 8/31/26 11:46 AM, Markus Frank wrote:
> Signed-off-by: Markus Frank <m.frank@proxmox.com>
> ---
> new to v4
>
> qm.adoc | 17 +++++++++++++++++
> 1 file changed, 17 insertions(+)
>
> diff --git a/qm.adoc b/qm.adoc
> index 18a4fbe..12c1752 100644
> --- a/qm.adoc
> +++ b/qm.adoc
> @@ -1047,6 +1047,9 @@ default due to being relatively big and also not available as open source for
> all GPU models/vendors. For most setups you'll just need to do:
> `apt install libgl1 libegl1`
>
> +To use Vulkan (Venus) you also need to install the virgl-server:
> +`apt install virgl-server`
> +
> You can edit the amount of memory given to the virtual GPU, by setting
> the 'memory' option. This can enable higher resolutions inside the VM,
> especially with SPICE/QXL.
> @@ -1066,6 +1069,20 @@ Selecting `serialX` as display 'type' disables the VGA output, and redirects
> the Web Console to the selected serial port. A configured display 'memory'
> setting will be ignored in that case.
>
> +.VirGL Feature Sets
> +
> +|===
> +|Feature Set |Description
> +|`opengl4.3 (Default)` |The default VirGL implementation; does not require a host memory window for blob resources
> +|`opengl4.6` |Adds support for OpenGL 4.6 by adding a host memory window (Default = 2048MiB) for blob resources
> +|`opengl4.6+vulkan` |Adds for OpenGL 4.6 and Vulkan by adding a host memory window for blob resources and enabling venus
here the word 'support' is missing between 'adds' and 'for'
> +|===
> +
> +The VirGL host memory window and blob resources allow a guest VM to
> +directly map and write to host GPU VRAM or system memory without copying
> +overhead, enabling the zero-copy buffer sharing and persistent memory
> +mapping required for Vulkan and OpenGL 4.6.
> +
> .VNC clipboard
> You can enable the VNC clipboard by setting `clipboard` to `vnc`.
>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-09-01 11:39 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-31 9:38 [PATCH qemu-server/pve-manager/docs v4 0/1] add virtio-vga-gl OpenGL 4.6 & Vulkan (venus) support Markus Frank
2026-08-31 9:38 ` [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Markus Frank
2026-08-31 15:29 ` DERUMIER, Alexandre
2026-08-31 15:43 ` DERUMIER, Alexandre
2026-09-01 6:24 ` Dominik Csapak
2026-09-01 11:28 ` Dominik Csapak
2026-08-31 9:38 ` [PATCH pve-manager v4 2/3] ui: qemu: add VirGl feature selection in DisplayEdit Markus Frank
2026-09-01 11:35 ` Dominik Csapak
2026-08-31 9:38 ` [PATCH docs v4 3/3] VirGL: add info about feature sets with OpenGL4.6 and vulkan Markus Frank
2026-09-01 11:39 ` 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.