summaryrefslogtreecommitdiff
path: root/java/tests/ScriptGroupTest/src/com/android/rs/sgtest/ScriptGroupTestActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/tests/ScriptGroupTest/src/com/android/rs/sgtest/ScriptGroupTestActivity.java')
-rw-r--r--java/tests/ScriptGroupTest/src/com/android/rs/sgtest/ScriptGroupTestActivity.java342
1 files changed, 342 insertions, 0 deletions
diff --git a/java/tests/ScriptGroupTest/src/com/android/rs/sgtest/ScriptGroupTestActivity.java b/java/tests/ScriptGroupTest/src/com/android/rs/sgtest/ScriptGroupTestActivity.java
new file mode 100644
index 00000000..db32d658
--- /dev/null
+++ b/java/tests/ScriptGroupTest/src/com/android/rs/sgtest/ScriptGroupTestActivity.java
@@ -0,0 +1,342 @@
+/*
+ * Copyright (C) 2012 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.rs.sgtest;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.view.SurfaceView;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.SeekBar;
+import android.widget.Spinner;
+import android.widget.TextView;
+import android.view.View;
+import android.util.Log;
+import android.renderscript.ScriptC;
+import android.renderscript.RenderScript;
+import android.renderscript.Type;
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.Script;
+
+import android.os.Environment;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class ScriptGroupTestActivity extends Activity
+ implements SeekBar.OnSeekBarChangeListener {
+ private final String TAG = "Img";
+ public final String RESULT_FILE = "image_processing_result.csv";
+
+ RenderScript mRS;
+ Allocation mInPixelsAllocation;
+ Allocation mOutPixelsAllocation;
+
+ Bitmap mBitmapOut;
+
+ private Spinner mSpinner;
+
+ private TextView mBenchmarkResult;
+ private Spinner mModeSpinner;
+ private Spinner mTestSpinner1;
+ private Spinner mTestSpinner2;
+
+ private ImageView mDisplayView;
+
+ private boolean mDoingBenchmark;
+
+ private TestBase mTest;
+ private int mRunCount;
+
+ public void updateDisplay() {
+ mHandler.sendMessage(Message.obtain());
+ }
+
+ private Handler mHandler = new Handler() {
+ // Allow the filter to complete without blocking the UI
+ // thread. When the message arrives that the op is complete
+ // we will either mark completion or start a new filter if
+ // more work is ready. Either way, display the result.
+ @Override
+ public void handleMessage(Message msg) {
+ boolean doTest = false;
+ synchronized(this) {
+ if (mRS == null) {
+ return;
+ }
+ mTest.updateBitmap(mBitmapOut);
+ mDisplayView.invalidate();
+ if (mRunCount > 0) {
+ mRunCount--;
+ if (mRunCount > 0) {
+ doTest = true;
+ }
+ }
+
+ if (doTest) {
+ mTest.runTestSendMessage();
+ }
+ }
+ }
+
+ };
+
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ }
+
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ }
+
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ }
+
+ void changeTest(int pos1, int pos2, int mode) {
+ if (mTest != null) {
+ mTest.destroy();
+ }
+
+ final int[] index = new int[] { pos1, pos2 };
+ mTest = new Filters(mode, index);
+
+ mTest.createBaseTest(this);
+
+ mTest.runTest();
+ updateDisplay();
+ mBenchmarkResult.setText("Result: not run");
+ }
+
+ String getFilterName(int pos) {
+ return Filters.mFilterClasses[pos].getSimpleName();
+ }
+
+ String[] getFilterNames() {
+ ArrayList<String> list = new ArrayList<String>();
+ final int n = Filters.mFilterClasses.length;
+ for (int i = 0; i < n; i++) {
+ list.add(getFilterName(i));
+ }
+ return list.toArray(new String[0]);
+ }
+
+ void setupTests() {
+ String[] names = getFilterNames();
+ mModeSpinner.setAdapter(new ArrayAdapter<String>(
+ this, R.layout.spinner_layout, new String[] {"emulated", "native"}));
+ mTestSpinner1.setAdapter(new ArrayAdapter<String>(
+ this, R.layout.spinner_layout, names));
+ mTestSpinner2.setAdapter(new ArrayAdapter<String>(
+ this, R.layout.spinner_layout, names));
+ }
+
+ private AdapterView.OnItemSelectedListener mModeSpinnerListener =
+ new AdapterView.OnItemSelectedListener() {
+ public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+ changeTest(
+ mTestSpinner1.getSelectedItemPosition(),
+ mTestSpinner2.getSelectedItemPosition(),
+ pos);
+ }
+
+ public void onNothingSelected(AdapterView parent) {
+ }
+ };
+
+ private AdapterView.OnItemSelectedListener mTestSpinner1Listener =
+ new AdapterView.OnItemSelectedListener() {
+ public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+ changeTest(pos, mTestSpinner2.getSelectedItemPosition(),
+ mModeSpinner.getSelectedItemPosition());
+ }
+
+ public void onNothingSelected(AdapterView parent) {
+ }
+ };
+
+ private AdapterView.OnItemSelectedListener mTestSpinner2Listener =
+ new AdapterView.OnItemSelectedListener() {
+ public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+ changeTest(mTestSpinner1.getSelectedItemPosition(), pos,
+ mModeSpinner.getSelectedItemPosition());
+ }
+
+ public void onNothingSelected(AdapterView parent) {
+ }
+ };
+
+ void init() {
+ mRS = RenderScript.create(this);
+ mInPixelsAllocation = Allocation.createFromBitmapResource(
+ mRS, getResources(), R.drawable.img1600x1067);
+ mBitmapOut = Bitmap.createBitmap(mInPixelsAllocation.getType().getX(),
+ mInPixelsAllocation.getType().getY(),
+ Bitmap.Config.ARGB_8888);
+ mOutPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapOut);
+
+ mDisplayView = (ImageView) findViewById(R.id.display);
+ mDisplayView.setImageBitmap(mBitmapOut);
+
+ mModeSpinner = (Spinner) findViewById(R.id.modeselection);
+ mModeSpinner.setOnItemSelectedListener(mModeSpinnerListener);
+ mTestSpinner1 = (Spinner) findViewById(R.id.filterselection);
+ mTestSpinner1.setOnItemSelectedListener(mTestSpinner1Listener);
+ mTestSpinner2 = (Spinner) findViewById(R.id.filter2selection);
+ mTestSpinner2.setOnItemSelectedListener(mTestSpinner2Listener);
+
+ mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
+ mBenchmarkResult.setText("Result: not run");
+
+ setupTests();
+ changeTest(0, 0, 0);
+ }
+
+ void cleanup() {
+ synchronized(this) {
+ RenderScript rs = mRS;
+ mRS = null;
+ while(mDoingBenchmark) {
+ try {
+ Thread.sleep(1, 0);
+ } catch(InterruptedException e) {
+ }
+
+ }
+ rs.destroy();
+ }
+
+ mInPixelsAllocation = null;
+ mOutPixelsAllocation = null;
+ mBitmapOut = null;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ init();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ cleanup();
+ }
+
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ if (null == mRS) {
+ init();
+ }
+ }
+
+ // button hook
+ public void benchmark(View v) {
+ float t = getBenchmark();
+ //long javaTime = javaFilter();
+ //mBenchmarkResult.setText("RS: " + t + " ms Java: " + javaTime + " ms");
+ mBenchmarkResult.setText("Result: " + t + " ms");
+ Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t);
+ }
+
+ public void benchmark_all(View v) {
+ // write result into a file
+ File externalStorage = Environment.getExternalStorageDirectory();
+ if (!externalStorage.canWrite()) {
+ Log.v(TAG, "sdcard is not writable");
+ return;
+ }
+ File resultFile = new File(externalStorage, RESULT_FILE);
+ resultFile.setWritable(true, false);
+ try {
+ BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
+ Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
+ final int n = Filters.mFilterClasses.length;
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ for (int k = 0; k < 2; k++) {
+ changeTest(i, j, k);
+ float t = getBenchmark();
+ String tn = getFilterName(i) + "-" + getFilterName(j);
+ if (k == 0) {
+ tn += " (emulated)";
+ } else {
+ tn += " (native)";
+ }
+ String s = new String("" + tn.toString() + ", " + t);
+ rsWriter.write(s + "\n");
+ Log.v(TAG, "Test " + s + "ms\n");
+ }
+ }
+ }
+ rsWriter.close();
+ } catch (IOException e) {
+ Log.v(TAG, "Unable to write result file " + e.getMessage());
+ }
+ changeTest(0, 0, 0);
+ Log.v(TAG, "result file:"+resultFile.getAbsolutePath());
+ }
+
+
+
+ // For benchmark test
+ public float getBenchmark() {
+ if (mRS == null) {
+ return 0;
+ }
+ mDoingBenchmark = true;
+
+ mTest.setupBenchmark();
+ long result = 0;
+
+ //Log.v(TAG, "Warming");
+ long t = java.lang.System.currentTimeMillis() + 250;
+ do {
+ mTest.runTest();
+ mTest.finish();
+ } while (t > java.lang.System.currentTimeMillis());
+
+ //Log.v(TAG, "Benchmarking");
+ int ct = 0;
+ t = java.lang.System.currentTimeMillis();
+ do {
+ mTest.runTest();
+ mTest.finish();
+ ct++;
+ } while ((t+1000) > java.lang.System.currentTimeMillis());
+ t = java.lang.System.currentTimeMillis() - t;
+ float ft = (float)t;
+ ft /= ct;
+
+ mTest.exitBenchmark();
+ mDoingBenchmark = false;
+
+ return ft;
+ }
+}