JHRobotics / softgpu

SW and HW accelerated GPU driver for Windows 9x Virtual Machines
MIT License
607 stars 17 forks source link
3d driver gpu virtualbox vmware windows-95 windows-98 windows-me

SoftGPU: SW and HW accelerated driver for Windows 9x Virtual Machines

SoftGPU animated logo

This is ready-to-use compilation of my ~4~ 6 projects:

Requirements

1) Virtual machine with one of these VGA adapter support:

Feature support

Hypervisor Version Adapter VGA driver 32 bpp 16 bpp 8 bpp HW 3D Sound drivers
Oracle VirtualBox 6.1, 7.0 VboxVGA SB16, AC97
Oracle VirtualBox 6.1, 7.0 VboxSVGA SB16, AC97
Oracle VirtualBox 6.1, 7.0 VMSVGA SB16, AC97
VMware Workstation 16, 17 - SBPCI128
QEMU 7.x, 8.0 std adlib, SB16, AC97
QEMU 7.x, 8.0 vmware adlib, SB16, AC97
QEMU 7.x, 8.0 std + qemu-3dfx adlib, SB16, AC97

SoftGPU can use 4 render drivers:

Not all renderers supporting all application/games, performance expectation is in 1024x768 32bit:

Renderer Guest Requirements DX9 DX9 shaders DX8 DX8 shaders DX6-7 OpenGL OpenGL version multiple contexts window mode Glide Glide DOS Expected FPS
softpipe - 3.3 1-3
llvmlipe (128 bits) SSE 3.3 10-15
llvmlipe (256 bits) SSE, AVX 3.3 12-20
SVGA3D SVGA-II (gen9) 2.1 30-100
SVGA3D SVGA-II (gen10) 3.3 30-80
qemu-3dfx qemu-3dfx native ✔ * ✔ * native/2 *

() Note for qemu-3dfx: performance depends on CPU emulation - you can reach about 1/2 of native GPU performance when using KVM acceleration on x86-64 host, about 1/5 when using Hyper-V, and about from 1/100 when is using accelerated emulation and about 1/1000 when using full emulation. DOS Glide and native* Glide wrapper isn't part of SoftGPU. You have to compile it from source or you can donate qemu-3dfx author.

Hypervisor translation to real HW GPU:

Renderer Host technology Hypervisor support
softpipe framebuffer all
llvmlipe framebuffer all
SVGA3D (gen 9) DX9/OpenGL 2.1 VirtualBox 6+7, VMware Workstation
SVGA3D (gen 10) DX11/Vulkan VirtualBox 7
qemu-3dfx native OpenGL QEMU with qemu-3dfx patch

Download

ISO image or ZIP package can be downloaded on release page: https://github.com/JHRobotics/softgpu/releases/

Installation

General instruction for most machines:

0) Setup the Virtual Machine (VM) 1) Copy installation files on formatted HDD and apply patcher9x [Optional but recommended] 2) Install the Windows 95/98/Me [Windows 98 SE is recommended] 3) [optional] install PATCHMEM by rloew and increase VM memory (1024 MB is usually enough) 4) [optional] install audio drivers (the most common drivers are below)[^1] 5) Run setup with softgpu.exe 6) [optional] Install additional drivers, for example USB (if you added USB controller) 7) Have fun!

[^1]: Do this before install/update DirectX redistributable, because audio drivers usually overwrite DX files with outdated versions.

Update

If you have an older version of SoftGPU installed, you can update without any problem: insert the CD with the latest version into the VM and click install. The installer will take care of all the necessary modifications, only to increase compatibility it is necessary to do some steps manually:

Update VirtualBox to 7.0.16

VirtualBox 7.0.16 correct some SVGA flags (my bug report). But this need for Mesa9x/SoftGPU to correct some behaviour. When you update from VirtualBox lower version, please run extra/tune/vbox-optimize-7.0.16.reg on SoftGPU CD/in SoftGPU ZIP archive. If you don't do do this, you probably will see black screen on most 3D application/games.

Update to version v0.5.2024.27

SVGA3D (especially vGPU10) is very memory consuming. Please consider to apply additional patches and set RAM to 1024 MB. Driver itself can cache memory allocation and it is faster when you have 1 GB RAM and more.

Update to version v0.5.2024.24

SoftGPU in action

For comparison, video from real end-of-era PC is here.

Virtual GPU implementation

Here are compare between vGPU9 (VirtualBox 6.1 + 7, VMWare) versus vGPU10 (VirtualBox 7):

If we're speaking about 3DMark99, there is also test width TNT PCI 16MB, (C) 1999 STB SYSTEM, INC. But on this 'GPU' isn't Quake 3 playable neither in 640x480, so keep in mind that test performance and gaming performance can vary quite a bit.

Performance between SoftGPU version

Here are some videos from older versions of SoftGPU for performance comparison:

Hypervisor specific setup

Here are some brief steps for individual virtualisation software:

VirtualBox VM setup with HW acceleration

1) Create new VM selecting Machine -> New in menu 2) Type: Microsoft Windows, Version: Windows 98 3) Base memory: 512 MB (this is minimum (for vGPU10), but more 512 MB isn't recommended without additional patches!), CPU: 1 4) Disk size: recommended is at least 20 GB for 98/Me (you can select less, but HDD becomes full faster). Select 2 GB if you plan install Windows 95. Tip: If you storing virtual machine on classic HDD, check Pre-allocate Full Size, because it leads to lower disk image fragmentation. 5) Finish wizard 6) Open VM setting

VirtualBox 7.0.16 options

12) Click on Install! 13) You maybe need some reboots (after MSVCRT and DX installation) and run softgpu.exe again. 14) After complete and final reboot system should start in 640x480 in 256 colours 15) Right click on desktop, Properties -> Settings and set the resolution (which you wish for) and colours:

AMD Zen, 11th Generation Intel Core and newer

Newer CPU have excellent performance but needs some extra tune: 1) apply patcher9x - this is required! 2) Change TSC (Time Stamp Counter) behaviour (Warning: this options is not available when VirtualBox is using Hyper-V as execution engine!)

VBoxManage setextradata "My Windows 98" "VBoxInternal/TM/TSCTiedToExecution" 1

3) (AMD ZEN 2+ only) Change too complex CPUID to something simpler (Windows itself is OK, but some programs may be confused - 3DMark for example)

VBoxManage modifyvm "My Windows 98" --cpu-profile "AMD Ryzen 7 1800X Eight-Core"

vGPU9 vs. vGPU10

There are 2 variant of graphical HW acceleration in VirtualBox 7:

vGPU9 (9 from DirectX 9) is older variant used usually to accelerate Windows Vista/7 aero and some desktop application. On host system is drawing by DirectX 9 (Windows) or OpenGL (Linux/Mac OS). Problem is very low pixel/vertex shader support, so DirectX 8 and DirectX 9 games can't use shaders. Keep on mind that DirectX in SoftGPU is emulated by Wine, so some non-shaders applications can have problems, because some behaviour is emulated by shaders.

vGPU10 (10 from Windows 10) is newer variant and is intended for acceleration of DirectX 12 (and DirectX 12 can emulate all older DirectX API). On host system is drawing by DirectX 12 (on Linux is translated by dxvk to Vulkan). Main problem is a relatively large amount of bugs (see summary here). vGPU10 don't work well with SoftGPU 0.4.x releases, but SoftGPU 0.5.x solved most of problems ~and now this is preferred variant.~ vGPU9 is usually faster in DX6-8 application and with Quake 2 engine games (paradoxically vGPU10 is faster with Quake 3 engine games).

Switch between vGPU9 and vGPU10:

[^2]: OK, and there some bugs, so VirtualBox is using vGPU10 even on DX10 only GPUs, so result is usually nice black screen...

VMware Workstation setup with HW acceleration

SoftGPU with HW acceleration was tested only with lasted version of VMware Workstation (17.0.0 build-20800274), if you'll be successful with older version or free VMware player, please let me know.

General information

Step by step guide

1) Create new VM - from menu File->New Virtual Machine 2) In wizard choose Custom (advanced) click on next:

5) Install the Windows 98 - this step is really pain, VMware VM in BIOS VGA mode is hyper slow and mouse isn't usable - you have navigate through installation by keyboard (TAB, Shift+TAB, cursor keys, Enter).

VMware HID devices disabled

11) Turn off VM, open VM setting and under Display check Accelerate 3D graphics

12) Start VM and use glchecker.exe to verify settings.

VMware Workstation Player

VMware Workstation Player hasn't GUI option to select virtual machine version. But you can set it manually by editing *.vmx file:

0) Turn VM off 1) Open folder with Virtual Machine (How to locate: Right click on VM -> setting... -> tab Options -> General -> Working directory) 2) Open file *Virtual machine name*.vmx in text editor (for example in Notepad if you haven't something better) 3) Search for virtualHW.version 4) Modify line to:

virtualHW.version = "9"

(Original values are 18 for VMware 16 or 19 for VMware 17)

5) Save file, start VM and run glchecker to verify setting:

VMware Player + SoftGPU

QEMU

There is no native 3D acceleration support for QEMU yet, but you can apply QEMU-3dfx patches.

Next problem with QEMU is, that Windows 98 incorrectly detected PCI bus as PnP BIOS. There is 2 solutions for it.

Non-PnP BIOS

This is best for fresh installations. First you need SeaBIOS with disabled CONFIG_PNPBIOS. You can compile manually from source or you can use my binary: seabios-qemu.zip. Extract bios.bin somewhere and run QEMU with '-bios /path/to/somewhere/bios.bin'. Windows 9x installation with this BIOS should detect all hardware without problems.

PCI bus detection fix

If you have already installed system and you don't see any PCI hardware, use these steps:

1) Open Device Manager and locate Plug and Play BIOS (Exclamation mark should be on it)

QEMU PCI: Plug and Play BIOS

2) With this device selected click on Properties, select Driver tab and click on Update driver

QEMU PCI: Plug and Play BIOS properties

3) In Wizard select second option (Display a list of all drivers in specific location, ...)

QEMU PCI: list drivers

4) Select Show all hadrware and from models list choose PCI bus, click on next, confirm warning message and reboot computer.

QEMU PCI: select PCI bus QEMU PCI: warning message

5) After reboot, system will ask you for drive on every new discovered device. All you need to do, is select Search for the best driver... and clicking on next. Please don't select new or updated drivers here - you can do it later. You may need reboot computer several times.

QEMU PCI: new PCI device QEMU PCI: select best driver

6) You will be asked for VGA driver and unknown device drivers. Still select default generic driver here!

QEMU PCI: standard PCI VGA QEMU PCI: unknown device

7) After last reboot open Device manager again - as you see, you have 2 VGA cards now, so select Standard Display Adapter (VGA) (the working one) and click on Remove.

QEMU PCI: 2 VGA adapters

8) After reboot (again), you have working system now and you can install SoftGPU and other drivers.

QEMU-3dfx

1) Built patched QEMU 2) Install Windows 98 with disabled CPU accelerator (it's a bit slow) 3) Check if you see PCI bus on Hardware manager 4) (optional) Install audio driver you're using AC-97 5) Mount SoftGPU ISO and install SoftGPU 6) Reboot and check if video driver works 7) Now you can shutdown VM and run again with CPU accelerator enabled 8) Now navigate to SoftGPU CD to extras\qemu3dfx folder and you have do set the signature:

For QEMU-3dfx need both wrapper and hypervisor same signature to works. This signature is first 7 characters from GIT revision hash. You can obtain the hash by this command in cloned qemu-3dfx repository:

git rev-parse HEAD

Binaries in SoftGPU allows to override build signature registry keys. To check that you have same signature as QEMU run testqmfx.exe (in extras\qemu3dfx). If you see error 0x45A (= ERROR_DLL_INIT_FAILED), you have wrong signature. In this case edit set-sign.reg (copy it from CD to writeable location) and rewrite the value REV_QEMU3DFX to revision hash obtain from GIT (you need only first 7 characters, retype full hash isn't necessary). After it apply file to registry (by double click on file) and run testqmfx.exe to check the result - you should see rotating triangle on success and see OpenGL information from your host GPU.

9) Copy fxmemmap.vxd and qmfxgl32.dll to C:\WINDOWS\SYSTEM and apply file icd-enable.reg (this tells to driver using qmfxgl32.dll when system opengl32.dll ask about OpenGL driver). 10) reboot (required) 11) run GLchecker or some other 3D application to verify settings.

Bugs

Currently there are known these limitations:

Vertex Shaders

Update for 0.5.x versions: Vertex Shaders works on vGPUv10 (VirtualBox 7) and for qemu-3dfx. For vGPU9 (VMware, VirtualBox 6.1) are DirectX shaders disabled, so most of applications can use shader alternative (most of DX8 games lots of DX9).

Windows 95 support

Windows 95 support is limited - SoftGPU works, but there lots of extra bugs will appear and if you haven't any special reasons for using Windows 95 use recommended Windows 98 Second edition instead.

Other bugs

There are many bugs in individual components, please post them to individual repositories based on bugged application (DirectX, Glide, OpenGL).

But still, please be patient. SoftGPU compatibility target is about a decade of intensive HW and SW development (from DOS direct VGA/VESA access, SW rendering through GDI, DirectDraw, OpenGL, Glide, DirectX, OpenGL again). After all, there will still applications that cannot be run anyway because there are written for very individual SW/HW combinations.

General tips

There are some tips without direct relation to SoftGPU but they can improve the user experience with MS Windows 9x OS.

Fresh install

Prefer new installation over copy older installations done on different (even virtual) HW.

Copy Installation to HDD before run setup

If you installed Windows 9x from CD, on near every system change your will be asked to insert Install CD. You can avoid it if you prepare HDD manually, copy installation from CD and run setup.exe from C: drive.

All utilities you need are on patcher9x boot floppy. The short procedure follows:

Now setup automatically runs scandisk and after complete it you can continue with installer GUI. You can also remove floppy and CD from drive at this point.

Turn on DMA

Windows by default using interrupts to access HDD and CD drive. This is especially slow in the HW accelerated virtual machines because every interrupt will stop executing visualisation engine and hand over access to hypervisor to solve it and after that it'll be need to restart visualisation engine again. Time consumed by interrupts depends on visualization technology for example in QEMU + kvm is HDD access very slow equally VirtualBox + Hyper-V and combination QEMU + Hyper-V is downright painful. Fortunately there is DMA transfer of whole memory block instead of individual bytes. Unfortunately you have to enable it manually.

You can turn it on in Device Manager on HDD properties enable DMA checkbox. Do it the same for CD driver and reboot VM for applying changes.

setting DMA access to HDD

Change logon to Windows Logon

After install network card you are asked every time to enter the credentials - but this is not credentials to the computer but to the network (you can also skip this by press ESC). If you don't plan to install NT server as other VM and runs ancient network sharing, this is only annoying thing. You can turn it off in Control panel -> Network and change Primary network logon to Windows Logon.

Windows logon switch

Extra drivers

These are links to some extra drivers for VM:

If you wish download these drivers from Windows 9x directly, you can use these links (simply replace https -> http):

http://files.emulace.cz/ac97_362.zip
http://files.emulace.cz/sbpci_98se.exe
http://files.emulace.cz/vmmouse.zip

If you need tool for decompressing ZIP and other archives, there is 7-Zip in version with Windows 98 compatible:

http://files.emulace.cz/7z920.exe

Runtime configuration

There a few registry keys to configure SoftGPU and its component, more on softgpu.md or softgpu.html on SoftGPU CD.

Compilation from source (outdated)

1) You need MINGW and GNU make to build softgpu.exe 2) You need all development tool to compile all other component (see README.md in individual repositories) 3) Compile softgpu.exe by type make 4) Compile VMDisp9x and copy files boxvmini.drv, vmwsmini.drv, qemumini.drv, vmwsmini.vxd, vmdisp9x.inf and place them to driver/win95 and driver/win98me folder 5) Compile Mesa9x for Windows 95 (e.g., without SSE) and copy and rename files to following schema

15) place redistributable to redist folder 16) Edit softgpu.ini for final paths review 17) Create ISO file place to it: