diff --git a/GPU/Math3D.h b/GPU/Math3D.h index 21f8f99cb8..a62905fa13 100644 --- a/GPU/Math3D.h +++ b/GPU/Math3D.h @@ -883,7 +883,8 @@ float vectorGetByIndex(__m128 v) { #endif #if defined(_M_SSE) -inline __m128 MATH3D_CALL Vec3ByMatrix43(__m128 x, __m128 y, __m128 z, const float m[12]) { +// x, y, and z should be broadcast. Should only be used through Vec3f version. +inline __m128 MATH3D_CALL Vec3ByMatrix43Internal(__m128 x, __m128 y, __m128 z, const float m[12]) { __m128 col0 = _mm_loadu_ps(m); __m128 col1 = _mm_loadu_ps(m + 3); __m128 col2 = _mm_loadu_ps(m + 6); @@ -894,7 +895,7 @@ inline __m128 MATH3D_CALL Vec3ByMatrix43(__m128 x, __m128 y, __m128 z, const flo return sum; } #elif PPSSPP_ARCH(ARM_NEON) && PPSSPP_ARCH(ARM64) -inline float32x4_t Vec3ByMatrix43(float32x4_t vec, const float m[16]) { +inline float32x4_t Vec3ByMatrix43Internal(float32x4_t vec, const float m[16]) { float32x4_t col0 = vld1q_f32(m); float32x4_t col1 = vld1q_f32(m + 3); float32x4_t col2 = vld1q_f32(m + 6); @@ -912,14 +913,14 @@ inline void Vec3ByMatrix43(float vecOut[3], const float v[3], const float m[12]) __m128 x = _mm_set1_ps(v[0]); __m128 y = _mm_set1_ps(v[1]); __m128 z = _mm_set1_ps(v[2]); - __m128 sum = Vec3ByMatrix43(x, y, z, m); + __m128 sum = Vec3ByMatrix43Internal(x, y, z, m); // Not sure what the best way to store 3 elements is. Ideally, we should // probably store all four. vecOut[0] = _mm_cvtss_f32(sum); vecOut[1] = vectorGetByIndex<1>(sum); vecOut[2] = vectorGetByIndex<2>(sum); #elif PPSSPP_ARCH(ARM_NEON) && PPSSPP_ARCH(ARM64) - float32x4_t sum = Vec3ByMatrix43(vld1q_f32(v), m); + float32x4_t sum = Vec3ByMatrix43Internal(vld1q_f32(v), m); vecOut[0] = vgetq_lane_f32(sum, 0); vecOut[1] = vgetq_lane_f32(sum, 1); vecOut[2] = vgetq_lane_f32(sum, 2); @@ -935,9 +936,9 @@ inline Vec3f MATH3D_CALL Vec3ByMatrix43(const Vec3f v, const float m[12]) { __m128 x = _mm_shuffle_ps(v.vec, v.vec, _MM_SHUFFLE(0, 0, 0, 0)); __m128 y = _mm_shuffle_ps(v.vec, v.vec, _MM_SHUFFLE(1, 1, 1, 1)); __m128 z = _mm_shuffle_ps(v.vec, v.vec, _MM_SHUFFLE(2, 2, 2, 2)); - return Vec3ByMatrix43(x, y, z, m); + return Vec3ByMatrix43Internal(x, y, z, m); #elif PPSSPP_ARCH(ARM_NEON) && PPSSPP_ARCH(ARM64) - return Vec3ByMatrix43(v.vec, m); + return Vec3ByMatrix43Internal(v.vec, m); #else Vec3f vecOut; Vec3ByMatrix43(vecOut.AsArray(), v.AsArray(), m); @@ -946,7 +947,8 @@ inline Vec3f MATH3D_CALL Vec3ByMatrix43(const Vec3f v, const float m[12]) { } #if defined(_M_SSE) -inline __m128 MATH3D_CALL Vec3ByMatrix44(__m128 x, __m128 y, __m128 z, const float m[16]) { +// x, y, and z should be broadcast. Should only be used through Vec3f version. +inline __m128 MATH3D_CALL Vec3ByMatrix44Internal(__m128 x, __m128 y, __m128 z, const float m[16]) { __m128 col0 = _mm_loadu_ps(m); __m128 col1 = _mm_loadu_ps(m + 4); __m128 col2 = _mm_loadu_ps(m + 8); @@ -957,7 +959,7 @@ inline __m128 MATH3D_CALL Vec3ByMatrix44(__m128 x, __m128 y, __m128 z, const flo return sum; } #elif PPSSPP_ARCH(ARM_NEON) && PPSSPP_ARCH(ARM64) -inline float32x4_t Vec3ByMatrix44(float32x4_t vec, const float m[16]) { +inline float32x4_t Vec3ByMatrix44Internal(float32x4_t vec, const float m[16]) { float32x4_t col0 = vld1q_f32(m); float32x4_t col1 = vld1q_f32(m + 4); float32x4_t col2 = vld1q_f32(m + 8); @@ -974,10 +976,10 @@ inline void Vec3ByMatrix44(float vecOut[4], const float v[3], const float m[16]) __m128 x = _mm_set1_ps(v[0]); __m128 y = _mm_set1_ps(v[1]); __m128 z = _mm_set1_ps(v[2]); - __m128 sum = Vec3ByMatrix44(x, y, z, m); + __m128 sum = Vec3ByMatrix44Internal(x, y, z, m); _mm_storeu_ps(vecOut, sum); #elif PPSSPP_ARCH(ARM_NEON) && PPSSPP_ARCH(ARM64) - float32x4_t sum = Vec3ByMatrix44(vld1q_f32(v), m); + float32x4_t sum = Vec3ByMatrix44Internal(vld1q_f32(v), m); vst1q_f32(vecOut, sum); #else vecOut[0] = v[0] * m[0] + v[1] * m[4] + v[2] * m[8] + m[12]; @@ -992,9 +994,9 @@ inline Vec4f MATH3D_CALL Vec3ByMatrix44(const Vec3f v, const float m[16]) { __m128 x = _mm_shuffle_ps(v.vec, v.vec, _MM_SHUFFLE(0, 0, 0, 0)); __m128 y = _mm_shuffle_ps(v.vec, v.vec, _MM_SHUFFLE(1, 1, 1, 1)); __m128 z = _mm_shuffle_ps(v.vec, v.vec, _MM_SHUFFLE(2, 2, 2, 2)); - return Vec3ByMatrix44(x, y, z, m); + return Vec3ByMatrix44Internal(x, y, z, m); #elif PPSSPP_ARCH(ARM_NEON) && PPSSPP_ARCH(ARM64) - return Vec3ByMatrix44(v.vec, m); + return Vec3ByMatrix44Internal(v.vec, m); #else Vec4f vecOut; Vec3ByMatrix44(vecOut.AsArray(), v.AsArray(), m); @@ -1003,7 +1005,8 @@ inline Vec4f MATH3D_CALL Vec3ByMatrix44(const Vec3f v, const float m[16]) { } #if defined(_M_SSE) -inline __m128 MATH3D_CALL Norm3ByMatrix43(__m128 x, __m128 y, __m128 z, const float m[12]) { +// x, y, and z should be broadcast. Should only be used through Vec3f version. +inline __m128 MATH3D_CALL Norm3ByMatrix43Internal(__m128 x, __m128 y, __m128 z, const float m[12]) { __m128 col0 = _mm_loadu_ps(m); __m128 col1 = _mm_loadu_ps(m + 3); __m128 col2 = _mm_loadu_ps(m + 6); @@ -1013,7 +1016,7 @@ inline __m128 MATH3D_CALL Norm3ByMatrix43(__m128 x, __m128 y, __m128 z, const fl return sum; } #elif PPSSPP_ARCH(ARM_NEON) && PPSSPP_ARCH(ARM64) -inline float32x4_t Norm3ByMatrix43(float32x4_t vec, const float m[16]) { +inline float32x4_t Norm3ByMatrix43Internal(float32x4_t vec, const float m[16]) { float32x4_t col0 = vld1q_f32(m); float32x4_t col1 = vld1q_f32(m + 3); float32x4_t col2 = vld1q_f32(m + 6); @@ -1029,12 +1032,12 @@ inline void Norm3ByMatrix43(float vecOut[3], const float v[3], const float m[12] __m128 x = _mm_set1_ps(v[0]); __m128 y = _mm_set1_ps(v[1]); __m128 z = _mm_set1_ps(v[2]); - __m128 sum = Norm3ByMatrix43(x, y, z, m); + __m128 sum = Norm3ByMatrix43Internal(x, y, z, m); vecOut[0] = _mm_cvtss_f32(sum); vecOut[1] = vectorGetByIndex<1>(sum); vecOut[2] = vectorGetByIndex<2>(sum); #elif PPSSPP_ARCH(ARM_NEON) && PPSSPP_ARCH(ARM64) - float32x4_t sum = Norm3ByMatrix43(vld1q_f32(v), m); + float32x4_t sum = Norm3ByMatrix43Internal(vld1q_f32(v), m); vecOut[0] = vgetq_lane_f32(sum, 0); vecOut[1] = vgetq_lane_f32(sum, 1); vecOut[2] = vgetq_lane_f32(sum, 2); @@ -1050,9 +1053,9 @@ inline Vec3f MATH3D_CALL Norm3ByMatrix43(const Vec3f v, const float m[12]) { __m128 x = _mm_shuffle_ps(v.vec, v.vec, _MM_SHUFFLE(0, 0, 0, 0)); __m128 y = _mm_shuffle_ps(v.vec, v.vec, _MM_SHUFFLE(1, 1, 1, 1)); __m128 z = _mm_shuffle_ps(v.vec, v.vec, _MM_SHUFFLE(2, 2, 2, 2)); - return Norm3ByMatrix43(x, y, z, m); + return Norm3ByMatrix43Internal(x, y, z, m); #elif PPSSPP_ARCH(ARM_NEON) && PPSSPP_ARCH(ARM64) - return Norm3ByMatrix43(v.vec, m); + return Norm3ByMatrix43Internal(v.vec, m); #else Vec3f vecOut; Norm3ByMatrix43(vecOut.AsArray(), v.AsArray(), m);