diff --git a/src/d_main.cpp b/src/d_main.cpp index d4b9e01edd..dda5acf575 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -2449,6 +2449,10 @@ void D_DoomMain (void) // This allocates a dummy framebuffer as a stand-in until V_Init2 is called. V_InitScreen(); } + else + { + screen->ReloadState(); + } GameConfig->DoKeySetup(gameinfo.ConfigName); diff --git a/src/rendering/gl/system/gl_framebuffer.cpp b/src/rendering/gl/system/gl_framebuffer.cpp index f28383e232..ac730975a2 100644 --- a/src/rendering/gl/system/gl_framebuffer.cpp +++ b/src/rendering/gl/system/gl_framebuffer.cpp @@ -101,6 +101,22 @@ OpenGLFrameBuffer::~OpenGLFrameBuffer() } } +//========================================================================== +// +// The entire state is encapsulated in GLRenderer, so deleting +// and recreating that woll do what we need, most importantly +// recompilation of the shaders. +// +//========================================================================== + +void OpenGLFrameBuffer::ReloadState() +{ + if (GLRenderer) delete GLRenderer; + GLRenderer = new FGLRenderer(this); + GLRenderer->Initialize(GetWidth(), GetHeight()); +} + + //========================================================================== // // Initializes the GL renderer diff --git a/src/rendering/gl/system/gl_framebuffer.h b/src/rendering/gl/system/gl_framebuffer.h index 512ea037b3..10675cf7eb 100644 --- a/src/rendering/gl/system/gl_framebuffer.h +++ b/src/rendering/gl/system/gl_framebuffer.h @@ -22,6 +22,7 @@ public: ~OpenGLFrameBuffer(); void InitializeState() override; + void ReloadState() override; void Update() override; void CleanForRestart() override; diff --git a/src/rendering/v_video.h b/src/rendering/v_video.h index 184df0fe83..e17ff0abab 100644 --- a/src/rendering/v_video.h +++ b/src/rendering/v_video.h @@ -393,6 +393,7 @@ public: DFrameBuffer (int width=1, int height=1); virtual ~DFrameBuffer(); virtual void InitializeState() = 0; // For stuff that needs 'screen' set. + virtual void ReloadState() = 0; virtual bool IsVulkan() { return false; } void SetSize(int width, int height); diff --git a/src/rendering/vulkan/system/vk_framebuffer.cpp b/src/rendering/vulkan/system/vk_framebuffer.cpp index 80532538ca..686d21f8d8 100644 --- a/src/rendering/vulkan/system/vk_framebuffer.cpp +++ b/src/rendering/vulkan/system/vk_framebuffer.cpp @@ -184,6 +184,11 @@ void VulkanFrameBuffer::InitializeState() } } +void VulkanFrameBuffer::ReloadState() +{ + InitializeState(); +} + void VulkanFrameBuffer::Update() { twoD.Reset(); diff --git a/src/rendering/vulkan/system/vk_framebuffer.h b/src/rendering/vulkan/system/vk_framebuffer.h index 64dfa3e7bd..fafca236f6 100644 --- a/src/rendering/vulkan/system/vk_framebuffer.h +++ b/src/rendering/vulkan/system/vk_framebuffer.h @@ -72,6 +72,7 @@ public: void Update(); void InitializeState() override; + void ReloadState() override; void CleanForRestart() override; void PrecacheMaterial(FMaterial *mat, int translation) override;