From 25c405a1bd330866f8636962a199a2586580cc73 Mon Sep 17 00:00:00 2001 From: praydog Date: Tue, 13 Feb 2024 20:28:33 -0800 Subject: [PATCH] UI Compat: Fix case where ViewFamilyTexture could sometimes not be seen --- src/CommitHash.hpp | 4 +-- src/mods/vr/FFakeStereoRenderingHook.cpp | 33 +++++++++++++++++------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/CommitHash.hpp b/src/CommitHash.hpp index 18acda0d..f72e2199 100644 --- a/src/CommitHash.hpp +++ b/src/CommitHash.hpp @@ -1,4 +1,4 @@ #pragma once -#define UEVR_COMMIT_HASH "ef68b854db04abe74cf577f4d4a5a8c1a7e448fb" -#define UEVR_BUILD_DATE "12.02.2024" +#define UEVR_COMMIT_HASH "3997108934a41fdbb1c6a6e8ff59d7fcd63362ac" +#define UEVR_BUILD_DATE "13.02.2024" #define UEVR_BUILD_TIME "00:00" diff --git a/src/mods/vr/FFakeStereoRenderingHook.cpp b/src/mods/vr/FFakeStereoRenderingHook.cpp index 81fe3d2e..f27a0e32 100644 --- a/src/mods/vr/FFakeStereoRenderingHook.cpp +++ b/src/mods/vr/FFakeStereoRenderingHook.cpp @@ -1731,6 +1731,7 @@ FRHITexture2D** FFakeStereoRenderingHook::viewport_get_render_target_texture_hoo const auto retaddr = (uintptr_t)_ReturnAddress(); static std::unordered_set redirected_retaddrs{}; static std::unordered_set call_original_retaddrs{}; + static std::unordered_set seen_retaddrs{}; static std::recursive_mutex retaddr_mutex{}; static bool has_view_family_tex{false}; @@ -1744,22 +1745,20 @@ FRHITexture2D** FFakeStereoRenderingHook::viewport_get_render_target_texture_hoo { std::scoped_lock _{retaddr_mutex}; + utility::ScopeGuard guard{[&](){ seen_retaddrs.insert(retaddr); }}; if (call_original_retaddrs.contains(retaddr)) { return og(viewport); } - // Hacky way to allow the first texture to go through - // For the games that are using something other than ViewFamilyTexture as the scene RT. - if (!call_original_retaddrs.empty() && !redirected_retaddrs.contains(retaddr) && !has_view_family_tex) { - return og(viewport); - } + std::optional func_start{}; - if (!redirected_retaddrs.contains(retaddr) && !call_original_retaddrs.contains(retaddr)) { + // ALWAYS check the retaddr for ViewFamilyTexture first and never skip it + // This will fix the case where we run into some other texture initially. + if (!seen_retaddrs.contains(retaddr)) { SPDLOG_INFO("FViewport::GetRenderTargetTexture called from {:x}", retaddr); - - // Analyze surrounding code to determine if this is a valid call. - auto func_start = utility::find_function_start(retaddr); + + func_start = utility::find_function_start(retaddr); if (!func_start) { func_start = retaddr; @@ -1774,6 +1773,22 @@ FRHITexture2D** FFakeStereoRenderingHook::viewport_get_render_target_texture_hoo has_view_family_tex = true; return og(viewport); } + } + + // Hacky way to allow the first texture to go through + // For the games that are using something other than ViewFamilyTexture as the scene RT. + if (!call_original_retaddrs.empty() && !redirected_retaddrs.contains(retaddr) && !has_view_family_tex) { + return og(viewport); + } + + if (!redirected_retaddrs.contains(retaddr) && !call_original_retaddrs.contains(retaddr)) { + if (!func_start) { + func_start = utility::find_function_start(retaddr); + + if (!func_start) { + func_start = retaddr; + } + } // Probably NOT... /*if (utility::find_string_reference_in_path(*func_start, L"r.RHICmdAsyncRHIThreadDispatch")) {