Przeglądaj źródła

Merge pull request #458 from blackberry-gaming/next-setaylor

Next setaylor
Sean Paul Taylor 13 lat temu
rodzic
commit
2175dcbf48

+ 16 - 6
gameplay/src/MathUtil.h

@@ -3,6 +3,9 @@
 
 namespace gameplay
 {
+/**
+ * Math utility class. Used for internal math optimizations.
+ */
 class MathUtil
 {
 	friend class Matrix;
@@ -10,22 +13,29 @@ class MathUtil
 
 private:
 
-	/** Matrix **/
 	inline static void addMatrix(const float* m, float scalar, float* dst);
+
 	inline static void addMatrix(const float* m1, const float* m2, float* dst);
+
+	inline static void subtractMatrix(const float* m1, const float* m2, float* dst);
+
 	inline static void multiplyMatrix(const float* m, float scalar, float* dst);
+
 	inline static void multiplyMatrix(const float* m1, const float* m2, float* dst);
+
 	inline static void negateMatrix(const float* m, float* dst);
-	inline static void subtractMatrix(const float* m1, const float* m2, float* dst);
-	inline static void transformVectorMatrix(const float* m, float x, float y, float z, float w, float* dst);
-	inline static void transformVectorMatrix(const float* m, const float* v, float* dst);
+
 	inline static void transposeMatrix(const float* m, float* dst);
 
-	/** Vector3 **/
+	inline static void transformVector4(const float* m, float x, float y, float z, float w, float* dst);
+
+	inline static void transformVector4(const float* m, const float* v, float* dst);
+
 	inline static void crossVector3(const float* v1, const float* v2, float* dst);
 
 	MathUtil();
 };
+
 }
 
 #define MATRIX_SIZE ( sizeof(float) * 16)
@@ -36,4 +46,4 @@ private:
 #include "MathUtil.inl"
 #endif
 
-#endif /* MATHUTIL_H_ */
+#endif

+ 30 - 30
gameplay/src/MathUtil.inl

@@ -41,6 +41,26 @@ inline void MathUtil::addMatrix(const float* m1, const float* m2, float* dst)
 	dst[15] = m1[15] + m2[15];
 }
 
+inline void MathUtil::subtractMatrix(const float* m1, const float* m2, float* dst)
+{
+	dst[0]  = m1[0]  - m2[0];
+	dst[1]  = m1[1]  - m2[1];
+	dst[2]  = m1[2]  - m2[2];
+	dst[3]  = m1[3]  - m2[3];
+	dst[4]  = m1[4]  - m2[4];
+	dst[5]  = m1[5]  - m2[5];
+	dst[6]  = m1[6]  - m2[6];
+	dst[7]  = m1[7]  - m2[7];
+	dst[8]  = m1[8]  - m2[8];
+	dst[9]  = m1[9]  - m2[9];
+	dst[10] = m1[10] - m2[10];
+	dst[11] = m1[11] - m2[11];
+	dst[12] = m1[12] - m2[12];
+	dst[13] = m1[13] - m2[13];
+	dst[14] = m1[14] - m2[14];
+	dst[15] = m1[15] - m2[15];
+}
+
 inline void MathUtil::multiplyMatrix(const float* m, float scalar, float* dst)
 {
 	dst[0]  = m[0]  * scalar;
@@ -109,34 +129,25 @@ inline void MathUtil::negateMatrix(const float* m, float* dst)
 	dst[15] = -m[15];
 }
 
-inline void MathUtil::subtractMatrix(const float* m1, const float* m2, float* dst)
+inline void MathUtil::transposeMatrix(const float* m, float* dst)
 {
-	dst[0]  = m1[0]  - m2[0];
-	dst[1]  = m1[1]  - m2[1];
-	dst[2]  = m1[2]  - m2[2];
-	dst[3]  = m1[3]  - m2[3];
-	dst[4]  = m1[4]  - m2[4];
-	dst[5]  = m1[5]  - m2[5];
-	dst[6]  = m1[6]  - m2[6];
-	dst[7]  = m1[7]  - m2[7];
-	dst[8]  = m1[8]  - m2[8];
-	dst[9]  = m1[9]  - m2[9];
-	dst[10] = m1[10] - m2[10];
-	dst[11] = m1[11] - m2[11];
-	dst[12] = m1[12] - m2[12];
-	dst[13] = m1[13] - m2[13];
-	dst[14] = m1[14] - m2[14];
-	dst[15] = m1[15] - m2[15];
+	float t[16] = {
+		m[0], m[4], m[8], m[12],
+		m[1], m[5], m[9], m[13],
+		m[2], m[6], m[10], m[14],
+		m[3], m[7], m[11], m[15]
+	};
+	memcpy(dst, t, MATRIX_SIZE);
 }
 
-inline void MathUtil::transformVectorMatrix(const float* m, float x, float y, float z, float w, float* dst)
+inline void MathUtil::transformVector4(const float* m, float x, float y, float z, float w, float* dst)
 {
 	dst[0] = x * m[0] + y * m[4] + z * m[8] + w * m[12];
 	dst[1] = x * m[1] + y * m[5] + z * m[9] + w * m[13];
 	dst[2] = x * m[2] + y * m[6] + z * m[10] + w * m[14];
 }
 
-inline void MathUtil::transformVectorMatrix(const float* m, const float* v, float* dst)
+inline void MathUtil::transformVector4(const float* m, const float* v, float* dst)
 {
     // Handle case where v == dst.
     float x = v[0] * m[0] + v[1] * m[4] + v[2] * m[8] + v[3] * m[12];
@@ -150,17 +161,6 @@ inline void MathUtil::transformVectorMatrix(const float* m, const float* v, floa
 	dst[3] = w;
 }
 
-inline void MathUtil::transposeMatrix(const float* m, float* dst)
-{
-	float t[16] = {
-		m[0], m[4], m[8], m[12],
-		m[1], m[5], m[9], m[13],
-		m[2], m[6], m[10], m[14],
-		m[3], m[7], m[11], m[15]
-	};
-	memcpy(dst, t, MATRIX_SIZE);
-}
-
 inline void MathUtil::crossVector3(const float* v1, const float* v2, float* dst)
 {
 	float x = (v1[1] * v2[2]) - (v1[2] * v2[1]);

+ 32 - 32
gameplay/src/MathUtilNeon.inl

@@ -45,6 +45,27 @@ inline void MathUtil::addMatrix(const float* m1, const float* m2, float* dst)
 	);
 }
 
+inline void MathUtil::subtractMatrix(const float* m1, const float* m2, float* dst)
+{
+	asm volatile(
+		"vld1.32 	{q0, q1}, 	[%1]! 	\n\t" // M1[m0-m7]
+		"vld1.32 	{q2, q3}, 	[%1] 	\n\t" // M1[m8-m15]
+		"vld1.32 	{q8, q9}, 	[%2]! 	\n\t" // M2[m0-m7]
+		"vld1.32 	{q10, q11}, [%2] 	\n\t" // M2[m8-m15]
+
+		"vsub.f32   q12, q0, q8 		\n\t" // DST->M[m0-m3] = M1[m0-m3] - M2[m0-m3]
+		"vsub.f32   q13, q1, q9			\n\t" // DST->M[m4-m7] = M1[m4-m7] - M2[m4-m7]
+		"vsub.f32   q14, q2, q10		\n\t" // DST->M[m8-m11] = M1[m8-m11] - M2[m8-m11]
+		"vsub.f32   q15, q3, q11		\n\t" // DST->M[m12-m15] = M1[m12-m15] - M2[m12-m15]
+
+		"vst1.32    {q12, q13}, [%0]!   \n\t" // DST->M[m0-m7]
+		"vst1.32    {q14, q15}, [%0]    \n\t" // DST->M[m8-m15]
+		:
+		: "r"(dst), "r"(m1), "r"(m2)
+		: "q0", "q1", "q2", "q3", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15", "memory"
+	);
+}
+
 inline void MathUtil::multiplyMatrix(const float* m, float scalar, float* dst)
 {
 	asm volatile(
@@ -121,28 +142,23 @@ inline void MathUtil::negateMatrix(const float* m, float* dst)
 	);
 }
 
-inline void MathUtil::subtractMatrix(const float* m1, const float* m2, float* dst)
+inline void MathUtil::transposeMatrix(const float* m, float* dst)
 {
 	asm volatile(
-		"vld1.32 	{q0, q1}, 	[%1]! 	\n\t" // M1[m0-m7]
-		"vld1.32 	{q2, q3}, 	[%1] 	\n\t" // M1[m8-m15]
-		"vld1.32 	{q8, q9}, 	[%2]! 	\n\t" // M2[m0-m7]
-		"vld1.32 	{q10, q11}, [%2] 	\n\t" // M2[m8-m15]
-
-		"vsub.f32   q12, q0, q8 		\n\t" // DST->M[m0-m3] = M1[m0-m3] - M2[m0-m3]
-		"vsub.f32   q13, q1, q9			\n\t" // DST->M[m4-m7] = M1[m4-m7] - M2[m4-m7]
-		"vsub.f32   q14, q2, q10		\n\t" // DST->M[m8-m11] = M1[m8-m11] - M2[m8-m11]
-		"vsub.f32   q15, q3, q11		\n\t" // DST->M[m12-m15] = M1[m12-m15] - M2[m12-m15]
+		"vld4.32 {d0[0], d2[0], d4[0], d6[0]}, [%1]! 	\n\t" // DST->M[m0, m4, m8, m12] = M[m0-m3]
+		"vld4.32 {d0[1], d2[1], d4[1], d6[1]}, [%1]!	\n\t" // DST->M[m1, m5, m9, m12] = M[m4-m7]
+		"vld4.32 {d1[0], d3[0], d5[0], d7[0]}, [%1]!	\n\t" // DST->M[m2, m6, m10, m12] = M[m8-m11]
+		"vld4.32 {d1[1], d3[1], d5[1], d7[1]}, [%1] 	\n\t" // DST->M[m3, m7, m11, m12] = M[m12-m15]
 
-		"vst1.32    {q12, q13}, [%0]!   \n\t" // DST->M[m0-m7]
-		"vst1.32    {q14, q15}, [%0]    \n\t" // DST->M[m8-m15]
+		"vst1.32 {q0-q1}, [%0]! 						\n\t" // DST->M[m0-m7]
+		"vst1.32 {q2-q3}, [%0] 							\n\t" // DST->M[m8-m15]
 		:
-		: "r"(dst), "r"(m1), "r"(m2)
-		: "q0", "q1", "q2", "q3", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15", "memory"
+		: "r"(dst), "r"(m)
+		: "q0", "q1", "q2", "q3", "memory"
 	);
 }
 
-inline void MathUtil::transformVectorMatrix(const float* m, float x, float y, float z, float w, float* dst)
+inline void MathUtil::transformVector4(const float* m, float x, float y, float z, float w, float* dst)
 {
 	asm volatile(
 		"vld1.32	{d0[0]},		[%1]	\n\t"	// V[x]
@@ -165,7 +181,7 @@ inline void MathUtil::transformVectorMatrix(const float* m, float x, float y, fl
 	);
 }
 
-inline void MathUtil::transformVectorMatrix(const float* m, const float* v, float* dst)
+inline void MathUtil::transformVector4(const float* m, const float* v, float* dst)
 {
 	asm volatile
 	(
@@ -185,22 +201,6 @@ inline void MathUtil::transformVectorMatrix(const float* m, const float* v, floa
 	);
 }
 
-inline void MathUtil::transposeMatrix(const float* m, float* dst)
-{
-	asm volatile(
-		"vld4.32 {d0[0], d2[0], d4[0], d6[0]}, [%1]! 	\n\t" // DST->M[m0, m4, m8, m12] = M[m0-m3]
-		"vld4.32 {d0[1], d2[1], d4[1], d6[1]}, [%1]!	\n\t" // DST->M[m1, m5, m9, m12] = M[m4-m7]
-		"vld4.32 {d1[0], d3[0], d5[0], d7[0]}, [%1]!	\n\t" // DST->M[m2, m6, m10, m12] = M[m8-m11]
-		"vld4.32 {d1[1], d3[1], d5[1], d7[1]}, [%1] 	\n\t" // DST->M[m3, m7, m11, m12] = M[m12-m15]
-
-		"vst1.32 {q0-q1}, [%0]! 						\n\t" // DST->M[m0-m7]
-		"vst1.32 {q2-q3}, [%0] 							\n\t"  // DST->M[m8-m15]
-		:
-		: "r"(dst), "r"(m)
-		: "q0", "q1", "q2", "q3", "memory"
-	);
-}
-
 inline void MathUtil::crossVector3(const float* v1, const float* v2, float* dst)
 {
 	asm volatile(

+ 2 - 2
gameplay/src/Matrix.cpp

@@ -842,7 +842,7 @@ void Matrix::transformVector(float x, float y, float z, float w, Vector3* dst) c
 {
     GP_ASSERT(dst);
 
-    MathUtil::transformVectorMatrix(m, x, y, z, w, (float*)dst);
+    MathUtil::transformVector4(m, x, y, z, w, (float*)dst);
 }
 
 void Matrix::transformVector(Vector4* vector) const
@@ -855,7 +855,7 @@ void Matrix::transformVector(const Vector4& vector, Vector4* dst) const
 {
     GP_ASSERT(dst);
 
-    MathUtil::transformVectorMatrix(m, (const float*) &vector, (float*)dst);
+    MathUtil::transformVector4(m, (const float*) &vector, (float*)dst);
 }
 
 void Matrix::translate(float x, float y, float z)