IPUDOOM

A WIP to put Doom 1993 on the Graphcore Mk2 IPU (an AI accelerator chip).

# Install dependencies
sudo apt update 
sudo apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libpng-dev g++-7
# Build binary
make
# Download shareware resource pack
wget https://distro.ibiblio.org/slitaz/sources/packages/d/doom1.wad
# Run
./build/doom -iwad doom1.wad -width 320 -nosound -nomouse

Vanilla Doom runs on the CPU, have started offloading subsystems to IPU Tile 0. Activity Log:

  • Create IPU hooks for key methods like G_Ticker, G_Responder so IPU can step game time and respond to keypresses in real time. (Also setviewsize etc)

  • Implement IPU memory allocator for level state, i.e., anything with lifetime PU_LEVEL

  • IPU interacts with host to load and unpack all level geometry from disk whenever a level is loaded

  • Implement all methods used by the automap (vector rendering, sprite rendering, AM event responder). Automap is now disabled on CPU, renders entirely on IPU.

Automap

  • Implement BinarySpacePartion search (stackless recursion version for IPU), solidseg occlusion and floor/ceiling clipping to get (untextured) rendering of vertical walls running on the IPU. CPU still renders everything else (floors, ceilings, objects, enemies).

Gameplay with untextured walls

  • Split rendering across 32 render tiles. Reformat textures into a big buffer that can be striped over dedicated texture tiles, and accessed by the render tiles using JIT-patched exchange programs to enable fetches based on dynamic indices. So now IPU can texture walls.

Gameplay with textured walls (but nothing else) Gameplay showing rendering striped across 32 tiles

  • Implement lighting model (add shadows to walls): texture tiles translate the colours during texture column fetch requests to save memory on the render tiles.

Side-by-side of room with and without shadows

  • Port the visplane system to the render tiles, so IPU can render floors and ceilings, (untextured for now, instead coloured to show the visplane subdivision). Also implement skybox.

Gameplay with visplanes and skybox visible

Immediate next steps:

  • Port 'flats' and zlight so IPU can texture and light floors + ceilings.
  • Implement system to notify IPU of map state changes, so that doors open and close properly.

Longer term next steps:

  • Render other things in the level (sprites and masked components, HUD (using dedicated HUD tiles))

  • Move beyond just the rendering?

    ...

  • Profit?

Description
No description provided
Readme 19 MiB
Languages
C 95.7%
Gnuplot 2.3%
C++ 1.9%