From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id BA89A1FF09B for ; Mon, 31 Aug 2026 11:46:33 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id E319821592; Mon, 31 Aug 2026 11:46:22 +0200 (CEST) From: Markus Frank To: pve-devel@lists.proxmox.com Subject: [PATCH qemu-server v4 1/3] fix #6277: virtio-vga-gl: add OpenGL 4.6 and Vulkan (Venus) support Date: Mon, 31 Aug 2026 11:38:09 +0200 Message-ID: <20260831094605.114396-2-m.frank@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260831094605.114396-1-m.frank@proxmox.com> References: <20260831094605.114396-1-m.frank@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1788169564708 X-SPAM-LEVEL: Spam detection results: 0 DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: PUK6VR46WPXNOMN2P6WVFVB6EUGJHPGY X-Message-ID-Hash: PUK6VR46WPXNOMN2P6WVFVB6EUGJHPGY X-MailFrom: m.frank@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Adding the 'blob=on,hostmem=' 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 --- 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