summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXia Wang <xiaw@google.com>2011-04-15 17:24:08 -0700
committerXia Wang <xiaw@google.com>2011-04-26 16:13:32 -0700
commit2738fb1cb13314e68ea5442e335de427261cde3c (patch)
tree9a5c2de74c677d7cad3c5258275f131d74a52587
parenta13802d8805c2af2fae4d64e3dee99abd73ecfa9 (diff)
downloadframeworks_base-2738fb1cb13314e68ea5442e335de427261cde3c.zip
frameworks_base-2738fb1cb13314e68ea5442e335de427261cde3c.tar.gz
frameworks_base-2738fb1cb13314e68ea5442e335de427261cde3c.tar.bz2
- Add instrumentation utility to automate rs performance tests:
The RsBench test activity can be launched within instrumentation - Provide parameter to control test run: set the maximum number of loops from test runner, the script will send out a message after the test loops exceeds the maxium number Change-Id: I5fba0543094ef7a8b5eaa6ff9a04367d272b4d65
-rw-r--r--tests/RenderScriptTests/PerfTest/Android.mk4
-rw-r--r--tests/RenderScriptTests/PerfTest/AndroidManifest.xml10
-rw-r--r--tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBench.java20
-rw-r--r--tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java49
-rw-r--r--tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchTest.java78
-rw-r--r--tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchView.java23
-rw-r--r--tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsPerfTestRunner.java56
-rw-r--r--tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs14
8 files changed, 238 insertions, 16 deletions
diff --git a/tests/RenderScriptTests/PerfTest/Android.mk b/tests/RenderScriptTests/PerfTest/Android.mk
index 85b0a65..757b3b1 100644
--- a/tests/RenderScriptTests/PerfTest/Android.mk
+++ b/tests/RenderScriptTests/PerfTest/Android.mk
@@ -19,7 +19,9 @@ ifneq ($(TARGET_SIMULATOR),true)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
#LOCAL_STATIC_JAVA_LIBRARIES := android.renderscript
diff --git a/tests/RenderScriptTests/PerfTest/AndroidManifest.xml b/tests/RenderScriptTests/PerfTest/AndroidManifest.xml
index 3afb3b2..e024882 100644
--- a/tests/RenderScriptTests/PerfTest/AndroidManifest.xml
+++ b/tests/RenderScriptTests/PerfTest/AndroidManifest.xml
@@ -3,7 +3,8 @@
package="com.android.perftest">
<uses-sdk android:minSdkVersion="11" />
<application android:label="PerfTest"
- android:icon="@drawable/test_pattern">
+ android:icon="@drawable/test_pattern">
+ <uses-library android:name="android.test.runner" />
<activity android:name="RsBench"
android:label="RsBenchmark"
android:theme="@android:style/Theme.Black.NoTitleBar">
@@ -12,5 +13,10 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- </application>
+ </application>
+
+ <instrumentation android:name=".RsPerfTestRunner"
+ android:targetPackage="com.android.perftest"
+ android:label="Test runner for RsBench tests"
+ />
</manifest>
diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBench.java b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBench.java
index 11ad11a..d7393f8 100644
--- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBench.java
+++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBench.java
@@ -21,6 +21,8 @@ import android.renderscript.RenderScript;
import android.app.Activity;
import android.content.res.Configuration;
+import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -37,17 +39,27 @@ import android.widget.ListView;
import java.lang.Runtime;
public class RsBench extends Activity {
-
- private RsBenchView mView;
+ private final String TAG = "RsBench";
+ public RsBenchView mView;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
-
+ int iterations = 0;
+ Intent intent = getIntent();
+ Uri uri = intent.getData();
+ if (uri != null) {
+ // when lauched from instrumentation
+ String scheme = uri.getScheme();
+ if ("iterations".equals(scheme)) {
+ iterations = Integer.parseInt(uri.getSchemeSpecificPart());
+ }
+ }
// Create our Preview view and set it as the content of our
// Activity
mView = new RsBenchView(this);
setContentView(mView);
+ mView.setLoops(iterations);
}
@Override
@@ -65,6 +77,4 @@ public class RsBench extends Activity {
super.onPause();
mView.pause();
}
-
}
-
diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java
index 5443ef8..4d4adf6 100644
--- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java
+++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java
@@ -29,6 +29,7 @@ import android.renderscript.Program.TextureType;
import android.renderscript.ProgramStore.DepthFunc;
import android.renderscript.ProgramStore.BlendSrcFunc;
import android.renderscript.ProgramStore.BlendDstFunc;
+import android.renderscript.RenderScript.RSMessageHandler;
import android.renderscript.Sampler.Value;
import android.util.Log;
@@ -37,11 +38,12 @@ public class RsBenchRS {
int mWidth;
int mHeight;
+ int mLoops;
public RsBenchRS() {
}
- public void init(RenderScriptGL rs, Resources res, int width, int height) {
+ public void init(RenderScriptGL rs, Resources res, int width, int height, int loops) {
mRS = rs;
mRes = res;
mWidth = width;
@@ -50,9 +52,12 @@ public class RsBenchRS {
mOptionsARGB.inPreferredConfig = Bitmap.Config.ARGB_8888;
mMode = 0;
mMaxModes = 0;
+ mLoops = loops;
initRS();
}
+ private boolean stopTest = false;
+
private Resources mRes;
private RenderScriptGL mRS;
@@ -121,6 +126,43 @@ public class RsBenchRS {
mScript.set_gDisplayMode(mMode);
}
+ /**
+ * Create a message handler to handle message sent from the script
+ */
+ protected RSMessageHandler mRsMessage = new RSMessageHandler() {
+ public void run() {
+ if (mID == mScript.get_RS_MSG_TEST_DONE()) {
+ synchronized(this) {
+ stopTest = true;
+ this.notifyAll();
+ }
+ return;
+ } else {
+ Log.v("RsBenchRS", "Perf test got unexpected message");
+ return;
+ }
+ }
+ };
+
+ /**
+ * Wait for message from the script
+ */
+ public boolean testIsFinished() {
+ synchronized(this) {
+ while (true) {
+ if (stopTest) {
+ return true;
+ } else {
+ try {
+ this.wait(60*1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+
ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) {
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
@@ -388,8 +430,10 @@ public class RsBenchRS {
private void initRS() {
mScript = new ScriptC_rsbench(mRS, mRes, R.raw.rsbench);
+ mRS.setMessageHandler(mRsMessage);
mMaxModes = mScript.get_gMaxModes();
+ mScript.set_gMaxLoops(mLoops);
initSamplers();
initProgramStore();
@@ -421,6 +465,3 @@ public class RsBenchRS {
mRS.bindRootScript(mScript);
}
}
-
-
-
diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchTest.java b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchTest.java
new file mode 100644
index 0000000..199200b
--- /dev/null
+++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2011 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 com.android.perftest;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.test.suitebuilder.annotation.LargeTest;
+import android.util.Log;
+
+/**
+ * To run the test, please use command
+ *
+ * adb shell am instrument -w com.android.perftest/.RsPerfTestRunner
+ *
+ */
+public class RsBenchTest extends ActivityInstrumentationTestCase2<RsBench> {
+ private String TAG = "RsBenchTest";
+ private int iterations = 0;
+ private RsBench mAct;
+
+ public RsBenchTest() {
+ super(RsBench.class);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ Instrumentation mInst = getInstrumentation();
+ RsPerfTestRunner mRunner = (RsPerfTestRunner) getInstrumentation();
+ iterations = mRunner.iterations;
+ Log.v(TAG, "Run benchmark for " + iterations + " iterations.");
+
+ Uri data = Uri.fromParts("iterations", Integer.toString(iterations), null);
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.setClassName("com.android.perftest", "com.android.perftest.RsBench");
+ intent.setData(data);
+ mAct = (RsBench) mInst.startActivitySync(intent);
+ mInst.waitForIdleSync();
+
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ mAct.finish();
+ super.tearDown();
+ }
+
+ /**
+ * Run tests and wait until the test has been run for iterations.
+ */
+ @LargeTest
+ public void testRsBench() {
+ if (mAct.mView.testIsFinished()) {
+ return;
+ } else {
+ fail("test didn't stop correctly");
+ }
+ }
+}
diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchView.java b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchView.java
index ee7e508..2882b93 100644
--- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchView.java
+++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchView.java
@@ -23,6 +23,7 @@ import java.util.concurrent.Semaphore;
import android.renderscript.RSSurfaceView;
import android.renderscript.RenderScript;
import android.renderscript.RenderScriptGL;
+import android.renderscript.RenderScript.RSMessageHandler;
import android.content.Context;
import android.content.res.Resources;
@@ -47,7 +48,7 @@ public class RsBenchView extends RSSurfaceView {
private RenderScriptGL mRS;
private RsBenchRS mRender;
-
+ private int mLoops = 0;
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
super.surfaceChanged(holder, format, w, h);
@@ -57,7 +58,8 @@ public class RsBenchView extends RSSurfaceView {
mRS = createRenderScriptGL(sc);
mRS.setSurface(holder, w, h);
mRender = new RsBenchRS();
- mRender.init(mRS, getResources(), w, h);
+ Log.v("RsBenchView", "mLoops = " + mLoops);
+ mRender.init(mRS, getResources(), w, h, mLoops);
}
}
@@ -86,6 +88,21 @@ public class RsBenchView extends RSSurfaceView {
return ret;
}
-}
+ /**
+ * Set the total number of loops the benchmark tests will run
+ * before the test results are collected.
+ */
+ public void setLoops(int iterations) {
+ if (iterations > 0) {
+ mLoops = iterations;
+ }
+ }
+ /**
+ * Wait for message from the script
+ */
+ public boolean testIsFinished() {
+ return mRender.testIsFinished();
+ }
+}
diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsPerfTestRunner.java b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsPerfTestRunner.java
new file mode 100644
index 0000000..031af6a
--- /dev/null
+++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsPerfTestRunner.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2011 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 com.android.perftest;
+
+//import com.android.perftest.RsBenchTest;
+
+import android.os.Bundle;
+import android.test.InstrumentationTestRunner;
+import android.test.InstrumentationTestSuite;
+
+import junit.framework.TestSuite;
+
+/**
+ * Run the RenderScript Performance Test
+ * adb shell am instrument -w com.android.perftest/.RsPerfTestRunner
+ *
+ * with specified iterations:
+ * adb shell am instrument -e iterations <n> -w com.android.perftest/.RsPerfTestRunner
+ *
+ */
+public class RsPerfTestRunner extends InstrumentationTestRunner {
+ public int iterations = 10;
+
+ @Override
+ public TestSuite getAllTests() {
+ TestSuite suite = new InstrumentationTestSuite(this);
+ suite.addTestSuite(RsBenchTest.class);
+ return suite;
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ String strValue = (String)icicle.get("iterations");
+ if (strValue != null) {
+ int intValue = Integer.parseInt(strValue);
+ if (iterations > 0) {
+ iterations = intValue;
+ }
+ }
+ }
+}
diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs
index fd0f16f..a663d35 100644
--- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs
+++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs
@@ -19,7 +19,11 @@
#include "rs_graphics.rsh"
#include "shader_def.rsh"
+/* Message sent from script to renderscript */
+const int RS_MSG_TEST_DONE = 100;
+
const int gMaxModes = 26;
+int gMaxLoops;
rs_program_vertex gProgVertex;
rs_program_fragment gProgFragmentColor;
@@ -634,6 +638,8 @@ static bool checkInit() {
}
static int benchMode = 0;
+static int runningLoops = 0;
+static bool sendMsgFlag = false;
static const char *testNames[] = {
"Finished text fill 1,",
@@ -828,7 +834,13 @@ int root(int launchID) {
if (benchMode > gMaxModes) {
benchMode = 0;
+ runningLoops++;
+ if ((gMaxLoops > 0) && (runningLoops > gMaxLoops) && !sendMsgFlag) {
+ //Notifiy the test to stop and get results
+ rsDebug("gMaxLoops and runningLoops: ", gMaxLoops, runningLoops);
+ rsSendToClientBlocking(RS_MSG_TEST_DONE);
+ sendMsgFlag = true;
+ }
}
-
return 1;
}