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