Skip to content

Commit b7b0732

Browse files
committed
allow output scaling to downsample when using below 1 scaling ratios
1 parent a59af1f commit b7b0732

8 files changed

+119
-10
lines changed

OptiScaler/OptiScaler.vcxproj

+1
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ copy $(SolutionDir)nvngx.ini $(SolutionDir)x64\Release\a\</Command>
206206
<ClInclude Include="bias\precompile\Bias_Shader.h" />
207207
<ClInclude Include="bicubicscaling\precompile\BCDS_Shader.h" />
208208
<ClInclude Include="bicubicscaling\precompile\BCUS_Shader.h" />
209+
<ClInclude Include="bicubicscaling\precompile\FSR_Shader.h" />
209210
<ClInclude Include="nvapi\nvapi.h" />
210211
<ClInclude Include="backends\fsr2_212\FSR2Feature_212.h" />
211212
<ClInclude Include="backends\fsr2_212\FSR2Feature_Dx11On12_212.h" />

OptiScaler/backends/fsr2/FSR2Feature_Dx11On12.cpp

+20-3
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_N
230230
{
231231
Bias->SetBufferState(Dx12CommandList, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
232232

233-
if (Config::Instance()->DlssReactiveMaskBias.value_or(0.45f) > 0.0f &&
233+
if (Config::Instance()->DlssReactiveMaskBias.value_or(0.45f) > 0.0f &&
234234
Bias->Dispatch(Dx12Device, Dx12CommandList, dx11Reactive.Dx12Resource, Config::Instance()->DlssReactiveMaskBias.value_or(0.45f), Bias->Buffer()))
235235
{
236236
Bias->SetBufferState(Dx12CommandList, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
@@ -649,19 +649,36 @@ bool FSR2FeatureDx11on12::InitFSR2(const NVSDK_NGX_Parameter* InParameters)
649649
_targetHeight = DisplayHeight();
650650
}
651651

652+
// extended limits changes how resolution
652653
if (Config::Instance()->ExtendedLimits.value_or(false))
653654
{
654655
_contextDesc.maxRenderSize.width = RenderWidth() < TargetWidth() ? TargetWidth() : RenderWidth();
655656
_contextDesc.maxRenderSize.height = RenderHeight() < TargetHeight() ? TargetHeight() : RenderHeight();
657+
658+
// if output scaling active let it to handle downsampling
659+
if (Config::Instance()->OutputScalingEnabled.value_or(false) && !Config::Instance()->DisplayResolution.value_or(false))
660+
{
661+
_contextDesc.displaySize.width = _contextDesc.maxRenderSize.width;
662+
_contextDesc.displaySize.height = _contextDesc.maxRenderSize.height;
663+
664+
// update target res
665+
_targetWidth = _contextDesc.displaySize.width;
666+
_targetHeight = _contextDesc.displaySize.height;
667+
}
668+
else
669+
{
670+
_contextDesc.displaySize.width = TargetWidth();
671+
_contextDesc.displaySize.height = TargetHeight();
672+
}
656673
}
657674
else
658675
{
659676
_contextDesc.maxRenderSize.width = TargetWidth();
660677
_contextDesc.maxRenderSize.height = TargetHeight();
678+
_contextDesc.displaySize.width = TargetWidth();
679+
_contextDesc.displaySize.height = TargetHeight();
661680
}
662681

663-
_contextDesc.displaySize.width = TargetWidth();
664-
_contextDesc.displaySize.height = TargetHeight();
665682

666683
#if _DEBUG
667684
_contextDesc.flags |= FFX_FSR2_ENABLE_DEBUG_CHECKING;

OptiScaler/backends/fsr2/FSR2Feature_Dx12.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -591,17 +591,37 @@ bool FSR2FeatureDx12::InitFSR2(const NVSDK_NGX_Parameter* InParameters)
591591
_targetHeight = DisplayHeight();
592592
}
593593

594+
// extended limits changes how resolution
594595
if (Config::Instance()->ExtendedLimits.value_or(false))
595596
{
596597
_contextDesc.maxRenderSize.width = RenderWidth() < TargetWidth() ? TargetWidth() : RenderWidth();
597598
_contextDesc.maxRenderSize.height = RenderHeight() < TargetHeight() ? TargetHeight() : RenderHeight();
599+
600+
// if output scaling active let it to handle downsampling
601+
if (Config::Instance()->OutputScalingEnabled.value_or(false) && !Config::Instance()->DisplayResolution.value_or(false))
602+
{
603+
_contextDesc.displaySize.width = _contextDesc.maxRenderSize.width;
604+
_contextDesc.displaySize.height = _contextDesc.maxRenderSize.height;
605+
606+
// update target res
607+
_targetWidth = _contextDesc.displaySize.width;
608+
_targetHeight = _contextDesc.displaySize.height;
609+
}
610+
else
611+
{
612+
_contextDesc.displaySize.width = TargetWidth();
613+
_contextDesc.displaySize.height = TargetHeight();
614+
}
598615
}
599616
else
600617
{
601618
_contextDesc.maxRenderSize.width = TargetWidth();
602619
_contextDesc.maxRenderSize.height = TargetHeight();
620+
_contextDesc.displaySize.width = TargetWidth();
621+
_contextDesc.displaySize.height = TargetHeight();
603622
}
604623

624+
605625
_contextDesc.displaySize.width = TargetWidth();
606626
_contextDesc.displaySize.height = TargetHeight();
607627

OptiScaler/backends/fsr2_212/FSR2Feature_Dx11On12_212.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -655,17 +655,37 @@ bool FSR2FeatureDx11on12_212::InitFSR2(const NVSDK_NGX_Parameter* InParameters)
655655
_targetHeight = DisplayHeight();
656656
}
657657

658+
// extended limits changes how resolution
658659
if (Config::Instance()->ExtendedLimits.value_or(false))
659660
{
660661
_contextDesc.maxRenderSize.width = RenderWidth() < TargetWidth() ? TargetWidth() : RenderWidth();
661662
_contextDesc.maxRenderSize.height = RenderHeight() < TargetHeight() ? TargetHeight() : RenderHeight();
663+
664+
// if output scaling active let it to handle downsampling
665+
if (Config::Instance()->OutputScalingEnabled.value_or(false) && !Config::Instance()->DisplayResolution.value_or(false))
666+
{
667+
_contextDesc.displaySize.width = _contextDesc.maxRenderSize.width;
668+
_contextDesc.displaySize.height = _contextDesc.maxRenderSize.height;
669+
670+
// update target res
671+
_targetWidth = _contextDesc.displaySize.width;
672+
_targetHeight = _contextDesc.displaySize.height;
673+
}
674+
else
675+
{
676+
_contextDesc.displaySize.width = TargetWidth();
677+
_contextDesc.displaySize.height = TargetHeight();
678+
}
662679
}
663680
else
664681
{
665682
_contextDesc.maxRenderSize.width = TargetWidth();
666683
_contextDesc.maxRenderSize.height = TargetHeight();
684+
_contextDesc.displaySize.width = TargetWidth();
685+
_contextDesc.displaySize.height = TargetHeight();
667686
}
668687

688+
669689
_contextDesc.displaySize.width = TargetWidth();
670690
_contextDesc.displaySize.height = TargetHeight();
671691

OptiScaler/backends/fsr2_212/FSR2Feature_Dx12_212.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -573,17 +573,37 @@ bool FSR2FeatureDx12_212::InitFSR2(const NVSDK_NGX_Parameter* InParameters)
573573
_targetHeight = DisplayHeight();
574574
}
575575

576+
// extended limits changes how resolution
576577
if (Config::Instance()->ExtendedLimits.value_or(false))
577578
{
578579
_contextDesc.maxRenderSize.width = RenderWidth() < TargetWidth() ? TargetWidth() : RenderWidth();
579580
_contextDesc.maxRenderSize.height = RenderHeight() < TargetHeight() ? TargetHeight() : RenderHeight();
581+
582+
// if output scaling active let it to handle downsampling
583+
if (Config::Instance()->OutputScalingEnabled.value_or(false) && !Config::Instance()->DisplayResolution.value_or(false))
584+
{
585+
_contextDesc.displaySize.width = _contextDesc.maxRenderSize.width;
586+
_contextDesc.displaySize.height = _contextDesc.maxRenderSize.height;
587+
588+
// update target res
589+
_targetWidth = _contextDesc.displaySize.width;
590+
_targetHeight = _contextDesc.displaySize.height;
591+
}
592+
else
593+
{
594+
_contextDesc.displaySize.width = TargetWidth();
595+
_contextDesc.displaySize.height = TargetHeight();
596+
}
580597
}
581598
else
582599
{
583600
_contextDesc.maxRenderSize.width = TargetWidth();
584601
_contextDesc.maxRenderSize.height = TargetHeight();
602+
_contextDesc.displaySize.width = TargetWidth();
603+
_contextDesc.displaySize.height = TargetHeight();
585604
}
586605

606+
587607
_contextDesc.displaySize.width = TargetWidth();
588608
_contextDesc.displaySize.height = TargetHeight();
589609

OptiScaler/backends/fsr31/FSR31Feature_Dx11On12.cpp

+19-3
Original file line numberDiff line numberDiff line change
@@ -706,20 +706,36 @@ bool FSR31FeatureDx11on12::InitFSR3(const NVSDK_NGX_Parameter* InParameters)
706706
_targetHeight = DisplayHeight();
707707
}
708708

709+
// extended limits changes how resolution
709710
if (Config::Instance()->ExtendedLimits.value_or(false))
710711
{
711712
_contextDesc.maxRenderSize.width = RenderWidth() < TargetWidth() ? TargetWidth() : RenderWidth();
712713
_contextDesc.maxRenderSize.height = RenderHeight() < TargetHeight() ? TargetHeight() : RenderHeight();
714+
715+
// if output scaling active let it to handle downsampling
716+
if (Config::Instance()->OutputScalingEnabled.value_or(false) && !Config::Instance()->DisplayResolution.value_or(false))
717+
{
718+
_contextDesc.maxUpscaleSize.width = _contextDesc.maxRenderSize.width;
719+
_contextDesc.maxUpscaleSize.height = _contextDesc.maxRenderSize.height;
720+
721+
// update target res
722+
_targetWidth = _contextDesc.maxUpscaleSize.width;
723+
_targetHeight = _contextDesc.maxUpscaleSize.height;
724+
}
725+
else
726+
{
727+
_contextDesc.maxUpscaleSize.width = TargetWidth();
728+
_contextDesc.maxUpscaleSize.height = TargetHeight();
729+
}
713730
}
714731
else
715732
{
716733
_contextDesc.maxRenderSize.width = TargetWidth();
717734
_contextDesc.maxRenderSize.height = TargetHeight();
735+
_contextDesc.maxUpscaleSize.width = TargetWidth();
736+
_contextDesc.maxUpscaleSize.height = TargetHeight();
718737
}
719738

720-
_contextDesc.maxUpscaleSize.width = TargetWidth();
721-
_contextDesc.maxUpscaleSize.height = TargetHeight();
722-
723739
ffxCreateBackendDX12Desc backendDesc = { 0 };
724740
backendDesc.header.type = FFX_API_CREATE_CONTEXT_DESC_TYPE_BACKEND_DX12;
725741
backendDesc.device = Dx12Device;

OptiScaler/backends/fsr31/FSR31Feature_Dx12.cpp

+19-3
Original file line numberDiff line numberDiff line change
@@ -625,20 +625,36 @@ bool FSR31FeatureDx12::InitFSR3(const NVSDK_NGX_Parameter* InParameters)
625625
_targetHeight = DisplayHeight();
626626
}
627627

628+
// extended limits changes how resolution
628629
if (Config::Instance()->ExtendedLimits.value_or(false))
629630
{
630631
_contextDesc.maxRenderSize.width = RenderWidth() < TargetWidth() ? TargetWidth() : RenderWidth();
631632
_contextDesc.maxRenderSize.height = RenderHeight() < TargetHeight() ? TargetHeight() : RenderHeight();
633+
634+
// if output scaling active let it to handle downsampling
635+
if (Config::Instance()->OutputScalingEnabled.value_or(false) && !Config::Instance()->DisplayResolution.value_or(false))
636+
{
637+
_contextDesc.maxUpscaleSize.width = _contextDesc.maxRenderSize.width;
638+
_contextDesc.maxUpscaleSize.height = _contextDesc.maxRenderSize.height;
639+
640+
// update target res
641+
_targetWidth = _contextDesc.maxUpscaleSize.width;
642+
_targetHeight = _contextDesc.maxUpscaleSize.height;
643+
}
644+
else
645+
{
646+
_contextDesc.maxUpscaleSize.width = TargetWidth();
647+
_contextDesc.maxUpscaleSize.height = TargetHeight();
648+
}
632649
}
633650
else
634651
{
635652
_contextDesc.maxRenderSize.width = TargetWidth();
636653
_contextDesc.maxRenderSize.height = TargetHeight();
654+
_contextDesc.maxUpscaleSize.width = TargetWidth();
655+
_contextDesc.maxUpscaleSize.height = TargetHeight();
637656
}
638657

639-
_contextDesc.maxUpscaleSize.width = TargetWidth();
640-
_contextDesc.maxUpscaleSize.height = TargetHeight();
641-
642658
ffxCreateBackendDX12Desc backendDesc = { 0 };
643659
backendDesc.header.type = FFX_API_CREATE_CONTEXT_DESC_TYPE_BACKEND_DX12;
644660
backendDesc.device = Device;

OptiScaler/pag/PAG_Dx12.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,6 @@ PAG_Dx12::PAG_Dx12(std::string InName, ID3D12Device* InDevice) : _name(InName),
386386
}
387387

388388
// Create the root signature
389-
// Create the root signature
390389
CD3DX12_ROOT_PARAMETER rootParameters[3];
391390

392391
// CBV

0 commit comments

Comments
 (0)