mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-09-04 03:35:19 +02:00
Vec4<float>::Cast<int>() used _mm_cvtps_epi32 under SSE, which rounds using MXCSR's mode, while NEON's vcvtq_s32_f32 and the scalar (T2)x fallback both truncate. Same split in Rasterizer's InterpolateI. That's on depth interpolation, so the differing values are written to the depth buffer and then compared - a one-LSB difference can flip a later GE_COMP_EQUAL pass and change a whole surface's visibility, not just a shade. Following MXCSR also meant anything that left a non-default rounding mode in the render thread would have changed rasterized output. Truncation is what two of the three paths already did, so SSE moves to match. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vd8ntC2brCUtCrDJMqLbs8
To get to 100% compatibility, we will need a software renderer as there are games out there that do tricks that can't really be faked in a sensible way. Useful for homebrew too that mix sw and accel rendering.