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.os.Handler; 24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Message; 25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.AdapterView; 26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.ArrayAdapter; 27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.SeekBar; 28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.Spinner; 29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.TextView; 30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.View; 31bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.view.TextureView; 32bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.view.Surface; 33bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.graphics.SurfaceTexture; 34d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Samsimport android.graphics.Point; 356b9cb41efc17c2731a2762c1ac6071ba5684af63Jason Samsimport android.view.WindowManager; 36d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.Log; 38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.ScriptC; 39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.RenderScript; 40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Type; 41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Allocation; 42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Element; 43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Script; 44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class ImageProcessingActivityJB extends Activity 47bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams implements SeekBar.OnSeekBarChangeListener, 48bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams TextureView.SurfaceTextureListener { 49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private final String TAG = "Img"; 50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private Spinner mSpinner; 52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private SeekBar mBar1; 53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private SeekBar mBar2; 54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private SeekBar mBar3; 55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private SeekBar mBar4; 56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private SeekBar mBar5; 57fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 58fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private int mBars[] = new int[5]; 59fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private int mBarsOld[] = new int[5]; 60fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private TextView mText1; 62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private TextView mText2; 63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private TextView mText3; 64572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private TextView mText4; 65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private TextView mText5; 66d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams private SizedTV mDisplayView; 67bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 68bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private int mTestList[]; 69bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private float mTestResults[]; 70bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 71bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mToggleIO; 72bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mToggleDVFS; 73bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mToggleLong; 74bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mTogglePause; 75fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private boolean mToggleAnimate; 76fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private boolean mToggleDisplay; 77dc08c6d13a68aa8fd35ce5922c1c98b915f35f08Jason Sams private int mBitmapWidth; 78dc08c6d13a68aa8fd35ce5922c1c98b915f35f08Jason Sams private int mBitmapHeight; 79fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private boolean mDemoMode; 80fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 81fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Updates pending is a counter of how many kernels have been 82fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // sent to RS for processing 83fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // 84fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // In benchmark this is incremented each time a kernel is launched and 85fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // decremented each time a kernel completes 86fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // 87fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // In demo mode, each UI input increments the counter and it is zeroed 88fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // when the latest settings are sent to RS for processing. 89fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private int mUpdatesPending; 90fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 91fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // In demo mode this is used to count updates in the pipeline. It's 92fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // incremented when work is submitted to RS and decremented when invalidate is 93fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // called to display a result. 94fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private int mShowsPending; 95fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 96bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 97d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams static public class SizedTV extends TextureView { 98d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int mWidth; 99d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int mHeight; 100d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 101d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams public SizedTV(android.content.Context c) { 102d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams super(c); 103d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mWidth = 800; 104d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mHeight = 450; 105d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 106d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 107d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams public SizedTV(android.content.Context c, android.util.AttributeSet attrs) { 108d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams super(c, attrs); 109d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mWidth = 800; 110d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mHeight = 450; 111d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 112d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 113d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams public SizedTV(android.content.Context c, android.util.AttributeSet attrs, int f) { 114d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams super(c, attrs, f); 115d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mWidth = 800; 116d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mHeight = 450; 117d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 118d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 119d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams protected void onMeasure(int w, int h) { 120d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams setMeasuredDimension(mWidth, mHeight); 121d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 122d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 123bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 124bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams ///////////////////////////////////////////////////////////////////////// 125bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 126fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Message processor to handle notifications for when kernel completes 127fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private class MessageProcessor extends RenderScript.RSMessageHandler { 128fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams MessageProcessor() { 129fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 130fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 131fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams public void run() { 132fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams synchronized(mProcessor) { 133fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // In demo mode, decrement the pending displays and notify the 134fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // UI processor it can now enqueue more work if additional updates 135fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // are blocked by a full pipeline. 136fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mShowsPending > 0) { 137fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mShowsPending --; 138fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mProcessor.notifyAll(); 139fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 140fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 141fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 142fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 143fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 144fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 145fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams ///////////////////////////////////////////////////////////////////////// 146fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Processor is a helper thread for running the work without 147fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // blocking the UI thread. 148bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams class Processor extends Thread { 149bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams RenderScript mRS; 150bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation mInPixelsAllocation; 151bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation mInPixelsAllocation2; 1527a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams Allocation mOutDisplayAllocation; 153bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation mOutPixelsAllocation; 154bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 155bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private Surface mOutSurface; 156bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private float mLastResult; 157bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mRun = true; 158bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mDoingBenchmark; 159bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private TestBase mTest; 160bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private TextureView mDisplayView; 161bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 162bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mBenchmarkMode; 163bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 164fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // We don't want to call the "changed" methods excessively as this 165fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // can cause extra work for drivers. Before running a test update 166fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // any bars which have changed. 167fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams void runTest() { 168fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mBars[0] != mBarsOld[0]) { 169fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.onBar1Changed(mBars[0]); 170fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBarsOld[0] = mBars[0]; 171fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 172fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mBars[1] != mBarsOld[1]) { 173fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.onBar2Changed(mBars[1]); 174fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBarsOld[1] = mBars[1]; 175fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 176fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mBars[2] != mBarsOld[2]) { 177fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.onBar3Changed(mBars[2]); 178fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBarsOld[2] = mBars[2]; 179fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 180fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mBars[3] != mBarsOld[3]) { 181fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.onBar4Changed(mBars[3]); 182fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBarsOld[3] = mBars[3]; 183fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 184fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mBars[4] != mBarsOld[4]) { 185fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.onBar5Changed(mBars[4]); 186fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBarsOld[4] = mBars[4]; 187fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 188fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.runTest(); 189fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 190fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 191bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Processor(RenderScript rs, TextureView v, boolean benchmarkMode) { 192bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mRS = rs; 193bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mDisplayView = v; 194dc08c6d13a68aa8fd35ce5922c1c98b915f35f08Jason Sams 195fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mRS.setMessageHandler(new MessageProcessor()); 196fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 197d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams switch(mBitmapWidth) { 198d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams case 3840: 199d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation = Allocation.createFromBitmapResource( 200d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img3840x2160a); 201d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation2 = Allocation.createFromBitmapResource( 202d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img3840x2160b); 203d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams break; 204d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams case 1920: 205d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation = Allocation.createFromBitmapResource( 206d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img1920x1080a); 207d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation2 = Allocation.createFromBitmapResource( 208d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img1920x1080b); 209d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams break; 210d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams case 1280: 211d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation = Allocation.createFromBitmapResource( 212d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img1280x720a); 213d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation2 = Allocation.createFromBitmapResource( 214d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img1280x720b); 215d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams break; 216d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams case 800: 217d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation = Allocation.createFromBitmapResource( 218d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img800x450a); 219d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mInPixelsAllocation2 = Allocation.createFromBitmapResource( 220d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mRS, getResources(), R.drawable.img800x450b); 221d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams break; 222d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 223dc08c6d13a68aa8fd35ce5922c1c98b915f35f08Jason Sams 224fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // We create the output allocation using USAGE_IO_OUTPUT so we can share the 225fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // bits with a TextureView. This is more efficient than using a bitmap. 2267a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutDisplayAllocation = Allocation.createTyped(mRS, mInPixelsAllocation.getType(), 227bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation.MipmapControl.MIPMAP_NONE, 228bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation.USAGE_SCRIPT | 229bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Allocation.USAGE_IO_OUTPUT); 2307a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutPixelsAllocation = mOutDisplayAllocation; 2317a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams 2327a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams if (!mToggleIO) { 2337a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams // Not using USAGE_IO for the script so create a non-io kernel to copy from 2347a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutPixelsAllocation = Allocation.createTyped(mRS, mInPixelsAllocation.getType(), 2357a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams Allocation.MipmapControl.MIPMAP_NONE, 2367a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams Allocation.USAGE_SCRIPT); 2377a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams } 2387a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams 239bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mBenchmarkMode = benchmarkMode; 240bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams start(); 241bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 242572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 243fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams class Result { 244fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams float totalTime; 245fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams int itterations; 246fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 247fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 248fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Run one loop of kernels for at least the specified minimum time. 249fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // The function returns the average time in ms for the test run 250fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams private Result runBenchmarkLoop(float minTime) { 251fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mUpdatesPending = 0; 252fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams Result r = new Result(); 253fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 254fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams long t = java.lang.System.currentTimeMillis(); 255fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams do { 256fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams synchronized(this) { 257fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Shows pending is used to track the number of kernels in the RS pipeline 258fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // We throttle it to 2. This provide some buffering to allow a kernel to be started 259fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // before we are nofitied the previous finished. However, larger numbers are uncommon 260fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // in interactive apps as they introduce 'lag' between user input and display. 261fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mShowsPending++; 262fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mShowsPending > 2) { 263fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams try { 264fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams this.wait(); 265fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } catch(InterruptedException e) { 266fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 267fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 268fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 269fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 270fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If animations are enabled update the test state. 271fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mToggleAnimate) { 272fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.animateBars(r.totalTime); 273fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 274fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 275fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Run the kernel 276fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.runTest(); 277fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams r.itterations ++; 278fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 279fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mToggleDisplay) { 280fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If we are not outputting directly to the TextureView we need to copy from 281fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // our temporary buffer. 282fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mOutDisplayAllocation != mOutPixelsAllocation) { 283fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mOutDisplayAllocation.copyFrom(mOutPixelsAllocation); 284fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 285fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 286fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // queue the update of the TextureView with the allocation contents 287fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mOutDisplayAllocation.ioSend(); 288fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 289fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 290fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Send our RS message handler a message so we know when this work has completed 291fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mRS.sendMessage(0, null); 292fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 293fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams long t2 = java.lang.System.currentTimeMillis(); 294fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams r.totalTime += (t2 - t) / 1000.f; 295fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams t = t2; 296fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } while (r.totalTime < minTime); 297fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 298fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Wait for any stray operations to complete and update the final time 299fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mRS.finish(); 300fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams long t2 = java.lang.System.currentTimeMillis(); 301fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams r.totalTime += (t2 - t) / 1000.f; 302fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams t = t2; 303fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams return r; 304fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 305fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 306fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 307fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Get a benchmark result for a specific test 308bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private float getBenchmark() { 309bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mDoingBenchmark = true; 310fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mUpdatesPending = 0; 311572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 312bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams long result = 0; 313fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams float runtime = 1.f; 314bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (mToggleLong) { 315fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams runtime = 10.f; 316bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 317572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 318bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (mToggleDVFS) { 319bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mDvfsWar.go(); 320bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 321572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 322fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // We run a short bit of work before starting the actual test 323fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // this is to let any power management do its job and respond 324fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams runBenchmarkLoop(0.3f); 325bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 326fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Run the actual benchmark 327fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams Result r = runBenchmarkLoop(runtime); 328bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 329fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams Log.v("rs", "Test: time=" + r.totalTime +"s, frames=" + r.itterations + 330fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams ", avg=" + r.totalTime / r.itterations * 1000.f); 331572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 332fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mDoingBenchmark = false; 333fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams return r.totalTime / r.itterations * 1000.f; 334fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 335bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 336bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void run() { 337bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Surface lastSurface = null; 338bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams while (mRun) { 339fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Our loop for launching tests or benchmarks 340bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams synchronized(this) { 341fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If we have no work to do, or we have displays pending, wait 342fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if ((mUpdatesPending == 0) || (mShowsPending != 0)) { 343fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams try { 344fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams this.wait(); 345fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } catch(InterruptedException e) { 346fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 347bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 348fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 349fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // We may have been asked to exit while waiting 350bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (!mRun) return; 351572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 352fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // During startup we may not have a surface yet to display, if 353fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // this is the case, wait. 354bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if ((mOutSurface == null) || (mOutPixelsAllocation == null)) { 355bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams continue; 356bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 357bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 358fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Our display surface changed, set it. 359bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (lastSurface != mOutSurface) { 3607a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutDisplayAllocation.setSurface(mOutSurface); 361bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams lastSurface = mOutSurface; 362bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 363bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 364bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 365bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (mBenchmarkMode) { 366fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Loop over the tests we want to benchmark 3671fbb61ece7de81cce9af6dae70642eea07565582Jason Sams for (int ct=0; (ct < mTestList.length) && mRun; ct++) { 368bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 369fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // For reproducibility we wait a short time for any sporadic work 370fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // created by the user touching the screen to launch the test to pass. 371fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Also allows for things to settle after the test changes. 372fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mRS.finish(); 373bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams try { 3741fbb61ece7de81cce9af6dae70642eea07565582Jason Sams sleep(250); 375bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } catch(InterruptedException e) { 376bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 377bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 378fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If we just ran a test, we destroy it here to relieve some memory pressure 379bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (mTest != null) { 380bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mTest.destroy(); 381bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 382bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 383fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Select the next test 384fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest = changeTest(mTestList[ct], false); 385fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 386fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If the user selected the "long pause" option, wait 387bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (mTogglePause) { 3881fbb61ece7de81cce9af6dae70642eea07565582Jason Sams for (int i=0; (i < 100) && mRun; i++) { 3891fbb61ece7de81cce9af6dae70642eea07565582Jason Sams try { 3901fbb61ece7de81cce9af6dae70642eea07565582Jason Sams sleep(100); 3911fbb61ece7de81cce9af6dae70642eea07565582Jason Sams } catch(InterruptedException e) { 3921fbb61ece7de81cce9af6dae70642eea07565582Jason Sams } 393bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 394bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 395bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 396fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Run the test 397bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mTestResults[ct] = getBenchmark(); 398bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 3991fbb61ece7de81cce9af6dae70642eea07565582Jason Sams onBenchmarkFinish(mRun); 400fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } else { 401fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams boolean update = false; 402fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams synchronized(this) { 403fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If we have updates to process and are not blocked by pending shows, 404fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // start the next kernel 405fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if ((mUpdatesPending > 0) && (mShowsPending == 0)) { 406fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mUpdatesPending = 0; 407fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams update = true; 408fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mShowsPending++; 409fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 410fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 411fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 412fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (update) { 413fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Run the kernel 414fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams runTest(); 415fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 416fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // If we are not outputting directly to the TextureView we need to copy from 417fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // our temporary buffer. 418fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mOutDisplayAllocation != mOutPixelsAllocation) { 419fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mOutDisplayAllocation.copyFrom(mOutPixelsAllocation); 420fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 421fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 422fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // queue the update of the TextureView with the allocation contents 423fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mOutDisplayAllocation.ioSend(); 424fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 425fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // Send our RS message handler a message so we know when this work has completed 426fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mRS.sendMessage(0, null); 427fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 428bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 429bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 430bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 431bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 432572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 433bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void update() { 434fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // something UI related has changed, enqueue an update if one is not 435fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams // already pending. Wake the worker if needed 436572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams synchronized(this) { 437fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mUpdatesPending < 2) { 438fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mUpdatesPending++; 439fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams notifyAll(); 440bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 441bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 442bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 443bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 444bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void setSurface(Surface s) { 445fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mOutSurface = s; 446fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams update(); 447bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 448bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 449bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void exit() { 450bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mRun = false; 451bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 452bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams synchronized(this) { 453bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams notifyAll(); 454bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 455bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 456bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams try { 457bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams this.join(); 458bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } catch(InterruptedException e) { 459bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 460bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 461bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mInPixelsAllocation.destroy(); 462bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mInPixelsAllocation2.destroy(); 4637a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams if (mOutPixelsAllocation != mOutDisplayAllocation) { 4647a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutPixelsAllocation.destroy(); 4657a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams } 466fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 467fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mTest != null) { 468fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest.destroy(); 469fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTest = null; 470fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 4717a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutDisplayAllocation.destroy(); 472bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mRS.destroy(); 473bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 474bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mInPixelsAllocation = null; 475bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mInPixelsAllocation2 = null; 476bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mOutPixelsAllocation = null; 4777a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams mOutDisplayAllocation = null; 478bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mRS = null; 479bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 480bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 481bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 482bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams /////////////////////////////////////////////////////////////////////////////////////// 483bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 484bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams static class DVFSWorkaround { 485bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams static class spinner extends Thread { 486bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams boolean mRun = true; 487bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams long mNextSleep; 488bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 489bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams spinner() { 490bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams setPriority(MIN_PRIORITY); 491bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams start(); 492bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 493bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 494bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void run() { 495bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams while (mRun) { 496bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams Thread.yield(); 497bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams synchronized(this) { 498bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams long t = java.lang.System.currentTimeMillis(); 499bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams if (t > mNextSleep) { 500bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams try { 501bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams this.wait(); 502bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } catch(InterruptedException e) { 503bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 504bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 505572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 506572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 507572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 508bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 509bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void go(long t) { 510bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams synchronized(this) { 511bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mNextSleep = t; 512bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams notifyAll(); 513bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 514bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 515bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 516bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 517bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams spinner s1; 518bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams DVFSWorkaround() { 519bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams s1 = new spinner(); 520bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 521bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 522bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams void go() { 523bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams long t = java.lang.System.currentTimeMillis() + 2000; 524bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams s1.go(t); 525bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 526bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 527bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams void destroy() { 528bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams synchronized(this) { 529bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams s1.mRun = false; 530bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams notifyAll(); 531572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 532572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 533bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 534bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams DVFSWorkaround mDvfsWar = new DVFSWorkaround(); 535bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 536bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams /////////////////////////////////////////////////////////// 537572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 538bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 539bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams private boolean mDoingBenchmark; 540bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public Processor mProcessor; 541bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 542fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams TestBase changeTest(IPTestListJB.TestName t, boolean setupUI) { 543fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams TestBase tb = IPTestListJB.newTest(t); 544bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 545fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams tb.createBaseTest(this); 546fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (setupUI) { 547fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams setupBars(tb); 548bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 549fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams return tb; 550bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 551bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 552fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams TestBase changeTest(int id, boolean setupUI) { 553bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams IPTestListJB.TestName t = IPTestListJB.TestName.values()[id]; 554fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams return changeTest(t, setupUI); 555bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 556bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 557572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 558572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if (fromUser) { 559572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if (seekBar == mBar1) { 560fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBars[0] = progress; 561572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } else if (seekBar == mBar2) { 562fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBars[1] = progress; 563572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } else if (seekBar == mBar3) { 564fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBars[2] = progress; 565572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } else if (seekBar == mBar4) { 566fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBars[3] = progress; 567572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } else if (seekBar == mBar5) { 568fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBars[4] = progress; 569572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 570bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mProcessor.update(); 571572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 572572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 573572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 574572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public void onStartTrackingTouch(SeekBar seekBar) { 575572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 576572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 577572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public void onStopTrackingTouch(SeekBar seekBar) { 578572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 579572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 580bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams void setupBars(TestBase t) { 581572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mSpinner.setVisibility(View.VISIBLE); 582bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onSpinner1Setup(mSpinner); 583572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 584572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar1.setVisibility(View.VISIBLE); 585572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText1.setVisibility(View.VISIBLE); 586bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onBar1Setup(mBar1, mText1); 587572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 588572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar2.setVisibility(View.VISIBLE); 589572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText2.setVisibility(View.VISIBLE); 590bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onBar2Setup(mBar2, mText2); 591572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 592572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar3.setVisibility(View.VISIBLE); 593572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText3.setVisibility(View.VISIBLE); 594bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onBar3Setup(mBar3, mText3); 595572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 596572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar4.setVisibility(View.VISIBLE); 597572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText4.setVisibility(View.VISIBLE); 598bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onBar4Setup(mBar4, mText4); 599572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 600572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar5.setVisibility(View.VISIBLE); 601572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText5.setVisibility(View.VISIBLE); 602bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams t.onBar5Setup(mBar5, mText5); 603572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 604572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 605d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams void hideBars() { 606d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mSpinner.setVisibility(View.INVISIBLE); 607d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 608d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mBar1.setVisibility(View.INVISIBLE); 609d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mText1.setVisibility(View.INVISIBLE); 610d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 611d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mBar2.setVisibility(View.INVISIBLE); 612d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mText2.setVisibility(View.INVISIBLE); 613d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 614d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mBar3.setVisibility(View.INVISIBLE); 615d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mText3.setVisibility(View.INVISIBLE); 616d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 617d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mBar4.setVisibility(View.INVISIBLE); 618d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mText4.setVisibility(View.INVISIBLE); 619d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 620d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mBar5.setVisibility(View.INVISIBLE); 621d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mText5.setVisibility(View.INVISIBLE); 622d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 623572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 624572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams @Override 625572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams protected void onCreate(Bundle savedInstanceState) { 626572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams super.onCreate(savedInstanceState); 627572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams setContentView(R.layout.main); 6286b9cb41efc17c2731a2762c1ac6071ba5684af63Jason Sams getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 629572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 630d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mDisplayView = (SizedTV) findViewById(R.id.display); 631572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 632572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mSpinner = (Spinner) findViewById(R.id.spinner1); 633572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 634572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar1 = (SeekBar) findViewById(R.id.slider1); 635572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar2 = (SeekBar) findViewById(R.id.slider2); 636572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar3 = (SeekBar) findViewById(R.id.slider3); 637572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar4 = (SeekBar) findViewById(R.id.slider4); 638572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar5 = (SeekBar) findViewById(R.id.slider5); 639572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 640572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar1.setOnSeekBarChangeListener(this); 641572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar2.setOnSeekBarChangeListener(this); 642572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar3.setOnSeekBarChangeListener(this); 643572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar4.setOnSeekBarChangeListener(this); 644572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mBar5.setOnSeekBarChangeListener(this); 645572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 646572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText1 = (TextView) findViewById(R.id.slider1Text); 647572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText2 = (TextView) findViewById(R.id.slider2Text); 648572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText3 = (TextView) findViewById(R.id.slider3Text); 649572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText4 = (TextView) findViewById(R.id.slider4Text); 650572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mText5 = (TextView) findViewById(R.id.slider5Text); 651bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 652572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 653bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams @Override 654bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams protected void onPause() { 655bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams super.onPause(); 6561fbb61ece7de81cce9af6dae70642eea07565582Jason Sams mProcessor.exit(); 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() { 673fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (!mDemoMode) { 674fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams hideBars(); 675fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 676d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 677d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams Point size = new Point(); 678d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams getWindowManager().getDefaultDisplay().getSize(size); 679d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 680d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int mScreenWidth = size.x; 681d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int mScreenHeight = size.y; 682d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 683d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int tw = mBitmapWidth; 684d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams int th = mBitmapHeight; 685d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 686d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams if (tw > mScreenWidth || th > mScreenHeight) { 687d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams float s1 = (float)tw / (float)mScreenWidth; 688d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams float s2 = (float)th / (float)mScreenHeight; 689d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 690d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams if (s1 > s2) { 691d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams tw /= s1; 692d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams th /= s1; 693d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } else { 694d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams tw /= s2; 695d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams th /= s2; 696d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 697d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams } 698d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 699d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams android.util.Log.v("rs", "TV sizes " + tw + ", " + th); 700d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams 701d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mDisplayView.mWidth = tw; 702d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams mDisplayView.mHeight = th; 703d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams //mDisplayView.setTransform(new android.graphics.Matrix()); 704dc08c6d13a68aa8fd35ce5922c1c98b915f35f08Jason Sams 705fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mProcessor = new Processor(RenderScript.create(this), mDisplayView, !mDemoMode); 706bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mDisplayView.setSurfaceTextureListener(this); 707fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 708fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams if (mDemoMode) { 709fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mProcessor.mTest = changeTest(mTestList[0], true); 710fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 711fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams } 712fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 713fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams @Override 714fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams protected void onResume() { 715fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams super.onResume(); 716fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams Intent i = getIntent(); 717fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTestList = i.getIntArrayExtra("tests"); 718fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 719fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mToggleIO = i.getBooleanExtra("enable io", false); 720fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mToggleDVFS = i.getBooleanExtra("enable dvfs", false); 721fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mToggleLong = i.getBooleanExtra("enable long", false); 722fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTogglePause = i.getBooleanExtra("enable pause", false); 723fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mToggleAnimate = i.getBooleanExtra("enable animate", false); 724fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mToggleDisplay = i.getBooleanExtra("enable display", false); 725fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBitmapWidth = i.getIntExtra("resolution X", 0); 726fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mBitmapHeight = i.getIntExtra("resolution Y", 0); 727fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mDemoMode = i.getBooleanExtra("demo", false); 728fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 729fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams mTestResults = new float[mTestList.length]; 730fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams 731fe801921741c8bbec2b28eb49690ff88d149f1b4Jason Sams startProcessor(); 732572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 733572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 734bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams protected void onDestroy() { 735bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams super.onDestroy(); 736bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 737572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 738bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 739bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams @Override 740bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 741bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mProcessor.setSurface(new Surface(surface)); 742572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 743572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 744bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams @Override 745bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 746bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mProcessor.setSurface(new Surface(surface)); 747bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams } 748bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams 749bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams @Override 750bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 751bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams mProcessor.setSurface(null); 752bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams return true; 753572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 754572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 755bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams @Override 756bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams public void onSurfaceTextureUpdated(SurfaceTexture surface) { 757572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 758572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 759