From e307baf31648713bc3fe0048a97eae9e7e7b1913 Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Mon, 28 Sep 2026 01:15:38 +0200 Subject: [PATCH] Pass depth's size into reprojection --- .../reprojection/Reprojection_Dx12.cpp | 7 + .../shaders/reproject/Reproject_Common.h | 10 +- .../shaders/reproject/Reproject_Dx12.cpp | 3 + OptiScaler/shaders/reproject/Reproject_Dx12.h | 6 + .../reproject/precompile/reproject.hlsl | 10 +- .../reproject/precompile/reproject_Shader.cso | Bin 5472 -> 5436 bytes .../reproject/precompile/reproject_Shader.h | 515 +++++++++--------- 7 files changed, 285 insertions(+), 266 deletions(-) diff --git a/OptiScaler/framegen/reprojection/Reprojection_Dx12.cpp b/OptiScaler/framegen/reprojection/Reprojection_Dx12.cpp index a7c7c9b9..22733978 100644 --- a/OptiScaler/framegen/reprojection/Reprojection_Dx12.cpp +++ b/OptiScaler/framegen/reprojection/Reprojection_Dx12.cpp @@ -275,6 +275,8 @@ bool Reprojection_Dx12::Present() data.mouseDeltaSimToSim = mouseDeltaSimToSim; data.screenWidth = (uint32_t) _interpolationWidth[fIndex]; data.screenHeight = (uint32_t) _interpolationHeight[fIndex]; + data.depthWidth = (uint32_t) depth->width; + data.depthHeight = (uint32_t) depth->height; data.invertedDepth = _constants.flags[FG_Flags::InvertedDepth]; data.cameraVFov = _cameraVFov[fIndex]; @@ -358,6 +360,11 @@ bool Reprojection_Dx12::SetResource(Dx12Resource* inputResource) fResource->resource = inputResource->resource; fResource->cmdList = inputResource->cmdList; + fResource->top = inputResource->top; + fResource->left = inputResource->left; + fResource->width = inputResource->width; + fResource->height = inputResource->height; + if (inputResource->cmdList != nullptr && fResource->validity == FG_ResourceValidity::ValidButMakeCopy) { LOG_DEBUG("Making a resource copy of: {}", magic_enum::enum_name(type)); diff --git a/OptiScaler/shaders/reproject/Reproject_Common.h b/OptiScaler/shaders/reproject/Reproject_Common.h index ca0818ea..cf4b97a9 100644 --- a/OptiScaler/shaders/reproject/Reproject_Common.h +++ b/OptiScaler/shaders/reproject/Reproject_Common.h @@ -10,6 +10,10 @@ cbuffer Params : register(b0) float InvScreenWidth; float InvScreenHeight; + uint DepthWidth; + uint DepthHeight; + float2 _Pad0; + float UiDiffThreshold; float DepthCutoff; float DitherWidthPx; @@ -62,9 +66,7 @@ float HashNoise(uint2 p) bool IsDepthCutoutExpanded(float2 uv, int radius) { - int2 depthDimension; - Depth.GetDimensions(depthDimension.x, depthDimension.y); - int2 basePixel = int2(uv * float2(depthDimension)); + int2 basePixel = int2(uv * float2(DepthWidth - 1, DepthHeight - 1)); if (radius == 0) { @@ -77,7 +79,7 @@ bool IsDepthCutoutExpanded(float2 uv, int radius) for (int x = -radius; x <= radius; ++x) { // Clamp coordinates to prevent reading outside the texture - int2 sampleCoord = clamp(basePixel + int2(x, y), int2(0, 0), int2(depthDimension.x - 1, depthDimension.y - 1)); + int2 sampleCoord = clamp(basePixel + int2(x, y), int2(0, 0), int2(DepthWidth - 1, DepthHeight - 1)); float d = Depth.Load(int3(sampleCoord, 0)); bool isCutout = InvertedDepth ? (d > DepthCutoff) : (d < DepthCutoff); diff --git a/OptiScaler/shaders/reproject/Reproject_Dx12.cpp b/OptiScaler/shaders/reproject/Reproject_Dx12.cpp index da4c3a6a..c4e112af 100644 --- a/OptiScaler/shaders/reproject/Reproject_Dx12.cpp +++ b/OptiScaler/shaders/reproject/Reproject_Dx12.cpp @@ -93,6 +93,9 @@ void Reproject_Dx12::FilloutStruct(const FilloutData& data, ReprojectionParams& params.InvScreenWidth = 1.0f / data.screenWidth; params.InvScreenHeight = 1.0f / data.screenHeight; + params.DepthWidth = data.depthWidth; + params.DepthHeight = data.depthHeight; + params.UiDiffThreshold = data.diffThreshold; params.DepthCutoff = Config::Instance()->ReprojectionDepthCutoff.value_or_default(); params.DitherWidthPx = data.screenHeight / 16.0f; // TODO: configurable diff --git a/OptiScaler/shaders/reproject/Reproject_Dx12.h b/OptiScaler/shaders/reproject/Reproject_Dx12.h index bbc41d1d..37cc84bf 100644 --- a/OptiScaler/shaders/reproject/Reproject_Dx12.h +++ b/OptiScaler/shaders/reproject/Reproject_Dx12.h @@ -20,6 +20,10 @@ struct alignas(16) ReprojectionParams float InvScreenWidth; float InvScreenHeight; + uint32_t DepthWidth; + uint32_t DepthHeight; + float _Pad0[2]; + float UiDiffThreshold; float DepthCutoff; float DitherWidthPx; @@ -46,6 +50,8 @@ struct FilloutData float diffThreshold; uint32_t screenWidth; uint32_t screenHeight; + uint32_t depthWidth; + uint32_t depthHeight; bool invertedDepth; bool fakeFrame; diff --git a/OptiScaler/shaders/reproject/precompile/reproject.hlsl b/OptiScaler/shaders/reproject/precompile/reproject.hlsl index 3b5df1ce..2092e01b 100644 --- a/OptiScaler/shaders/reproject/precompile/reproject.hlsl +++ b/OptiScaler/shaders/reproject/precompile/reproject.hlsl @@ -5,6 +5,10 @@ cbuffer Params : register(b0) float InvScreenWidth; float InvScreenHeight; + uint DepthWidth; + uint DepthHeight; + float2 _Pad0; + float UiDiffThreshold; float DepthCutoff; float DitherWidthPx; @@ -57,9 +61,7 @@ float HashNoise(uint2 p) bool IsDepthCutoutExpanded(float2 uv, int radius) { - int2 depthDimension; - Depth.GetDimensions(depthDimension.x, depthDimension.y); - int2 basePixel = int2(uv * float2(depthDimension)); + int2 basePixel = int2(uv * float2(DepthWidth - 1, DepthHeight - 1)); if (radius == 0) { @@ -72,7 +74,7 @@ bool IsDepthCutoutExpanded(float2 uv, int radius) for (int x = -radius; x <= radius; ++x) { // Clamp coordinates to prevent reading outside the texture - int2 sampleCoord = clamp(basePixel + int2(x, y), int2(0, 0), int2(depthDimension.x - 1, depthDimension.y - 1)); + int2 sampleCoord = clamp(basePixel + int2(x, y), int2(0, 0), int2(DepthWidth - 1, DepthHeight - 1)); float d = Depth.Load(int3(sampleCoord, 0)); bool isCutout = InvertedDepth ? (d > DepthCutoff) : (d < DepthCutoff); diff --git a/OptiScaler/shaders/reproject/precompile/reproject_Shader.cso b/OptiScaler/shaders/reproject/precompile/reproject_Shader.cso index c76c0ac2da5a27ffd2b1633b0e7e55434f114717..08b96814f2db0980938c939e8d019a6cedf55f04 100644 GIT binary patch delta 3680 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