diff --git a/Makefile b/Makefile index 6aa43e3..2acbdb4 100644 --- a/Makefile +++ b/Makefile @@ -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/ \ No newline at end of file diff --git a/src/am_map.c b/src/am_map.c index 033faef..0c45027 100644 --- a/src/am_map.c +++ b/src/am_map.c @@ -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(); diff --git a/src/d_main.c b/src/d_main.c index 92645c1..0a7d43d 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -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(); diff --git a/src/doomtype.h b/src/doomtype.h index 09a3c29..c902209 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -56,12 +56,22 @@ #include +#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; diff --git a/src/i_video.c b/src/i_video.c index 4039059..230c843 100644 --- a/src/i_video.c +++ b/src/i_video.c @@ -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. diff --git a/src/ipu/AM_map.gp b/src/ipu/AM_map.gp deleted file mode 100644 index eaa224d..0000000 Binary files a/src/ipu/AM_map.gp and /dev/null differ diff --git a/src/ipu/AM_map.c b/src/ipu/am_map.c similarity index 65% rename from src/ipu/AM_map.c rename to src/ipu/am_map.c index aa81bf6..92e5954 100644 --- a/src/ipu/AM_map.c +++ b/src/ipu/am_map.c @@ -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; } } \ No newline at end of file diff --git a/src/ipu/am_map.h b/src/ipu/am_map.h index 4adeb8e..ba11f79 100644 --- a/src/ipu/am_map.h +++ b/src/ipu/am_map.h @@ -5,6 +5,7 @@ typedef uint8_t pixel_t; +void AM_LevelInit(void); void AM_Drawer(pixel_t*); diff --git a/src/ipu/ipu_host.cpp b/src/ipu/ipu_host.cpp new file mode 100644 index 0000000..bd8f8f3 --- /dev/null +++ b/src/ipu/ipu_host.cpp @@ -0,0 +1,112 @@ +#include "ipu_host.h" + +#include +#include +#include +#include +#include + +#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 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( + 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 ipuDoomInstance = nullptr; +extern "C" { +void IPU_Init(void) { ipuDoomInstance = std::make_unique(); } +void IPU_AM_LevelInit() { ipuDoomInstance->run_AM_LevelInit(); } +void IPU_AM_Drawer() { ipuDoomInstance->run_AM_Drawer(); } +} \ No newline at end of file diff --git a/src/ipu/ipu_host.h b/src/ipu/ipu_host.h new file mode 100644 index 0000000..84cfe7a --- /dev/null +++ b/src/ipu/ipu_host.h @@ -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__ // \ No newline at end of file diff --git a/src/ipu/ipu_rt.gp b/src/ipu/ipu_rt.gp deleted file mode 100644 index e649b3b..0000000 Binary files a/src/ipu/ipu_rt.gp and /dev/null differ diff --git a/src/ipu/ipu_vertices.cpp b/src/ipu/ipu_vertices.cpp index 8af6f4a..9cfe212 100644 --- a/src/ipu/ipu_vertices.cpp +++ b/src/ipu/ipu_vertices.cpp @@ -14,7 +14,7 @@ extern "C" { class AM_LevelInit_Vertex : public poplar::Vertex { public: bool compute() { - AM_LevelInit(); + AM_LevelInit(); return true; } }; diff --git a/src/ipu/ipu_vertices.gp b/src/ipu/ipu_vertices.gp deleted file mode 100644 index 0cd7dc8..0000000 Binary files a/src/ipu/ipu_vertices.gp and /dev/null differ