Add reactve mask support from FSR inputs to FSR upscalers

This commit is contained in:
cdozdil
2025-08-10 14:25:45 +03:00
parent 1238c11d28
commit 39a42e09c5
4 changed files with 174 additions and 97 deletions
@@ -240,17 +240,13 @@ bool FSR2FeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_N
}
ID3D12Resource* paramTransparency = nullptr;
if (InParameters->Get("FSR.transparencyAndComposition", &paramTransparency) == NVSDK_NGX_Result_Success)
InParameters->Get("FSR.transparencyAndComposition", (void**) &paramTransparency);
InParameters->Get("FSR.transparencyAndComposition", (void**) &paramTransparency);
ID3D12Resource* paramReactiveMask = nullptr;
if (InParameters->Get("FSR.reactive", &paramReactiveMask) == NVSDK_NGX_Result_Success)
InParameters->Get("FSR.reactive", (void**) &paramReactiveMask);
InParameters->Get("FSR.reactive", (void**) &paramReactiveMask);
ID3D12Resource* paramReactiveMask2 = nullptr;
if (InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, &paramReactiveMask2) !=
NVSDK_NGX_Result_Success)
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, (void**) &paramReactiveMask2);
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, (void**) &paramReactiveMask2);
if (!Config::Instance()->DisableReactiveMask.value_or(paramReactiveMask == nullptr &&
paramReactiveMask2 == nullptr))
+61 -31
View File
@@ -241,45 +241,75 @@ bool FSR2FeatureVk::Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter* I
}
}
void* paramTransparency = nullptr;
InParameters->Get("FSR.transparencyAndComposition", &paramTransparency);
void* paramReactiveMask = nullptr;
if (InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, &paramReactiveMask) !=
NVSDK_NGX_Result_Success)
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, (void**) &paramReactiveMask);
InParameters->Get("FSR.reactive", &paramReactiveMask);
if (paramReactiveMask && Config::Instance()->FsrUseMaskForTransparency.value_or_default())
{
params.transparencyAndComposition = ffxGetTextureResourceVK(
&_context, ((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Transparency", FFX_RESOURCE_STATE_COMPUTE_READ);
}
void* paramReactiveMask2 = nullptr;
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, &paramReactiveMask2);
if (!Config::Instance()->DisableReactiveMask.value_or(paramReactiveMask == nullptr))
if (!Config::Instance()->DisableReactiveMask.value_or(paramReactiveMask == nullptr &&
paramReactiveMask2 == nullptr))
{
if (paramReactiveMask)
if (paramTransparency != nullptr)
{
LOG_DEBUG("Bias mask exist..");
LOG_DEBUG("Using FSR transparency mask..");
params.transparencyAndComposition = ffxGetTextureResourceVK(
&_context, ((NVSDK_NGX_Resource_VK*) paramTransparency)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramTransparency)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramTransparency)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramTransparency)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramTransparency)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Reactive", FFX_RESOURCE_STATE_COMPUTE_READ);
}
if (Config::Instance()->DlssReactiveMaskBias.value_or_default() > 0.0f)
{
params.reactive = ffxGetTextureResourceVK(
&_context, ((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Reactive", FFX_RESOURCE_STATE_COMPUTE_READ);
}
if (paramReactiveMask != nullptr)
{
LOG_DEBUG("Using FSR reactive mask..");
params.reactive = ffxGetTextureResourceVK(
&_context, ((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Reactive", FFX_RESOURCE_STATE_COMPUTE_READ);
}
else
{
LOG_DEBUG("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask.set_volatile_value(true);
State::Instance().changeBackend[Handle()->Id] = true;
return true;
if (paramReactiveMask2 != nullptr)
{
LOG_DEBUG("Bias mask exist..");
if (Config::Instance()->FsrUseMaskForTransparency.value_or_default())
{
params.transparencyAndComposition = ffxGetTextureResourceVK(
&_context, ((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Transparency", FFX_RESOURCE_STATE_COMPUTE_READ);
}
if (Config::Instance()->DlssReactiveMaskBias.value_or_default() > 0.0f)
{
params.reactive = ffxGetTextureResourceVK(
&_context, ((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Reactive", FFX_RESOURCE_STATE_COMPUTE_READ);
}
}
else
{
LOG_DEBUG("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask.set_volatile_value(true);
return true;
}
}
}
@@ -288,7 +318,7 @@ bool FSR2FeatureVk::Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter* I
_hasMV = params.motionVectors.resource != nullptr;
_hasExposure = params.exposure.resource != nullptr;
_hasTM = params.transparencyAndComposition.resource != nullptr;
_accessToReactiveMask = paramReactiveMask != nullptr;
_accessToReactiveMask = paramReactiveMask != nullptr || paramReactiveMask2 != nullptr;
_hasOutput = params.output.resource != nullptr;
float MVScaleX = 1.0f;
@@ -283,45 +283,74 @@ bool FSR2FeatureVk212::Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter
}
}
void* paramTransparency = nullptr;
InParameters->Get("FSR.transparencyAndComposition", &paramTransparency);
void* paramReactiveMask = nullptr;
if (InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, &paramReactiveMask) !=
NVSDK_NGX_Result_Success)
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, (void**) &paramReactiveMask);
InParameters->Get("FSR.reactive", &paramReactiveMask);
if (paramReactiveMask && Config::Instance()->FsrUseMaskForTransparency.value_or_default())
{
params.transparencyAndComposition = Fsr212::ffxGetTextureResourceVK212(
&_context, ((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Transparency", Fsr212::FFX_RESOURCE_STATE_COMPUTE_READ);
}
void* paramReactiveMask2 = nullptr;
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, &paramReactiveMask2);
if (!Config::Instance()->DisableReactiveMask.value_or(paramReactiveMask == nullptr))
if (!Config::Instance()->DisableReactiveMask.value_or(paramReactiveMask == nullptr &&
paramReactiveMask2 == nullptr))
{
if (paramReactiveMask)
if (paramTransparency != nullptr)
{
LOG_DEBUG("Bias mask exist..");
LOG_DEBUG("Using FSR transparency mask..");
params.transparencyAndComposition = Fsr212::ffxGetTextureResourceVK212(
&_context, ((NVSDK_NGX_Resource_VK*) paramTransparency)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramTransparency)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramTransparency)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramTransparency)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramTransparency)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Reactive", Fsr212::FFX_RESOURCE_STATE_COMPUTE_READ);
}
if (Config::Instance()->DlssReactiveMaskBias.value_or_default() > 0.0f)
{
params.reactive = Fsr212::ffxGetTextureResourceVK212(
&_context, ((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Reactive", Fsr212::FFX_RESOURCE_STATE_COMPUTE_READ);
}
if (paramReactiveMask != nullptr)
{
LOG_DEBUG("Using FSR reactive mask..");
params.reactive = Fsr212::ffxGetTextureResourceVK212(
&_context, ((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Reactive", Fsr212::FFX_RESOURCE_STATE_COMPUTE_READ);
}
else
{
LOG_DEBUG("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask.set_volatile_value(true);
State::Instance().changeBackend[Handle()->Id] = true;
return true;
if (paramReactiveMask2 != nullptr)
{
LOG_DEBUG("Bias mask exist..");
if (Config::Instance()->FsrUseMaskForTransparency.value_or_default())
{
params.transparencyAndComposition = Fsr212::ffxGetTextureResourceVK212(
&_context, ((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Transparency", Fsr212::FFX_RESOURCE_STATE_COMPUTE_READ);
}
if (Config::Instance()->DlssReactiveMaskBias.value_or_default() > 0.0f)
{
params.reactive = Fsr212::ffxGetTextureResourceVK212(
&_context, ((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Image,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.ImageView,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Width,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Height,
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Format,
(wchar_t*) L"FSR2_Reactive", Fsr212::FFX_RESOURCE_STATE_COMPUTE_READ);
}
}
else
{
LOG_DEBUG("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask.set_volatile_value(true);
return true;
}
}
}
@@ -330,7 +359,7 @@ bool FSR2FeatureVk212::Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter
_hasMV = params.motionVectors.resource != nullptr;
_hasExposure = params.exposure.resource != nullptr;
_hasTM = params.transparencyAndComposition.resource != nullptr;
_accessToReactiveMask = paramReactiveMask != nullptr;
_accessToReactiveMask = paramReactiveMask != nullptr || paramReactiveMask2 != nullptr;
_hasOutput = params.output.resource != nullptr;
float MVScaleX = 1.0f;
+50 -28
View File
@@ -397,41 +397,63 @@ bool FSR31FeatureVk::Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter*
}
}
void* paramTransparency = nullptr;
InParameters->Get("FSR.transparencyAndComposition", &paramTransparency);
void* paramReactiveMask = nullptr;
if (InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, &paramReactiveMask) !=
NVSDK_NGX_Result_Success)
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, (void**) &paramReactiveMask);
InParameters->Get("FSR.reactive", &paramReactiveMask);
if (paramReactiveMask && Config::Instance()->FsrUseMaskForTransparency.value_or_default())
void* paramReactiveMask2 = nullptr;
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, &paramReactiveMask2);
if (!Config::Instance()->DisableReactiveMask.value_or(paramReactiveMask == nullptr &&
paramReactiveMask2 == nullptr))
{
params.transparencyAndComposition =
ffxApiGetResourceVK(((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Image,
ffxApiGetImageResourceDescriptionVKLocal((NVSDK_NGX_Resource_VK*) paramReactiveMask),
FFX_API_RESOURCE_STATE_COMPUTE_READ);
}
if (!Config::Instance()->DisableReactiveMask.value_or(paramReactiveMask == nullptr))
{
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, &paramReactiveMask);
if (paramReactiveMask)
if (paramTransparency != nullptr)
{
LOG_DEBUG("Bias mask exist..");
LOG_DEBUG("Using FSR transparency mask..");
params.transparencyAndComposition = ffxApiGetResourceVK(
((NVSDK_NGX_Resource_VK*) paramTransparency)->Resource.ImageViewInfo.Image,
ffxApiGetImageResourceDescriptionVKLocal((NVSDK_NGX_Resource_VK*) paramTransparency),
FFX_API_RESOURCE_STATE_COMPUTE_READ);
}
if (Config::Instance()->DlssReactiveMaskBias.value_or_default() > 0.0f)
{
params.reactive = ffxApiGetResourceVK(
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Image,
ffxApiGetImageResourceDescriptionVKLocal((NVSDK_NGX_Resource_VK*) paramReactiveMask),
FFX_API_RESOURCE_STATE_COMPUTE_READ);
}
if (paramReactiveMask != nullptr)
{
LOG_DEBUG("Using FSR reactive mask..");
params.reactive = ffxApiGetResourceVK(
((NVSDK_NGX_Resource_VK*) paramReactiveMask)->Resource.ImageViewInfo.Image,
ffxApiGetImageResourceDescriptionVKLocal((NVSDK_NGX_Resource_VK*) paramReactiveMask),
FFX_API_RESOURCE_STATE_COMPUTE_READ);
}
else
{
LOG_DEBUG("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask.set_volatile_value(true);
State::Instance().changeBackend[Handle()->Id] = true;
return true;
if (paramReactiveMask2 != nullptr)
{
if (Config::Instance()->FsrUseMaskForTransparency.value_or_default())
{
params.transparencyAndComposition = ffxApiGetResourceVK(
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Image,
ffxApiGetImageResourceDescriptionVKLocal((NVSDK_NGX_Resource_VK*) paramReactiveMask2),
FFX_API_RESOURCE_STATE_COMPUTE_READ);
}
LOG_DEBUG("Bias mask exist..");
if (Config::Instance()->DlssReactiveMaskBias.value_or_default() > 0.0f)
{
params.reactive = ffxApiGetResourceVK(
((NVSDK_NGX_Resource_VK*) paramReactiveMask2)->Resource.ImageViewInfo.Image,
ffxApiGetImageResourceDescriptionVKLocal((NVSDK_NGX_Resource_VK*) paramReactiveMask2),
FFX_API_RESOURCE_STATE_COMPUTE_READ);
}
}
else
{
LOG_DEBUG("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask.set_volatile_value(true);
return true;
}
}
}
@@ -440,7 +462,7 @@ bool FSR31FeatureVk::Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter*
_hasMV = params.motionVectors.resource != nullptr;
_hasExposure = params.exposure.resource != nullptr;
_hasTM = params.transparencyAndComposition.resource != nullptr;
_accessToReactiveMask = paramReactiveMask != nullptr;
_accessToReactiveMask = paramReactiveMask != nullptr || paramReactiveMask2 != nullptr;
_hasOutput = params.output.resource != nullptr;
float MVScaleX = 1.0f;