ImageProcessingActivityJB.java revision bde1a28e6652f25e4f74f018cb7d1dcba65a51e4
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;
20bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.content.Intent;
21572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Bundle;
22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Handler;
23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Message;
24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.BitmapFactory;
25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Bitmap;
26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Canvas;
27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.SurfaceView;
28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.AdapterView;
29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.ArrayAdapter;
30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.ImageView;
31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.SeekBar;
32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.Spinner;
33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.TextView;
34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.View;
35bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.view.TextureView;
36bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.view.Surface;
37bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.graphics.SurfaceTexture;
38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.Log;
39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.ScriptC;
40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.RenderScript;
41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Type;
42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Allocation;
43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Element;
44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Script;
45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Environment;
47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.io.BufferedWriter;
48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.io.File;
49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.io.FileWriter;
50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.io.IOException;
51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class ImageProcessingActivityJB extends Activity
53bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                                       implements SeekBar.OnSeekBarChangeListener,
54bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                                                  TextureView.SurfaceTextureListener {
55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private final String TAG = "Img";
56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public final String RESULT_FILE = "image_processing_result.csv";
57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
58572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Bitmap mBitmapIn;
59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Bitmap mBitmapIn2;
60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Spinner mSpinner;
62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar1;
63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar2;
64572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar3;
65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar4;
66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar5;
67572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText1;
68572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText2;
69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText3;
70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText4;
71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText5;
72bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private TextureView mDisplayView;
73bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
74bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private int mTestList[];
75bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private float mTestResults[];
76bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
77bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private boolean mToggleIO;
78bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private boolean mToggleDVFS;
79bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private boolean mToggleLong;
80bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private boolean mTogglePause;
81bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
82bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
83bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    /////////////////////////////////////////////////////////////////////////
84bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
85bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    class Processor extends Thread {
86bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        RenderScript mRS;
87bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        Allocation mInPixelsAllocation;
88bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        Allocation mInPixelsAllocation2;
89bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        Allocation mOutPixelsAllocation;
90bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
91bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private Surface mOutSurface;
92bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private float mLastResult;
93bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private boolean mRun = true;
94bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private int mOp = 0;
95bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private boolean mDoingBenchmark;
96bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private TestBase mTest;
97bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private TextureView mDisplayView;
98bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
99bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private boolean mBenchmarkMode;
100bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
101bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
102bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        Processor(RenderScript rs, TextureView v, boolean benchmarkMode) {
103bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mRS = rs;
104bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mDisplayView = v;
105bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mInPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapIn);
106bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mInPixelsAllocation2 = Allocation.createFromBitmap(mRS, mBitmapIn2);
107bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mOutPixelsAllocation = Allocation.createTyped(mRS, mInPixelsAllocation.getType(),
108bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                                                               Allocation.MipmapControl.MIPMAP_NONE,
109bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                                                               Allocation.USAGE_SCRIPT |
110bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                                                               Allocation.USAGE_IO_OUTPUT);
111bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mBenchmarkMode = benchmarkMode;
112bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            start();
113bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
115bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private float getBenchmark() {
116bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mDoingBenchmark = true;
117572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
118bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mTest.setupBenchmark();
119bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            long result = 0;
120bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            long runtime = 1000;
121bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            if (mToggleLong) {
122bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                runtime = 10000;
123bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
124572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
125bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            if (mToggleDVFS) {
126bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mDvfsWar.go();
127bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
128572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
129bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            Log.v("rs", "Warming");
130bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            long t = java.lang.System.currentTimeMillis() + 250;
131bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            do {
132bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mTest.runTest();
133bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mTest.finish();
134bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            } while (t > java.lang.System.currentTimeMillis());
135bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            //mHandler.sendMessage(Message.obtain());
136bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
137bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            Log.v("rs", "Benchmarking");
138bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            int ct = 0;
139bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            t = java.lang.System.currentTimeMillis();
140bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            do {
141bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mTest.runTest();
142bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mTest.finish();
143bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                ct++;
144bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            } while ((t + runtime) > java.lang.System.currentTimeMillis());
145bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            t = java.lang.System.currentTimeMillis() - t;
146bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            float ft = (float)t;
147bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            ft /= ct;
148bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
149bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mTest.exitBenchmark();
150bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mDoingBenchmark = false;
151bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
152bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            android.util.Log.v("rs", "bench " + ft);
153bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            return ft;
154bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
155572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
156bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private Handler mHandler = new Handler() {
157bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            // Allow the filter to complete without blocking the UI
158bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            // thread.  When the message arrives that the op is complete
159bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            // we will either mark completion or start a new filter if
160bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            // more work is ready.  Either way, display the result.
161bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            @Override
162bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            public void handleMessage(Message msg) {
163bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                synchronized(this) {
164bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    if (mRS == null || mOutPixelsAllocation == null) {
165bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        return;
166bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    }
167bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    mOutPixelsAllocation.ioSend();
168bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    mDisplayView.invalidate();
169bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    //mTest.runTestSendMessage();
170bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                }
171bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
172bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        };
173bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
174bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        public void run() {
175bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            Surface lastSurface = null;
176bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            while (mRun) {
177bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                synchronized(this) {
178bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    try {
179bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        this.wait();
180bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    } catch(InterruptedException e) {
181bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    }
182bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    if (!mRun) return;
183572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
184bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    if ((mOutSurface == null) || (mOutPixelsAllocation == null)) {
185bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        continue;
186bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    }
187bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
188bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    if (lastSurface != mOutSurface) {
189bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        mOutPixelsAllocation.setSurface(mOutSurface);
190bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        lastSurface = mOutSurface;
191bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    }
192bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                }
193bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
194bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                if (mBenchmarkMode) {
195bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    for (int ct=0; ct < mTestList.length; ct++) {
196bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        mRS.finish();
197bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
198bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        try {
199bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                            sleep(1000);
200bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        } catch(InterruptedException e) {
201bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        }
202bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
203bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        if (mTest != null) {
204bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                            mTest.destroy();
205bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        }
206bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
207bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        mTest = changeTest(mTestList[ct]);
208bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        if (mTogglePause) {
209bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                            try {
210bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                                sleep(10000);
211bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                            } catch(InterruptedException e) {
212bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                            }
213bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        }
214bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
215bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        mTestResults[ct] = getBenchmark();
216bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        mHandler.sendMessage(Message.obtain());
217bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    }
218bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    onBenchmarkFinish();
219bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                }
220bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
221bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
222bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
223572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
224bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        public void update() {
225572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            synchronized(this) {
226bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                if (mOp == 0) {
227bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    mOp = 2;
228bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                }
229bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                notifyAll();
230bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
231bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
232bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
233bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        public void setSurface(Surface s) {
234bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            synchronized(this) {
235bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mOutSurface = s;
236bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                notifyAll();
237bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
238bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            //update();
239bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
240bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
241bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        public void exit() {
242bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mRun = false;
243bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
244bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            synchronized(this) {
245bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                notifyAll();
246bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
247bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
248bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            try {
249bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                this.join();
250bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            } catch(InterruptedException e) {
251bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
252bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
253bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mInPixelsAllocation.destroy();
254bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mInPixelsAllocation2.destroy();
255bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mOutPixelsAllocation.destroy();
256bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mRS.destroy();
257bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
258bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mInPixelsAllocation = null;
259bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mInPixelsAllocation2 = null;
260bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mOutPixelsAllocation = null;
261bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mRS = null;
262bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
263bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
264bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
265bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    ///////////////////////////////////////////////////////////////////////////////////////
266bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
267bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    static class DVFSWorkaround {
268bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        static class spinner extends Thread {
269bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            boolean mRun = true;
270bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            long mNextSleep;
271bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
272bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            spinner() {
273bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                setPriority(MIN_PRIORITY);
274bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                start();
275bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
276bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
277bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            public void run() {
278bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                while (mRun) {
279bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    Thread.yield();
280bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    synchronized(this) {
281bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        long t = java.lang.System.currentTimeMillis();
282bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        if (t > mNextSleep) {
283bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                            try {
284bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                                this.wait();
285bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                            } catch(InterruptedException e) {
286bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                            }
287bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                        }
288572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    }
289572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
290572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
291bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
292bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            public void go(long t) {
293bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                synchronized(this) {
294bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    mNextSleep = t;
295bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    notifyAll();
296bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                }
297bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
298bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
299bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
300bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        spinner s1;
301bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        DVFSWorkaround() {
302bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            s1 = new spinner();
303bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
304bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
305bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        void go() {
306bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            long t = java.lang.System.currentTimeMillis() + 2000;
307bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            s1.go(t);
308bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
309bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
310bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        void destroy() {
311bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            synchronized(this) {
312bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                s1.mRun = false;
313bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                notifyAll();
314572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
315572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
316bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
317bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    DVFSWorkaround mDvfsWar = new DVFSWorkaround();
318bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
319bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    ///////////////////////////////////////////////////////////
320572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
321bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
322bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private boolean mDoingBenchmark;
323bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public Processor mProcessor;
324bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
325bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
326bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private Handler mHandler = new Handler() {
327bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        @Override
328bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        public void handleMessage(Message msg) {
329bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mDisplayView.invalidate();
330bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
331572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    };
332572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
333bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public void updateDisplay() {
334bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mHandler.sendMessage(Message.obtain());
335bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        //mProcessor.update();
336bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
337bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
338bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    TestBase changeTest(int id) {
339bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        IPTestListJB.TestName t = IPTestListJB.TestName.values()[id];
340bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        TestBase tb = IPTestListJB.newTest(t);
341bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        tb.createBaseTest(this);
342bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        //setupBars(tb);
343bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        return tb;
344bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
345bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
346572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
347572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (fromUser) {
348572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (seekBar == mBar1) {
349bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mProcessor.mTest.onBar1Changed(progress);
350572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar2) {
351bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mProcessor.mTest.onBar2Changed(progress);
352572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar3) {
353bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mProcessor.mTest.onBar3Changed(progress);
354572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar4) {
355bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mProcessor.mTest.onBar4Changed(progress);
356572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar5) {
357bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mProcessor.mTest.onBar5Changed(progress);
358572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
359bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mProcessor.update();
360572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
361572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
362572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
363572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStartTrackingTouch(SeekBar seekBar) {
364572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
365572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
366572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStopTrackingTouch(SeekBar seekBar) {
367572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
368572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
369bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    void setupBars(TestBase t) {
370572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSpinner.setVisibility(View.VISIBLE);
371bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        t.onSpinner1Setup(mSpinner);
372572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
373572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1.setVisibility(View.VISIBLE);
374572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText1.setVisibility(View.VISIBLE);
375bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        t.onBar1Setup(mBar1, mText1);
376572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
377572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2.setVisibility(View.VISIBLE);
378572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText2.setVisibility(View.VISIBLE);
379bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        t.onBar2Setup(mBar2, mText2);
380572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
381572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3.setVisibility(View.VISIBLE);
382572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText3.setVisibility(View.VISIBLE);
383bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        t.onBar3Setup(mBar3, mText3);
384572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
385572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4.setVisibility(View.VISIBLE);
386572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText4.setVisibility(View.VISIBLE);
387bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        t.onBar4Setup(mBar4, mText4);
388572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
389572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5.setVisibility(View.VISIBLE);
390572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText5.setVisibility(View.VISIBLE);
391bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        t.onBar5Setup(mBar5, mText5);
392572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
393572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
394572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
395bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    void cleanup() {
396bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        synchronized(this) {
397bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mProcessor.exit();
398572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
399572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
400bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mBitmapIn = null;
401bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mBitmapIn2 = null;
402572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
403572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
404572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
405572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onCreate(Bundle savedInstanceState) {
406572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.onCreate(savedInstanceState);
407572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setContentView(R.layout.main);
408572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
409572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapIn = loadBitmap(R.drawable.img1600x1067);
410572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapIn2 = loadBitmap(R.drawable.img1600x1067b);
411572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
412bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mDisplayView = (TextureView) findViewById(R.id.display);
413572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
414572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSpinner = (Spinner) findViewById(R.id.spinner1);
415572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
416572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1 = (SeekBar) findViewById(R.id.slider1);
417572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2 = (SeekBar) findViewById(R.id.slider2);
418572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3 = (SeekBar) findViewById(R.id.slider3);
419572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4 = (SeekBar) findViewById(R.id.slider4);
420572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5 = (SeekBar) findViewById(R.id.slider5);
421572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
422572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1.setOnSeekBarChangeListener(this);
423572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2.setOnSeekBarChangeListener(this);
424572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3.setOnSeekBarChangeListener(this);
425572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4.setOnSeekBarChangeListener(this);
426572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5.setOnSeekBarChangeListener(this);
427572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
428572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText1 = (TextView) findViewById(R.id.slider1Text);
429572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText2 = (TextView) findViewById(R.id.slider2Text);
430572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText3 = (TextView) findViewById(R.id.slider3Text);
431572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText4 = (TextView) findViewById(R.id.slider4Text);
432572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText5 = (TextView) findViewById(R.id.slider5Text);
433bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
434572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
435bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    @Override
436bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    protected void onPause() {
437bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        super.onPause();
438572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
439bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        cleanup();
440bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
441572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
442bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public void onBenchmarkFinish() {
443bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        Intent intent = new Intent();
444bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        intent.putExtra("tests", mTestList);
445bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        intent.putExtra("results", mTestResults);
446bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        setResult(RESULT_OK, intent);
447bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        finish();
448bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
449572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
450bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    @Override
451bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    protected void onResume() {
452bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        super.onResume();
453bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        Intent i = getIntent();
454bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mTestList = i.getIntArrayExtra("tests");
455572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
456bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mToggleIO = i.getBooleanExtra("enable io", true);
457bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mToggleDVFS = i.getBooleanExtra("enable dvfs", true);
458bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mToggleLong = i.getBooleanExtra("enable long", false);
459bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mTogglePause = i.getBooleanExtra("enable pause", false);
460572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
461bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mTestResults = new float[mTestList.length];
462bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
463bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mProcessor = new Processor(RenderScript.create(this), mDisplayView, true);
464bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mDisplayView.setSurfaceTextureListener(this);
465572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
466572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
467bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    protected void onDestroy() {
468bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        super.onDestroy();
469bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
470572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
471572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Bitmap loadBitmap(int resource) {
472572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        final BitmapFactory.Options options = new BitmapFactory.Options();
473572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
474572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return BitmapFactory.decodeResource(getResources(), resource, options);
475572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
476572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
477bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
478bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
479bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    @Override
480bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
481bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mProcessor.setSurface(new Surface(surface));
482572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
483572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
484bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    @Override
485bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
486bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mProcessor.setSurface(new Surface(surface));
487bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
488bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
489bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    @Override
490bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
491bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mProcessor.setSurface(null);
492bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        return true;
493572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
494572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
495bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    @Override
496bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
497572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
498572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
499