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