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.image;
18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
19572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.app.Activity;
20572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Bundle;
21572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Handler;
22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Message;
23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.BitmapFactory;
24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Bitmap;
25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Canvas;
26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.SurfaceView;
27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.AdapterView;
28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.ArrayAdapter;
29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.ImageView;
30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.SeekBar;
31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.Spinner;
32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.TextView;
33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.View;
34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.Log;
35572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.ScriptC;
36572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.RenderScript;
37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Type;
38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Allocation;
39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Element;
40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Script;
41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Environment;
43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.io.BufferedWriter;
44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.io.File;
45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.io.FileWriter;
46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.io.IOException;
47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class ImageProcessingActivity extends Activity
49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                       implements SeekBar.OnSeekBarChangeListener {
50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private final String TAG = "Img";
51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public final String RESULT_FILE = "image_processing_result.csv";
52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    RenderScript mRS;
54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Allocation mInPixelsAllocation;
55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Allocation mInPixelsAllocation2;
56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Allocation mOutPixelsAllocation;
57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
5826bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams    static class DVFSWorkaround {
5926bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams        static class spinner extends Thread {
6026bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            boolean mRun = true;
6126bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            long mNextSleep;
6226bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams
6326bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            spinner() {
6426bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                setPriority(MIN_PRIORITY);
6526bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                start();
6626bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            }
6726bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams
6826bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            public void run() {
6926bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                while (mRun) {
7026bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                    Thread.yield();
7126bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                    synchronized(this) {
7226bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                        long t = java.lang.System.currentTimeMillis();
7326bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                        if (t > mNextSleep) {
7426bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                            try {
7526bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                                this.wait();
7626bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                            } catch(InterruptedException e) {
7726bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                            }
7826bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                        }
7926bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                    }
8026bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                }
8126bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            }
8226bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams
8326bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            public void go(long t) {
8426bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                synchronized(this) {
8526bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                    mNextSleep = t;
8626bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                    notifyAll();
8726bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                }
8826bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            }
8926bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams        }
9026bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams
9126bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams        spinner s1;
9226bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams        DVFSWorkaround() {
9326bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            s1 = new spinner();
9426bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams        }
9526bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams
9626bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams        void go() {
9726bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            long t = java.lang.System.currentTimeMillis() + 2000;
9826bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            s1.go(t);
9926bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams        }
10026bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams
10126bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams        void destroy() {
10226bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            synchronized(this) {
10326bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                s1.mRun = false;
10426bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams                notifyAll();
10526bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams            }
10626bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams        }
10726bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams    }
10826bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams    DVFSWorkaround mDvfsWar = new DVFSWorkaround();
10926bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams
11026bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams
111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    /**
112572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams     * Define enum type for test names
113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams     */
114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public enum TestName {
115572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // totally there are 38 test cases
116572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        LEVELS_VEC3_RELAXED ("Levels Vec3 Relaxed"),
117572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        LEVELS_VEC4_RELAXED ("Levels Vec4 Relaxed"),
118572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        LEVELS_VEC3_FULL ("Levels Vec3 Full"),
119572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        LEVELS_VEC4_FULL ("Levels Vec4 Full"),
120572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        BLUR_RADIUS_25 ("Blur radius 25"),
121572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSIC_BLUE_RADIUS_25 ("Intrinsic Blur radius 25"),
122572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        GREYSCALE ("Greyscale"),
123572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        GRAIN ("Grain"),
124572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        FISHEYE_FULL ("Fisheye Full"),
125572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        FISHEYE_RELAXED ("Fisheye Relaxed"),
126572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        FISHEYE_APPROXIMATE_FULL ("Fisheye Approximate Full"),
127572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        FISHEYE_APPROXIMATE_RELAXED ("Fisheye Approximate Relaxed"),
128572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        VIGNETTE_FULL ("Vignette Full"),
129572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        VIGNETTE_RELAXED ("Vignette Relaxed"),
130572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        VIGNETTE_APPROXIMATE_FULL ("Vignette Approximate Full"),
131572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        VIGNETTE_APPROXIMATE_RELAXED ("Vignette Approximate Relaxed"),
132572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        GROUP_TEST_EMULATED ("Group Test (emulated)"),
133572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        GROUP_TEST_NATIVE ("Group Test (native)"),
134572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        CONVOLVE_3X3 ("Convolve 3x3"),
135572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_CONVOLVE_3X3 ("Intrinsics Convolve 3x3"),
136572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        COLOR_MATRIX ("ColorMatrix"),
137572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_COLOR_MATRIX ("Intrinsics ColorMatrix"),
138572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_COLOR_MATRIX_GREY ("Intrinsics ColorMatrix Grey"),
139572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        COPY ("Copy"),
140572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        CROSS_PROCESS_USING_LUT ("CrossProcess (using LUT)"),
141572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        CONVOLVE_5X5 ("Convolve 5x5"),
142572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_CONVOLVE_5X5 ("Intrinsics Convolve 5x5"),
143572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        MANDELBROT ("Mandelbrot"),
144572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_BLEND ("Intrinsics Blend"),
145572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_BLUR_25G ("Intrinsics Blur 25 uchar"),
146572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        VIBRANCE ("Vibrance"),
147572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        BW_FILTER ("BW Filter"),
148572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        SHADOWS ("Shadows"),
149572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        CONTRAST ("Contrast"),
150572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        EXPOSURE ("Exposure"),
151572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        WHITE_BALANCE ("White Balance"),
152572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        COLOR_CUBE ("Color Cube"),
153572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        COLOR_CUBE_3D_INTRINSIC ("Color Cube (3D LUT intrinsic)"),
154204009b9114b33f184d7178838861d2fa9c9f88cJason Sams        USAGE_IO ("Usage io"),
1559ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams        ARTISTIC_1("Artistic 1"),
156204009b9114b33f184d7178838861d2fa9c9f88cJason Sams        HISTOGRAM ("Histogram");
157572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
158572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
159572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        private final String name;
160572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
161572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        private TestName(String s) {
162572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            name = s;
163572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
164572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
165572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // return quoted string as displayed test name
166572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        public String toString() {
167572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return name;
168572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
169572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
170572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
171572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Bitmap mBitmapIn;
172572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Bitmap mBitmapIn2;
173572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Bitmap mBitmapOut;
174572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
175572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Spinner mSpinner;
176572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar1;
177572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar2;
178572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar3;
179572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar4;
180572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar5;
181572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText1;
182572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText2;
183572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText3;
184572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText4;
185572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText5;
186572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
187572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mSaturation = 1.0f;
188572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
189572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mBenchmarkResult;
190572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Spinner mTestSpinner;
191572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
192572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SurfaceView mSurfaceView;
193572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private ImageView mDisplayView;
194572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
195572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private boolean mDoingBenchmark;
196572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
197572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TestBase mTest;
198572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private int mRunCount;
199572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
200572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void updateDisplay() {
201572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mHandler.sendMessage(Message.obtain());
202572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
203572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
204572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Handler mHandler = new Handler() {
205572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Allow the filter to complete without blocking the UI
206572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // thread.  When the message arrives that the op is complete
207572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // we will either mark completion or start a new filter if
208572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // more work is ready.  Either way, display the result.
209572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        @Override
210572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        public void handleMessage(Message msg) {
211572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            boolean doTest = false;
212572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            synchronized(this) {
213572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                if (mRS == null) {
214572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    return;
215572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
216572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.updateBitmap(mBitmapOut);
217572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mDisplayView.invalidate();
218572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                if (mRunCount > 0) {
219572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    mRunCount--;
220572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    if (mRunCount > 0) {
221572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                        doTest = true;
222572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    }
223572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
224572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
225572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                if (doTest) {
226572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    mTest.runTestSendMessage();
227572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
228572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
229572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
230572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
231572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    };
232572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
233572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
234572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (fromUser) {
235572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
236572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (seekBar == mBar1) {
237572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar1Changed(progress);
238572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar2) {
239572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar2Changed(progress);
240572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar3) {
241572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar3Changed(progress);
242572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar4) {
243572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar4Changed(progress);
244572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar5) {
245572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar5Changed(progress);
246572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
247572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
248572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            boolean doTest = false;
249572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            synchronized(this) {
250572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                if (mRunCount == 0) {
251572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    doTest = true;
252572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    mRunCount = 1;
253572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                } else {
254572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    mRunCount = 2;
255572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
256572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
257572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (doTest) {
258572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.runTestSendMessage();
259572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
260572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
261572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
262572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
263572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStartTrackingTouch(SeekBar seekBar) {
264572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
265572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
266572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStopTrackingTouch(SeekBar seekBar) {
267572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
268572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
269572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void setupBars() {
270572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSpinner.setVisibility(View.VISIBLE);
271572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onSpinner1Setup(mSpinner);
272572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
273572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1.setVisibility(View.VISIBLE);
274572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText1.setVisibility(View.VISIBLE);
275572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar1Setup(mBar1, mText1);
276572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
277572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2.setVisibility(View.VISIBLE);
278572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText2.setVisibility(View.VISIBLE);
279572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar2Setup(mBar2, mText2);
280572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
281572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3.setVisibility(View.VISIBLE);
282572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText3.setVisibility(View.VISIBLE);
283572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar3Setup(mBar3, mText3);
284572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
285572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4.setVisibility(View.VISIBLE);
286572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText4.setVisibility(View.VISIBLE);
287572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar4Setup(mBar4, mText4);
288572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
289572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5.setVisibility(View.VISIBLE);
290572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText5.setVisibility(View.VISIBLE);
291572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar5Setup(mBar5, mText5);
292572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
293572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
294572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
295572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void changeTest(TestName testName) {
296572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (mTest != null) {
297572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.destroy();
298572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
299572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        switch(testName) {
300572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC3_RELAXED:
301572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(false, false);
302572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
303572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC4_RELAXED:
304572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(false, true);
305572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
306572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC3_FULL:
307572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(true, false);
308572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
309572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC4_FULL:
310572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(true, true);
311572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
312572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case BLUR_RADIUS_25:
313572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Blur25(false);
314572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
315572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSIC_BLUE_RADIUS_25:
316572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Blur25(true);
317572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
318572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GREYSCALE:
319572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Greyscale();
320572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
321572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GRAIN:
322572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Grain();
323572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
324572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_FULL:
325572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(false, false);
326572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
327572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_RELAXED:
328572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(false, true);
329572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
330572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_APPROXIMATE_FULL:
331572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(true, false);
332572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
333572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_APPROXIMATE_RELAXED:
334572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(true, true);
335572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
336572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_FULL:
337572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(false, false);
338572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
339572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_RELAXED:
340572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(false, true);
341572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
342572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_APPROXIMATE_FULL:
343572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(true, false);
344572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
345572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_APPROXIMATE_RELAXED:
346572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(true, true);
347572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
348572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GROUP_TEST_EMULATED:
349572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new GroupTest(false);
350572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
351572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GROUP_TEST_NATIVE:
352572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new GroupTest(true);
353572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
354572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CONVOLVE_3X3:
355572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve3x3(false);
356572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
357572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_CONVOLVE_3X3:
358572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve3x3(true);
359572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
360572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case COLOR_MATRIX:
361572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorMatrix(false, false);
362572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
363572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_COLOR_MATRIX:
364572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorMatrix(true, false);
365572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
366572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_COLOR_MATRIX_GREY:
367572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorMatrix(true, true);
368572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
369572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case COPY:
370572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Copy();
371572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
372572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CROSS_PROCESS_USING_LUT:
373572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new CrossProcess();
374572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
375572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CONVOLVE_5X5:
376572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve5x5(false);
377572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
378572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_CONVOLVE_5X5:
379572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve5x5(true);
380572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
381572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case MANDELBROT:
382572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Mandelbrot();
383572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
384572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_BLEND:
385572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Blend();
386572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
387572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_BLUR_25G:
388572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Blur25G();
389572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
390572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIBRANCE:
391572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vibrance();
392572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
393572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case BW_FILTER:
394572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new BWFilter();
395572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
396572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case SHADOWS:
397572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Shadows();
398572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
399572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CONTRAST:
400572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Contrast();
401572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
402572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case EXPOSURE:
403572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Exposure();
404572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
405572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case WHITE_BALANCE:
406572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new WhiteBalance();
407572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
408572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case COLOR_CUBE:
409572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorCube(false);
410572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
411572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case COLOR_CUBE_3D_INTRINSIC:
412572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorCube(true);
413572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
414572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case USAGE_IO:
415572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new UsageIO();
416572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
4179ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams        case ARTISTIC_1:
4189ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams            mTest = new Artistic1();
4199ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams            break;
420204009b9114b33f184d7178838861d2fa9c9f88cJason Sams        case HISTOGRAM:
421204009b9114b33f184d7178838861d2fa9c9f88cJason Sams            mTest = new Histogram();
422204009b9114b33f184d7178838861d2fa9c9f88cJason Sams            break;
423572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
424572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
425572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.createBaseTest(this, mBitmapIn, mBitmapIn2, mBitmapOut);
426572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setupBars();
427572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
428572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.runTest();
429572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        updateDisplay();
430572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: not run");
431572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
432572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
433572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void setupTests() {
434572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTestSpinner.setAdapter(new ArrayAdapter<TestName>(
435572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            this, R.layout.spinner_layout, TestName.values()));
436572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
437572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
438572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private AdapterView.OnItemSelectedListener mTestSpinnerListener =
439572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            new AdapterView.OnItemSelectedListener() {
440572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
441572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    changeTest(TestName.values()[pos]);
442572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
443572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
444572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                public void onNothingSelected(AdapterView parent) {
445572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
446572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
447572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            };
448572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
449572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void init() {
450572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapIn = loadBitmap(R.drawable.img1600x1067);
451572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapIn2 = loadBitmap(R.drawable.img1600x1067b);
452572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(), mBitmapIn.getHeight(),
453572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                         mBitmapIn.getConfig());
454572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
455572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSurfaceView = (SurfaceView) findViewById(R.id.surface);
456572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
457572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDisplayView = (ImageView) findViewById(R.id.display);
458572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDisplayView.setImageBitmap(mBitmapOut);
459572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
460572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSpinner = (Spinner) findViewById(R.id.spinner1);
461572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
462572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1 = (SeekBar) findViewById(R.id.slider1);
463572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2 = (SeekBar) findViewById(R.id.slider2);
464572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3 = (SeekBar) findViewById(R.id.slider3);
465572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4 = (SeekBar) findViewById(R.id.slider4);
466572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5 = (SeekBar) findViewById(R.id.slider5);
467572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
468572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1.setOnSeekBarChangeListener(this);
469572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2.setOnSeekBarChangeListener(this);
470572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3.setOnSeekBarChangeListener(this);
471572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4.setOnSeekBarChangeListener(this);
472572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5.setOnSeekBarChangeListener(this);
473572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
474572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText1 = (TextView) findViewById(R.id.slider1Text);
475572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText2 = (TextView) findViewById(R.id.slider2Text);
476572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText3 = (TextView) findViewById(R.id.slider3Text);
477572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText4 = (TextView) findViewById(R.id.slider4Text);
478572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText5 = (TextView) findViewById(R.id.slider5Text);
479572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
480572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTestSpinner = (Spinner) findViewById(R.id.filterselection);
481572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTestSpinner.setOnItemSelectedListener(mTestSpinnerListener);
482572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
483572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
484572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: not run");
485572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
486572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
487572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mRS = RenderScript.create(this);
48889e20d27effd875431087a9188b20386b9c5aff0Jason Sams        mInPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
48989e20d27effd875431087a9188b20386b9c5aff0Jason Sams                                                          Allocation.MipmapControl.MIPMAP_NONE,
49089e20d27effd875431087a9188b20386b9c5aff0Jason Sams                                                          Allocation.USAGE_SHARED |
49189e20d27effd875431087a9188b20386b9c5aff0Jason Sams                                                          Allocation.USAGE_GRAPHICS_TEXTURE |
49289e20d27effd875431087a9188b20386b9c5aff0Jason Sams                                                          Allocation.USAGE_SCRIPT);
49389e20d27effd875431087a9188b20386b9c5aff0Jason Sams        mInPixelsAllocation2 = Allocation.createFromBitmap(mRS, mBitmapIn2,
49489e20d27effd875431087a9188b20386b9c5aff0Jason Sams                                                           Allocation.MipmapControl.MIPMAP_NONE,
49589e20d27effd875431087a9188b20386b9c5aff0Jason Sams                                                           Allocation.USAGE_SHARED |
49689e20d27effd875431087a9188b20386b9c5aff0Jason Sams                                                           Allocation.USAGE_GRAPHICS_TEXTURE |
49789e20d27effd875431087a9188b20386b9c5aff0Jason Sams                                                           Allocation.USAGE_SCRIPT);
498572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOutPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapOut);
499572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
500572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
501572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setupTests();
502572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        changeTest(TestName.LEVELS_VEC3_RELAXED);
503572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
504572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
505572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void cleanup() {
506572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        synchronized(this) {
507572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            RenderScript rs = mRS;
508572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRS = null;
509572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            while(mDoingBenchmark) {
510572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                try {
511572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    Thread.sleep(1, 0);
512572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                } catch(InterruptedException e) {
513572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
514572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
515572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
516572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            rs.destroy();
517572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
518572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
519572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInPixelsAllocation = null;
520572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInPixelsAllocation2 = null;
521572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOutPixelsAllocation = null;
522572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapIn = null;
523572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapIn2 = null;
524572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapOut = null;
525572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
526572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
527572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
528572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onCreate(Bundle savedInstanceState) {
529572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.onCreate(savedInstanceState);
530572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setContentView(R.layout.main);
531572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
532572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        init();
533572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
534572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
535572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
536572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onPause() {
537572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.onPause();
538572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
539572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        cleanup();
540572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
541572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
542572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
543572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
544572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onResume() {
545572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.onResume();
546572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
547572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        init();
548572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
549572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
550572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Bitmap loadBitmap(int resource) {
551572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        final BitmapFactory.Options options = new BitmapFactory.Options();
552572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
553572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return BitmapFactory.decodeResource(getResources(), resource, options);
554572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
555572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
556572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    // button hook
557572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void benchmark(View v) {
558572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float t = getBenchmark();
559572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //long javaTime = javaFilter();
560572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //mBenchmarkResult.setText("RS: " + t + " ms  Java: " + javaTime + " ms");
561572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: " + t + " ms");
562572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t);
563572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
564572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
565572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void benchmark_all(View v) {
566572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // write result into a file
567572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        File externalStorage = Environment.getExternalStorageDirectory();
568572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (!externalStorage.canWrite()) {
569572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            Log.v(TAG, "sdcard is not writable");
570572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return;
571572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
572572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        File resultFile = new File(externalStorage, RESULT_FILE);
573572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        resultFile.setWritable(true, false);
574572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        try {
575572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
576572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
577572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            for (TestName tn: TestName.values()) {
578572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                changeTest(tn);
579572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                float t = getBenchmark();
580572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                String s = new String("" + tn.toString() + ", " + t);
581572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                rsWriter.write(s + "\n");
582572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                Log.v(TAG, "Test " + s + "ms\n");
583572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
584572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            rsWriter.close();
585572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        } catch (IOException e) {
586572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            Log.v(TAG, "Unable to write result file " + e.getMessage());
587572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
588572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        changeTest(TestName.LEVELS_VEC3_RELAXED);
589572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
590572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
591572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
592572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
593572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    // For benchmark test
594572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public float getBenchmark() {
595572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (mRS == null) {
596572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return 0;
597572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
598572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDoingBenchmark = true;
599572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
60026bbf46db3c2f4eb752a0edfa722b354fce160ceJason Sams        mDvfsWar.go();
601572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.setupBenchmark();
602572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        long result = 0;
603572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
604572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //Log.v(TAG, "Warming");
605572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        long t = java.lang.System.currentTimeMillis() + 250;
606572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        do {
607572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.runTest();
608572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.finish();
609572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        } while (t > java.lang.System.currentTimeMillis());
610572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
611572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //Log.v(TAG, "Benchmarking");
612572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int ct = 0;
613572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t = java.lang.System.currentTimeMillis();
614572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        do {
615572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.runTest();
616572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.finish();
617572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            ct++;
618572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        } while ((t+1000) > java.lang.System.currentTimeMillis());
619572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t = java.lang.System.currentTimeMillis() - t;
620572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float ft = (float)t;
621572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        ft /= ct;
622572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
623572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.exitBenchmark();
624572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDoingBenchmark = false;
625572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return ft;
626572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
627572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
628