1572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* 2572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Copyright (C) 2012 The Android Open Source Project 3572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * 4572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * you may not use this file except in compliance with the License. 6572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * You may obtain a copy of the License at 7572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * 8572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * 10572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Unless required by applicable law or agreed to in writing, software 11572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * See the License for the specific language governing permissions and 14572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * limitations under the License. 15572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams */ 16572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 17572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspackage com.android.rs.imagejb; 18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 19572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.app.Activity; 20fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 21bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.content.Intent; 22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Bundle; 23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.SeekBar; 24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.Spinner; 25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.TextView; 26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.View; 27bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.view.TextureView; 28bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.view.Surface; 29bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.graphics.SurfaceTexture; 30d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Samsimport android.graphics.Point; 316b9cb41efc17c2731a2762c1ac6071ba5684af63Jason Samsimport android.view.WindowManager; 32d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.Log; 34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Allocation; 35f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wangimport android.renderscript.RenderScript; 364a40b82759be72849f83c103b77f20ea29e160e5Michael Butlerimport android.support.test.InstrumentationRegistry; 37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class ImageProcessingActivityJB extends Activity 39bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams implements SeekBar.OnSeekBarChangeListener, 40bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams TextureView.SurfaceTextureListener { 41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private final String TAG = "Img"; 42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private Spinner mSpinner; 44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private SeekBar mBar1; 45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private SeekBar mBar2; 46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private SeekBar mBar3; 47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private SeekBar mBar4; 48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private SeekBar mBar5; 49fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 50fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private int mBars[] = new int[5]; 51fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private int mBarsOld[] = new int[5]; 52fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private TextView mText1; 54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private TextView mText2; 55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private TextView mText3; 56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private TextView mText4; 57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private TextView mText5; 58d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams private SizedTV mDisplayView; 59bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 60bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private int mTestList[]; 61bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private float mTestResults[]; 62bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 63bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mToggleIO; 64bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mToggleDVFS; 65bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mToggleLong; 66bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mTogglePause; 67fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private boolean mToggleAnimate; 68fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private boolean mToggleDisplay; 69dc08c6d13a68aa8fd35ce5922c1c98b915f35f08Jason Sams private int mBitmapWidth; 70dc08c6d13a68aa8fd35ce5922c1c98b915f35f08Jason Sams private int mBitmapHeight; 71fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private boolean mDemoMode; 724a40b82759be72849f83c103b77f20ea29e160e5Michael Butler private float mMinTestRuntime; 734a40b82759be72849f83c103b77f20ea29e160e5Michael Butler private int mMinTestIterations; 74fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 75fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Updates pending is a counter of how many kernels have been 76fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // sent to RS for processing 77fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // 78fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // In benchmark this is incremented each time a kernel is launched and 79fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // decremented each time a kernel completes 80fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // 81fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // In demo mode, each UI input increments the counter and it is zeroed 82fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // when the latest settings are sent to RS for processing. 83fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private int mUpdatesPending; 84fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 85fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // In demo mode this is used to count updates in the pipeline. It's 86fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // incremented when work is submitted to RS and decremented when invalidate is 87fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // called to display a result. 88fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private int mShowsPending; 89fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 90f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang // Initialize the parameters for Instrumentation tests. 91f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang protected void prepareInstrumentationTest() { 92f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang mTestList = new int[1]; 93f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang mBitmapWidth = 1920; 94f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang mBitmapHeight = 1080; 95f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang mTestResults = new float[1]; 96f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang 97f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang startProcessor(); 98f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang } 99bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 100d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams static public class SizedTV extends TextureView { 101d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int mWidth; 102d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int mHeight; 103d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 104d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams public SizedTV(android.content.Context c) { 105d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams super(c); 106d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mWidth = 800; 107d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mHeight = 450; 108d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 109d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 110d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams public SizedTV(android.content.Context c, android.util.AttributeSet attrs) { 111d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams super(c, attrs); 112d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mWidth = 800; 113d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mHeight = 450; 114d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 115d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 116d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams public SizedTV(android.content.Context c, android.util.AttributeSet attrs, int f) { 117d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams super(c, attrs, f); 118d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mWidth = 800; 119d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mHeight = 450; 120d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 121d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 122d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams protected void onMeasure(int w, int h) { 123d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams setMeasuredDimension(mWidth, mHeight); 124d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 125d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 126bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 127bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams ///////////////////////////////////////////////////////////////////////// 128bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 129fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Message processor to handle notifications for when kernel completes 130fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private class MessageProcessor extends RenderScript.RSMessageHandler { 131fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams MessageProcessor() { 132fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 133fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 134fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams public void run() { 135fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams synchronized(mProcessor) { 136fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // In demo mode, decrement the pending displays and notify the 137fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // UI processor it can now enqueue more work if additional updates 138fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // are blocked by a full pipeline. 139fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mShowsPending > 0) { 140fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mShowsPending --; 141fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mProcessor.notifyAll(); 142fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 143fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 144fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 145fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 146fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 147fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 148fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams ///////////////////////////////////////////////////////////////////////// 149fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Processor is a helper thread for running the work without 150fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // blocking the UI thread. 151bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams class Processor extends Thread { 152bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams RenderScript mRS; 153bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation mInPixelsAllocation; 154bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation mInPixelsAllocation2; 1557a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams Allocation mOutDisplayAllocation; 156bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation mOutPixelsAllocation; 157bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 158bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private Surface mOutSurface; 159bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private float mLastResult; 160bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mRun = true; 161bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mDoingBenchmark; 162bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private TestBase mTest; 163bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private TextureView mDisplayView; 164bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 165bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mBenchmarkMode; 166bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 167fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // We don't want to call the "changed" methods excessively as this 168fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // can cause extra work for drivers. Before running a test update 169fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // any bars which have changed. 170fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams void runTest() { 171fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mBars[0] != mBarsOld[0]) { 172fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.onBar1Changed(mBars[0]); 173fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBarsOld[0] = mBars[0]; 174fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 175fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mBars[1] != mBarsOld[1]) { 176fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.onBar2Changed(mBars[1]); 177fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBarsOld[1] = mBars[1]; 178fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 179fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mBars[2] != mBarsOld[2]) { 180fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.onBar3Changed(mBars[2]); 181fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBarsOld[2] = mBars[2]; 182fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 183fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mBars[3] != mBarsOld[3]) { 184fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.onBar4Changed(mBars[3]); 185fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBarsOld[3] = mBars[3]; 186fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 187fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mBars[4] != mBarsOld[4]) { 188fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.onBar5Changed(mBars[4]); 189fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBarsOld[4] = mBars[4]; 190fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 191fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.runTest(); 192fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 193fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 194bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Processor(RenderScript rs, TextureView v, boolean benchmarkMode) { 195bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mRS = rs; 196bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mDisplayView = v; 197dc08c6d13a68aa8fd35ce5922c1c98b915f35f08Jason Sams 198fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mRS.setMessageHandler(new MessageProcessor()); 199fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 200d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams switch(mBitmapWidth) { 201d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams case 3840: 202d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation = Allocation.createFromBitmapResource( 203d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img3840x2160a); 204d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation2 = Allocation.createFromBitmapResource( 205d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img3840x2160b); 206d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams break; 207d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams case 1920: 208d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation = Allocation.createFromBitmapResource( 209d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img1920x1080a); 210d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation2 = Allocation.createFromBitmapResource( 211d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img1920x1080b); 212d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams break; 213d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams case 1280: 214d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation = Allocation.createFromBitmapResource( 215d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img1280x720a); 216d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation2 = Allocation.createFromBitmapResource( 217d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img1280x720b); 218d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams break; 219d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams case 800: 220d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation = Allocation.createFromBitmapResource( 221d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img800x450a); 222d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation2 = Allocation.createFromBitmapResource( 223d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img800x450b); 224d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams break; 225d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 226dc08c6d13a68aa8fd35ce5922c1c98b915f35f08Jason Sams 227fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // We create the output allocation using USAGE_IO_OUTPUT so we can share the 228fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // bits with a TextureView. This is more efficient than using a bitmap. 2297a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutDisplayAllocation = Allocation.createTyped(mRS, mInPixelsAllocation.getType(), 230bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation.MipmapControl.MIPMAP_NONE, 231bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation.USAGE_SCRIPT | 232bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation.USAGE_IO_OUTPUT); 2337a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutPixelsAllocation = mOutDisplayAllocation; 2347a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams 2357a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams if (!mToggleIO) { 2367a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams // Not using USAGE_IO for the script so create a non-io kernel to copy from 2377a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutPixelsAllocation = Allocation.createTyped(mRS, mInPixelsAllocation.getType(), 2387a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams Allocation.MipmapControl.MIPMAP_NONE, 2397a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams Allocation.USAGE_SCRIPT); 2407a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams } 2417a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams 242bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mBenchmarkMode = benchmarkMode; 243bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams start(); 244bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 245572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 246fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Run one loop of kernels for at least the specified minimum time. 247fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // The function returns the average time in ms for the test run 2484a40b82759be72849f83c103b77f20ea29e160e5Michael Butler private Result runBenchmarkLoop(float minTime, int minIter) { 249fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mUpdatesPending = 0; 250fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams Result r = new Result(); 251fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 2524a40b82759be72849f83c103b77f20ea29e160e5Michael Butler long t = java.lang.System.nanoTime(); 253fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams do { 254fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams synchronized(this) { 255fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Shows pending is used to track the number of kernels in the RS pipeline 256fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // We throttle it to 2. This provide some buffering to allow a kernel to be started 257fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // before we are nofitied the previous finished. However, larger numbers are uncommon 258fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // in interactive apps as they introduce 'lag' between user input and display. 259fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mShowsPending++; 260fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mShowsPending > 2) { 261fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams try { 262fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams this.wait(); 263fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } catch(InterruptedException e) { 264fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 265fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 266fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 267fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 268fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If animations are enabled update the test state. 269fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mToggleAnimate) { 2704a40b82759be72849f83c103b77f20ea29e160e5Michael Butler mTest.animateBars(r.getTotalTime()); 271fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 272fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 273fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Run the kernel 274fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.runTest(); 275fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 276fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mToggleDisplay) { 277fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If we are not outputting directly to the TextureView we need to copy from 278fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // our temporary buffer. 279fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mOutDisplayAllocation != mOutPixelsAllocation) { 280fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mOutDisplayAllocation.copyFrom(mOutPixelsAllocation); 281fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 282fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 283fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // queue the update of the TextureView with the allocation contents 284fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mOutDisplayAllocation.ioSend(); 285fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 286fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 287fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Send our RS message handler a message so we know when this work has completed 288fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mRS.sendMessage(0, null); 289fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 2904a40b82759be72849f83c103b77f20ea29e160e5Michael Butler // Finish previous iteration before recording the time. Without this, the first 2914a40b82759be72849f83c103b77f20ea29e160e5Michael Butler // few iterations finish very quickly and the later iterations take much longer 2924a40b82759be72849f83c103b77f20ea29e160e5Michael Butler mRS.finish(); 2934a40b82759be72849f83c103b77f20ea29e160e5Michael Butler 2944a40b82759be72849f83c103b77f20ea29e160e5Michael Butler long t2 = java.lang.System.nanoTime(); 2954a40b82759be72849f83c103b77f20ea29e160e5Michael Butler r.add((t2 - t) / 1000000000.f); 296fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams t = t2; 2974a40b82759be72849f83c103b77f20ea29e160e5Michael Butler } while (r.getTotalTime() < minTime || r.getIterations() < minIter); 298fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 299fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Wait for any stray operations to complete and update the final time 300fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mRS.finish(); 301fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams return r; 302fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 303fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 304f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang // Method to retreive benchmark results for instrumentation tests. 3054a40b82759be72849f83c103b77f20ea29e160e5Michael Butler Result getInstrumentationResult(IPTestListJB.TestName t) { 306f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang mTest = changeTest(t, false); 307f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang return getBenchmark(); 308f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang } 309fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 310fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Get a benchmark result for a specific test 3114a40b82759be72849f83c103b77f20ea29e160e5Michael Butler private Result getBenchmark() { 312bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mDoingBenchmark = true; 313fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mUpdatesPending = 0; 314572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 315bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (mToggleDVFS) { 316bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mDvfsWar.go(); 317bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 318572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 319fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // We run a short bit of work before starting the actual test 320fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // this is to let any power management do its job and respond 3214a40b82759be72849f83c103b77f20ea29e160e5Michael Butler runBenchmarkLoop(0.3f, 0); 322bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 323fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Run the actual benchmark 3244a40b82759be72849f83c103b77f20ea29e160e5Michael Butler Result r = runBenchmarkLoop(mMinTestRuntime, mMinTestIterations); 325bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 3264a40b82759be72849f83c103b77f20ea29e160e5Michael Butler Log.v("rs", "Test: time=" + r.getTotalTime() + "s, frames=" + r.getIterations() + 3274a40b82759be72849f83c103b77f20ea29e160e5Michael Butler ", avg=" + r.getAvg() * 1000.f + ", stdcoef=" + r.getStdCoef() * 100.0f + "%"); 328572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 329fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mDoingBenchmark = false; 3304a40b82759be72849f83c103b77f20ea29e160e5Michael Butler return r; 331fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 332bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 333bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void run() { 334bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Surface lastSurface = null; 335bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams while (mRun) { 336fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Our loop for launching tests or benchmarks 337bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams synchronized(this) { 338fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If we have no work to do, or we have displays pending, wait 339fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if ((mUpdatesPending == 0) || (mShowsPending != 0)) { 340fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams try { 341fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams this.wait(); 342fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } catch(InterruptedException e) { 343fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 344bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 345fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 346fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // We may have been asked to exit while waiting 347bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (!mRun) return; 348572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 349fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // During startup we may not have a surface yet to display, if 350fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // this is the case, wait. 351bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if ((mOutSurface == null) || (mOutPixelsAllocation == null)) { 352bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams continue; 353bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 354bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 355fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Our display surface changed, set it. 356bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (lastSurface != mOutSurface) { 3577a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutDisplayAllocation.setSurface(mOutSurface); 358bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams lastSurface = mOutSurface; 359bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 360bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 361bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 362bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (mBenchmarkMode) { 363fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Loop over the tests we want to benchmark 3641fbb61ece7de81cce9af6dae70642eea07565582Jason Sams for (int ct=0; (ct < mTestList.length) && mRun; ct++) { 365bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 366fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // For reproducibility we wait a short time for any sporadic work 367fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // created by the user touching the screen to launch the test to pass. 368fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Also allows for things to settle after the test changes. 369fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mRS.finish(); 370bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams try { 3711fbb61ece7de81cce9af6dae70642eea07565582Jason Sams sleep(250); 372bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } catch(InterruptedException e) { 373bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 374bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 375fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If we just ran a test, we destroy it here to relieve some memory pressure 376bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (mTest != null) { 377bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mTest.destroy(); 378bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 379bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 380fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Select the next test 381fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest = changeTest(mTestList[ct], false); 382fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 383fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If the user selected the "long pause" option, wait 384bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (mTogglePause) { 3851fbb61ece7de81cce9af6dae70642eea07565582Jason Sams for (int i=0; (i < 100) && mRun; i++) { 3861fbb61ece7de81cce9af6dae70642eea07565582Jason Sams try { 3871fbb61ece7de81cce9af6dae70642eea07565582Jason Sams sleep(100); 3881fbb61ece7de81cce9af6dae70642eea07565582Jason Sams } catch(InterruptedException e) { 3891fbb61ece7de81cce9af6dae70642eea07565582Jason Sams } 390bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 391bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 392bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 393fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Run the test 3944a40b82759be72849f83c103b77f20ea29e160e5Michael Butler mTestResults[ct] = getBenchmark().getAvg() * 1000.0f; 395bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 3961fbb61ece7de81cce9af6dae70642eea07565582Jason Sams onBenchmarkFinish(mRun); 397fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } else { 398fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams boolean update = false; 399fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams synchronized(this) { 400fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If we have updates to process and are not blocked by pending shows, 401fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // start the next kernel 402fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if ((mUpdatesPending > 0) && (mShowsPending == 0)) { 403fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mUpdatesPending = 0; 404fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams update = true; 405fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mShowsPending++; 406fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 407fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 408fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 409fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (update) { 410fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Run the kernel 411fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams runTest(); 412fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 413fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If we are not outputting directly to the TextureView we need to copy from 414fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // our temporary buffer. 415fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mOutDisplayAllocation != mOutPixelsAllocation) { 416fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mOutDisplayAllocation.copyFrom(mOutPixelsAllocation); 417fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 418fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 419fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // queue the update of the TextureView with the allocation contents 420fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mOutDisplayAllocation.ioSend(); 421fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 422fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Send our RS message handler a message so we know when this work has completed 423fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mRS.sendMessage(0, null); 424fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 425bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 426bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 427bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 428bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 429572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 430bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void update() { 431fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // something UI related has changed, enqueue an update if one is not 432fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // already pending. Wake the worker if needed 433572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams synchronized(this) { 434fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mUpdatesPending < 2) { 435fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mUpdatesPending++; 436fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams notifyAll(); 437bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 438bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 439bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 440bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 441bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void setSurface(Surface s) { 442fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mOutSurface = s; 443fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams update(); 444bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 445bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 446bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void exit() { 447bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mRun = false; 448bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 449bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams synchronized(this) { 450bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams notifyAll(); 451bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 452bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 453bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams try { 454bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams this.join(); 455bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } catch(InterruptedException e) { 456bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 457bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 458bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mInPixelsAllocation.destroy(); 459bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mInPixelsAllocation2.destroy(); 4607a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams if (mOutPixelsAllocation != mOutDisplayAllocation) { 4617a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutPixelsAllocation.destroy(); 4627a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams } 463fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 464fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mTest != null) { 465fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.destroy(); 466fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest = null; 467fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 4687a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutDisplayAllocation.destroy(); 469bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mRS.destroy(); 470bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 471bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mInPixelsAllocation = null; 472bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mInPixelsAllocation2 = null; 473bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mOutPixelsAllocation = null; 4747a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutDisplayAllocation = null; 475bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mRS = null; 476bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 477bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 478bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 479bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams /////////////////////////////////////////////////////////////////////////////////////// 480bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 481bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams static class DVFSWorkaround { 482bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams static class spinner extends Thread { 483bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams boolean mRun = true; 484bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams long mNextSleep; 485bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 486bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams spinner() { 487bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams setPriority(MIN_PRIORITY); 488bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams start(); 489bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 490bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 491bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void run() { 492bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams while (mRun) { 493bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Thread.yield(); 494bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams synchronized(this) { 495bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams long t = java.lang.System.currentTimeMillis(); 496bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (t > mNextSleep) { 497bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams try { 498bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams this.wait(); 499bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } catch(InterruptedException e) { 500bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 501bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 502572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 503572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 504572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 505bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 506bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void go(long t) { 507bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams synchronized(this) { 508bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mNextSleep = t; 509bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams notifyAll(); 510bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 511bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 512bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 513bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 514bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams spinner s1; 515bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams DVFSWorkaround() { 516bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams s1 = new spinner(); 517bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 518bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 519bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams void go() { 520bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams long t = java.lang.System.currentTimeMillis() + 2000; 521bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams s1.go(t); 522bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 523bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 524bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams void destroy() { 525bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams synchronized(this) { 526bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams s1.mRun = false; 527bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams notifyAll(); 528572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 529572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 530bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 531bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams DVFSWorkaround mDvfsWar = new DVFSWorkaround(); 532bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 533bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams /////////////////////////////////////////////////////////// 534572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 535bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 536bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mDoingBenchmark; 537bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public Processor mProcessor; 538bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 539fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams TestBase changeTest(IPTestListJB.TestName t, boolean setupUI) { 540fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams TestBase tb = IPTestListJB.newTest(t); 541bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 542fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams tb.createBaseTest(this); 543fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (setupUI) { 544fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams setupBars(tb); 545bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 546fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams return tb; 547bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 548bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 549fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams TestBase changeTest(int id, boolean setupUI) { 550bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams IPTestListJB.TestName t = IPTestListJB.TestName.values()[id]; 551fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams return changeTest(t, setupUI); 552bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 553bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 554572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 555572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if (fromUser) { 556572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if (seekBar == mBar1) { 557fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBars[0] = progress; 558572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } else if (seekBar == mBar2) { 559fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBars[1] = progress; 560572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } else if (seekBar == mBar3) { 561fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBars[2] = progress; 562572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } else if (seekBar == mBar4) { 563fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBars[3] = progress; 564572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } else if (seekBar == mBar5) { 565fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBars[4] = progress; 566572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 567bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mProcessor.update(); 568572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 569572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 570572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 571572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public void onStartTrackingTouch(SeekBar seekBar) { 572572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 573572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 574572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public void onStopTrackingTouch(SeekBar seekBar) { 575572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 576572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 577bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams void setupBars(TestBase t) { 578572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mSpinner.setVisibility(View.VISIBLE); 579bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onSpinner1Setup(mSpinner); 580572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 581572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar1.setVisibility(View.VISIBLE); 582572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText1.setVisibility(View.VISIBLE); 583bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onBar1Setup(mBar1, mText1); 584572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 585572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar2.setVisibility(View.VISIBLE); 586572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText2.setVisibility(View.VISIBLE); 587bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onBar2Setup(mBar2, mText2); 588572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 589572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar3.setVisibility(View.VISIBLE); 590572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText3.setVisibility(View.VISIBLE); 591bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onBar3Setup(mBar3, mText3); 592572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 593572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar4.setVisibility(View.VISIBLE); 594572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText4.setVisibility(View.VISIBLE); 595bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onBar4Setup(mBar4, mText4); 596572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 597572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar5.setVisibility(View.VISIBLE); 598572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText5.setVisibility(View.VISIBLE); 599bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onBar5Setup(mBar5, mText5); 600572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 601572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 602d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams void hideBars() { 603d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mSpinner.setVisibility(View.INVISIBLE); 604d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 605d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mBar1.setVisibility(View.INVISIBLE); 606d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mText1.setVisibility(View.INVISIBLE); 607d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 608d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mBar2.setVisibility(View.INVISIBLE); 609d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mText2.setVisibility(View.INVISIBLE); 610d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 611d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mBar3.setVisibility(View.INVISIBLE); 612d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mText3.setVisibility(View.INVISIBLE); 613d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 614d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mBar4.setVisibility(View.INVISIBLE); 615d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mText4.setVisibility(View.INVISIBLE); 616d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 617d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mBar5.setVisibility(View.INVISIBLE); 618d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mText5.setVisibility(View.INVISIBLE); 619d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 620572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 621572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams @Override 622572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams protected void onCreate(Bundle savedInstanceState) { 623572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams super.onCreate(savedInstanceState); 624572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams setContentView(R.layout.main); 6256b9cb41efc17c2731a2762c1ac6071ba5684af63Jason Sams getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 626572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 6278467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mDisplayView = findViewById(R.id.display); 628572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 6298467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mSpinner = findViewById(R.id.spinner1); 630572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 6318467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mBar1 = findViewById(R.id.slider1); 6328467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mBar2 = findViewById(R.id.slider2); 6338467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mBar3 = findViewById(R.id.slider3); 6348467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mBar4 = findViewById(R.id.slider4); 6358467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mBar5 = findViewById(R.id.slider5); 636572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 637572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar1.setOnSeekBarChangeListener(this); 638572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar2.setOnSeekBarChangeListener(this); 639572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar3.setOnSeekBarChangeListener(this); 640572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar4.setOnSeekBarChangeListener(this); 641572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar5.setOnSeekBarChangeListener(this); 642572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 6438467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mText1 = findViewById(R.id.slider1Text); 6448467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mText2 = findViewById(R.id.slider2Text); 6458467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mText3 = findViewById(R.id.slider3Text); 6468467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mText4 = findViewById(R.id.slider4Text); 6478467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette mText5 = findViewById(R.id.slider5Text); 648bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 649572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 650bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams @Override 651bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams protected void onPause() { 652bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams super.onPause(); 653f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang if (mProcessor != null) { 654f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang mProcessor.exit(); 6554a40b82759be72849f83c103b77f20ea29e160e5Michael Butler mProcessor = null; 656f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang } 657bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 658572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 6591fbb61ece7de81cce9af6dae70642eea07565582Jason Sams public void onBenchmarkFinish(boolean ok) { 6601fbb61ece7de81cce9af6dae70642eea07565582Jason Sams if (ok) { 6611fbb61ece7de81cce9af6dae70642eea07565582Jason Sams Intent intent = new Intent(); 6621fbb61ece7de81cce9af6dae70642eea07565582Jason Sams intent.putExtra("tests", mTestList); 6631fbb61ece7de81cce9af6dae70642eea07565582Jason Sams intent.putExtra("results", mTestResults); 6641fbb61ece7de81cce9af6dae70642eea07565582Jason Sams setResult(RESULT_OK, intent); 6651fbb61ece7de81cce9af6dae70642eea07565582Jason Sams } else { 6661fbb61ece7de81cce9af6dae70642eea07565582Jason Sams setResult(RESULT_CANCELED); 6671fbb61ece7de81cce9af6dae70642eea07565582Jason Sams } 668bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams finish(); 669bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 670572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 671bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 672fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams void startProcessor() { 673d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams Point size = new Point(); 674d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams getWindowManager().getDefaultDisplay().getSize(size); 675d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 676d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int mScreenWidth = size.x; 677d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int mScreenHeight = size.y; 678d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 679d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int tw = mBitmapWidth; 680d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int th = mBitmapHeight; 681d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 682d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams if (tw > mScreenWidth || th > mScreenHeight) { 683d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams float s1 = (float)tw / (float)mScreenWidth; 684d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams float s2 = (float)th / (float)mScreenHeight; 685d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 686d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams if (s1 > s2) { 687d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams tw /= s1; 688d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams th /= s1; 689d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } else { 690d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams tw /= s2; 691d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams th /= s2; 692d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 693d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 694d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 695d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams android.util.Log.v("rs", "TV sizes " + tw + ", " + th); 696d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 697d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mDisplayView.mWidth = tw; 698d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mDisplayView.mHeight = th; 699d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams //mDisplayView.setTransform(new android.graphics.Matrix()); 700dc08c6d13a68aa8fd35ce5922c1c98b915f35f08Jason Sams 701fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mProcessor = new Processor(RenderScript.create(this), mDisplayView, !mDemoMode); 702bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mDisplayView.setSurfaceTextureListener(this); 703fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 704fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mDemoMode) { 705fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mProcessor.mTest = changeTest(mTestList[0], true); 706fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 707fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 708fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 709fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams @Override 710fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams protected void onResume() { 711fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams super.onResume(); 712fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams Intent i = getIntent(); 713fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTestList = i.getIntArrayExtra("tests"); 714fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 715fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mToggleIO = i.getBooleanExtra("enable io", false); 716fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mToggleDVFS = i.getBooleanExtra("enable dvfs", false); 717fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mToggleLong = i.getBooleanExtra("enable long", false); 718fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTogglePause = i.getBooleanExtra("enable pause", false); 719fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mToggleAnimate = i.getBooleanExtra("enable animate", false); 720fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mToggleDisplay = i.getBooleanExtra("enable display", false); 721fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBitmapWidth = i.getIntExtra("resolution X", 0); 722fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBitmapHeight = i.getIntExtra("resolution Y", 0); 723fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mDemoMode = i.getBooleanExtra("demo", false); 724fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 7254a40b82759be72849f83c103b77f20ea29e160e5Michael Butler // Default values 7264a40b82759be72849f83c103b77f20ea29e160e5Michael Butler mMinTestRuntime = 1.0f; 7274a40b82759be72849f83c103b77f20ea29e160e5Michael Butler mMinTestIterations = 2; 7284a40b82759be72849f83c103b77f20ea29e160e5Michael Butler 7294a40b82759be72849f83c103b77f20ea29e160e5Michael Butler // Pass in arguments from "am instrumentation ..." if present 7304a40b82759be72849f83c103b77f20ea29e160e5Michael Butler // This is wrapped in a try..catch because there was an exception thrown whenever 7314a40b82759be72849f83c103b77f20ea29e160e5Michael Butler // instrumentation was not used (ie. when the graphical interface was used) 7324a40b82759be72849f83c103b77f20ea29e160e5Michael Butler try { 7334a40b82759be72849f83c103b77f20ea29e160e5Michael Butler Bundle extras = InstrumentationRegistry.getArguments(); 7344a40b82759be72849f83c103b77f20ea29e160e5Michael Butler String passedInString = null; 7354a40b82759be72849f83c103b77f20ea29e160e5Michael Butler if ( extras != null ) { 7364a40b82759be72849f83c103b77f20ea29e160e5Michael Butler if ( extras.containsKey ("minimum_test_runtime") ) { 7374a40b82759be72849f83c103b77f20ea29e160e5Michael Butler mMinTestRuntime = Float.parseFloat(extras.getString("minimum_test_runtime")); 7384a40b82759be72849f83c103b77f20ea29e160e5Michael Butler } 7394a40b82759be72849f83c103b77f20ea29e160e5Michael Butler if ( extras.containsKey ("minimum_test_iterations") ) { 7404a40b82759be72849f83c103b77f20ea29e160e5Michael Butler mMinTestIterations = Integer.parseInt( 7414a40b82759be72849f83c103b77f20ea29e160e5Michael Butler extras.getString("minimum_test_iterations")); 7424a40b82759be72849f83c103b77f20ea29e160e5Michael Butler } 7434a40b82759be72849f83c103b77f20ea29e160e5Michael Butler } 7444a40b82759be72849f83c103b77f20ea29e160e5Michael Butler } catch(Exception e) { 7454a40b82759be72849f83c103b77f20ea29e160e5Michael Butler } 7464a40b82759be72849f83c103b77f20ea29e160e5Michael Butler 7474a40b82759be72849f83c103b77f20ea29e160e5Michael Butler // User chose the longer pre-set runtime 7484a40b82759be72849f83c103b77f20ea29e160e5Michael Butler if (mToggleLong) { 7494a40b82759be72849f83c103b77f20ea29e160e5Michael Butler mMinTestRuntime = 10.f; 7504a40b82759be72849f83c103b77f20ea29e160e5Michael Butler } 7514a40b82759be72849f83c103b77f20ea29e160e5Michael Butler 752f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang // Hide the bars in demo mode. 753f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang // Calling from onResume() to make sure the operation is on the UI thread. 754f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang if (!mDemoMode) { 755f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang hideBars(); 756f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang } 757f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang // Start the processor only when a non-empty list received from the intent. 758f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang if (mTestList != null) { 759f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang mTestResults = new float[mTestList.length]; 760f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang startProcessor(); 761f428c33c37dcbaf8a08aef1b579cb8f319f85f8bMiao Wang } 762572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 763572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 764bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams protected void onDestroy() { 765bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams super.onDestroy(); 766bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 767572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 768bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 769bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams @Override 770bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 771bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mProcessor.setSurface(new Surface(surface)); 772572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 773572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 774bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams @Override 775bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 776bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mProcessor.setSurface(new Surface(surface)); 777bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 778bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 779bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams @Override 780bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 7814a40b82759be72849f83c103b77f20ea29e160e5Michael Butler if (mProcessor != null) { 7824a40b82759be72849f83c103b77f20ea29e160e5Michael Butler mProcessor.setSurface(null); 7834a40b82759be72849f83c103b77f20ea29e160e5Michael Butler } 784bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams return true; 785572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 786572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 787bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams @Override 788bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void onSurfaceTextureUpdated(SurfaceTexture surface) { 789572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 790572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 791