// HACKER NEWS — CYBERSECURITY
Recreating Voodoo Graphics and a Late-1990s Gaming PC on an FPGA
I've spent the last month adding features and improving performance in
z486_MiSTer, mostly working through
games from the first half of the 1990s. Looking a few years ahead brought me
to another change I wanted to explore: the arrival of 3D graphics cards.
The first one that left a strong impression on me was the Voodoo. The game was
Need for Speed II SE. Smooth textures, fog, and the speed of the whole thing
made it feel like a new generation of PC gaming. Could I recreate that on an FPGA
now that the z486 CPU exists?
The result of this detour is zSST, a
SystemVerilog implementation of the 3dfx Voodoo Graphics, or SST-1.
Combined with my z486 CPU and the surrounding PC hardware, it forms
z486 XL: a DOS PC with Voodoo graphics
running in the programmable logic of a Xilinx KV260 board. Tomb Raider now runs
with its original 3dfx renderer.
zSST implements most of the central Voodoo features: prepared triangles,
texture filtering and mipmapping, depth and alpha tests, fog, blending,
dithering, framebuffer access, and buffer swaps. It supports both the
fixed-point and floating-point setup interfaces. Hardware game testing is
still concentrated on Tomb Raider; broader compatibility and later Voodoo
generations are work for another day.
The CPU and renderer run at 100 MHz on the
KV260.
That board has enough logic, DSP blocks, on-chip memory, and DDR bandwidth for
the combined design. The DE10-Nano does
not have room for this graphics addition. The KV260 uses its onboard DDR;
there is no external SDRAM module to add.
Fortunately, there is plenty of material to work from. 3dfx released the Glide source
in 1999, before NVIDIA acquired its core graphics assets in December 2000.
The surviving Glide source and
SST-1 specification
explain how software prepares triangles, configures the pixel pipeline, and
manages textures and framebuffers.
The specification is a behavioral target, rather than a circuit diagram.
It tells what should happen when software writes a register, but leaves
many implementation choices open. 86Box
provides useful references for complicated rendering behavior. The earlier
MAME Voodoo work is another
part of this preservation history.
SpinalVoodoo supplied particularly
useful Glide traces and reference screenshots for testing.
Voodoo Graphics turns triangles into pixels, leaving much of the 3D work to
the host CPU. Its command interface is surprisingly compact: five main
command registers drive the accelerator.
Both triangle commands launch the same rendering pipeline. Other registers
hold coordinates, gradients, and render state, while memory-mapped regions
provide texture uploads and direct framebuffer access. The main drawing
primitive is simply a prepared triangle.
For game developers, Glide presents a friendlier interface: