From 92825679280fc3e43ea894998f9833dc965e1072 Mon Sep 17 00:00:00 2001 From: bloeys Date: Tue, 9 Nov 2021 09:29:45 +0400 Subject: [PATCH] Optimize mat4 mul --- gglm/mat4.go | 106 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 74 insertions(+), 32 deletions(-) diff --git a/gglm/mat4.go b/gglm/mat4.go index fc747f8..e9d46cf 100755 --- a/gglm/mat4.go +++ b/gglm/mat4.go @@ -92,30 +92,51 @@ func (m *Mat4) Mul(m2 *Mat4) *Mat4 { // 02, 12, 22, 32, // 03, 13, 23, 33, + //Improves performance by ~8% + m00 := m.Data[0][0] + m01 := m.Data[0][1] + m02 := m.Data[0][2] + m03 := m.Data[0][3] + + m10 := m.Data[1][0] + m11 := m.Data[1][1] + m12 := m.Data[1][2] + m13 := m.Data[1][3] + + m20 := m.Data[2][0] + m21 := m.Data[2][1] + m22 := m.Data[2][2] + m23 := m.Data[2][3] + + m30 := m.Data[3][0] + m31 := m.Data[3][1] + m32 := m.Data[3][2] + m33 := m.Data[3][3] + m.Data = [4][4]float32{ { - m.Data[0][0]*m2.Data[0][0] + m.Data[1][0]*m2.Data[0][1] + m.Data[2][0]*m2.Data[0][2] + m.Data[3][0]*m2.Data[0][3], - m.Data[0][1]*m2.Data[0][0] + m.Data[1][1]*m2.Data[0][1] + m.Data[2][1]*m2.Data[0][2] + m.Data[3][1]*m2.Data[0][3], - m.Data[0][2]*m2.Data[0][0] + m.Data[1][2]*m2.Data[0][1] + m.Data[2][2]*m2.Data[0][2] + m.Data[3][2]*m2.Data[0][3], - m.Data[0][3]*m2.Data[0][0] + m.Data[1][3]*m2.Data[0][1] + m.Data[2][3]*m2.Data[0][2] + m.Data[3][3]*m2.Data[0][3], + m00*m2.Data[0][0] + m10*m2.Data[0][1] + m20*m2.Data[0][2] + m30*m2.Data[0][3], + m01*m2.Data[0][0] + m11*m2.Data[0][1] + m21*m2.Data[0][2] + m31*m2.Data[0][3], + m02*m2.Data[0][0] + m12*m2.Data[0][1] + m22*m2.Data[0][2] + m32*m2.Data[0][3], + m03*m2.Data[0][0] + m13*m2.Data[0][1] + m23*m2.Data[0][2] + m33*m2.Data[0][3], }, { - m.Data[0][0]*m2.Data[1][0] + m.Data[1][0]*m2.Data[1][1] + m.Data[2][0]*m2.Data[1][2] + m.Data[3][0]*m2.Data[1][3], - m.Data[0][1]*m2.Data[1][0] + m.Data[1][1]*m2.Data[1][1] + m.Data[2][1]*m2.Data[1][2] + m.Data[3][1]*m2.Data[1][3], - m.Data[0][2]*m2.Data[1][0] + m.Data[1][2]*m2.Data[1][1] + m.Data[2][2]*m2.Data[1][2] + m.Data[3][2]*m2.Data[1][3], - m.Data[0][3]*m2.Data[1][0] + m.Data[1][3]*m2.Data[1][1] + m.Data[2][3]*m2.Data[1][2] + m.Data[3][3]*m2.Data[1][3], + m00*m2.Data[1][0] + m10*m2.Data[1][1] + m20*m2.Data[1][2] + m30*m2.Data[1][3], + m01*m2.Data[1][0] + m11*m2.Data[1][1] + m21*m2.Data[1][2] + m31*m2.Data[1][3], + m02*m2.Data[1][0] + m12*m2.Data[1][1] + m22*m2.Data[1][2] + m32*m2.Data[1][3], + m03*m2.Data[1][0] + m13*m2.Data[1][1] + m23*m2.Data[1][2] + m33*m2.Data[1][3], }, { - m.Data[0][0]*m2.Data[2][0] + m.Data[1][0]*m2.Data[2][1] + m.Data[2][0]*m2.Data[2][2] + m.Data[3][0]*m2.Data[2][3], - m.Data[0][1]*m2.Data[2][0] + m.Data[1][1]*m2.Data[2][1] + m.Data[2][1]*m2.Data[2][2] + m.Data[3][1]*m2.Data[2][3], - m.Data[0][2]*m2.Data[2][0] + m.Data[1][2]*m2.Data[2][1] + m.Data[2][2]*m2.Data[2][2] + m.Data[3][2]*m2.Data[2][3], - m.Data[0][3]*m2.Data[2][0] + m.Data[1][3]*m2.Data[2][1] + m.Data[2][3]*m2.Data[2][2] + m.Data[3][3]*m2.Data[2][3], + m00*m2.Data[2][0] + m10*m2.Data[2][1] + m20*m2.Data[2][2] + m30*m2.Data[2][3], + m01*m2.Data[2][0] + m11*m2.Data[2][1] + m21*m2.Data[2][2] + m31*m2.Data[2][3], + m02*m2.Data[2][0] + m12*m2.Data[2][1] + m22*m2.Data[2][2] + m32*m2.Data[2][3], + m03*m2.Data[2][0] + m13*m2.Data[2][1] + m23*m2.Data[2][2] + m33*m2.Data[2][3], }, { - m.Data[0][0]*m2.Data[3][0] + m.Data[1][0]*m2.Data[3][1] + m.Data[2][0]*m2.Data[3][2] + m.Data[3][0]*m2.Data[3][3], - m.Data[0][1]*m2.Data[3][0] + m.Data[1][1]*m2.Data[3][1] + m.Data[2][1]*m2.Data[3][2] + m.Data[3][1]*m2.Data[3][3], - m.Data[0][2]*m2.Data[3][0] + m.Data[1][2]*m2.Data[3][1] + m.Data[2][2]*m2.Data[3][2] + m.Data[3][2]*m2.Data[3][3], - m.Data[0][3]*m2.Data[3][0] + m.Data[1][3]*m2.Data[3][1] + m.Data[2][3]*m2.Data[3][2] + m.Data[3][3]*m2.Data[3][3], + m00*m2.Data[3][0] + m10*m2.Data[3][1] + m20*m2.Data[3][2] + m30*m2.Data[3][3], + m01*m2.Data[3][0] + m11*m2.Data[3][1] + m21*m2.Data[3][2] + m31*m2.Data[3][3], + m02*m2.Data[3][0] + m12*m2.Data[3][1] + m22*m2.Data[3][2] + m32*m2.Data[3][3], + m03*m2.Data[3][0] + m13*m2.Data[3][1] + m23*m2.Data[3][2] + m33*m2.Data[3][3], }, } @@ -221,31 +242,52 @@ func SubMat4(m1, m2 *Mat4) *Mat4 { //MulMat4 m3 = m1 * m2 func MulMat4(m1, m2 *Mat4) *Mat4 { + + m00 := m1.Data[0][0] + m01 := m1.Data[0][1] + m02 := m1.Data[0][2] + m03 := m1.Data[0][3] + + m10 := m1.Data[1][0] + m11 := m1.Data[1][1] + m12 := m1.Data[1][2] + m13 := m1.Data[1][3] + + m20 := m1.Data[2][0] + m21 := m1.Data[2][1] + m22 := m1.Data[2][2] + m23 := m1.Data[2][3] + + m30 := m1.Data[3][0] + m31 := m1.Data[3][1] + m32 := m1.Data[3][2] + m33 := m1.Data[3][3] + return &Mat4{ Data: [4][4]float32{ { - m1.Data[0][0]*m2.Data[0][0] + m1.Data[1][0]*m2.Data[0][1] + m1.Data[2][0]*m2.Data[0][2] + m1.Data[3][0]*m2.Data[0][3], - m1.Data[0][1]*m2.Data[0][0] + m1.Data[1][1]*m2.Data[0][1] + m1.Data[2][1]*m2.Data[0][2] + m1.Data[3][1]*m2.Data[0][3], - m1.Data[0][2]*m2.Data[0][0] + m1.Data[1][2]*m2.Data[0][1] + m1.Data[2][2]*m2.Data[0][2] + m1.Data[3][2]*m2.Data[0][3], - m1.Data[0][3]*m2.Data[0][0] + m1.Data[1][3]*m2.Data[0][1] + m1.Data[2][3]*m2.Data[0][2] + m1.Data[3][3]*m2.Data[0][3], + m00*m2.Data[0][0] + m10*m2.Data[0][1] + m20*m2.Data[0][2] + m30*m2.Data[0][3], + m01*m2.Data[0][0] + m11*m2.Data[0][1] + m21*m2.Data[0][2] + m31*m2.Data[0][3], + m02*m2.Data[0][0] + m12*m2.Data[0][1] + m22*m2.Data[0][2] + m32*m2.Data[0][3], + m03*m2.Data[0][0] + m13*m2.Data[0][1] + m23*m2.Data[0][2] + m33*m2.Data[0][3], }, { - m1.Data[0][0]*m2.Data[1][0] + m1.Data[1][0]*m2.Data[1][1] + m1.Data[2][0]*m2.Data[1][2] + m1.Data[3][0]*m2.Data[1][3], - m1.Data[0][1]*m2.Data[1][0] + m1.Data[1][1]*m2.Data[1][1] + m1.Data[2][1]*m2.Data[1][2] + m1.Data[3][1]*m2.Data[1][3], - m1.Data[0][2]*m2.Data[1][0] + m1.Data[1][2]*m2.Data[1][1] + m1.Data[2][2]*m2.Data[1][2] + m1.Data[3][2]*m2.Data[1][3], - m1.Data[0][3]*m2.Data[1][0] + m1.Data[1][3]*m2.Data[1][1] + m1.Data[2][3]*m2.Data[1][2] + m1.Data[3][3]*m2.Data[1][3], + m00*m2.Data[1][0] + m10*m2.Data[1][1] + m20*m2.Data[1][2] + m30*m2.Data[1][3], + m01*m2.Data[1][0] + m11*m2.Data[1][1] + m21*m2.Data[1][2] + m31*m2.Data[1][3], + m02*m2.Data[1][0] + m12*m2.Data[1][1] + m22*m2.Data[1][2] + m32*m2.Data[1][3], + m03*m2.Data[1][0] + m13*m2.Data[1][1] + m23*m2.Data[1][2] + m33*m2.Data[1][3], }, { - m1.Data[0][0]*m2.Data[2][0] + m1.Data[1][0]*m2.Data[2][1] + m1.Data[2][0]*m2.Data[2][2] + m1.Data[3][0]*m2.Data[2][3], - m1.Data[0][1]*m2.Data[2][0] + m1.Data[1][1]*m2.Data[2][1] + m1.Data[2][1]*m2.Data[2][2] + m1.Data[3][1]*m2.Data[2][3], - m1.Data[0][2]*m2.Data[2][0] + m1.Data[1][2]*m2.Data[2][1] + m1.Data[2][2]*m2.Data[2][2] + m1.Data[3][2]*m2.Data[2][3], - m1.Data[0][3]*m2.Data[2][0] + m1.Data[1][3]*m2.Data[2][1] + m1.Data[2][3]*m2.Data[2][2] + m1.Data[3][3]*m2.Data[2][3], + m00*m2.Data[2][0] + m10*m2.Data[2][1] + m20*m2.Data[2][2] + m30*m2.Data[2][3], + m01*m2.Data[2][0] + m11*m2.Data[2][1] + m21*m2.Data[2][2] + m31*m2.Data[2][3], + m02*m2.Data[2][0] + m12*m2.Data[2][1] + m22*m2.Data[2][2] + m32*m2.Data[2][3], + m03*m2.Data[2][0] + m13*m2.Data[2][1] + m23*m2.Data[2][2] + m33*m2.Data[2][3], }, { - m1.Data[0][0]*m2.Data[3][0] + m1.Data[1][0]*m2.Data[3][1] + m1.Data[2][0]*m2.Data[3][2] + m1.Data[3][0]*m2.Data[3][3], - m1.Data[0][1]*m2.Data[3][0] + m1.Data[1][1]*m2.Data[3][1] + m1.Data[2][1]*m2.Data[3][2] + m1.Data[3][1]*m2.Data[3][3], - m1.Data[0][2]*m2.Data[3][0] + m1.Data[1][2]*m2.Data[3][1] + m1.Data[2][2]*m2.Data[3][2] + m1.Data[3][2]*m2.Data[3][3], - m1.Data[0][3]*m2.Data[3][0] + m1.Data[1][3]*m2.Data[3][1] + m1.Data[2][3]*m2.Data[3][2] + m1.Data[3][3]*m2.Data[3][3], + m00*m2.Data[3][0] + m10*m2.Data[3][1] + m20*m2.Data[3][2] + m30*m2.Data[3][3], + m01*m2.Data[3][0] + m11*m2.Data[3][1] + m21*m2.Data[3][2] + m31*m2.Data[3][3], + m02*m2.Data[3][0] + m12*m2.Data[3][1] + m22*m2.Data[3][2] + m32*m2.Data[3][3], + m03*m2.Data[3][0] + m13*m2.Data[3][1] + m23*m2.Data[3][2] + m33*m2.Data[3][3], }, }, }