diff --git a/OptiScaler/Config.cpp b/OptiScaler/Config.cpp index 6d85829c..11d3f47f 100644 --- a/OptiScaler/Config.cpp +++ b/OptiScaler/Config.cpp @@ -442,6 +442,15 @@ bool Config::Reload(std::filesystem::path iniPath) if (MipmapBiasOverride.has_value() && (MipmapBiasOverride.value() > 15.0 || MipmapBiasOverride.value() < -15.0)) MipmapBiasOverride.reset(); + if (!MipmapBiasFixedOverride.has_value()) + MipmapBiasFixedOverride = readBool("Hotfix", "MipmapBiasFixedOverride"); + + if (!MipmapBiasScaleOverride.has_value()) + MipmapBiasScaleOverride = readBool("Hotfix", "MipmapBiasScaleOverride"); + + if (!MipmapBiasOverrideAll.has_value()) + MipmapBiasOverrideAll = readBool("Hotfix", "MipmapBiasOverrideAll"); + if (!AnisotropyOverride.has_value()) AnisotropyOverride = readInt("Hotfix", "AnisotropyOverride"); @@ -830,6 +839,10 @@ bool Config::SaveIni() // Hotfixes { ini.SetValue("Hotfix", "MipmapBiasOverride", GetFloatValue(Instance()->MipmapBiasOverride).c_str()); + ini.SetValue("Hotfix", "MipmapBiasOverrideAll", GetBoolValue(Instance()->MipmapBiasOverrideAll).c_str()); + ini.SetValue("Hotfix", "MipmapBiasFixedOverride", GetBoolValue(Instance()->MipmapBiasFixedOverride).c_str()); + ini.SetValue("Hotfix", "MipmapBiasScaleOverride", GetBoolValue(Instance()->MipmapBiasScaleOverride).c_str()); + ini.SetValue("Hotfix", "AnisotropyOverride", GetIntValue(Instance()->AnisotropyOverride).c_str()); ini.SetValue("Hotfix", "RoundInternalResolution", GetIntValue(Instance()->RoundInternalResolution).c_str()); diff --git a/OptiScaler/Config.h b/OptiScaler/Config.h index bf0990e7..3bd06dc7 100644 --- a/OptiScaler/Config.h +++ b/OptiScaler/Config.h @@ -97,6 +97,9 @@ public: //Hotfixes std::optional MipmapBiasOverride; + std::optional MipmapBiasFixedOverride; + std::optional MipmapBiasScaleOverride; + std::optional MipmapBiasOverrideAll; std::optional AnisotropyOverride; std::optional RoundInternalResolution; @@ -227,7 +230,8 @@ public: // XeSS debug stuff bool xessDebug = false; int xessDebugFrames = 5; - float lastMipBias = 0.0f; + float lastMipBias = 100.0f; + float lastMipBiasMax = -100.0f; // dlss hook bool upscalerDisableHook = false; diff --git a/OptiScaler/OptiScaler.vcxproj b/OptiScaler/OptiScaler.vcxproj index 6b082c38..69f7031b 100644 --- a/OptiScaler/OptiScaler.vcxproj +++ b/OptiScaler/OptiScaler.vcxproj @@ -82,7 +82,7 @@ $(SolutionDir)external\vulkan\include;$(SolutionDir)external\nvngx_dlss_sdk;$(SolutionDir)external\xess\inc\xess;$(SolutionDir)external\FidelityFX-SDK\ffx-api\include\ffx_api;$(SolutionDir)external\simpleini;$(SolutionDir)external\unordered_dense\include;$(SolutionDir)external\spdlog\include;$(SolutionDir)external\freetype;$(IncludePath) $(ProjectDir)fsr2\lib;$(ProjectDir)fsr2_212\lib;$(ProjectDir)fsr31\lib;$(ProjectDir)vulkan;$(ProjectDir)d3dx;$(ProjectDir)detours;$(SolutionDir)external\xess\lib;$(SolutionDir)external\freetype;$(LibraryPath) dxgi - D:\Folders\Games\SteamLibrary\steamapps\common\Nobody Wants to Die\detnoir\Binaries\Win64\ + E:\Games\Deep Rock Galactic\FSD\Binaries\Win64\ .\x64\Debug .dll diff --git a/OptiScaler/hooks/HooksDx.cpp b/OptiScaler/hooks/HooksDx.cpp index 5ef9e915..9fc5aeb2 100644 --- a/OptiScaler/hooks/HooksDx.cpp +++ b/OptiScaler/hooks/HooksDx.cpp @@ -961,7 +961,7 @@ static void hkCreateRenderTargetView(ID3D12Device* This, ID3D12Resource* pResour { std::unique_lock lock(resourceMutex); fgHandlesByResources.insert_or_assign(pResource, info); -} + } #endif #ifdef DETAILED_DEBUG_LOGS @@ -1014,7 +1014,7 @@ static void hkCreateShaderResourceView(ID3D12Device* This, ID3D12Resource* pReso { std::unique_lock lock(resourceMutex); fgHandlesByResources.insert_or_assign(pResource, info); -} + } #endif #ifdef DETAILED_DEBUG_LOGS @@ -1066,7 +1066,7 @@ static void hkCreateUnorderedAccessView(ID3D12Device* This, ID3D12Resource* pRes { std::unique_lock lock(resourceMutex); fgHandlesByResources.insert_or_assign(pResource, info); -} + } #endif #ifdef DETAILED_DEBUG_LOGS @@ -3282,7 +3282,7 @@ static HRESULT hkD3D12CreateDevice(IDXGIAdapter* pAdapter, D3D_FEATURE_LEVEL Min LOG_WARN("GPU Based Validation active!"); debugController->SetEnableGPUBasedValidation(TRUE); #endif -} + } #endif Config::Instance()->dxgiSkipSpoofing = true; @@ -3320,9 +3320,9 @@ static HRESULT hkD3D12CreateDevice(IDXGIAdapter* pAdapter, D3D_FEATURE_LEVEL Min LOG_DEBUG("infoQueue1 accuired, registering MessageCallback"); res = infoQueue1->RegisterMessageCallback(D3D12DebugCallback, D3D12_MESSAGE_CALLBACK_IGNORE_FILTERS, NULL, NULL); } - } + } #endif -} + } LOG_FUNC_RESULT(result); @@ -3349,7 +3349,7 @@ static void hkCreateSampler(ID3D12Device* device, const D3D12_SAMPLER_DESC* pDes (pDesc->Filter == D3D12_FILTER_MIN_LINEAR_MAG_MIP_POINT || pDesc->Filter == D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT || pDesc->Filter == D3D12_FILTER_MIN_MAG_MIP_LINEAR || pDesc->Filter == D3D12_FILTER_ANISOTROPIC)) { - LOG_INFO("Overriding Anisotrpic ({2}) filtering {0} -> {1}", pDesc->MaxAnisotropy, Config::Instance()->AnisotropyOverride.value(), (UINT)pDesc->Filter); + LOG_DEBUG("Overriding Anisotrpic ({2}) filtering {0} -> {1}", pDesc->MaxAnisotropy, Config::Instance()->AnisotropyOverride.value(), (UINT)pDesc->Filter); newDesc.Filter = D3D12_FILTER_ANISOTROPIC; newDesc.MaxAnisotropy = Config::Instance()->AnisotropyOverride.value(); } @@ -3363,15 +3363,25 @@ static void hkCreateSampler(ID3D12Device* device, const D3D12_SAMPLER_DESC* pDes newDesc.MinLOD = pDesc->MinLOD; newDesc.MipLODBias = pDesc->MipLODBias; - if (newDesc.MipLODBias < 0.0f) + if (newDesc.MipLODBias < 0.0f || Config::Instance()->MipmapBiasOverrideAll.value_or(false)) { if (Config::Instance()->MipmapBiasOverride.has_value()) { - LOG_INFO("Overriding mipmap bias {0} -> {1}", pDesc->MipLODBias, Config::Instance()->MipmapBiasOverride.value()); - newDesc.MipLODBias = Config::Instance()->MipmapBiasOverride.value(); + LOG_DEBUG("Overriding mipmap bias {0} -> {1}", pDesc->MipLODBias, Config::Instance()->MipmapBiasOverride.value()); + + if (Config::Instance()->MipmapBiasFixedOverride.value_or(false)) + newDesc.MipLODBias = Config::Instance()->MipmapBiasOverride.value(); + else if (Config::Instance()->MipmapBiasScaleOverride.value_or(false)) + newDesc.MipLODBias = newDesc.MipLODBias * Config::Instance()->MipmapBiasOverride.value(); + else + newDesc.MipLODBias = newDesc.MipLODBias + Config::Instance()->MipmapBiasOverride.value(); } - Config::Instance()->lastMipBias = newDesc.MipLODBias; + if (Config::Instance()->lastMipBiasMax < newDesc.MipLODBias) + Config::Instance()->lastMipBiasMax = newDesc.MipLODBias; + + if (Config::Instance()->lastMipBias > newDesc.MipLODBias) + Config::Instance()->lastMipBias = newDesc.MipLODBias; } return o_CreateSampler(device, &newDesc, DestDescriptor); @@ -3406,7 +3416,7 @@ static HRESULT hkCreateSamplerState(ID3D11Device* This, const D3D11_SAMPLER_DESC pSamplerDesc->Filter == D3D11_FILTER_MIN_MAG_MIP_LINEAR || pSamplerDesc->Filter == D3D11_FILTER_ANISOTROPIC)) { - LOG_INFO("Overriding Anisotrpic ({2}) filtering {0} -> {1}", pSamplerDesc->MaxAnisotropy, Config::Instance()->AnisotropyOverride.value(), (UINT)pSamplerDesc->Filter); + LOG_DEBUG("Overriding Anisotrpic ({2}) filtering {0} -> {1}", pSamplerDesc->MaxAnisotropy, Config::Instance()->AnisotropyOverride.value(), (UINT)pSamplerDesc->Filter); newDesc.Filter = D3D11_FILTER_ANISOTROPIC; newDesc.MaxAnisotropy = Config::Instance()->AnisotropyOverride.value(); } @@ -3418,15 +3428,25 @@ static HRESULT hkCreateSamplerState(ID3D11Device* This, const D3D11_SAMPLER_DESC newDesc.MipLODBias = pSamplerDesc->MipLODBias; - if (newDesc.MipLODBias < 0.0f) + if (newDesc.MipLODBias < 0.0f || Config::Instance()->MipmapBiasOverrideAll.value_or(false)) { if (Config::Instance()->MipmapBiasOverride.has_value()) { - LOG_INFO("Overriding mipmap bias {0} -> {1}", pSamplerDesc->MipLODBias, Config::Instance()->MipmapBiasOverride.value()); - newDesc.MipLODBias = Config::Instance()->MipmapBiasOverride.value(); + LOG_DEBUG("Overriding mipmap bias {0} -> {1}", pSamplerDesc->MipLODBias, Config::Instance()->MipmapBiasOverride.value()); + + if (Config::Instance()->MipmapBiasFixedOverride.value_or(false)) + newDesc.MipLODBias = Config::Instance()->MipmapBiasOverride.value(); + else if (Config::Instance()->MipmapBiasScaleOverride.value_or(false)) + newDesc.MipLODBias = newDesc.MipLODBias * Config::Instance()->MipmapBiasOverride.value(); + else + newDesc.MipLODBias = newDesc.MipLODBias + Config::Instance()->MipmapBiasOverride.value(); } - Config::Instance()->lastMipBias = newDesc.MipLODBias; + if (Config::Instance()->lastMipBiasMax < newDesc.MipLODBias) + Config::Instance()->lastMipBiasMax = newDesc.MipLODBias; + + if (Config::Instance()->lastMipBias > newDesc.MipLODBias) + Config::Instance()->lastMipBias = newDesc.MipLODBias; } return o_CreateSamplerState(This, &newDesc, ppSamplerState); diff --git a/OptiScaler/hooks/wrapped_swapchain.cpp b/OptiScaler/hooks/wrapped_swapchain.cpp index 3d791bed..84f110a1 100644 --- a/OptiScaler/hooks/wrapped_swapchain.cpp +++ b/OptiScaler/hooks/wrapped_swapchain.cpp @@ -145,6 +145,8 @@ HRESULT WrappedIDXGISwapChain4::ResizeBuffers(UINT BufferCount, UINT Width, UINT { Config::Instance()->ScreenWidth = Width; Config::Instance()->ScreenHeight = Height; + Config::Instance()->lastMipBias = 100.0f; + Config::Instance()->lastMipBiasMax = -100.0f; } // Crude implementation of EndlesslyFlowering's AutoHDR-ReShade @@ -258,6 +260,8 @@ HRESULT WrappedIDXGISwapChain4::ResizeBuffers1(UINT BufferCount, UINT Width, UIN { Config::Instance()->ScreenWidth = Width; Config::Instance()->ScreenHeight = Height; + Config::Instance()->lastMipBias = 100.0f; + Config::Instance()->lastMipBiasMax = -100.0f; } // Crude implementation of EndlesslyFlowering's AutoHDR-ReShade diff --git a/OptiScaler/imgui/imgui_common.cpp b/OptiScaler/imgui/imgui_common.cpp index 9d5b7907..7d18717a 100644 --- a/OptiScaler/imgui/imgui_common.cpp +++ b/OptiScaler/imgui/imgui_common.cpp @@ -286,7 +286,7 @@ LRESULT ImGuiCommon::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) //LOG_TRACE("msg: {:X}, wParam: {:X}, lParam: {:X}", msg, wParam, lParam); - if (!Config::Instance()->IsShuttingDown && + if (!Config::Instance()->IsShuttingDown && (msg == WM_QUIT || msg == WM_CLOSE || msg == WM_DESTROY || /* classic messages but they are a bit late to capture */ (msg == WM_SYSCOMMAND && wParam == SC_CLOSE /* window close*/))) { @@ -331,11 +331,11 @@ LRESULT ImGuiCommon::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) if (rawData.header.dwType == RIM_TYPEKEYBOARD && rawData.data.keyboard.VKey != 0) inputMenu = rawData.data.keyboard.VKey == Config::Instance()->ShortcutKey.value_or(VK_INSERT); } - else + else { inputMenu = msg == WM_KEYDOWN && wParam == Config::Instance()->ShortcutKey.value_or(VK_INSERT); } - + // INSERT - OPEN MENU if (inputMenu) { @@ -1629,19 +1629,68 @@ void ImGuiCommon::RenderMenu() "Positive values will make textures more blurry\n\n" "Has a small performance impact"); + ImGui::BeginDisabled(!Config::Instance()->MipmapBiasOverride.has_value()); + { + ImGui::BeginDisabled(Config::Instance()->MipmapBiasScaleOverride.has_value() && Config::Instance()->MipmapBiasScaleOverride.value()); + { + bool mbFixed = Config::Instance()->MipmapBiasFixedOverride.value_or(false); + if (ImGui::Checkbox("MB Fixed Override", &mbFixed)) + { + Config::Instance()->MipmapBiasScaleOverride.reset(); + Config::Instance()->MipmapBiasFixedOverride = mbFixed; + } + + ShowHelpMarker("Apply same override value to all textures"); + } + ImGui::EndDisabled(); + + ImGui::SameLine(0.0f, 6.0f); + + ImGui::BeginDisabled(Config::Instance()->MipmapBiasFixedOverride.has_value() && Config::Instance()->MipmapBiasFixedOverride.value()); + { + bool mbScale = Config::Instance()->MipmapBiasScaleOverride.value_or(false); + if (ImGui::Checkbox("MB Scale Override", &mbScale)) + { + Config::Instance()->MipmapBiasFixedOverride.reset(); + Config::Instance()->MipmapBiasScaleOverride = mbScale; + } + + ShowHelpMarker("Apply override value as scale multiplier\n" + "When using scale mode please use positive\n" + "override values to increase sharpness!"); + } + ImGui::EndDisabled(); + + bool mbAll = Config::Instance()->MipmapBiasOverrideAll.value_or(false); + if (ImGui::Checkbox("MB Override All Textures", &mbAll)) + Config::Instance()->MipmapBiasOverrideAll = mbAll; + + ShowHelpMarker("Apply override value as scale multiplier\n" + "When using scale mode please use positive\n" + "override values to increase sharpness!"); + } + ImGui::EndDisabled(); ImGui::BeginDisabled(Config::Instance()->MipmapBiasOverride.has_value() && Config::Instance()->MipmapBiasOverride.value() == _mipBias); - if (ImGui::Button("Set")) - Config::Instance()->MipmapBiasOverride = _mipBias; + { + if (ImGui::Button("Set")) + { + Config::Instance()->MipmapBiasOverride = _mipBias; + Config::Instance()->lastMipBias = 100.0f; + Config::Instance()->lastMipBiasMax = -100.0f; + } + } ImGui::EndDisabled(); ImGui::SameLine(0.0f, 6.0f); ImGui::BeginDisabled(!Config::Instance()->MipmapBiasOverride.has_value()); - if (ImGui::Button("Reset")) { - Config::Instance()->MipmapBiasOverride.reset(); - _mipBias = 0.0f; + if (ImGui::Button("Reset")) + { + Config::Instance()->MipmapBiasOverride.reset(); + _mipBias = 0.0f; + } } ImGui::EndDisabled(); @@ -1654,13 +1703,31 @@ void ImGuiCommon::RenderMenu() } if (Config::Instance()->MipmapBiasOverride.has_value()) - ImGui::Text("Current : %.6f, Target: %.6f", Config::Instance()->lastMipBias, Config::Instance()->MipmapBiasOverride.value()); + { + if (Config::Instance()->MipmapBiasFixedOverride.value_or(false)) + { + ImGui::Text("Current : %.3f / %.3f, Target: %.3f", + Config::Instance()->lastMipBias, Config::Instance()->lastMipBiasMax, Config::Instance()->MipmapBiasOverride.value()); + } + else if (Config::Instance()->MipmapBiasScaleOverride.value_or(false)) + { + ImGui::Text("Current : %.3f / %.3f, Target: Base * %.3f", + Config::Instance()->lastMipBias, Config::Instance()->lastMipBiasMax, Config::Instance()->MipmapBiasOverride.value()); + } + else + { + ImGui::Text("Current : %.3f / %.3f, Target: Base + %.3f", + Config::Instance()->lastMipBias, Config::Instance()->lastMipBiasMax, Config::Instance()->MipmapBiasOverride.value()); + } + } else - ImGui::Text("Current : %.6f", Config::Instance()->lastMipBias); + { + ImGui::Text("Current : %.3f / %.3f", Config::Instance()->lastMipBias, Config::Instance()->lastMipBiasMax); + } ImGui::Text("Will be applied after RESOLUTION or PRESENT change !!!"); - // MIPMAP BIAS & Anisotropy ----------------------------- + // Anisotropy Override ----------------------------- ImGui::SeparatorText("Anisotropic Filtering (DirectX)"); ImGui::PushItemWidth(65.0f * Config::Instance()->MenuScale.value()); diff --git a/OptiScaler/resource.h b/OptiScaler/resource.h index 8243b086..e9415896 100644 --- a/OptiScaler/resource.h +++ b/OptiScaler/resource.h @@ -21,7 +21,7 @@ #define VER_MAJOR_VERSION 0 #define VER_MINOR_VERSION 7 #define VER_HOTFIX_VERSION 0 -#define VER_BUILD_NUMBER 69 +#define VER_BUILD_NUMBER 70 #define VER_PRE_RELEASE diff --git a/nvngx.ini b/nvngx.ini index 47353521..b4607e1c 100644 --- a/nvngx.ini +++ b/nvngx.ini @@ -547,10 +547,22 @@ UseHDR10=auto ; ------------------------------------------------------- [Hotfix] ; ------------------------------------------------------- -; Override mipmap lod bias for textures +; Override value for mipmap lod bias ; -15.0 - 15.0 - Default (auto) is disabled MipmapBiasOverride=auto +; Use a fixed value for lod bias +; true or false - Default (auto) is false +MipmapBiasFixedOverride=auto + +; Use override value as scale multiplier +; true or false - Default (auto) is false +MipmapBiasScaleOverride=auto + +; Override all textures lod bias (normally only overriding < 0 values) +; true or false - Default (auto) is false +MipmapBiasOverrideAll=auto + ; Override max anisotropy for textures ; 2, 4, 8, 16 - Default (auto) is disabled AnisotropyOverride=auto