From 67eb78e08df7d6261ee6d561d21010872f97ba96 Mon Sep 17 00:00:00 2001 From: jndean Date: Sun, 10 Dec 2023 19:35:19 +0000 Subject: [PATCH] Add option for IPU-only rendering --- Makefile | 3 +-- README.md | 11 ++++++++--- src/d_loop.c | 3 ++- src/d_main.c | 17 +++++++++++++++-- src/i_video.c | 6 ++++-- src/ipu/Makefile | 16 ---------------- src/ipu/ipu_texturetiles.gp | Bin 0 -> 62475 bytes src/ipu/r_codelets.cpp | 3 --- src/r_main.c | 9 ++++++--- src/r_main.h | 3 +++ 10 files changed, 39 insertions(+), 32 deletions(-) delete mode 100644 src/ipu/Makefile create mode 100644 src/ipu/ipu_texturetiles.gp diff --git a/Makefile b/Makefile index e235ca5..040ed29 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,6 @@ IPU_OBJ = $(addprefix build/ipu_obj/, \ ipu_vertices.gp \ ipu_transfer.gp \ ipu_malloc.gp \ - ipu_texturetiles.gp \ i_video.gp \ g_game.gp \ g_game_codelets.gp \ @@ -58,7 +57,7 @@ build/cpu_obj/%.o: src/%.cpp #src/*.h gcc-7 src/$*.cpp $(CPU_FLAGS) -c -o $@ build/ipu_rt.gp: $(IPU_OBJ) - popc $^ $(IPU_FLAGS) -o $@ + popc $^ src/ipu/ipu_texturetiles.gp $(IPU_FLAGS) -o $@ build/ipu_obj/%.gp: src/ipu/%.c src/ipu/*.h popc $< $(IPU_FLAGS) -o $@ diff --git a/README.md b/README.md index 8397c81..681087d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A WIP to run Doom 1993 in the SRAM (~L1 cache) of the Graphcore MkII IPU (an AI accelerator chip which was definitely not designed to play video games). This is a hobby project, not a Graphcore product. ## Build and Run -I use Ubuntu20 and Poplar SDK 3.3, but recent versions of either should be fine. +I use Ubuntu20 and Poplar SDK 3.3, but recent versions of either will probably work fine. Due to the use of mutable global state and a custom exchange compiler, IPUDOOM requires a real IPU and will not run on the IPUModel (CPU simulating an IPU). @@ -26,8 +26,13 @@ make -j4 # Download the doom shareware resource pack (contains the free levels) wget https://distro.ibiblio.org/slitaz/sources/packages/d/doom1.wad -# Run the game. It will start a demo - press any key to bring up the main menu. -./build/doom -iwad doom1.wad -width 320 -nosound -nomouse +# Run the game - it will start a demo, press any key bring up the menu. +# Uses the CPU to overdraw the components that are not yet ported to IPU +./build/doom -iwad doom1.wad -width 320 -nosound + +# Run the game without the CPU adding the bits missing from the IPU port, +# so you can see IPUDoom in its raw ipu-only glory +./build/doom -iwad doom1.wad -width 320 -nosound -ipuonly ``` diff --git a/src/d_loop.c b/src/d_loop.c index 5bf823b..47c0e4e 100644 --- a/src/d_loop.c +++ b/src/d_loop.c @@ -443,6 +443,7 @@ boolean D_InitNetGame(net_connect_data_t *connect_data) net_addr_t *addr = NULL; int i; + // Call D_QuitNetGame on exit: I_AtExit(D_QuitNetGame, true); @@ -458,7 +459,7 @@ boolean D_InitNetGame(net_connect_data_t *connect_data) if (M_CheckParm("-server") > 0 || M_CheckParm("-privateserver") > 0) { - printf("JOSEF SAYS: I do not support multiplayer :)\n"); + printf("JOSEF SAYS: I have disabled multiplayer :)\n"); exit(0); // But if you remove this return statement it might just work :) NET_SV_Init(); NET_SV_AddModule(&net_loop_server_module); diff --git a/src/d_main.c b/src/d_main.c index 5ef9f8c..7f75962 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -215,8 +215,12 @@ void D_Display(void) { redrawsbar = true; if (inhelpscreensstate && !inhelpscreens) redrawsbar = true; // just put away the help screen - ST_Drawer(viewheight == SCREENHEIGHT, redrawsbar); - // (void) redrawsbar; // JOSEF: for disabling ST_Drawer + + if (!renderIPUonly) { // JOSEF + ST_Drawer(viewheight == SCREENHEIGHT, redrawsbar); + } else { + memset(&I_VideoBuffer[SCREENWIDTH * (SCREENHEIGHT - 32)], 0, SCREENWIDTH * 32); + } fullscreen = viewheight == SCREENHEIGHT; break; @@ -913,6 +917,15 @@ void D_DoomMain(void) { devparm = M_CheckParm("-devparm"); I_DisplayFPSDots(devparm); + + //! + // @JOSEF + // + // Only use the IPU for rendering, disable CPU overdraw of missing elements + // + + renderIPUonly = M_CheckParm("-ipuonly"); + //! // @category net diff --git a/src/i_video.c b/src/i_video.c index fcfe8cb..a4f3b39 100644 --- a/src/i_video.c +++ b/src/i_video.c @@ -976,8 +976,10 @@ void I_GraphicsCheckCommandLine(void) // Disable the mouse. // - nomouse = M_CheckParm("-nomouse") > 0; - + // JOSEF: Disable mouse input + // nomouse = M_CheckParm("-nomouse") > 0; + nomouse = 1; + //! // @category video // @arg diff --git a/src/ipu/Makefile b/src/ipu/Makefile deleted file mode 100644 index 0a43a55..0000000 --- a/src/ipu/Makefile +++ /dev/null @@ -1,16 +0,0 @@ - -GARPHOBJS = AM_map.gp # m_fixed.gp - -all: ipu_rt.gp - -ipu_rt.gp: $(GARPHOBJS) ipu_vertices.gp - popc $(GARPHOBJS) ipu_vertices.gp -o $@ - -ipu_vertices.gp: ipu_vertices.cpp - popc -Os $^ -o $@ - -%.gp: %.c - popc -Os $^ -o $@ - -clean: - rm $(GARPHOBJS) ipu_vertices.gp \ No newline at end of file diff --git a/src/ipu/ipu_texturetiles.gp b/src/ipu/ipu_texturetiles.gp new file mode 100644 index 0000000000000000000000000000000000000000..55cc24c3b4334985e225588ca4da38c83d6eb842 GIT binary patch literal 62475 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�nZ(ftPiX48xS{v=O@Uh1|DNZeHJIBOj00jv9hro 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 literal 0 HcmV?d00001 diff --git a/src/ipu/r_codelets.cpp b/src/ipu/r_codelets.cpp index 1a2f4c9..5ae1071 100644 --- a/src/ipu/r_codelets.cpp +++ b/src/ipu/r_codelets.cpp @@ -90,9 +90,6 @@ R_RenderPlayerView_Vertex : public poplar::SupervisorVertex { (R_RenderPlayerView_MiscValues_t*) &miscValues[0] ); - // For visualisation of progress - memset(I_VideoBuffer, 0, IPUCOLSPERRENDERTILE * SCREENHEIGHT); - R_RenderPlayerView(&players[displayplayer]); IPU_R_RenderTileDone(); return; diff --git a/src/r_main.c b/src/r_main.c index 2cec8b2..8f0cabb 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -106,6 +106,8 @@ lighttable_t *zlight[LIGHTLEVELS][MAXLIGHTZ]; // bumped light from gun blasts int extralight; +int renderIPUonly; // JOSEF + void (*colfunc)(void); void (*basecolfunc)(void); void (*fuzzcolfunc)(void); @@ -750,11 +752,12 @@ void R_RenderPlayerView(player_t *player) { // R_DrawPlanes(); // Check for new console commands. - NetUpdate(); + // NetUpdate(); - // R_DrawMasked(); + IPU_R_RenderPlayerView(); + + if (!renderIPUonly) R_DrawMasked(); // Check for new console commands. NetUpdate(); - IPU_R_RenderPlayerView(); } diff --git a/src/r_main.h b/src/r_main.h index a5ab94a..06dd822 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -77,6 +77,9 @@ extern lighttable_t *fixedcolormap; // 0 = high, 1 = low extern int detailshift; +extern int renderIPUonly; // JOSEF + + // // Function pointers to switch refresh/drawing functions. // Used to select shadow mode etc.