Fix reactive mask flag for XeSS

This commit is contained in:
cdozdil
2025-08-06 21:58:56 +03:00
parent 5aff3c54f8
commit aafeebc9dc
8 changed files with 109 additions and 53 deletions
@@ -87,6 +87,9 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa
LOG_DEBUG("xessParams.initFlags (ReactiveMaskActive) {0:b}", xessParams.initFlags);
}
_xessInitFlags = xessParams.initFlags;
LOG_DEBUG("_xessInitFlags: {}", _xessInitFlags);
switch (PerfQualityValue())
{
case NVSDK_NGX_PerfQuality_Value_UltraPerformance:
+1
View File
@@ -52,6 +52,7 @@ class XeSSFeature : public virtual IFeature
protected:
xess_context_handle_t _xessContext = nullptr;
uint32_t _xessInitFlags = 0;
int dumpCount = 0;
bool InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InParameters);
+18 -14
View File
@@ -125,6 +125,8 @@ bool XeSSFeature_Dx11::Init(ID3D11Device* InDevice, ID3D11DeviceContext* InConte
LOG_DEBUG("xessParams.initFlags (ReactiveMaskActive) {0:b}", xessParams.initFlags);
}
_xessInitFlags = xessParams.initFlags;
switch (PerfQualityValue())
{
case NVSDK_NGX_PerfQuality_Value_UltraPerformance:
@@ -433,26 +435,28 @@ bool XeSSFeature_Dx11::Evaluate(ID3D11DeviceContext* DeviceContext, NVSDK_NGX_Pa
// LOG_DEBUG("AutoExposure is always enabled for XeSS Dx11!");
//}
if (!Config::Instance()->DisableReactiveMask.value_or(true))
{
ID3D11Resource* 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);
ID3D11Resource* 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);
bool supportsFloatResponsivePixelMask = Version() >= feature_version { 2, 0, 1 };
if (!Config::Instance()->DisableReactiveMask.value_or(true) && supportsFloatResponsivePixelMask)
{
if (paramReactiveMask)
{
LOG_DEBUG("Input Bias mask exist..");
Config::Instance()->DisableReactiveMask = false;
params.pResponsivePixelMaskTexture = paramReactiveMask;
}
else
{
LOG_WARN("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask = true;
State::Instance().changeBackend[_handle->Id] = true;
return true;
}
}
if ((_xessInitFlags & XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK) > 0 && params.pResponsivePixelMaskTexture == nullptr)
{
LOG_WARN("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask = true;
State::Instance().changeBackend[_handle->Id] = true;
return true;
}
_hasColor = params.pColorTexture != nullptr;
@@ -12,6 +12,8 @@ class XeSSFeature_Dx11 : public virtual IFeature_Dx11
protected:
xess_context_handle_t _xessContext = nullptr;
uint32_t _xessInitFlags = 0;
int dumpCount = 0;
public:
@@ -244,24 +244,38 @@ bool XeSSFeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_N
params.pExposureScaleTexture = dx11Exp.Dx12Resource;
_hasExposure = params.pExposureScaleTexture != nullptr;
bool supportsFloatResponsivePixelMask = Version() >= feature_version { 2, 0, 1 };
if (dx11Reactive.Dx12Resource != nullptr)
{
if (Config::Instance()->DlssReactiveMaskBias.value_or(0.0f) > 0.0f && Bias->IsInit() &&
Bias->CreateBufferResource(State::Instance().currentD3D12Device, dx11Reactive.Dx12Resource,
D3D12_RESOURCE_STATE_UNORDERED_ACCESS) &&
Bias->CanRender())
if (!Config::Instance()->DisableReactiveMask.value_or(true) && supportsFloatResponsivePixelMask)
{
Bias->SetBufferState(cmdList, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
if (Bias->Dispatch(State::Instance().currentD3D12Device, cmdList, dx11Reactive.Dx12Resource,
Config::Instance()->DlssReactiveMaskBias.value_or(0.0f), Bias->Buffer()))
if (Config::Instance()->DlssReactiveMaskBias.value_or_default() > 0.0f && Bias->IsInit() &&
Bias->CreateBufferResource(State::Instance().currentD3D12Device, dx11Reactive.Dx12Resource,
D3D12_RESOURCE_STATE_UNORDERED_ACCESS) &&
Bias->CanRender())
{
Bias->SetBufferState(cmdList, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
params.pResponsivePixelMaskTexture = Bias->Buffer();
Bias->SetBufferState(cmdList, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
if (Bias->Dispatch(State::Instance().currentD3D12Device, cmdList, dx11Reactive.Dx12Resource,
Config::Instance()->DlssReactiveMaskBias.value_or_default(), Bias->Buffer()))
{
Bias->SetBufferState(cmdList, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
params.pResponsivePixelMaskTexture = Bias->Buffer();
}
}
}
}
if ((_xessInitFlags & XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK) > 0 &&
params.pResponsivePixelMaskTexture == nullptr)
{
Config::Instance()->DisableReactiveMask = true;
LOG_WARN("Reactive mask not exist not enabled, disabling it!");
State::Instance().changeBackend[_handle->Id] = true;
return true;
}
float MVScaleX;
float MVScaleY;
+29 -16
View File
@@ -245,10 +245,18 @@ bool XeSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_N
InParameters->Get("FSR.reactive", &paramReactiveMask);
bool supportsFloatResponsivePixelMask = Version() >= feature_version { 2, 0, 1 };
if (supportsFloatResponsivePixelMask && paramReactiveMask != nullptr)
if (paramReactiveMask != nullptr)
{
if (!Config::Instance()->DisableReactiveMask.value_or(false))
if (!Config::Instance()->DisableReactiveMask.value_or(!supportsFloatResponsivePixelMask))
{
if ((_xessInitFlags & XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK) == 0)
{
Config::Instance()->DisableReactiveMask = false;
LOG_WARN("Reactive mask exist but not enabled, enabling it!");
State::Instance().changeBackend[_handle->Id] = true;
return true;
}
LOG_DEBUG("Using FSR reactive mask");
params.pResponsivePixelMaskTexture = paramReactiveMask;
}
@@ -259,40 +267,45 @@ bool XeSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_N
NVSDK_NGX_Result_Success)
InParameters->Get(NVSDK_NGX_Parameter_DLSS_Input_Bias_Current_Color_Mask, (void**) &paramReactiveMask);
if (!Config::Instance()->DisableReactiveMask.value_or(!supportsFloatResponsivePixelMask) && paramReactiveMask)
if (!Config::Instance()->DisableReactiveMask.value_or(true) && paramReactiveMask)
{
LOG_DEBUG("Input Bias mask exist..");
Config::Instance()->DisableReactiveMask = false;
if ((_xessInitFlags & XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK) == 0)
{
Config::Instance()->DisableReactiveMask = false;
LOG_WARN("Reactive mask exist but not enabled, enabling it!");
State::Instance().changeBackend[_handle->Id] = true;
return true;
}
if (Config::Instance()->MaskResourceBarrier.has_value())
ResourceBarrier(InCommandList, params.pResponsivePixelMaskTexture,
(D3D12_RESOURCE_STATES) Config::Instance()->MaskResourceBarrier.value(),
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
if (Config::Instance()->DlssReactiveMaskBias.value_or(0.0f) > 0.0f && Bias->IsInit() &&
if (Config::Instance()->DlssReactiveMaskBias.value_or_default() > 0.0f && Bias->IsInit() &&
Bias->CreateBufferResource(Device, paramReactiveMask, D3D12_RESOURCE_STATE_UNORDERED_ACCESS) &&
Bias->CanRender())
{
Bias->SetBufferState(InCommandList, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
if (Bias->Dispatch(Device, InCommandList, paramReactiveMask,
Config::Instance()->DlssReactiveMaskBias.value_or(0.0f), Bias->Buffer()))
Config::Instance()->DlssReactiveMaskBias.value_or_default(), Bias->Buffer()))
{
Bias->SetBufferState(InCommandList, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
params.pResponsivePixelMaskTexture = Bias->Buffer();
}
}
}
else
{
if (!Config::Instance()->DisableReactiveMask.value_or(true))
{
LOG_WARN("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask = true;
State::Instance().changeBackend[_handle->Id] = true;
return true;
}
}
}
if ((_xessInitFlags & XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK) > 0 && params.pResponsivePixelMaskTexture == nullptr)
{
LOG_WARN("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask = true;
State::Instance().changeBackend[_handle->Id] = true;
return true;
}
_hasColor = params.pColorTexture != nullptr;
+30 -13
View File
@@ -157,6 +157,8 @@ bool XeSSFeature_Vk::Init(VkInstance InInstance, VkPhysicalDevice InPD, VkDevice
LOG_DEBUG("xessParams.initFlags (ReactiveMaskActive) {0:b}", xessParams.initFlags);
}
_xessInitFlags = xessParams.initFlags;
switch (PerfQualityValue())
{
case NVSDK_NGX_PerfQuality_Value_UltraPerformance:
@@ -513,11 +515,20 @@ bool XeSSFeature_Vk::Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter*
bool supportsFloatResponsivePixelMask = Version() >= feature_version { 2, 0, 1 };
NVSDK_NGX_Resource_VK* paramReactiveMask = nullptr;
if (supportsFloatResponsivePixelMask &&
InParameters->Get("FSR.reactive", (void**) &paramReactiveMask) == NVSDK_NGX_Result_Success)
if (InParameters->Get("FSR.reactive", (void**) &paramReactiveMask) == NVSDK_NGX_Result_Success)
{
if (!Config::Instance()->DisableReactiveMask.value_or(true))
if (!Config::Instance()->DisableReactiveMask.value_or(!supportsFloatResponsivePixelMask))
{
if ((_xessInitFlags & XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK) == 0)
{
Config::Instance()->DisableReactiveMask = false;
LOG_WARN("Reactive mask exist but not enabled, enabling it!");
State::Instance().changeBackend[_handle->Id] = true;
return true;
}
params.responsivePixelMaskTexture = NV_to_XeSS(paramReactiveMask);
}
}
else
{
@@ -526,21 +537,27 @@ bool XeSSFeature_Vk::Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter*
paramReactiveMask != nullptr)
{
LOG_DEBUG("Input Bias mask exist..");
Config::Instance()->DisableReactiveMask = false;
if (!Config::Instance()->DisableReactiveMask.value_or(!supportsFloatResponsivePixelMask))
params.responsivePixelMaskTexture = NV_to_XeSS(paramReactiveMask);
}
else
{
if (!Config::Instance()->DisableReactiveMask.value_or(true))
{
LOG_WARN("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask = true;
State::Instance().changeBackend[_handle->Id] = true;
return true;
if ((_xessInitFlags & XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK) == 0)
{
Config::Instance()->DisableReactiveMask = false;
LOG_WARN("Reactive mask exist but not enabled, enabling it!");
State::Instance().changeBackend[_handle->Id] = true;
return true;
}
params.responsivePixelMaskTexture = NV_to_XeSS(paramReactiveMask);
}
}
else if ((_xessInitFlags & XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK) > 0)
{
LOG_WARN("Bias mask not exist and its enabled in config, it may cause problems!!");
Config::Instance()->DisableReactiveMask = true;
State::Instance().changeBackend[_handle->Id] = true;
return true;
}
}
_hasColor = params.colorTexture.image != VK_NULL_HANDLE;
@@ -14,6 +14,8 @@ class XeSSFeature_Vk : public virtual IFeature_Vk
protected:
xess_context_handle_t _xessContext = nullptr;
uint32_t _xessInitFlags = 0;
int dumpCount = 0;
public: