1 /*	Public domain	*/
2 /*
3  * Microbenchmarks for comparing the performance of M_Vector3 operations
4  * on random vector sets, under different backends.
5  */
6 
7 static __inline__ void
UseMatrix(const M_Matrix44 * M)8 UseMatrix(const M_Matrix44 *M)
9 {
10 	if (M->m[0][0] > M->m[3][3]) { realJunk = M->m[1][1]+M->m[2][2]; }
11 }
12 
13 static void
MatrixZero44(void * ti)14 MatrixZero44(void *ti)
15 {
16 	M_Matrix44 M[10];
17 	int i;
18 	for (i = 0; i < 10; i++) { M[i] = M_MatZero44(); }
19 	for (i = 0; i < 10; i++) { UseMatrix(&M[i]); }
20 }
21 static void
MatrixZero44v(void * ti)22 MatrixZero44v(void *ti)
23 {
24 	M_Matrix44 M[10];
25 	int i;
26 	for (i = 0; i < 10; i++) { M_MatZero44v(&M[i]); }
27 	for (i = 0; i < 10; i++) { UseMatrix(&M[i]); }
28 }
29 
30 static void
MatrixIdentity44(void * ti)31 MatrixIdentity44(void *ti)
32 {
33 	M_Matrix44 M[10];
34 	int i;
35 	for (i = 0; i < 10; i++) { M[i] = M_MatIdentity44(); }
36 	for (i = 0; i < 10; i++) { UseMatrix(&M[i]); }
37 }
38 static void
MatrixIdentity44v(void * ti)39 MatrixIdentity44v(void *ti)
40 {
41 	M_Matrix44 M[10];
42 	int i;
43 	for (i = 0; i < 10; i++) { M_MatIdentity44v(&M[i]); }
44 	for (i = 0; i < 10; i++) { UseMatrix(&M[i]); }
45 }
46 
47 static void
MatrixInvert44(void * ti)48 MatrixInvert44(void *ti)
49 {
50 	M_Matrix44 M[2], Minv[2];
51 	int i;
52 	for (i = 0; i < 2; i++) { M[i] = RandomMatrix44(ti); }
53 	for (i = 0; i < 2; i++) { Minv[i] = M_MatInvert44(M[i]); }
54 	for (i = 0; i < 2; i++) { UseMatrix(&Minv[i]); }
55 }
56 
57 static void
MatrixTranspose44(void * ti)58 MatrixTranspose44(void *ti)
59 {
60 	M_Matrix44 M[6], Mt[6];
61 	int i;
62 	for (i = 0; i < 6; i++) { M[i] = RandomMatrix44(ti); }
63 	for (i = 0; i < 6; i++) { Mt[i] = M_MatTranspose44(M[i]); }
64 	for (i = 0; i < 6; i++) { UseMatrix(&Mt[i]); }
65 }
66 static void
MatrixTranspose44p(void * ti)67 MatrixTranspose44p(void *ti)
68 {
69 	M_Matrix44 M[6], Mt[6];
70 	int i;
71 	for (i = 0; i < 6; i++) { M[i] = RandomMatrix44(ti); }
72 	for (i = 0; i < 6; i++) { Mt[i] = M_MatTranspose44p(&M[i]); }
73 	for (i = 0; i < 6; i++) { UseMatrix(&Mt[i]); }
74 }
75 static void
MatrixTranspose44v(void * ti)76 MatrixTranspose44v(void *ti)
77 {
78 	M_Matrix44 M[6];
79 	int i;
80 	for (i = 0; i < 6; i++) { M[i] = RandomMatrix44(ti); }
81 	for (i = 0; i < 6; i++) { M_MatTranspose44v(&M[i]); }
82 	for (i = 0; i < 6; i++) { UseMatrix(&M[i]); }
83 }
84 
85 static void
MatrixMult44(void * ti)86 MatrixMult44(void *ti)
87 {
88 	M_Matrix44 A[3], B[3], AB[3];
89 	int i;
90 	for (i = 0; i < 3; i++) { A[i] = RandomMatrix44(ti); B[i] = RandomMatrix44(ti); }
91 	for (i = 0; i < 3; i++) { AB[i] = M_MatMult44(A[i], B[i]); }
92 	for (i = 0; i < 3; i++) { UseMatrix(&AB[i]); }
93 }
94 static void
MatrixMult44v(void * ti)95 MatrixMult44v(void *ti)
96 {
97 	M_Matrix44 A[3], B[3];
98 	int i;
99 	for (i = 0; i < 3; i++) { A[i] = RandomMatrix44(ti); B[i] = RandomMatrix44(ti); }
100 	for (i = 0; i < 3; i++) { M_MatMult44v(&A[i], &B[i]); }
101 	for (i = 0; i < 3; i++) { UseMatrix(&A[i]); }
102 }
103 
104 static void
MatrixCopy44(void * ti)105 MatrixCopy44(void *ti)
106 {
107 	M_Matrix44 A[6], B[6];
108 	int i;
109 	for (i = 0; i < 6; i++) { A[i] = RandomMatrix44(ti); }
110 	for (i = 0; i < 6; i++) { M_MatCopy44(&B[i], &A[i]); }
111 	for (i = 0; i < 6; i++) { realJunk = B[i].m[0][0]; }
112 }
113 
114 static void
MatrixRotateAxis44(void * ti)115 MatrixRotateAxis44(void *ti)
116 {
117 	M_Matrix44 A[6];
118 	M_Vector3 b[6];
119 	M_Real theta[6];
120 	int i;
121 	for (i = 0; i < 6; i++) {
122 		A[i] = RandomMatrix44(ti);
123 		b[i] = RandomVector3(ti);
124 		theta[i] = RandomReal(ti);
125 	}
126 	for (i = 0; i < 6; i++) { M_MatRotateAxis44(&A[i], theta[i], b[i]); }
127 	for (i = 0; i < 6; i++) { realJunk = A[i].m[0][0]; }
128 }
129 static void
MatrixRotate44I(void * ti)130 MatrixRotate44I(void *ti)
131 {
132 	M_Matrix44 A[6];
133 	M_Real theta[6];
134 	int i;
135 	for (i = 0; i < 6; i++) {
136 		A[i] = RandomMatrix44(ti);
137 		theta[i] = RandomReal(ti);
138 	}
139 	for (i = 0; i < 6; i++) { M_MatRotate44I(&A[i], theta[i]); }
140 	for (i = 0; i < 6; i++) { realJunk = A[i].m[0][0]; }
141 }
142 static void
MatrixTranslate44(void * ti)143 MatrixTranslate44(void *ti)
144 {
145 	M_Matrix44 A[6];
146 	M_Vector3 b[6];
147 	int i;
148 	for (i = 0; i < 6; i++) {
149 		A[i] = RandomMatrix44(ti);
150 		b[i] = RandomVector3(ti);
151 	}
152 	for (i = 0; i < 6; i++) { M_MatTranslate44v(&A[i], b[i]); }
153 	for (i = 0; i < 6; i++) { realJunk = A[i].m[0][0]; }
154 }
155 static void
MatrixTranslateX44(void * ti)156 MatrixTranslateX44(void *ti)
157 {
158 	M_Matrix44 A[6];
159 	M_Real t[6];
160 	int i;
161 	for (i = 0; i < 6; i++) {
162 		A[i] = RandomMatrix44(ti);
163 		t[i] = RandomReal(ti);
164 	}
165 	for (i = 0; i < 6; i++) { M_MatTranslate44X(&A[i], t[i]); }
166 	for (i = 0; i < 6; i++) { realJunk = A[i].m[0][0]; }
167 }
168 static void
MatrixScale44(void * ti)169 MatrixScale44(void *ti)
170 {
171 	M_Matrix44 A[6];
172 	M_Vector4 b[6];
173 	int i;
174 	for (i = 0; i < 6; i++) {
175 		A[i] = RandomMatrix44(ti);
176 		b[i] = RandomVector4(ti);
177 	}
178 	for (i = 0; i < 6; i++) { M_MatScale44(&A[i], b[i].x, b[i].y, b[i].z, b[i].w); }
179 	for (i = 0; i < 6; i++) { realJunk = A[i].m[0][0]; }
180 }
181 static void
MatrixUniScale44(void * ti)182 MatrixUniScale44(void *ti)
183 {
184 	M_Matrix44 A[6];
185 	M_Real s[6];
186 	int i;
187 	for (i = 0; i < 6; i++) {
188 		A[i] = RandomMatrix44(ti);
189 		s[i] = RandomReal(ti);
190 	}
191 	for (i = 0; i < 6; i++) { M_MatUniScale44(&A[i], s[i]); }
192 	for (i = 0; i < 6; i++) { realJunk = A[i].m[0][0]; }
193 }
194 
195 static struct ag_benchmark_fn mathBenchMatrix44Fns[] = {
196 	{ "Zero44()", 		MatrixZero44		},
197 	{ "Zero44v()", 		MatrixZero44v		},
198 	{ "Identity44()", 	MatrixIdentity44	},
199 	{ "Identity44v()", 	MatrixIdentity44v	},
200 	{ "Transpose44()", 	MatrixTranspose44	},
201 	{ "Transpose44p()", 	MatrixTranspose44p	},
202 	{ "Transpose44v()", 	MatrixTranspose44v	},
203 	{ "Invert44()", 	MatrixInvert44		},
204 	{ "Mult44()", 		MatrixMult44		},
205 	{ "Mult44v()", 		MatrixMult44v		},
206 	{ "Copy()", 		MatrixCopy44		},
207 	{ "RotateAxis44()",	MatrixRotateAxis44	},
208 	{ "Rotate44I()",	MatrixRotate44I		},
209 	{ "Translate44()",	MatrixTranslate44	},
210 	{ "TranslateX44()",	MatrixTranslateX44	},
211 	{ "Scale44()",		MatrixScale44		},
212 	{ "UniScale44()",	MatrixUniScale44	},
213 };
214 struct ag_benchmark mathBenchMatrix44 = {
215 	"M_Matrix44",
216 	&mathBenchMatrix44Fns[0],
217 	sizeof(mathBenchMatrix44Fns) / sizeof(mathBenchMatrix44Fns[0]),
218 	10, 50000, 10000
219 };
220