ImageProcessingActivityJB.java revision 572a5031a5d8602db0bec0b253428a034bd4dd59
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;
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 ImageProcessingActivityJB 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
58572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    /**
59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams     * Define enum type for test names
60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams     */
61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public enum TestName {
62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // totally there are 38 test cases
63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        LEVELS_VEC3_RELAXED ("Levels Vec3 Relaxed"),
64572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        LEVELS_VEC4_RELAXED ("Levels Vec4 Relaxed"),
65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        LEVELS_VEC3_FULL ("Levels Vec3 Full"),
66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        LEVELS_VEC4_FULL ("Levels Vec4 Full"),
67572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        BLUR_RADIUS_25 ("Blur radius 25"),
68572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSIC_BLUE_RADIUS_25 ("Intrinsic Blur radius 25"),
69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        GREYSCALE ("Greyscale"),
70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        GRAIN ("Grain"),
71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        FISHEYE_FULL ("Fisheye Full"),
72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        FISHEYE_RELAXED ("Fisheye Relaxed"),
73572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        FISHEYE_APPROXIMATE_FULL ("Fisheye Approximate Full"),
74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        FISHEYE_APPROXIMATE_RELAXED ("Fisheye Approximate Relaxed"),
75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        VIGNETTE_FULL ("Vignette Full"),
76572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        VIGNETTE_RELAXED ("Vignette Relaxed"),
77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        VIGNETTE_APPROXIMATE_FULL ("Vignette Approximate Full"),
78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        VIGNETTE_APPROXIMATE_RELAXED ("Vignette Approximate Relaxed"),
79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        GROUP_TEST_EMULATED ("Group Test (emulated)"),
80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        GROUP_TEST_NATIVE ("Group Test (native)"),
81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        CONVOLVE_3X3 ("Convolve 3x3"),
82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_CONVOLVE_3X3 ("Intrinsics Convolve 3x3"),
83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        COLOR_MATRIX ("ColorMatrix"),
84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_COLOR_MATRIX ("Intrinsics ColorMatrix"),
85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_COLOR_MATRIX_GREY ("Intrinsics ColorMatrix Grey"),
86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        COPY ("Copy"),
87572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        CROSS_PROCESS_USING_LUT ("CrossProcess (using LUT)"),
88572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        CONVOLVE_5X5 ("Convolve 5x5"),
89572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_CONVOLVE_5X5 ("Intrinsics Convolve 5x5"),
90572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        MANDELBROT ("Mandelbrot"),
91572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_BLEND ("Intrinsics Blend"),
92572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        VIBRANCE ("Vibrance"),
93572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        BW_FILTER ("BW Filter"),
94572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        SHADOWS ("Shadows"),
95572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        CONTRAST ("Contrast"),
96572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        EXPOSURE ("Exposure"),
97572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        WHITE_BALANCE ("White Balance");
98572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
99572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
100572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        private final String name;
101572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
102572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        private TestName(String s) {
103572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            name = s;
104572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
105572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
106572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // return quoted string as displayed test name
107572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        public String toString() {
108572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return name;
109572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
110572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
112572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Bitmap mBitmapIn;
113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Bitmap mBitmapIn2;
114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Bitmap mBitmapOut;
115572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
116572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Spinner mSpinner;
117572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar1;
118572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar2;
119572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar3;
120572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar4;
121572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar5;
122572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText1;
123572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText2;
124572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText3;
125572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText4;
126572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText5;
127572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
128572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mSaturation = 1.0f;
129572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
130572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mBenchmarkResult;
131572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Spinner mTestSpinner;
132572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
133572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SurfaceView mSurfaceView;
134572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private ImageView mDisplayView;
135572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
136572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private boolean mDoingBenchmark;
137572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
138572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TestBase mTest;
139572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private int mRunCount;
140572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
141572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void updateDisplay() {
142572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mHandler.sendMessage(Message.obtain());
143572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
144572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
145572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Handler mHandler = new Handler() {
146572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Allow the filter to complete without blocking the UI
147572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // thread.  When the message arrives that the op is complete
148572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // we will either mark completion or start a new filter if
149572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // more work is ready.  Either way, display the result.
150572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        @Override
151572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        public void handleMessage(Message msg) {
152572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.updateBitmap(mBitmapOut);
153572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mDisplayView.invalidate();
154572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
155572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            boolean doTest = false;
156572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            synchronized(this) {
157572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                if (mRunCount > 0) {
158572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    mRunCount--;
159572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    if (mRunCount > 0) {
160572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                        doTest = true;
161572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    }
162572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
163572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
164572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (doTest) {
165572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.runTestSendMessage();
166572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
167572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
168572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
169572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    };
170572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
171572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
172572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (fromUser) {
173572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
174572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (seekBar == mBar1) {
175572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar1Changed(progress);
176572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar2) {
177572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar2Changed(progress);
178572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar3) {
179572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar3Changed(progress);
180572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar4) {
181572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar4Changed(progress);
182572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar5) {
183572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar5Changed(progress);
184572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
185572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
186572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            boolean doTest = false;
187572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            synchronized(this) {
188572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                if (mRunCount == 0) {
189572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    doTest = true;
190572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    mRunCount = 1;
191572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                } else {
192572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    mRunCount = 2;
193572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
194572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
195572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (doTest) {
196572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.runTestSendMessage();
197572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
198572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
199572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
200572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
201572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStartTrackingTouch(SeekBar seekBar) {
202572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
203572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
204572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStopTrackingTouch(SeekBar seekBar) {
205572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
206572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
207572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void setupBars() {
208572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSpinner.setVisibility(View.VISIBLE);
209572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onSpinner1Setup(mSpinner);
210572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
211572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1.setVisibility(View.VISIBLE);
212572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText1.setVisibility(View.VISIBLE);
213572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar1Setup(mBar1, mText1);
214572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
215572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2.setVisibility(View.VISIBLE);
216572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText2.setVisibility(View.VISIBLE);
217572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar2Setup(mBar2, mText2);
218572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
219572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3.setVisibility(View.VISIBLE);
220572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText3.setVisibility(View.VISIBLE);
221572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar3Setup(mBar3, mText3);
222572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
223572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4.setVisibility(View.VISIBLE);
224572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText4.setVisibility(View.VISIBLE);
225572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar4Setup(mBar4, mText4);
226572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
227572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5.setVisibility(View.VISIBLE);
228572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText5.setVisibility(View.VISIBLE);
229572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar5Setup(mBar5, mText5);
230572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
231572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
232572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
233572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void changeTest(TestName testName) {
234572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (mTest != null) {
235572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.destroy();
236572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
237572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        switch(testName) {
238572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC3_RELAXED:
239572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(false, false);
240572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
241572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC4_RELAXED:
242572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(false, true);
243572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
244572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC3_FULL:
245572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(true, false);
246572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
247572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC4_FULL:
248572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(true, true);
249572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
250572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case BLUR_RADIUS_25:
251572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Blur25(false);
252572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
253572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSIC_BLUE_RADIUS_25:
254572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Blur25(true);
255572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
256572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GREYSCALE:
257572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Greyscale();
258572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
259572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GRAIN:
260572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Grain();
261572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
262572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_FULL:
263572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(false, false);
264572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
265572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_RELAXED:
266572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(false, true);
267572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
268572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_APPROXIMATE_FULL:
269572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(true, false);
270572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
271572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_APPROXIMATE_RELAXED:
272572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(true, true);
273572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
274572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_FULL:
275572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(false, false);
276572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
277572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_RELAXED:
278572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(false, true);
279572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
280572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_APPROXIMATE_FULL:
281572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(true, false);
282572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
283572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_APPROXIMATE_RELAXED:
284572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(true, true);
285572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
286572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GROUP_TEST_EMULATED:
287572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new GroupTest(false);
288572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
289572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GROUP_TEST_NATIVE:
290572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new GroupTest(true);
291572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
292572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CONVOLVE_3X3:
293572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve3x3(false);
294572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
295572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_CONVOLVE_3X3:
296572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve3x3(true);
297572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
298572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case COLOR_MATRIX:
299572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorMatrix(false, false);
300572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
301572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_COLOR_MATRIX:
302572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorMatrix(true, false);
303572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
304572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_COLOR_MATRIX_GREY:
305572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorMatrix(true, true);
306572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
307572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case COPY:
308572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Copy();
309572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
310572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CROSS_PROCESS_USING_LUT:
311572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new CrossProcess();
312572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
313572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CONVOLVE_5X5:
314572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve5x5(false);
315572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
316572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_CONVOLVE_5X5:
317572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve5x5(true);
318572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
319572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case MANDELBROT:
320572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Mandelbrot();
321572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
322572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_BLEND:
323572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Blend();
324572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
325572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIBRANCE:
326572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vibrance();
327572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
328572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case BW_FILTER:
329572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new BWFilter();
330572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
331572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case SHADOWS:
332572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Shadows();
333572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
334572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CONTRAST:
335572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Contrast();
336572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
337572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case EXPOSURE:
338572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Exposure();
339572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
340572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case WHITE_BALANCE:
341572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new WhiteBalance();
342572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
343572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
344572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
345572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.createBaseTest(this, mBitmapIn, mBitmapIn2, mBitmapOut);
346572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setupBars();
347572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
348572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.runTest();
349572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        updateDisplay();
350572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: not run");
351572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
352572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
353572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void setupTests() {
354572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTestSpinner.setAdapter(new ArrayAdapter<TestName>(
355572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            this, R.layout.spinner_layout, TestName.values()));
356572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
357572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
358572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private AdapterView.OnItemSelectedListener mTestSpinnerListener =
359572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            new AdapterView.OnItemSelectedListener() {
360572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
361572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    changeTest(TestName.values()[pos]);
362572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
363572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
364572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                public void onNothingSelected(AdapterView parent) {
365572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
366572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
367572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            };
368572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
369572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
370572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onCreate(Bundle savedInstanceState) {
371572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.onCreate(savedInstanceState);
372572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setContentView(R.layout.main);
373572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
374572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapIn = loadBitmap(R.drawable.img1600x1067);
375572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapIn2 = loadBitmap(R.drawable.img1600x1067b);
376572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(), mBitmapIn.getHeight(),
377572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                         mBitmapIn.getConfig());
378572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
379572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSurfaceView = (SurfaceView) findViewById(R.id.surface);
380572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
381572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDisplayView = (ImageView) findViewById(R.id.display);
382572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDisplayView.setImageBitmap(mBitmapOut);
383572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
384572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSpinner = (Spinner) findViewById(R.id.spinner1);
385572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
386572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1 = (SeekBar) findViewById(R.id.slider1);
387572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2 = (SeekBar) findViewById(R.id.slider2);
388572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3 = (SeekBar) findViewById(R.id.slider3);
389572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4 = (SeekBar) findViewById(R.id.slider4);
390572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5 = (SeekBar) findViewById(R.id.slider5);
391572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
392572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1.setOnSeekBarChangeListener(this);
393572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2.setOnSeekBarChangeListener(this);
394572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3.setOnSeekBarChangeListener(this);
395572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4.setOnSeekBarChangeListener(this);
396572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5.setOnSeekBarChangeListener(this);
397572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
398572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText1 = (TextView) findViewById(R.id.slider1Text);
399572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText2 = (TextView) findViewById(R.id.slider2Text);
400572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText3 = (TextView) findViewById(R.id.slider3Text);
401572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText4 = (TextView) findViewById(R.id.slider4Text);
402572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText5 = (TextView) findViewById(R.id.slider5Text);
403572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
404572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTestSpinner = (Spinner) findViewById(R.id.filterselection);
405572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTestSpinner.setOnItemSelectedListener(mTestSpinnerListener);
406572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
407572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
408572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: not run");
409572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
410572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
411572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mRS = RenderScript.create(this);
412572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapIn);
413572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInPixelsAllocation2 = Allocation.createFromBitmap(mRS, mBitmapIn2);
414572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOutPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapOut);
415572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
416572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
417572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setupTests();
418572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        changeTest(TestName.LEVELS_VEC3_RELAXED);
419572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
420572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
421572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
422572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Bitmap loadBitmap(int resource) {
423572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        final BitmapFactory.Options options = new BitmapFactory.Options();
424572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
425572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return BitmapFactory.decodeResource(getResources(), resource, options);
426572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
427572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
428572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    // button hook
429572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void benchmark(View v) {
430572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float t = getBenchmark();
431572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //long javaTime = javaFilter();
432572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //mBenchmarkResult.setText("RS: " + t + " ms  Java: " + javaTime + " ms");
433572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: " + t + " ms");
434572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t);
435572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
436572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
437572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void benchmark_all(View v) {
438572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // write result into a file
439572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        File externalStorage = Environment.getExternalStorageDirectory();
440572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (!externalStorage.canWrite()) {
441572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            Log.v(TAG, "sdcard is not writable");
442572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return;
443572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
444572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        File resultFile = new File(externalStorage, RESULT_FILE);
445572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        resultFile.setWritable(true, false);
446572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        try {
447572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
448572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
449572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            for (TestName tn: TestName.values()) {
450572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                changeTest(tn);
451572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                float t = getBenchmark();
452572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                String s = new String("" + tn.toString() + ", " + t);
453572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                rsWriter.write(s + "\n");
454572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                Log.v(TAG, "Test " + s + "ms\n");
455572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
456572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            rsWriter.close();
457572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        } catch (IOException e) {
458572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            Log.v(TAG, "Unable to write result file " + e.getMessage());
459572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
460572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        changeTest(TestName.LEVELS_VEC3_RELAXED);
461572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
462572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
463572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    // For benchmark test
464572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public float getBenchmark() {
465572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDoingBenchmark = true;
466572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
467572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.setupBenchmark();
468572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        long result = 0;
469572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
470572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //Log.v(TAG, "Warming");
471572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        long t = java.lang.System.currentTimeMillis() + 250;
472572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        do {
473572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.runTest();
474572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.finish();
475572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        } while (t > java.lang.System.currentTimeMillis());
476572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
477572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //Log.v(TAG, "Benchmarking");
478572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int ct = 0;
479572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t = java.lang.System.currentTimeMillis();
480572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        do {
481572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.runTest();
482572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.finish();
483572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            ct++;
484572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        } while ((t+1000) > java.lang.System.currentTimeMillis());
485572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t = java.lang.System.currentTimeMillis() - t;
486572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float ft = (float)t;
487572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        ft /= ct;
488572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
489572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.exitBenchmark();
490572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDoingBenchmark = false;
491572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
492572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return ft;
493572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
494572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
495