From 820e4be41c493db3438d96dc771b11c8b0a89bd4 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Wed, 18 Jun 2025 12:10:03 +0300 Subject: [PATCH] Fixed potential crash when using `frame_texture` --- src/DivaGL/hook.cpp | 17 +++++++++++++++++ src/DivaGL/render.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/DivaGL/render.hpp | 3 +++ 3 files changed, 60 insertions(+) diff --git a/src/DivaGL/hook.cpp b/src/DivaGL/hook.cpp index be39641..62b85d8 100644 --- a/src/DivaGL/hook.cpp +++ b/src/DivaGL/hook.cpp @@ -163,11 +163,20 @@ HOOK(void, FASTCALL, rndr__Render__free, 0x00000001404AB900, rndr::Render* rend) rend->free(); } +HOOK(void, FASTCALL, rndr__Render__frame_texture_free, 0x00000001404AE6C0, rndr::Render* rend) { + return rend->frame_texture_free(); +} + HOOK(void, FASTCALL, rndr__Render__render_texture_set, 0x00000001404B1560, rndr::Render* rend, texture* render_texture, bool task_photo) { rend->render_texture_set(render_texture, task_photo); } +HOOK(int32_t, FASTCALL, rndr__Render__frame_texture_load, 0x00000001404B1600, + rndr::Render* rend, int32_t slot, rndr::Render::FrameTextureType type, texture* tex) { + return rend->frame_texture_load(slot, type, tex); +} + HOOK(void, FASTCALL, rndr__Render__movie_texture_set, 0x00000001404B16A0, rndr::Render* rend, texture* movie_texture) { rend->movie_texture_set(movie_texture); @@ -183,6 +192,11 @@ HOOK(void, FASTCALL, rndr__Render__movie_texture_free, 0x00000001404B18F0, rend->movie_texture_free(movie_texture); } +HOOK(bool, FASTCALL, rndr__Render__frame_texture_unload, 0x00000001404B30A0, + rndr::Render* rend, int32_t slot, texture* tex) { + return rend->frame_texture_unload(slot, tex); +} + HOOK(void, FASTCALL, rndr__RenderManager__rndpass_pre_proc, 0x0000000140502C90) { render_data_context rend_data_ctx(GL_REND_STATE_PRE_3D); rend_data_ctx.state.get(); @@ -362,10 +376,13 @@ void hook_funcs() { INSTALL_HOOK(rndr__Render__init_post_process_buffers); INSTALL_HOOK(rndr__Render__init_render_buffers); INSTALL_HOOK(rndr__Render__free); + INSTALL_HOOK(rndr__Render__frame_texture_free); INSTALL_HOOK(rndr__Render__render_texture_set); + INSTALL_HOOK(rndr__Render__frame_texture_load); INSTALL_HOOK(rndr__Render__movie_texture_set); INSTALL_HOOK(rndr__Render__render_texture_free); INSTALL_HOOK(rndr__Render__movie_texture_free); + INSTALL_HOOK(rndr__Render__frame_texture_unload); INSTALL_HOOK(rndr__RenderManager__rndpass_pre_proc); INSTALL_HOOK(rndr__RenderManager__render_all); diff --git a/src/DivaGL/render.cpp b/src/DivaGL/render.cpp index bac8c83..554dd0a 100644 --- a/src/DivaGL/render.cpp +++ b/src/DivaGL/render.cpp @@ -508,6 +508,46 @@ namespace rndr { } } + void Render::frame_texture_free() { + for (Render::FrameTexture& i : frame_texture) { + for (Render::FrameTextureData& j : i.data) { + j.texture = 0; + j.render_texture.Free(); + j.type = FRAME_TEXTURE_MAX; + } + + i.capture = false; + } + } + + int32_t Render::frame_texture_load(int32_t slot, Render::FrameTextureType type, texture* tex) { + if (!tex || slot < 0 || slot >= 6) + return -1; + + for (Render::FrameTextureData& i : frame_texture[slot].data) + if (!i.texture) { + i.render_texture.SetColorDepthTextures(tex->glid); + i.texture = tex; + i.type = type; + return (int32_t)(&i - frame_texture[slot].data); + } + return -1; + } + + bool Render::frame_texture_unload(int32_t slot, texture* tex) { + if (!tex || slot < 0 || slot >= 6) + return false; + + for (Render::FrameTextureData& i : frame_texture[slot].data) + if (i.texture == tex) { + i.render_texture.Free(); + i.texture = 0; + i.type = FRAME_TEXTURE_MAX; + return true; + } + return false; + } + void Render::free() { if (transparency) { delete transparency; diff --git a/src/DivaGL/render.hpp b/src/DivaGL/render.hpp index 26b702d..3f5fb49 100644 --- a/src/DivaGL/render.hpp +++ b/src/DivaGL/render.hpp @@ -185,6 +185,9 @@ namespace rndr { int32_t width, int32_t height, float_t s0, float_t t0, float_t s1, float_t t1, float_t scale, float_t param_x, float_t param_y, float_t param_z, float_t param_w); void draw_lens_flare(render_data_context& rend_data_ctx, const cam_data& cam); + void frame_texture_free(); + int32_t frame_texture_load(int32_t slot, FrameTextureType type, texture* tex); + bool frame_texture_unload(int32_t slot, texture* tex); void free(); vec2 get_taa_offset(); void init_render_buffers(int32_t width, int32_t height,