Merge "Add performance test suite for opengl Matrix operations"
This commit is contained in:
@@ -0,0 +1,397 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.opengl.perftests;
|
||||||
|
|
||||||
|
import android.opengl.Matrix;
|
||||||
|
import android.perftests.utils.BenchmarkState;
|
||||||
|
import android.perftests.utils.PerfStatusReporter;
|
||||||
|
|
||||||
|
import androidx.test.filters.LargeTest;
|
||||||
|
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
@LargeTest
|
||||||
|
public class MatrixPerfTest {
|
||||||
|
@Rule
|
||||||
|
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public float[] array = new float[48];
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public float[] bigArray = new float[16 * 1024 * 1024];
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMM() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMM(array, 32, array, 16, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMMLeftOverlapResult() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMM(array, 16, array, 16, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMMRightOverlapResult() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMM(array, 0, array, 16, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMMAllOverlap() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMM(array, 0, array, 0, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMMOutputBigArray() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMM(bigArray, 1024, array, 16, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMMAllBigArray() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
bigArray[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMM(bigArray, 1024, bigArray, 16, bigArray, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMV() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMV(array, 20, array, 4, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMVLeftOverlapResult() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMV(array, 4, array, 4, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMVRightOverlapResult() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMV(array, 0, array, 16, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMVAllOverlap() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMV(array, 0, array, 0, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMVOutputBigArray() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMV(bigArray, 1024, array, 16, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplyMVAllBigArray() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
bigArray[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.multiplyMV(bigArray, 1024, bigArray, 16, bigArray, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTransposeM() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.transposeM(array, 16, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testInvertM() {
|
||||||
|
// non-singular matrix
|
||||||
|
array[ 0] = 0.814f;
|
||||||
|
array[ 1] = 4.976f;
|
||||||
|
array[ 2] = -3.858f;
|
||||||
|
array[ 3] = 7.206f;
|
||||||
|
array[ 4] = 5.112f;
|
||||||
|
array[ 5] = -2.420f;
|
||||||
|
array[ 6] = 8.791f;
|
||||||
|
array[ 7] = 6.426f;
|
||||||
|
array[ 8] = 2.945f;
|
||||||
|
array[ 9] = 1.801f;
|
||||||
|
array[10] = -2.594f;
|
||||||
|
array[11] = 2.663f;
|
||||||
|
array[12] = -5.003f;
|
||||||
|
array[13] = -4.188f;
|
||||||
|
array[14] = 3.340f;
|
||||||
|
array[15] = -1.235f;
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.invertM(array, 16, array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOrthoM() {
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.orthoM(array, 0, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFrustumM() {
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.frustumM(array, 0, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPerspectiveM() {
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.perspectiveM(array, 0, 45.0f, 1.0f, 1.0f, 100.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLength() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.length(array[0], array[1], array[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetIdentityM() {
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.setIdentityM(array, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testScaleM() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 19; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.scaleM(array, 19, array, 0, array[16], array[17], array[18]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testScaleMInPlace() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 19; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.scaleM(array, 0, array[16], array[17], array[18]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTranslateM() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 19; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.translateM(array, 19, array, 0, array[16], array[17], array[18]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTranslateMInPlace() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 19; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.translateM(array, 0, array[16], array[17], array[18]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRotateM() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.rotateM(array, 20, array, 0, array[16], array[17], array[18], array[19]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRotateMInPlace() {
|
||||||
|
Random rng = new Random();
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
array[i] = rng.nextFloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.rotateM(array, 0, array[16], array[17], array[18], array[19]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetRotateM() {
|
||||||
|
Random rng = new Random();
|
||||||
|
array[0] = rng.nextFloat() * 90.0f;
|
||||||
|
array[1] = rng.nextFloat() + 0.5f;
|
||||||
|
array[2] = rng.nextFloat() + 0.5f;
|
||||||
|
array[3] = rng.nextFloat() + 0.5f;
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.setRotateM(array, 4, array[0], array[1], array[2], array[3]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetRotateEulerM() {
|
||||||
|
Random rng = new Random();
|
||||||
|
array[0] = rng.nextFloat() * 90.0f;
|
||||||
|
array[1] = rng.nextFloat() * 90.0f;
|
||||||
|
array[2] = rng.nextFloat() * 90.0f;
|
||||||
|
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.setRotateEulerM(array, 3, array[0], array[1], array[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetLookAtM() {
|
||||||
|
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
|
||||||
|
while (state.keepRunning()) {
|
||||||
|
Matrix.setLookAtM(array, 9,
|
||||||
|
1.0f, 0.0f, 0.0f,
|
||||||
|
1.0f, 0.0f, 1.0f,
|
||||||
|
0.0f, 1.0f, 0.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user