2023-11-06 23:46:50 +00:00
2023-11-05 19:11:28 +00:00
2023-11-06 23:46:50 +00:00
2023-10-27 10:18:10 +00:00
2023-11-03 20:14:34 +00:00
2023-11-06 23:46:50 +00:00

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)

  • 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

Immediate next steps:

  • Implement system to notify IPU of map state changes, so that doors open and close properly.
  • Port visplane system to get IPU rendering floors and ceilings

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%