Use virtio-gpu with viogpudo on Arm64 Windows 11

Replace ramfb with virtio-gpu-pci at 2048x1280 and install the viogpudo
driver from the VirtIO ISO. ramfb has a fixed mode, and keeping both
adapters left Windows with a second, fixed-mode monitor.

Windows Setup and the base image have no viogpudo driver, so on the
launch that creates the system disk the launcher also adds a ramfb ahead
of the config files. The display window shows the first GPU.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
guofangandClaude Sonnet 5.5 committed 2026-10-18 17:47:48 +08:00
1 parent 361ecd977a
commit c139c566d0
4 files changed
+24 -10

No files matched your search

+8 -4
View File
@@ -24,11 +24,15 @@
driver = "virtio-net-pci"
netdev = "net0"
# Unlike q35, "virt" has no default GPU or keyboard. ramfb is used rather than
# virtio-gpu because the firmware's virtio-gpu output freezes at the Windows
# boot manager; Windows drives either one through its basic display driver.
# Unlike q35, "virt" has no default GPU or keyboard. virtio-gpu is the only
# display, driven by viogpudo (installed by Configure-Windows.ps1). ramfb is not
# added because Windows would then see a second adapter with a fixed-mode
# monitor. xres/yres set the preferred mode in the EDID (QEMU defaults to
# 1280x800); viogpudo accepted 1920x1200 and 2048x1280 but not 2560x1600.
[device "gpu0"]
driver = "ramfb"
driver = "virtio-gpu-pci"
xres = "2048"
yres = "1280"
[device "kbd0"]
driver = "usb-kbd"
+8 -4
View File
@@ -24,11 +24,15 @@
driver = "virtio-net-pci"
netdev = "net0"
# Unlike q35, "virt" has no default GPU or keyboard. ramfb is used rather than
# virtio-gpu because the firmware's virtio-gpu output freezes at the Windows
# boot manager; Windows drives either one through its basic display driver.
# Unlike q35, "virt" has no default GPU or keyboard. virtio-gpu is the only
# display, driven by viogpudo (installed by Configure-Windows.ps1). ramfb is not
# added because Windows would then see a second adapter with a fixed-mode
# monitor. xres/yres set the preferred mode in the EDID (QEMU defaults to
# 1280x800); viogpudo accepted 1920x1200 and 2048x1280 but not 2560x1600.
[device "gpu0"]
driver = "ramfb"
driver = "virtio-gpu-pci"
xres = "2048"
yres = "1280"
[device "kbd0"]
driver = "usb-kbd"
+6 -1
View File
@@ -372,7 +372,12 @@ for label, host_port, guest_port in (("RDP", rdp_port, 3389), ("SSH", ssh_port,
else:
forwards.append(f"hostfwd=tcp::{host_port}-:{guest_port}")
qemu_args = [
# Neither Windows Setup nor the base image has the viogpudo driver yet, and
# without it the virtio-gpu in the config file shows "display output is not
# active". ramfb shows the screen until Configure-Windows.ps1 installs it. It
# must be created before the virtio-gpu: the display window shows the first GPU.
qemu_args = ["-device", "ramfb"] if installing and host_arch == "arm64" else []
qemu_args += [
"-readconfig", str(qemu_config),
"-readconfig", str(qemu_platform_config),
# "max" is the host CPU under KVM/HVF and the fullest model under TCG.
+2 -1
View File
@@ -45,7 +45,8 @@ function Install-VirtIOArm64Drivers {
@{ Folder = 'vioserial'; Inf = 'vioser.inf' },
@{ Folder = 'Balloon'; Inf = 'balloon.inf' },
@{ Folder = 'viorng'; Inf = 'viorng.inf' },
@{ Folder = 'vioinput'; Inf = 'vioinput.inf' }
@{ Folder = 'vioinput'; Inf = 'vioinput.inf' },
@{ Folder = 'viogpudo'; Inf = 'viogpudo.inf' }
)
$installed = 0