blob: b29614817ee2d811da20d265c287883375fd8869 [file] [log] [blame]
/*
* 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);
}
}
}