mirror of
https://github.com/jndean/IPUDOOM.git
synced 2026-08-09 11:58:52 +00:00
Setup build system and test IPU integration by drawing a line on the automap
This commit is contained in:
@@ -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/
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
Binary file not shown.
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
|
||||
typedef uint8_t pixel_t;
|
||||
void AM_LevelInit(void);
|
||||
void AM_Drawer(pixel_t*);
|
||||
|
||||
|
||||
|
||||
@@ -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(); }
|
||||
}
|
||||
@@ -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__ //
|
||||
Binary file not shown.
@@ -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.
Reference in New Issue
Block a user