PixelShaderGen: Use bitwise AND for wrapping indirect texture coordinates

(x % y) is not defined in GLSL when sign(x) != sign(y).
This also has the added benefit of behaving the same as sampler wrapping modes, in regards to negative inputs.
This commit is contained in:
Stenzek 2016-01-14 01:57:01 +10:00
parent 87464d432b
commit edebadc093
2 changed files with 7 additions and 7 deletions

View File

@ -374,15 +374,15 @@ static inline s32 WrapIndirectCoord(s32 coord, int wrapMode)
case ITW_OFF:
return coord;
case ITW_256:
return (coord % (256 << 7));
return (coord & ((256 << 7) - 1));
case ITW_128:
return (coord % (128 << 7));
return (coord & ((128 << 7) - 1));
case ITW_64:
return (coord % (64 << 7));
return (coord & ((64 << 7) - 1));
case ITW_32:
return (coord % (32 << 7));
return (coord & ((32 << 7) - 1));
case ITW_16:
return (coord % (16 << 7));
return (coord & ((16 << 7) - 1));
case ITW_0:
return 0;
default:

View File

@ -764,7 +764,7 @@ static void WriteStage(T& out, pixel_shader_uid_data* uid_data, int n, API_TYPE
else if (bpmem.tevind[n].sw == ITW_0)
out.Write("\twrappedcoord.x = 0;\n");
else
out.Write("\twrappedcoord.x = fixpoint_uv%d.x %% %s;\n", texcoord, tevIndWrapStart[bpmem.tevind[n].sw]);
out.Write("\twrappedcoord.x = fixpoint_uv%d.x & (%s - 1);\n", texcoord, tevIndWrapStart[bpmem.tevind[n].sw]);
// wrap T
if (bpmem.tevind[n].tw == ITW_OFF)
@ -772,7 +772,7 @@ static void WriteStage(T& out, pixel_shader_uid_data* uid_data, int n, API_TYPE
else if (bpmem.tevind[n].tw == ITW_0)
out.Write("\twrappedcoord.y = 0;\n");
else
out.Write("\twrappedcoord.y = fixpoint_uv%d.y %% %s;\n", texcoord, tevIndWrapStart[bpmem.tevind[n].tw]);
out.Write("\twrappedcoord.y = fixpoint_uv%d.y & (%s - 1);\n", texcoord, tevIndWrapStart[bpmem.tevind[n].tw]);
if (bpmem.tevind[n].fb_addprev) // add previous tevcoord
out.Write("\ttevcoord.xy += wrappedcoord + indtevtrans%d;\n", n);