* [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
* 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
* [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 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.