From 9d562a454b570d7f83c5483e98003901417bd030 Mon Sep 17 00:00:00 2001 From: KrossX Date: Tue, 2 Oct 2018 21:42:02 +0200 Subject: [PATCH] GSdx: Limit Wrap negative UV when PS_FST is 0 only. --- plugins/GSdx/res/glsl/tfx_fs.glsl | 18 ++++++++++++++---- plugins/GSdx/res/tfx.fx | 17 ++++++++++++++--- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/plugins/GSdx/res/glsl/tfx_fs.glsl b/plugins/GSdx/res/glsl/tfx_fs.glsl index 8c475f162d..3fec14f638 100644 --- a/plugins/GSdx/res/glsl/tfx_fs.glsl +++ b/plugins/GSdx/res/glsl/tfx_fs.glsl @@ -127,7 +127,12 @@ vec4 clamp_wrap_uv(vec4 uv) #if PS_WMS == 2 uv_out = clamp(uv, MinMax.xyxy, MinMax.zwzw); #elif PS_WMS == 3 - uv_out = vec4((uvec4(fract(uv) * WH.xyxy) & ivec4(MskFix.xyxy)) | ivec4(MskFix.zwzw)) / WH.xyxy; + #if PS_FST == 0 + // wrap negative uv coords to avoid an off by one error that shifted + // textures. Fixes Xenosaga's hair issue. + uv = fract(uv); + #endif + uv_out = vec4((uvec4(uv * WH.xyxy) & ivec4(MskFix.xyxy)) | ivec4(MskFix.zwzw)) / WH.xyxy; #endif #else // PS_WMS != PS_WMT @@ -136,7 +141,10 @@ vec4 clamp_wrap_uv(vec4 uv) uv_out.xz = clamp(uv.xz, MinMax.xx, MinMax.zz); #elif PS_WMS == 3 - uv_out.xz = vec2((uvec2(fract(uv.xz) * WH.xx) & ivec2(MskFix.xx)) | ivec2(MskFix.zz)) / WH.xx; + #if PS_FST == 0 + uv.xz = fract(uv.xz); + #endif + uv_out.xz = vec2((uvec2(uv.xz * WH.xx) & ivec2(MskFix.xx)) | ivec2(MskFix.zz)) / WH.xx; #endif @@ -144,8 +152,10 @@ vec4 clamp_wrap_uv(vec4 uv) uv_out.yw = clamp(uv.yw, MinMax.yy, MinMax.ww); #elif PS_WMT == 3 - - uv_out.yw = vec2((uvec2(fract(uv.yw) * WH.yy) & ivec2(MskFix.yy)) | ivec2(MskFix.ww)) / WH.yy; + #if PS_FST == 0 + uv.yw = fract(uv.yw); + #endif + uv_out.yw = vec2((uvec2(uv.yw * WH.yy) & ivec2(MskFix.yy)) | ivec2(MskFix.ww)) / WH.yy; #endif #endif diff --git a/plugins/GSdx/res/tfx.fx b/plugins/GSdx/res/tfx.fx index d54417dac8..fb61020386 100644 --- a/plugins/GSdx/res/tfx.fx +++ b/plugins/GSdx/res/tfx.fx @@ -254,7 +254,12 @@ float4 clamp_wrap_uv(float4 uv) else if(PS_WMS == 3) { #if SHADER_MODEL >= 0x400 - uv = (float4)(((uint4)(frac(uv) * WH.xyxy) & MskFix.xyxy) | MskFix.zwzw) / WH.xyxy; + #if PS_FST == 0 + // wrap negative uv coords to avoid an off by one error that shifted + // textures. Fixes Xenosaga's hair issue. + uv = frac(uv); + #endif + uv = (float4)(((uint4)(uv * WH.xyxy) & MskFix.xyxy) | MskFix.zwzw) / WH.xyxy; #elif SHADER_MODEL <= 0x300 uv.x = tex1D(UMSKFIX, uv.x); uv.y = tex1D(VMSKFIX, uv.y); @@ -283,7 +288,10 @@ float4 clamp_wrap_uv(float4 uv) else if(PS_WMS == 3) { #if SHADER_MODEL >= 0x400 - uv.xz = (float2)(((uint2)(frac(uv.xz) * WH.xx) & MskFix.xx) | MskFix.zz) / WH.xx; + #if PS_FST == 0 + uv.xz = frac(uv.xz); + #endif + uv.xz = (float2)(((uint2)(uv.xz * WH.xx) & MskFix.xx) | MskFix.zz) / WH.xx; #elif SHADER_MODEL <= 0x300 uv.x = tex1D(UMSKFIX, uv.x); uv.z = tex1D(UMSKFIX, uv.z); @@ -307,7 +315,10 @@ float4 clamp_wrap_uv(float4 uv) else if(PS_WMT == 3) { #if SHADER_MODEL >= 0x400 - uv.yw = (float2)(((uint2)(frac(uv.yw) * WH.yy) & MskFix.yy) | MskFix.ww) / WH.yy; + #if PS_FST == 0 + uv.yw = frac(uv.yw); + #endif + uv.yw = (float2)(((uint2)(uv.yw * WH.yy) & MskFix.yy) | MskFix.ww) / WH.yy; #elif SHADER_MODEL <= 0x300 uv.y = tex1D(VMSKFIX, uv.y); uv.w = tex1D(VMSKFIX, uv.w);