From 2b01d8a5899df6aacfa53d58417d81fa2aaa146a Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sat, 15 Apr 2023 22:19:01 -0500 Subject: [PATCH] rhi: Reset patch atlas if patch is freed --- src/hwr2/patch_atlas.cpp | 6 ++++++ src/i_video_common.cpp | 1 + src/r_patch.cpp | 14 ++++++++++++++ src/r_patch.h | 2 ++ 4 files changed, 23 insertions(+) diff --git a/src/hwr2/patch_atlas.cpp b/src/hwr2/patch_atlas.cpp index 90db30483..fe5f6229c 100644 --- a/src/hwr2/patch_atlas.cpp +++ b/src/hwr2/patch_atlas.cpp @@ -11,6 +11,8 @@ #include +#include "../r_patch.h" + using namespace srb2; using namespace srb2::hwr2; using namespace srb2::rhi; @@ -168,6 +170,10 @@ bool PatchAtlasCache::need_to_reset() const { return true; } + if (Patch_WasFreedThisFrame()) + { + return true; + } return false; } diff --git a/src/i_video_common.cpp b/src/i_video_common.cpp index e41725a16..20294e9b6 100644 --- a/src/i_video_common.cpp +++ b/src/i_video_common.cpp @@ -455,6 +455,7 @@ static InternalPassData build_pass_manager() void I_NewTwodeeFrame(void) { g_2d = Twodee(); + Patch_ResetFreedThisFrame(); } void I_NewImguiFrame(void) diff --git a/src/r_patch.cpp b/src/r_patch.cpp index 443e940a3..3e544ef82 100644 --- a/src/r_patch.cpp +++ b/src/r_patch.cpp @@ -99,6 +99,8 @@ static void Patch_FreeData(patch_t *patch) Z_Free(patch->columns); } +static boolean g_patch_was_freed_this_frame = false; + void Patch_Free(patch_t *patch) { if (!patch || patch == missingpat) @@ -106,6 +108,18 @@ void Patch_Free(patch_t *patch) Patch_FreeData(patch); Z_Free(patch); + + g_patch_was_freed_this_frame = true; +} + +boolean Patch_WasFreedThisFrame(void) +{ + return g_patch_was_freed_this_frame; +} + +void Patch_ResetFreedThisFrame(void) +{ + g_patch_was_freed_this_frame = false; } // diff --git a/src/r_patch.h b/src/r_patch.h index dd3a6a29c..c0f0448c1 100644 --- a/src/r_patch.h +++ b/src/r_patch.h @@ -24,6 +24,8 @@ extern "C" { // Patch functions patch_t *Patch_Create(softwarepatch_t *source, size_t srcsize, void *dest); void Patch_Free(patch_t *patch); +boolean Patch_WasFreedThisFrame(void); +void Patch_ResetFreedThisFrame(void); #define Patch_FreeTag(tagnum) Patch_FreeTags(tagnum, tagnum) void Patch_FreeTags(INT32 lowtag, INT32 hightag);