diff --git a/src/d_main.cpp b/src/d_main.cpp index 1d26efce3..9518be8ee 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -2738,6 +2738,7 @@ void D_DoomMain (void) M_SaveDefaults(NULL); // save config before the restart // delete all data that cannot be left until reinitialization + screen->CleanForRestart(); V_ClearFonts(); // must clear global font pointers ColorSets.Clear(); PainFlashes.Clear(); diff --git a/src/gl/renderer/gl_renderer.cpp b/src/gl/renderer/gl_renderer.cpp index 74100cc80..27da7b8bd 100644 --- a/src/gl/renderer/gl_renderer.cpp +++ b/src/gl/renderer/gl_renderer.cpp @@ -361,6 +361,13 @@ int FGLRenderer::ScreenToWindowY(int y) // //=========================================================================== +void FGLRenderer::ResetSWScene() +{ + // force recreation of the SW scene drawer to ensure it gets a new set of resources. + if (swdrawer != nullptr) delete swdrawer; + swdrawer = nullptr; +} + void FGLRenderer::SetupLevel() { mVBO->CreateVBO(); diff --git a/src/gl/renderer/gl_renderer.h b/src/gl/renderer/gl_renderer.h index 2b81ae547..c44330560 100644 --- a/src/gl/renderer/gl_renderer.h +++ b/src/gl/renderer/gl_renderer.h @@ -172,6 +172,7 @@ public: void FlushTextures(); void SetupLevel(); + void ResetSWScene(); void RenderScreenQuad(); void PostProcessScene(int fixedcm, const std::function &afterBloomDrawEndScene2D); diff --git a/src/gl/system/gl_framebuffer.cpp b/src/gl/system/gl_framebuffer.cpp index 1a9725656..661224da7 100644 --- a/src/gl/system/gl_framebuffer.cpp +++ b/src/gl/system/gl_framebuffer.cpp @@ -385,6 +385,12 @@ bool OpenGLFrameBuffer::SetContrast(float contrast) // //=========================================================================== +void OpenGLFrameBuffer::CleanForRestart() +{ + if (GLRenderer) + GLRenderer->ResetSWScene(); +} + void OpenGLFrameBuffer::UpdatePalette() { if (GLRenderer) diff --git a/src/gl/system/gl_framebuffer.h b/src/gl/system/gl_framebuffer.h index c73dc1cba..fb436c7cc 100644 --- a/src/gl/system/gl_framebuffer.h +++ b/src/gl/system/gl_framebuffer.h @@ -39,6 +39,7 @@ public: bool SetContrast(float contrast); void DoSetGamma(); + void CleanForRestart() override; void UpdatePalette() override; void GetFlashedPalette (PalEntry pal[256]) override; PalEntry *GetPalette () override; diff --git a/src/v_video.h b/src/v_video.h index 299694524..5567d1612 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -355,7 +355,8 @@ public: // Set the rect defining the area affected by blending. virtual void SetBlendingRect (int x1, int y1, int x2, int y2); - virtual bool LegacyHardware() const { return false; } // only for reporting SM1.4 support to the stat collector + // Delete any resources that need to be deleted after restarting with a different IWAD + virtual void CleanForRestart() {} // Begin 2D drawing operations. // Returns true if hardware-accelerated 2D has been entered, false if not.