From aa468e924dda60fbc491e8b71fcd6fdb5d689d78 Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Thu, 14 Aug 2025 21:13:45 +0200 Subject: [PATCH] Add ui alpha premult setting (not saved yet), some logs and checks --- OptiScaler/Config.h | 1 + OptiScaler/framegen/IFGFeature_Dx12.cpp | 8 +++++--- OptiScaler/framegen/Streamline_Inputs_Dx12.cpp | 2 ++ OptiScaler/framegen/ffx/FSRFG_Dx12.cpp | 4 +++- OptiScaler/framegen/xefg/XeFG_Dx12.cpp | 14 +++++++++++++- OptiScaler/menu/menu_common.cpp | 6 ++++++ 6 files changed, 30 insertions(+), 5 deletions(-) diff --git a/OptiScaler/Config.h b/OptiScaler/Config.h index fe919702..cf0ef7a1 100644 --- a/OptiScaler/Config.h +++ b/OptiScaler/Config.h @@ -350,6 +350,7 @@ class Config CustomOptional FGInput { FGInput::NoFG }; CustomOptional FGOutput { FGOutput::NoFG }; CustomOptional DrawUIOverFG { false }; + CustomOptional UIPremultipliedAlpha { true }; // OptiFG CustomOptional FGEnabled { false }; diff --git a/OptiScaler/framegen/IFGFeature_Dx12.cpp b/OptiScaler/framegen/IFGFeature_Dx12.cpp index c6368322..8777ceb7 100644 --- a/OptiScaler/framegen/IFGFeature_Dx12.cpp +++ b/OptiScaler/framegen/IFGFeature_Dx12.cpp @@ -12,9 +12,11 @@ bool IFGFeature_Dx12::GetResourceCopy(FG_ResourceType type, D3D12_RESOURCE_STATE auto resource = GetResource(type); - // TODO: add some warning - if (resource->copy == nullptr) + if (resource->copy == nullptr && resource->validity == FG_ResourceValidity::ValidNow) + { + LOG_WARN("No resource copy of type {} to use", magic_enum::enum_name(type)); return false; + } auto result = _copyCommandAllocator->Reset(); if (result != S_OK) @@ -24,7 +26,7 @@ bool IFGFeature_Dx12::GetResourceCopy(FG_ResourceType type, D3D12_RESOURCE_STATE if (result != S_OK) return false; - _copyCommandList->CopyResource(output, resource->copy); + _copyCommandList->CopyResource(output, resource->GetResource()); _copyCommandList->Close(); ID3D12CommandList* commandList = _copyCommandList; diff --git a/OptiScaler/framegen/Streamline_Inputs_Dx12.cpp b/OptiScaler/framegen/Streamline_Inputs_Dx12.cpp index 27427193..b042f44b 100644 --- a/OptiScaler/framegen/Streamline_Inputs_Dx12.cpp +++ b/OptiScaler/framegen/Streamline_Inputs_Dx12.cpp @@ -54,6 +54,8 @@ bool Sl_Inputs_Dx12::setConstants(const sl::Constants& values, uint32_t frameId) memcpy(&data, &values, sizeof(values) - sizeof(sl::Constants::minRelativeLinearDepthObjectSeparation)); data.value().structVersion = sl::kStructVersion2; data.value().next = pNext; + + return true; } } diff --git a/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp b/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp index 4752dd3b..01408c21 100644 --- a/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp +++ b/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp @@ -106,7 +106,9 @@ bool FSRFG_Dx12::Dispatch() LOG_TRACE("Using UI: {:X}", (size_t) uiColor->GetResource()); uiDesc.uiResource = ffxApiGetResourceDX12(uiColor->GetResource(), GetFfxApiState(uiColor->state)); - // uiDesc.flags = FFX_FRAMEGENERATION_UI_COMPOSITION_FLAG_USE_PREMUL_ALPHA; + + if (Config::Instance()->UIPremultipliedAlpha.value_or_default()) + uiDesc.flags = FFX_FRAMEGENERATION_UI_COMPOSITION_FLAG_USE_PREMUL_ALPHA; } else if (hudless != nullptr && IsResourceReady(FG_ResourceType::HudlessColor)) { diff --git a/OptiScaler/framegen/xefg/XeFG_Dx12.cpp b/OptiScaler/framegen/xefg/XeFG_Dx12.cpp index 40ec987d..e37e5105 100644 --- a/OptiScaler/framegen/xefg/XeFG_Dx12.cpp +++ b/OptiScaler/framegen/xefg/XeFG_Dx12.cpp @@ -279,6 +279,9 @@ bool XeFG_Dx12::CreateSwapchain(IDXGIFactory* factory, ID3D12CommandQueue* cmdQu if (Config::Instance()->FGXeFGHighResMV.value_or_default()) params.initFlags |= XEFG_SWAPCHAIN_INIT_FLAG_HIGH_RES_MV; + if (!Config::Instance()->UIPremultipliedAlpha.value_or_default()) + params.initFlags |= XEFG_SWAPCHAIN_INIT_FLAG_UITEXTURE_NOT_PREMUL_ALPHA; + LOG_DEBUG("Inverted Depth: {}", Config::Instance()->FGXeFGDepthInverted.value_or_default()); LOG_DEBUG("Jittered Velocity: {}", Config::Instance()->FGXeFGJitteredMV.value_or_default()); LOG_DEBUG("High Res MV: {}", Config::Instance()->FGXeFGHighResMV.value_or_default()); @@ -353,6 +356,9 @@ bool XeFG_Dx12::CreateSwapchain1(IDXGIFactory* factory, ID3D12CommandQueue* cmdQ if (Config::Instance()->FGXeFGHighResMV.value_or_default()) params.initFlags |= XEFG_SWAPCHAIN_INIT_FLAG_HIGH_RES_MV; + if (!Config::Instance()->UIPremultipliedAlpha.value_or_default()) + params.initFlags |= XEFG_SWAPCHAIN_INIT_FLAG_UITEXTURE_NOT_PREMUL_ALPHA; + LOG_DEBUG("Inverted Depth: {}", Config::Instance()->FGXeFGDepthInverted.value_or_default()); LOG_DEBUG("Jittered Velocity: {}", Config::Instance()->FGXeFGJitteredMV.value_or_default()); LOG_DEBUG("High Res MV: {}", Config::Instance()->FGXeFGHighResMV.value_or_default()); @@ -437,7 +443,7 @@ bool XeFG_Dx12::Dispatch() xefg_swapchain_frame_constant_data_t constData = {}; - if (_cameraPosition[0] != 0.0 || _cameraPosition[1] != 0.0 || _cameraPosition[2] != 0.0) + if (_cameraPosition[0] != 0.0f || _cameraPosition[1] != 0.0f || _cameraPosition[2] != 0.0f) { XMVECTOR right = XMLoadFloat3(reinterpret_cast(_cameraRight)); XMVECTOR up = XMLoadFloat3(reinterpret_cast(_cameraUp)); @@ -466,6 +472,10 @@ bool XeFG_Dx12::Dispatch() auto projectionMatrix = XMMatrixPerspectiveFovLH(_cameraVFov, _cameraAspectRatio, _cameraNear, _cameraFar); memcpy(constData.projectionMatrix, projectionMatrix.r, sizeof(projectionMatrix)); } + else + { + LOG_WARN("Can't calculate projectionMatrix"); + } constData.jitterOffsetX = _jitterX; constData.jitterOffsetY = _jitterY; @@ -633,6 +643,8 @@ void XeFG_Dx12::SetResource(FG_ResourceType type, ID3D12GraphicsCommandList* cmd // We usually don't copy any resources for XeFG, the ones with this tag are the exception if (cmdList != nullptr && fResource->validity == FG_ResourceValidity::ValidButMakeCopy) { + LOG_DEBUG("Making a resource copy of: {}", magic_enum::enum_name(type)); + ID3D12Resource* copyOutput = nullptr; if (_resourceCopy[fIndex].contains(type)) diff --git a/OptiScaler/menu/menu_common.cpp b/OptiScaler/menu/menu_common.cpp index bb4e90a6..a4d66abc 100644 --- a/OptiScaler/menu/menu_common.cpp +++ b/OptiScaler/menu/menu_common.cpp @@ -3323,6 +3323,12 @@ bool MenuCommon::RenderMenu() if (bool drawUIOverFG = Config::Instance()->DrawUIOverFG.value_or_default(); ImGui::Checkbox("Draw UI over FG", &drawUIOverFG)) Config::Instance()->DrawUIOverFG = drawUIOverFG; + + ImGui::SameLine(); + + if (bool uiPremultipliedAlpha = Config::Instance()->UIPremultipliedAlpha.value_or_default(); + ImGui::Checkbox("UI Premult. alpha", &uiPremultipliedAlpha)) + Config::Instance()->UIPremultipliedAlpha = uiPremultipliedAlpha; } else {