diff --git a/UnleashedRecomp/gpu/shader/csd_no_tex_vs.hlsl b/UnleashedRecomp/gpu/shader/csd_no_tex_vs.hlsl index 48ec6af1..1654e734 100644 --- a/UnleashedRecomp/gpu/shader/csd_no_tex_vs.hlsl +++ b/UnleashedRecomp/gpu/shader/csd_no_tex_vs.hlsl @@ -43,7 +43,7 @@ void main( out float4 oColor0 : COLOR0, out float4 oColor1 : COLOR1) { - oPos.xy = (iPosition0.xy - 0.5) * g_ViewportSize.zw * float2(2.0, -2.0) + float2(-1.0, 1.0); + oPos.xy = iPosition0.xy * g_ViewportSize.zw * float2(2.0, -2.0) + float2(-1.0, 1.0); oPos.z = g_Z.x; oPos.w = 1.0; oTexCoord0 = iColor0.wxyz; diff --git a/UnleashedRecomp/gpu/shader/csd_vs.hlsl b/UnleashedRecomp/gpu/shader/csd_vs.hlsl index 11463684..90b561f5 100644 --- a/UnleashedRecomp/gpu/shader/csd_vs.hlsl +++ b/UnleashedRecomp/gpu/shader/csd_vs.hlsl @@ -44,7 +44,7 @@ void main( out float4 oColor0 : COLOR0, out float4 oColor1 : COLOR1) { - oPos.xy = (iPosition0.xy - 0.5) * g_ViewportSize.zw * float2(2.0, -2.0) + float2(-1.0, 1.0); + oPos.xy = iPosition0.xy * g_ViewportSize.zw * float2(2.0, -2.0) + float2(-1.0, 1.0); oPos.z = g_Z.x; oPos.w = 1.0; oTexCoord0 = iColor0.wxyz; diff --git a/UnleashedRecomp/gpu/shader/movie_vs.hlsl b/UnleashedRecomp/gpu/shader/movie_vs.hlsl index c4e47c1c..6d00919e 100644 --- a/UnleashedRecomp/gpu/shader/movie_vs.hlsl +++ b/UnleashedRecomp/gpu/shader/movie_vs.hlsl @@ -4,6 +4,7 @@ Interpolators main(in VertexShaderInput In) { Interpolators Out; Out.ProjPos = In.ObjPos; + Out.ProjPos.xy += g_HalfPixelOffset * Out.ProjPos.w; Out.UV = In.UV; return Out; } diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index e24ce4de..9acd6cd2 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -163,6 +163,8 @@ struct SharedConstants uint32_t samplerIndices[16]{}; uint32_t booleans{}; uint32_t swappedTexcoords{}; + float halfPixelOffsetX{}; + float halfPixelOffsetY{}; float alphaThreshold{}; }; @@ -3089,8 +3091,6 @@ static void FlushViewport() if (g_dirtyStates.viewport) { auto viewport = g_viewport; - viewport.x += 0.5f; - viewport.y += 0.5f; if (viewport.minDepth > viewport.maxDepth) std::swap(viewport.minDepth, viewport.maxDepth); @@ -3514,6 +3514,12 @@ static void SetFramebuffer(GuestSurface* renderTarget, GuestSurface* depthStenci g_framebuffer = nullptr; } + if (g_framebuffer != nullptr) + { + SetDirtyValue(g_dirtyStates.sharedConstants, g_sharedConstants.halfPixelOffsetX, 1.0f / float(g_framebuffer->getWidth())); + SetDirtyValue(g_dirtyStates.sharedConstants, g_sharedConstants.halfPixelOffsetY, -1.0f / float(g_framebuffer->getHeight())); + } + g_dirtyStates.renderTargetAndDepthStencil = settingForClear; } } diff --git a/tools/XenosRecomp b/tools/XenosRecomp index 855a5a8c..4897cf7e 160000 --- a/tools/XenosRecomp +++ b/tools/XenosRecomp @@ -1 +1 @@ -Subproject commit 855a5a8c51ea5f84baecbf4fc87c182795d482c9 +Subproject commit 4897cf7ef2070120310c28a1a672b427d745dad8