diff --git a/pcsx2/GS/GSState.cpp b/pcsx2/GS/GSState.cpp index 83068f15db4be..83e2f5202ea89 100644 --- a/pcsx2/GS/GSState.cpp +++ b/pcsx2/GS/GSState.cpp @@ -3924,6 +3924,8 @@ GSState::TextureMinMaxResult GSState::GetTextureMinMax(GIFRegTEX0 TEX0, GIFRegCL } } + + // Sometimes ST get huge values (possibly game or emulation bugs) so clamp to const GSVector4i uv = GSVector4i(st.floor()); uses_border = GSVector4::cast((uv < vr).blend32<0xc>(uv >= vr)).mask(); diff --git a/pcsx2/GS/Renderers/Common/GSVertexTraceFMM.cpp b/pcsx2/GS/Renderers/Common/GSVertexTraceFMM.cpp index 4b9e5e5801689..622d90a4a36ca 100644 --- a/pcsx2/GS/Renderers/Common/GSVertexTraceFMM.cpp +++ b/pcsx2/GS/Renderers/Common/GSVertexTraceFMM.cpp @@ -246,6 +246,12 @@ void GSVertexTraceFMM::FindMinMax(GSVertexTrace& vt, const void* vertex, const u vt.m_min.t = tmin * s; vt.m_max.t = tmax * s; + + // Clamp the min/max values to the min/max valid UV values + // This is needed in certain cases where buggy GS input results + // in huge floating points values for ST. + vt.m_min.t = vt.m_min.t.min(GSVector4(2047.0)).max(GSVector4(-2047.0)).xyxy(vt.m_min.t); + vt.m_max.t = vt.m_max.t.min(GSVector4(2047.0)).max(GSVector4(-2047.0)).xyxy(vt.m_max.t); } else {