我們知道QEMU跑Windows虛擬機是很難獲得3D加速的,在虛擬機執行部份程式會出問題。
目前QEMU 8.0想取得3D加速,要嘛直通宿主機GPU,要嘛等待 max8rr8的Windows viogpu3d驅動的PR完成。
現在有一個微妙的專案出現了,那就是「qemu-3dfx」
本專案由KJ Liew維護,專為Windows XP或更舊版的Windows虛擬機打造,可以讓你在虛擬機玩老遊戲的時候獲得原生效能的3D加速。按照作者說法,這樣你就不用找奇怪的patch來在現代的作業系統玩老遊戲了。
(不過老實說,想要3D加速,Windows XP以前的舊遊戲在Linux Wine都能很好的執行,再不濟還有VirtualBox SoftGPU和DosBox 3dfx Voodoo嘛,qemu-3dfx屬實有點太複雜了。)
1. 系統需求#
哪些系統可以作為宿主機?qemu-3dfx支援Linux、Windows、macOS系統。Android的Vectra VM軟體也有整合此技術。
虛擬機系統部份,建議使用Windows XP或更早的版本,包括Windows Me、Windows 2000、Windows 98、Windows 95等系統。至於要裝32位元還64位元就看你跑的遊戲而定。
遊戲的話,qemu-3dfx最高支援到DirectX 9.0。
本文Ivon使用Ubuntu LTS做為宿主機,並用Windows XP SP3 64bit當作虛擬機示範。請先 設定好QEMU/KVM。
2. 編譯QEMU和Guest Wrapper#
目前qemu-3dfx需要手動對QEMU打patch才可使用,作者要你捐款89.99美元才會提供現成執行檔。
所以我們這些窮鬼得按照 作者Github指示手動編譯自訂版本的QEMU。
- Ubuntu 22.04 LTS需要安裝以下前置套件
sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev git libglib2.0-dev libfdt-dev libpixman-1-dev libncurses5-dev libncursesw5-dev ninja-build libslirp-dev unzip mingw-w64-tools gcc-mingw-w64 libdigest-sha-perl gcc-mingw-w64-x86-64-win32
- 開始編譯QEMU 8.2.1
mkdir ~/myqemu && cd ~/myqemu
git clone https://github.com/kjliew/qemu-3dfx.git
cd qemu-3dfx
wget https://download.qemu.org/qemu-8.2.1.tar.xz
tar xf qemu-8.2.1.tar.xz
cd qemu-8.2.1
rsync -r ../qemu-0/hw/3dfx ../qemu-1/hw/mesa ./hw/
patch -p0 -i ../00-qemu82x-mesa-glide.patch
bash ../scripts/sign_commit
mkdir ../build && cd ../build
../qemu-8.2.1/configure --enable-slirp --enable-opengl --enable-debug
make -j4
最後得到自訂的qemu-system-x86_64執行檔,位於
~/myqemu/qemu-3dfx/build/qemu-system-x86_64
。接著編譯qemu-3dfx的Guest Wrappers。作者的編譯環境似乎是為Windows上的MingGW準備的,Ubuntu編譯不起來?
作者指定需要GCC 7.5.0並啟用DJGPP支援。參照另一個專案 andrewwutw/build-djgpp來編譯i686-pc-msdosdjgpp。
git clone https://github.com/andrewwutw/build-djgpp.git
cd build-djgpp
# 修改"scripts/7.5.0"和"setenv/setenv",把所有i586字串換成i686
sudo ./build-djgpp.sh 7.5.0
- 使用舊版GCC 7.5.0編譯Wrapper,針對Windows XP編譯
export DJGPP_PREFIX=/usr/local/djgpp/bin/i686-pc-msdosdjgpp
export PATH=/usr/local/djgpp/bin/i686-pc-msdosdjgpp/bin/:$PATH
export GCC_EXEC_PREFIX=/usr/local/djgpp/lib/gcc/
cd ~/myqemu/qemu-3dfx/wrappers/3dfx
mkdir build && cd build
bash ../../../scripts/conf_wrapper
make && make clean
cd ~/myqemu/qemu-3dfx/wrappers/mesa
mkdir build && cd build
bash ../../../scripts/conf_wrapper
make && make clean
- 之後檔案會放在
~/myqemu/qemu-3dfx/wrappers/3dfx/build
和~/myqemu/qemu-3dfx/wrappers/mesa/build
3. Windows虛擬機安裝qemu-3dfx檔案#
- 開啟Virt Manager,新增Windows XP虛擬機
2.在新增虛擬機之後,到Virt Manager的XML編輯欄位,修改<emulator></emulator>
數值,填寫剛剛編譯的QEMU的路徑,使其使用自訂QEMU(AppArmor可能會擋自訂QEMU路徑,請參考
stackexchange答案修改權限)
- 或者使用命令行跑QEMU虛擬機:
# 建立虛擬硬碟
qemu-img create -f qcow2 WindowsXP.qcow2 64G
# 開機
"/home/user/myqemu/qemu-3dfx/build/qemu-system-x86_64" \
-name "Windows XP" \
-enable-kvm \
-machine pc -L pc-bios -nodefaults -machine hpet=off \
-rtc base=localtime,clock=host\
-cpu qemu64 -smp cores=4,threads=1,sockets=1 \
-m 4096 \
-drive id=root,format=raw,file=WindowsXP.qcow2 \
-drive id=drive1,media=cdrom,file="Windows XP ISO路徑" \
-boot c \
-device rtl8139,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::8080-:80,hostfwd=tcp::2222-:22 \
-display sdl -device VGA \
-audiodev pa,id=snd0 -device AC97,audiodev=snd0 \
開機進入虛擬機。Windows XP能用的瀏覽器不多了,請用 Supermium上網吧。
手動安裝Guest Wrappers必要檔案到指定位置。
將FXPTL.SYS
放到%SystemRoot%\system32\drivers
GLIDE.DLL
,、GLIDE2X.DLL
、 GLIDE3X.DLL
放到%SystemRoot%\system32
OPENGL32.DLL
放到遊戲程式所在的資料夾。
使用系統管理員身份執行INSTDRV.EXE
4. 測試qemu-3dfx效能#
尚未親自測試
下面是原作者的測試結果,可見舊版的3DMark有吃到3D加速。