Setup build system and test IPU integration by drawing a line on the automap

This commit is contained in:
jndean
2022-07-09 18:55:02 +01:00
parent d6910fcffc
commit 2e8cc9e70e
13 changed files with 186 additions and 11 deletions
+25 -8
View File
@@ -1,22 +1,39 @@
CPU_OBJ = $(addprefix build/obj/, i_system.o d_mode.o i_main.o i_timer.o m_argv.o m_misc.o net_common.o net_dedicated.o net_io.o net_packet.o net_query.o net_sdl.o net_server.o net_structrw.o aes_prng.o d_event.o d_iwad.o d_loop.o d_mode.o gusconf.o i_cdmus.o i_input.o i_joystick.o i_sdlmusic.o i_sdlsound.o i_sound.o i_timer.o i_video.o i_videohr.o midifile.o mus2mid.o m_bbox.o m_cheat.o m_config.o m_controls.o m_fixed.o net_client.o sha1.o memio.o tables.o v_video.o w_checksum.o w_main.o w_wad.o w_file.o w_file_stdc.o w_file_posix.o w_merge.o z_zone.o net_loop.o am_map.o d_items.o d_main.o d_net.o doomdef.o doomstat.o dstrings.o f_wipe.o g_game.o hu_lib.o hu_stuff.o info.o m_menu.o m_random.o p_ceilng.o p_doors.o p_enemy.o p_floor.o p_inter.o p_lights.o p_map.o p_maputl.o p_mobj.o p_plats.o p_pspr.o p_saveg.o p_setup.o p_sight.o p_spec.o p_switch.o p_telept.o p_tick.o p_user.o r_bsp.o r_data.o r_draw.o r_main.o r_plane.o r_segs.o r_sky.o r_things.o s_sound.o sounds.o st_lib.o st_stuff.o statdump.o wi_stuff.o)
CPU_OBJ = $(addprefix build/cpu_obj/, ipu_host.o i_system.o d_mode.o i_main.o m_argv.o m_misc.o net_common.o net_dedicated.o net_io.o net_packet.o net_query.o net_sdl.o net_server.o net_structrw.o aes_prng.o d_event.o d_iwad.o d_loop.o gusconf.o i_cdmus.o i_input.o i_joystick.o i_sdlmusic.o i_sdlsound.o i_sound.o i_timer.o i_video.o i_videohr.o midifile.o mus2mid.o m_bbox.o m_cheat.o m_config.o m_controls.o m_fixed.o net_client.o sha1.o memio.o tables.o v_video.o w_checksum.o w_main.o w_wad.o w_file.o w_file_stdc.o w_file_posix.o w_merge.o z_zone.o net_loop.o am_map.o d_items.o d_main.o d_net.o doomdef.o doomstat.o dstrings.o f_wipe.o g_game.o hu_lib.o hu_stuff.o info.o m_menu.o m_random.o p_ceilng.o p_doors.o p_enemy.o p_floor.o p_inter.o p_lights.o p_map.o p_maputl.o p_mobj.o p_plats.o p_pspr.o p_saveg.o p_setup.o p_sight.o p_spec.o p_switch.o p_telept.o p_tick.o p_user.o r_bsp.o r_data.o r_draw.o r_main.o r_plane.o r_segs.o r_sky.o r_things.o s_sound.o sounds.o st_lib.o st_stuff.o statdump.o wi_stuff.o)
IPU_OBJ = $(addprefix build/ipu_obj/, ipu_vertices.gp am_map.gp)
CFLAGS = -I /usr/local/include/SDL2 -I/usr/include/libpng16 -I src \
-D_REENTRANT -lSDL2 -lSDL2_mixer -lSDL2_net -lpng16 -lz \
CFLAGS = -I src -I /usr/local/include/SDL2 -I/usr/include/libpng16 -I/opt/poplar/include \
-D_REENTRANT -lSDL2 -lSDL2_mixer -lSDL2_net -lpng16 -lz -lpoplar \
-Wall -Werror \
-O2
all: build build/doom
all: build build/doom build/ipu_rt.gp
build/doom: $(CPU_OBJ)
gcc $^ $(CFLAGS) -o build/doom
g++ $^ $(CFLAGS) -o build/doom
build/cpu_obj/%.o: src/%.c src/*.h
gcc src/$*.c $(CFLAGS) -c -o $@
build/cpu_obj/%.o: src/ipu/%.cpp
gcc src/ipu/$*.cpp $(CFLAGS) -c -o $@
build/ipu_rt.gp: $(IPU_OBJ)
popc -O2 $^ -o $@
build/ipu_obj/%.gp: src/ipu/%.c
popc -O2 $^ -o $@
build/ipu_obj/%.gp: src/ipu/%.cpp
popc -O2 $^ -o $@
build/obj/%.o: src/%.c
gcc $(CFLAGS) $^ -c -o $@
build:
mkdir -p build/obj
mkdir -p build/cpu_obj build/ipu_obj build/pop_obj
clean:
rm -r build/
+6
View File
@@ -46,6 +46,9 @@
#include "w_wad.h"
#include "z_zone.h"
#include "ipu/ipu_host.h"
// For use if I do walls with outsides/insides
#define REDS (256 - 5 * 16)
#define REDRANGE 16
@@ -504,6 +507,7 @@ void AM_Start(void) {
stopped = false;
if (lastlevel != gamemap || lastepisode != gameepisode) {
AM_LevelInit();
IPU_AM_LevelInit();
lastlevel = gamemap;
lastepisode = gameepisode;
}
@@ -1159,7 +1163,9 @@ void AM_Drawer(void) {
if (!automapactive)
return;
AM_clearFB(BACKGROUND);
IPU_AM_Drawer() ;
if (grid)
AM_drawGrid(GRIDCOLORS);
AM_drawWalls();
+5
View File
@@ -68,6 +68,8 @@
#include "wi_stuff.h"
#include "z_zone.h"
#include "ipu/ipu_host.h"
//
// D-DoomLoop()
// Not a globally visible function,
@@ -794,6 +796,9 @@ void D_DoomMain(void) {
// print banner
printf("IPU_Init: Initialise IPU device and compute graph \n");
IPU_Init();
printf("Z_Init: Init zone memory allocation daemon. \n");
Z_Init();
+10
View File
@@ -56,12 +56,22 @@
#include <inttypes.h>
#if defined(__cplusplus) || defined(__bool_true_false_are_defined)
// Use builtin bool type with C++.
typedef bool boolean;
#else
typedef enum
{
false,
true
} boolean;
#endif
typedef uint8_t byte;
typedef uint8_t pixel_t;
typedef int16_t dpixel_t;
+1 -1
View File
@@ -155,7 +155,7 @@ int force_software_renderer = false;
// Time to wait for the screen to settle on startup before starting the
// game (ms)
static int startup_delay = 1000;
static int startup_delay = 10;
// Grab the mouse? (int type for config code). nograbmouse_override allows
// this to be temporarily disabled via the command line.
BIN
View File
Binary file not shown.
+6 -1
View File
@@ -3,8 +3,13 @@
typedef unsigned char pixel_t;
void AM_LevelInit(void) {
}
void AM_Drawer(pixel_t* fb) {
for (int i = 0; i < 100; ++i) {
fb[(i + 1) * 320] = 56;
fb[i * 321] = 56;
}
}
+1
View File
@@ -5,6 +5,7 @@
typedef uint8_t pixel_t;
void AM_LevelInit(void);
void AM_Drawer(pixel_t*);
+112
View File
@@ -0,0 +1,112 @@
#include "ipu_host.h"
#include <algorithm>
#include <memory>
#include <poplar/DeviceManager.hpp>
#include <poplar/Engine.hpp>
#include <poplar/IPUModel.hpp>
#include "i_video.h"
poplar::Device getIpu(bool use_hardware, int num_ipus) {
if (use_hardware) {
auto manager = poplar::DeviceManager::createDeviceManager();
auto devices = manager.getDevices(poplar::TargetType::IPU, num_ipus);
auto it =
std::find_if(devices.begin(), devices.end(), [](poplar::Device &device) { return device.attach(); });
if (it == devices.end()) {
std::cerr << "IPU: Error attaching to device\n";
exit(EXIT_FAILURE);
}
std::cout << "Attached to IPU " << it->getId() << std::endl;
return std::move(*it);
} else {
poplar::IPUModel ipuModel;
std::cout << "Using simulated IPU" << std::endl;
return ipuModel.createDevice();
}
}
class IpuDoom {
public:
IpuDoom();
~IpuDoom();
void buildIpuGraph();
void run_AM_LevelInit();
void run_AM_Drawer();
poplar::Device m_ipuDevice;
poplar::Graph m_ipuGraph;
std::unique_ptr<poplar::Engine> m_ipuEngine;
};
IpuDoom::IpuDoom()
: m_ipuDevice(getIpu(false, 1)), m_ipuGraph(m_ipuDevice.getTarget()), m_ipuEngine(nullptr) {
buildIpuGraph();
}
IpuDoom::~IpuDoom(){};
void IpuDoom::buildIpuGraph() {
m_ipuGraph.addCodelets("build/ipu_rt.gp");
poplar::Tensor ipuFrame =
m_ipuGraph.addVariable(poplar::UNSIGNED_CHAR, {(ulong)SCREENWIDTH * SCREENHEIGHT}, "frame");
m_ipuGraph.setTileMapping(ipuFrame, 0);
auto frameInStream =
m_ipuGraph.addHostToDeviceFIFO("frame-instream", poplar::UNSIGNED_CHAR, SCREENWIDTH * SCREENHEIGHT);
auto frameOutStream =
m_ipuGraph.addDeviceToHostFIFO("frame-outstream", poplar::UNSIGNED_CHAR, SCREENWIDTH * SCREENHEIGHT);
poplar::ComputeSet AM_Drawer_CS = m_ipuGraph.addComputeSet("AM_Drawer_CS");
poplar::VertexRef vtx = m_ipuGraph.addVertex(AM_Drawer_CS, "AM_Drawer_Vertex", {{"frame", ipuFrame}});
m_ipuGraph.setTileMapping(vtx, 0);
m_ipuGraph.setPerfEstimate(vtx, 10000000);
poplar::program::Sequence AM_Drawer_prog({
poplar::program::Copy(frameInStream, ipuFrame),
poplar::program::Execute(AM_Drawer_CS),
poplar::program::Copy(ipuFrame, frameOutStream),
});
poplar::ComputeSet AM_LevelInit_CS = m_ipuGraph.addComputeSet("AM_LevelInit_CS");
vtx = m_ipuGraph.addVertex(AM_LevelInit_CS, "AM_LevelInit_Vertex", {});
m_ipuGraph.setTileMapping(vtx, 0);
m_ipuGraph.setPerfEstimate(vtx, 10000000);
poplar::program::Sequence AM_LevelInit_prog({
poplar::program::Execute(AM_LevelInit_CS),
});
m_ipuEngine = std::make_unique<poplar::Engine>(
std::move(poplar::Engine(m_ipuGraph,
{
AM_LevelInit_prog,
AM_Drawer_prog
}
)));
// m_ipuEngine->connectStream("frame-instream", I_VideoBuffer);
// m_ipuEngine->connectStream("frame-outstream", I_VideoBuffer);
m_ipuEngine->load(m_ipuDevice);
}
void IpuDoom::run_AM_LevelInit() { m_ipuEngine->run(0); }
void IpuDoom::run_AM_Drawer() {
static bool setup = true;
if (setup) {
setup = false;
m_ipuEngine->connectStream("frame-instream", I_VideoBuffer);
m_ipuEngine->connectStream("frame-outstream", I_VideoBuffer);
}
m_ipuEngine->run(1);
}
static std::unique_ptr<IpuDoom> ipuDoomInstance = nullptr;
extern "C" {
void IPU_Init(void) { ipuDoomInstance = std::make_unique<IpuDoom>(); }
void IPU_AM_LevelInit() { ipuDoomInstance->run_AM_LevelInit(); }
void IPU_AM_Drawer() { ipuDoomInstance->run_AM_Drawer(); }
}
+19
View File
@@ -0,0 +1,19 @@
#ifndef __IPUDOOM__
#define __IPUDOOM__
#ifdef __cplusplus
extern "C" {
#endif
void IPU_Init();
void IPU_AM_LevelInit();
void IPU_AM_Drawer();
#ifdef __cplusplus
}
#endif
#endif // __IPUDOOM__ //
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -14,7 +14,7 @@ extern "C" {
class AM_LevelInit_Vertex : public poplar::Vertex {
public:
bool compute() {
AM_LevelInit();
AM_LevelInit();
return true;
}
};
Binary file not shown.