From 2e8cc9e70ebeadb4ff73a9403507a3e47f2d3e00 Mon Sep 17 00:00:00 2001 From: jndean Date: Sat, 9 Jul 2022 18:55:02 +0100 Subject: [PATCH] Setup build system and test IPU integration by drawing a line on the automap --- Makefile | 33 +++++++--- src/am_map.c | 6 ++ src/d_main.c | 5 ++ src/doomtype.h | 10 +++ src/i_video.c | 2 +- src/ipu/AM_map.gp | Bin 2727 -> 0 bytes src/ipu/{AM_map.c => am_map.c} | 7 ++- src/ipu/am_map.h | 1 + src/ipu/ipu_host.cpp | 112 +++++++++++++++++++++++++++++++++ src/ipu/ipu_host.h | 19 ++++++ src/ipu/ipu_rt.gp | Bin 4930 -> 0 bytes src/ipu/ipu_vertices.cpp | 2 +- src/ipu/ipu_vertices.gp | Bin 3050 -> 0 bytes 13 files changed, 186 insertions(+), 11 deletions(-) delete mode 100644 src/ipu/AM_map.gp rename src/ipu/{AM_map.c => am_map.c} (65%) create mode 100644 src/ipu/ipu_host.cpp create mode 100644 src/ipu/ipu_host.h delete mode 100644 src/ipu/ipu_rt.gp delete mode 100644 src/ipu/ipu_vertices.gp 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 eaa224d606f1180e030849827bc2bb464a1b50f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2727 zcmXpgXL4W^WK4JDVG%S`64X?3)L{~gX~VG>@+!Y3@qt|iRLuI0?b z&LnKf&c~iyPzu71EUbd6?1F;qf}-q#yzGL!Y=XS(0gQ|S%mIu{0?ZDKhKx>5_4Tek zZcL1f3=E=-c8m;+%qLg{96}tpIQi4~^I1WJDu@sT5wcHraHYBMAI@h@b7|+#7fs`L z;m_y&pT?hmI?a*)z4nPTNB;a@Y5ZwF(;WHBPNne|eEgcmfBSnHf5G{$Y5cFxrSaFD z{C1GBgyUEXyTkYY|1Hw^i*K@lL=V0cfJrp`088Yb0+|Um@>3dr+DDj?KS4(ROXDv% z2Qu<}8voIg3^1(+euA|gJ;?$SVfYOe$v*=(4B|fig6}Rc6JLg=@!x)z#$WI~G>!lD z*EIg4=ivGs{($utoCMi=K8?TNJ;>IVY5Yge!qqhV1*^#ix%EAW$bXf_pY{@FJU9%# zrtue?1!+Bp>fnE1txyNE9Aja(NOR=BauY;c1Q8EG#Pow6tXv*XZF~4zd-?zU|9_Z) zfsu`oosor+m63^&nSp_kv7@1(qoJWQ1%eql7&-nW=OpH(E0q0DEh^5;&r>kuH_bdF3zyh*H6zZaVW@0Oe)GuPAthU(ksp{ElN%;OD!r%tT>D2e} z3G)pI^7nFe4$;raDa+L@D9X=DO)k+(&n!`}Ff_KbG%!p}H84&|GBPkoN;EREOiMB_ zFtAKEF-b8Mz(@rEGAdryOSBRwDI`vIN?@y2>S`$3B0P4w!)s^d-n zgA{oh#G5fPIQquB6eX53rxr1?2r{w%|MMRL7#Mj3nK+QRB7#huNL(2~CN3ndmLL;1 z64zLei3f>mBgn)H=W;XX6<6k#BqlNF6_*r2=nNREC^aWhuOzjigh8(;KP9mwQ7^f; z#L$dEFF8LqH#M(>K`$@ABvsGdFI2a#7F0I;XJTLk6%`+SnSK7}b2Kn8FvEld8JQRunV6X~7zH`_z=m=%GcYn| zurLOLOkiLT6a@2G8KWV5{>*|>Loh*1Ii>a=R8BE6GX7@(l~g|%85o3LFflrsXnf`2 z`tX0Z()pxg8(h+~{v-%9f7s#wpXtL+f5s2H{2A_j*zTV^LGr!>BfEk{gXFsj1x^zh zo&GG4a9}J~cr!!z!*<61j30I}GJV*|$jJO*2crPPZUvqN&Vm9Q%uF1HJRFSX;DpdfQtp+MrrO88b6(b|#1yJr`0Oc-*0A?lz22d7b2w-LhvDg^7 z0waW&7)1mG7|jI)7~KQ}_JLEB-hWWK(sT5U=Le{CQEn{hbQgglA`A&iAj#W@%KS_H`&p*9-Q@3i~h&Qm**E{ zrxvlsL#)b8tcXu9$}ca;h%d+~EsoF6OJ#sa<(H)vrRC(;mdD2zmsl{c2r@D-Ic)#{ 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 e649b3bfd246254585c8dede60cee3e6190406c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4930 zcmXqH6kujnVsu~>WK4JDVG%S`64X?3)L|0*$|wAhRZI9KtCsT{Rwm)CY<$AD+*-n> z+*-~S+)ToZJbdiQ1*IVD$igZ(Ra{U|T+r8CP|{z}mQS#jJ&=Wwk&#h=k&#J|hxrTh z|NsC0^MeQm21X`FMn(n(K^8`+fFPrhd|FXrZfYP0Ba;XtqoCj-K?z0>L$pg!hVj3n zZ@f=xS!xcWXI^GWd{}A`dr4}AAR}19r6{pHm9YpUT9R79z#u5VA;9d&!Dz_J#V9EH z>3@8DQE8rYehPDHPHIU!%p{mWU@dSpOfWTILyO|Wk5t&83|`Uo?&1g+HJ7e;R-O z=`=_F_u41Y9QpHqrSYfzOmpNfJC(*?@bPOJ|LyN-`~~N~rt!Z%m&RXr^4mei5{_dn z><-`m|F=lvFTTkJ5B>xQDFo^s33%6;CV z(G2{Kaj}OP7#P_Y*%?_FSs9ranHd-u89N#pIvN@}Qy`d;gOTH3a!z7ixT&&esv)h#H>&q_@$(M!)PQLr#HwzM=bOieW~PDwH{Fi1)? zGO|odGB7Z(Og1q|F-WvXvrjWiGBVZt4|Pzg0MtPP<(@QouzMJo0+<;Y7z3D@K?Dnk zUjEca8zYxG+`geBcoPehY%wJ1M?O}!ASxPjQ<>c<8u=W z^!_I6`8Wr78vKqo05iTD#2bPb?>!CTjr4q+?+17q#2f4R><1}|H_@vHtByDQ4^rf5 z5O2oC04qdb9KrElsGW*mVkY+{}K_>S9e?W!e|Ns9P z7Y!v(Nv0js^w>W|)v5BNGE7^95$+6O4i!{9toAnHd6 zd~kj@;k46-3yctsfPf(flYjsZGl!s|35Sq?jW7qZjsXkv2T-x~KV6{=T#gFlDHsk| zxdke=7&Q%9I7Ap2m{~X&7z{Z$_(4prL07giGBREOm4*zUGL|8LnTde`RM0X6Ftamq z!DKiauZ%&7MBz~FG);t^o<8sKFP+Q)+^W) zfg*Y?l<(HRa#24h07RTr3r7}RI^2<_-(sJ_48RFxMODqW2 zKaS8AGN@X?Pz|;n-kN1#5oBa!WMeb|6~>_Amrc+l0?Za?WNZ*z!OF1SXNWMupp0x5-=tHFgd#ONNdaY>AfY=S*J zU^d8T;c7-!MovaX!A=%N2jK=r9zhXKkZ~Zxg?m6;E)aJsNZSkngti%stc<*jjDj~o z+7^J+@q*NWwXFeh`9NHdql9-bqPfbQ2~^GtgB$M5P>v8I69a>>2U7y0pcua(i-52c zsA*@sf>{Ub1z{BsSNICcERa@E-CzVJhIs`c$i!&Kh@*~R8m%MH+uGo!_Gle3T1UX! U_VCJNw2olm5d;;-Bc+Z2084k|>i_@% 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 0cd7dc823be072b81b139b30e76e9b48ece277ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3050 zcmXpw$>hK&$e8ZP!y;&?B&ez6sKX@ql~1^nSxdN)Sio(KFC9P|zqY&al$g zPtPoID9A`mD#}bwEXgm@E6y)1N=_{UJ4-JwwM0K9GcBzYq*33;C(Jh>$luG=IYd7v zrz}^upeR2pHMvADJ+nl?!qC{#(!ek^)xbC<$;iMUDbdKtGA+r#z`!!u#3aQa(IU-0 z%`C~tRFi=zfSHkjF@TvFM6iGeRtCn4j4U7jGcX1+3o$YF=`1q2{14U z`Uo&E{xSv!^nd646mTGNVhd@o5||1{-*{LsgT2E57XY!q@ePV41_nkhK^D&ce?V#H z|Ns9CjQWBs9B?itgI;lEZb@PigI;k-5rocwv5Hc267@<_D@qvjlJj$OQ}ap~^z!mc zQuW;ZLUoHv5|gtT^guxspO})uUsRl#&cH6Hz{tqPz`*Fh=)l0h$il!ND9r+5GAA%G z8VIs6GIB6V2&yqM8Za<0HZb-xFn|)dpgt%?@H2uq3=ALbnSK7}b2Kn8FvEld8JQRu znFSabKM1n3fsNo~W?*DuVvGbCz`!6V$jrdVJb{VP7sBVyEGRVu6V%OG%&@G*%qU1k z*5Y8He%5Nz`wz-mjEs!`85kHu8GkS`FbD@QGdh}RJQd)ZaN6n30ttr?&hI9icKUFE z5yD|$Fl6E2VqjoqVP;@3fT_0{g%zSMNV4{p!WX7s-K(F>vO> zmbdi4={deQvnsWiK@XntK{^R&1gk~S4YLwOBWh;FV*{E(c+P|6G;l`4$cOM;49~sx zkZk-HQnEPzhn6gkoY2|;R64+ledG{fAhwucU=d_wWMpGB0p)Z-c1A`vK@%P@TaS^k zK`?-ok%^H}(3*wOK`??xke5l2g-0+Q#7p53=0^