15ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni/* 25ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * Copyright (C) 2012 The Android Open Source Project 35ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * 45ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * Licensed under the Apache License, Version 2.0 (the "License"); 55ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * you may not use this file except in compliance with the License. 65ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * You may obtain a copy of the License at 75ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * 85ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * http://www.apache.org/licenses/LICENSE-2.0 95ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * 105ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * Unless required by applicable law or agreed to in writing, software 115ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * distributed under the License is distributed on an "AS IS" BASIS, 125ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * See the License for the specific language governing permissions and 145ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * limitations under the License. 155ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni */ 165ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 175ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Nipackage com.android.rs.sgtest; 185ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 195ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.app.Activity; 205ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.os.Bundle; 215ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.os.Handler; 225ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.os.Message; 235ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.graphics.BitmapFactory; 245ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.graphics.Bitmap; 255ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.graphics.Canvas; 265ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.view.SurfaceView; 275ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.widget.AdapterView; 285ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.widget.ArrayAdapter; 295ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.widget.ImageView; 305ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.widget.SeekBar; 315ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.widget.Spinner; 325ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.widget.TextView; 335ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.view.View; 345ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.util.Log; 355ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.renderscript.ScriptC; 365ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.renderscript.RenderScript; 375ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.renderscript.Type; 385ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.renderscript.Allocation; 395ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.renderscript.Element; 405ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.renderscript.Script; 415ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 425ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport android.os.Environment; 435ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport java.io.BufferedWriter; 445ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport java.io.File; 455ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport java.io.FileWriter; 465ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport java.io.IOException; 475ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niimport java.util.ArrayList; 485ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 495ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Nipublic class ScriptGroupTestActivity extends Activity 505ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni implements SeekBar.OnSeekBarChangeListener { 515ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private final String TAG = "Img"; 525ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public final String RESULT_FILE = "image_processing_result.csv"; 535ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 545ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni RenderScript mRS; 555ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni Allocation mInPixelsAllocation; 565ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni Allocation mOutPixelsAllocation; 575ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 585ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni Bitmap mBitmapOut; 595ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 605ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private Spinner mSpinner; 615ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 625ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private TextView mBenchmarkResult; 635ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private Spinner mModeSpinner; 645ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private Spinner mTestSpinner1; 655ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private Spinner mTestSpinner2; 665ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 675ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private ImageView mDisplayView; 685ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 695ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private boolean mDoingBenchmark; 705ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 715ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private TestBase mTest; 725ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private int mRunCount; 735ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 745ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void updateDisplay() { 755ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mHandler.sendMessage(Message.obtain()); 765ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 775ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 785ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private Handler mHandler = new Handler() { 795ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni // Allow the filter to complete without blocking the UI 805ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni // thread. When the message arrives that the op is complete 815ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni // we will either mark completion or start a new filter if 825ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni // more work is ready. Either way, display the result. 835ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni @Override 845ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void handleMessage(Message msg) { 855ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni boolean doTest = false; 865ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni synchronized(this) { 875ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni if (mRS == null) { 885ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni return; 895ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 905ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest.updateBitmap(mBitmapOut); 915ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mDisplayView.invalidate(); 925ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni if (mRunCount > 0) { 935ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mRunCount--; 945ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni if (mRunCount > 0) { 955ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni doTest = true; 965ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 975ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 985ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 995ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni if (doTest) { 1005ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest.runTestSendMessage(); 1015ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1025ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1035ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1045ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1055ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni }; 1065ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1075ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 1085ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1095ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1105ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void onStartTrackingTouch(SeekBar seekBar) { 1115ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1125ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1135ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void onStopTrackingTouch(SeekBar seekBar) { 1145ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1155ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1165ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni void changeTest(int pos1, int pos2, int mode) { 1175ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni if (mTest != null) { 1185ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest.destroy(); 1195ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1205ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1215ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni final int[] index = new int[] { pos1, pos2 }; 1225ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest = new Filters(mode, index); 1235ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1245ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest.createBaseTest(this); 1255ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1265ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest.runTest(); 1275ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni updateDisplay(); 1285ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mBenchmarkResult.setText("Result: not run"); 1295ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1305ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1315ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni String getFilterName(int pos) { 1325ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni return Filters.mFilterClasses[pos].getSimpleName(); 1335ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1345ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1355ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni String[] getFilterNames() { 1365ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni ArrayList<String> list = new ArrayList<String>(); 1375ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni final int n = Filters.mFilterClasses.length; 1385ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni for (int i = 0; i < n; i++) { 1395ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni list.add(getFilterName(i)); 1405ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1415ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni return list.toArray(new String[0]); 1425ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1435ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1445ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni void setupTests() { 1455ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni String[] names = getFilterNames(); 1465ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mModeSpinner.setAdapter(new ArrayAdapter<String>( 1475ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni this, R.layout.spinner_layout, new String[] {"emulated", "native"})); 1485ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTestSpinner1.setAdapter(new ArrayAdapter<String>( 1495ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni this, R.layout.spinner_layout, names)); 1505ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTestSpinner2.setAdapter(new ArrayAdapter<String>( 1515ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni this, R.layout.spinner_layout, names)); 1525ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1535ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1545ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private AdapterView.OnItemSelectedListener mModeSpinnerListener = 1555ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni new AdapterView.OnItemSelectedListener() { 1565ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 1575ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni changeTest( 1585ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTestSpinner1.getSelectedItemPosition(), 1595ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTestSpinner2.getSelectedItemPosition(), 1605ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni pos); 1615ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1625ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1635ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void onNothingSelected(AdapterView parent) { 1645ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1655ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni }; 1665ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1675ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private AdapterView.OnItemSelectedListener mTestSpinner1Listener = 1685ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni new AdapterView.OnItemSelectedListener() { 1695ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 1705ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni changeTest(pos, mTestSpinner2.getSelectedItemPosition(), 1715ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mModeSpinner.getSelectedItemPosition()); 1725ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1735ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1745ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void onNothingSelected(AdapterView parent) { 1755ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1765ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni }; 1775ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1785ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni private AdapterView.OnItemSelectedListener mTestSpinner2Listener = 1795ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni new AdapterView.OnItemSelectedListener() { 1805ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 1815ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni changeTest(mTestSpinner1.getSelectedItemPosition(), pos, 1825ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mModeSpinner.getSelectedItemPosition()); 1835ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1845ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1855ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void onNothingSelected(AdapterView parent) { 1865ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 1875ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni }; 1885ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1895ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni void init() { 1905ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mRS = RenderScript.create(this); 1915ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mInPixelsAllocation = Allocation.createFromBitmapResource( 1925ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mRS, getResources(), R.drawable.img1600x1067); 1935ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mBitmapOut = Bitmap.createBitmap(mInPixelsAllocation.getType().getX(), 1945ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mInPixelsAllocation.getType().getY(), 1955ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni Bitmap.Config.ARGB_8888); 1965ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mOutPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapOut); 1975ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 1988467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mDisplayView = findViewById(R.id.display); 1995ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mDisplayView.setImageBitmap(mBitmapOut); 2005ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2018467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mModeSpinner = findViewById(R.id.modeselection); 2025ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mModeSpinner.setOnItemSelectedListener(mModeSpinnerListener); 2038467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mTestSpinner1 = findViewById(R.id.filterselection); 2045ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTestSpinner1.setOnItemSelectedListener(mTestSpinner1Listener); 2058467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mTestSpinner2 = findViewById(R.id.filter2selection); 2065ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTestSpinner2.setOnItemSelectedListener(mTestSpinner2Listener); 2075ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2088467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mBenchmarkResult = findViewById(R.id.benchmarkText); 2095ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mBenchmarkResult.setText("Result: not run"); 2105ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2115ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni setupTests(); 2125ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni changeTest(0, 0, 0); 2135ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2145ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2155ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni void cleanup() { 2165ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni synchronized(this) { 2175ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni RenderScript rs = mRS; 2185ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mRS = null; 2195ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni while(mDoingBenchmark) { 2205ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni try { 2215ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni Thread.sleep(1, 0); 2225ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } catch(InterruptedException e) { 2235ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2245ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2255ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2265ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni rs.destroy(); 2275ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2285ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2295ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mInPixelsAllocation = null; 2305ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mOutPixelsAllocation = null; 2315ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mBitmapOut = null; 2325ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2335ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2345ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni @Override 2355ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni protected void onCreate(Bundle savedInstanceState) { 2365ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni super.onCreate(savedInstanceState); 2375ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni setContentView(R.layout.main); 2385ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2395ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni init(); 2405ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2415ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2425ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni @Override 2435ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni protected void onPause() { 2445ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni super.onPause(); 2455ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2465ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni cleanup(); 2475ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2485ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2495ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2505ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni @Override 2515ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni protected void onResume() { 2525ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni super.onResume(); 2535ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2545ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni if (null == mRS) { 2555ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni init(); 2565ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2575ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2585ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2595ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni // button hook 2605ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void benchmark(View v) { 2615ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni float t = getBenchmark(); 2625ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni //long javaTime = javaFilter(); 2635ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni //mBenchmarkResult.setText("RS: " + t + " ms Java: " + javaTime + " ms"); 2645ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mBenchmarkResult.setText("Result: " + t + " ms"); 2655ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t); 2665ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2675ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 2685ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public void benchmark_all(View v) { 2695ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni // write result into a file 2705ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni File externalStorage = Environment.getExternalStorageDirectory(); 2715ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni if (!externalStorage.canWrite()) { 2725ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni Log.v(TAG, "sdcard is not writable"); 2735ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni return; 2745ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2755ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni File resultFile = new File(externalStorage, RESULT_FILE); 2765ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni resultFile.setWritable(true, false); 2775ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni try { 2785ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile)); 2795ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath()); 2805ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni final int n = Filters.mFilterClasses.length; 2815ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni for (int i = 0; i < n; i++) { 2825ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni for (int j = 0; j < n; j++) { 2835ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni for (int k = 0; k < 2; k++) { 2845ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni changeTest(i, j, k); 2855ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni float t = getBenchmark(); 2865ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni String tn = getFilterName(i) + "-" + getFilterName(j); 2875ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni if (k == 0) { 2885ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni tn += " (emulated)"; 2895ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } else { 2905ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni tn += " (native)"; 2915ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2925ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni String s = new String("" + tn.toString() + ", " + t); 2935ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni rsWriter.write(s + "\n"); 2945ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni Log.v(TAG, "Test " + s + "ms\n"); 2955ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2965ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2975ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 2985ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni rsWriter.close(); 2995ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } catch (IOException e) { 3005ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni Log.v(TAG, "Unable to write result file " + e.getMessage()); 3015ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 3025ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni changeTest(0, 0, 0); 3035ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni Log.v(TAG, "result file:"+resultFile.getAbsolutePath()); 3045ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 3055ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 3065ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 3075ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 3085ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni // For benchmark test 3095ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni public float getBenchmark() { 3105ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni if (mRS == null) { 3115ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni return 0; 3125ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 3135ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mDoingBenchmark = true; 3145ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 3155ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest.setupBenchmark(); 3165ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni long result = 0; 3175ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 3185ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni //Log.v(TAG, "Warming"); 3195ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni long t = java.lang.System.currentTimeMillis() + 250; 3205ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni do { 3215ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest.runTest(); 3225ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest.finish(); 3235ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } while (t > java.lang.System.currentTimeMillis()); 3245ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 3255ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni //Log.v(TAG, "Benchmarking"); 3265ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni int ct = 0; 3275ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni t = java.lang.System.currentTimeMillis(); 3285ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni do { 3295ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest.runTest(); 3305ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest.finish(); 3315ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni ct++; 3325ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } while ((t+1000) > java.lang.System.currentTimeMillis()); 3335ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni t = java.lang.System.currentTimeMillis() - t; 3345ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni float ft = (float)t; 3355ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni ft /= ct; 3365ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 3375ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mTest.exitBenchmark(); 3385ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni mDoingBenchmark = false; 3395ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni 3405ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni return ft; 3415ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni } 3425ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni} 343