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
59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    /**
60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams     * Define enum type for test names
61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams     */
62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public enum TestName {
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"),
90859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams        MANDELBROT_FLOAT ("Mandelbrot fp32"),
91572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_BLEND ("Intrinsics Blend"),
92572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        INTRINSICS_BLUR_25G ("Intrinsics Blur 25 uchar"),
93572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        VIBRANCE ("Vibrance"),
94572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        BW_FILTER ("BW Filter"),
95572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        SHADOWS ("Shadows"),
96572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        CONTRAST ("Contrast"),
97572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        EXPOSURE ("Exposure"),
98572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        WHITE_BALANCE ("White Balance"),
99572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        COLOR_CUBE ("Color Cube"),
100572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        COLOR_CUBE_3D_INTRINSIC ("Color Cube (3D LUT intrinsic)"),
101204009b9114b33f184d7178838861d2fa9c9f88cJason Sams        USAGE_IO ("Usage io"),
1029ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams        ARTISTIC_1("Artistic 1"),
103859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams        HISTOGRAM ("Histogram"),
1040d6043caef208ee6c661eb17bcb376abfe90cd48Jason Sams        MANDELBROT_DOUBLE ("Mandelbrot fp64"),
1050d6043caef208ee6c661eb17bcb376abfe90cd48Jason Sams        RESIZE_BICUBIC_SCRIPT ("Resize BiCubic Script"),
106da68eff288c8b403bc41c1fa856ca09d73f35e2fMiao Wang        RESIZE_BICUBIC_INTRINSIC ("Resize BiCubic Intrinsic"),
107da68eff288c8b403bc41c1fa856ca09d73f35e2fMiao Wang        MIRROR ("Mirror Image");
108572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
109572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        private final String name;
110572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        private TestName(String s) {
112572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            name = s;
113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
115572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // return quoted string as displayed test name
116572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        public String toString() {
117572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return name;
118572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
119572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
120572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
121572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Bitmap mBitmapOut;
122572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
123572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Spinner mSpinner;
124572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar1;
125572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar2;
126572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar3;
127572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar4;
128572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar5;
129572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText1;
130572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText2;
131572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText3;
132572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText4;
133572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText5;
134572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
135572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mBenchmarkResult;
136572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Spinner mTestSpinner;
137572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
138572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private ImageView mDisplayView;
139572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
140572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private boolean mDoingBenchmark;
141572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
142572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TestBase mTest;
143572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private int mRunCount;
144572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
145572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void updateDisplay() {
146572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mHandler.sendMessage(Message.obtain());
147572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
148572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
149572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Handler mHandler = new Handler() {
150572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Allow the filter to complete without blocking the UI
151572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // thread.  When the message arrives that the op is complete
152572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // we will either mark completion or start a new filter if
153572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // more work is ready.  Either way, display the result.
154572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        @Override
155572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        public void handleMessage(Message msg) {
156572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            boolean doTest = false;
157572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            synchronized(this) {
158572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                if (mRS == null) {
159572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    return;
160572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
161572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.updateBitmap(mBitmapOut);
162572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mDisplayView.invalidate();
163572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                if (mRunCount > 0) {
164572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    mRunCount--;
165572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    if (mRunCount > 0) {
166572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                        doTest = true;
167572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    }
168572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
169572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
170572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                if (doTest) {
171572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    mTest.runTestSendMessage();
172572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
173572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
174572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
175572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
176572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    };
177572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
178572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
179572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (fromUser) {
180572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
181572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (seekBar == mBar1) {
182572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar1Changed(progress);
183572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar2) {
184572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar2Changed(progress);
185572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar3) {
186572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar3Changed(progress);
187572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar4) {
188572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar4Changed(progress);
189572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar5) {
190572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.onBar5Changed(progress);
191572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
192572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
193572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            boolean doTest = false;
194572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            synchronized(this) {
195572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                if (mRunCount == 0) {
196572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    doTest = true;
197572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    mRunCount = 1;
198572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                } else {
199572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    mRunCount = 2;
200572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
201572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
202572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (doTest) {
203572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mTest.runTestSendMessage();
204572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
205572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
206572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
207572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
208572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStartTrackingTouch(SeekBar seekBar) {
209572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
210572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
211572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStopTrackingTouch(SeekBar seekBar) {
212572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
213572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
214572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void setupBars() {
215572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSpinner.setVisibility(View.VISIBLE);
216572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onSpinner1Setup(mSpinner);
217572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
218572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1.setVisibility(View.VISIBLE);
219572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText1.setVisibility(View.VISIBLE);
220572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar1Setup(mBar1, mText1);
221572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
222572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2.setVisibility(View.VISIBLE);
223572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText2.setVisibility(View.VISIBLE);
224572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar2Setup(mBar2, mText2);
225572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
226572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3.setVisibility(View.VISIBLE);
227572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText3.setVisibility(View.VISIBLE);
228572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar3Setup(mBar3, mText3);
229572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
230572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4.setVisibility(View.VISIBLE);
231572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText4.setVisibility(View.VISIBLE);
232572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar4Setup(mBar4, mText4);
233572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
234572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5.setVisibility(View.VISIBLE);
235572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText5.setVisibility(View.VISIBLE);
236572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.onBar5Setup(mBar5, mText5);
237572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
238572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
239572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
240572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void changeTest(TestName testName) {
241572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (mTest != null) {
242572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.destroy();
243572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
244572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        switch(testName) {
245572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC3_RELAXED:
246572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(false, false);
247572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
248572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC4_RELAXED:
249572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(false, true);
250572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
251572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC3_FULL:
252572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(true, false);
253572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
254572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case LEVELS_VEC4_FULL:
255572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new LevelsV4(true, true);
256572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
257572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case BLUR_RADIUS_25:
258572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Blur25(false);
259572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
260572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSIC_BLUE_RADIUS_25:
261572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Blur25(true);
262572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
263572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GREYSCALE:
264572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Greyscale();
265572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
266572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GRAIN:
267572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Grain();
268572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
269572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_FULL:
270572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(false, false);
271572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
272572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_RELAXED:
273572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(false, true);
274572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
275572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_APPROXIMATE_FULL:
276572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(true, false);
277572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
278572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case FISHEYE_APPROXIMATE_RELAXED:
279572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Fisheye(true, true);
280572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
281572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_FULL:
282572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(false, false);
283572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
284572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_RELAXED:
285572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(false, true);
286572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
287572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_APPROXIMATE_FULL:
288572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(true, false);
289572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
290572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIGNETTE_APPROXIMATE_RELAXED:
291572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vignette(true, true);
292572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
293572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GROUP_TEST_EMULATED:
294572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new GroupTest(false);
295572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
296572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case GROUP_TEST_NATIVE:
297572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new GroupTest(true);
298572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
299572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CONVOLVE_3X3:
300572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve3x3(false);
301572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
302572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_CONVOLVE_3X3:
303572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve3x3(true);
304572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
305572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case COLOR_MATRIX:
306572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorMatrix(false, false);
307572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
308572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_COLOR_MATRIX:
309572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorMatrix(true, false);
310572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
311572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_COLOR_MATRIX_GREY:
312572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorMatrix(true, true);
313572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
314572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case COPY:
315572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Copy();
316572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
317572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CROSS_PROCESS_USING_LUT:
318572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new CrossProcess();
319572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
320572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CONVOLVE_5X5:
321572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve5x5(false);
322572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
323572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_CONVOLVE_5X5:
324572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Convolve5x5(true);
325572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
326859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams        case MANDELBROT_FLOAT:
327859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams            mTest = new Mandelbrot(false);
328572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
329572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_BLEND:
330572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Blend();
331572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
332572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case INTRINSICS_BLUR_25G:
333572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Blur25G();
334572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
335572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case VIBRANCE:
336572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Vibrance();
337572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
338572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case BW_FILTER:
339572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new BWFilter();
340572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
341572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case SHADOWS:
342572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Shadows();
343572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
344572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case CONTRAST:
345572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Contrast();
346572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
347572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case EXPOSURE:
348572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new Exposure();
349572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
350572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case WHITE_BALANCE:
351572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new WhiteBalance();
352572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
353572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case COLOR_CUBE:
354572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorCube(false);
355572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
356572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case COLOR_CUBE_3D_INTRINSIC:
357572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new ColorCube(true);
358572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
359572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        case USAGE_IO:
360572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest = new UsageIO();
361572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            break;
3629ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams        case ARTISTIC_1:
3639ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams            mTest = new Artistic1();
3649ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams            break;
365204009b9114b33f184d7178838861d2fa9c9f88cJason Sams        case HISTOGRAM:
366204009b9114b33f184d7178838861d2fa9c9f88cJason Sams            mTest = new Histogram();
367204009b9114b33f184d7178838861d2fa9c9f88cJason Sams            break;
368859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams        case MANDELBROT_DOUBLE:
369859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams            mTest = new Mandelbrot(true);
370859c4817355fcb86ea3aa103d1d1c5fa12ce81faJason Sams            break;
3710d6043caef208ee6c661eb17bcb376abfe90cd48Jason Sams        case RESIZE_BICUBIC_SCRIPT:
3720d6043caef208ee6c661eb17bcb376abfe90cd48Jason Sams            mTest = new Resize(false);
3730d6043caef208ee6c661eb17bcb376abfe90cd48Jason Sams            break;
3740d6043caef208ee6c661eb17bcb376abfe90cd48Jason Sams        case RESIZE_BICUBIC_INTRINSIC:
3750d6043caef208ee6c661eb17bcb376abfe90cd48Jason Sams            mTest = new Resize(true);
3760d6043caef208ee6c661eb17bcb376abfe90cd48Jason Sams            break;
377da68eff288c8b403bc41c1fa856ca09d73f35e2fMiao Wang        case MIRROR:
378da68eff288c8b403bc41c1fa856ca09d73f35e2fMiao Wang            mTest = new Mirror();
379da68eff288c8b403bc41c1fa856ca09d73f35e2fMiao Wang            break;
380572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
381572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
382da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams        mTest.createBaseTest(this);
383572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setupBars();
384572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
385572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.runTest();
386572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        updateDisplay();
387572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: not run");
388572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
389572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
390572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void setupTests() {
391572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTestSpinner.setAdapter(new ArrayAdapter<TestName>(
392572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            this, R.layout.spinner_layout, TestName.values()));
393572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
394572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
395572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private AdapterView.OnItemSelectedListener mTestSpinnerListener =
396572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            new AdapterView.OnItemSelectedListener() {
397572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
398572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    changeTest(TestName.values()[pos]);
399572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
400572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
401572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                public void onNothingSelected(AdapterView parent) {
402572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
403572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
404572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            };
405572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
406572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void init() {
407da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams        mRS = RenderScript.create(this);
408da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams        mInPixelsAllocation = Allocation.createFromBitmapResource(
409da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams                mRS, getResources(), R.drawable.img1600x1067);
410da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams        mInPixelsAllocation2 = Allocation.createFromBitmapResource(
411da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams                mRS, getResources(), R.drawable.img1600x1067b);
412da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams        mBitmapOut = Bitmap.createBitmap(mInPixelsAllocation.getType().getX(),
413da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams                                         mInPixelsAllocation.getType().getY(),
414da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams                                         Bitmap.Config.ARGB_8888);
415fcedeb0887ed1dd9213e881fe955808e4c0fcabfJason Sams        mBitmapOut.setHasAlpha(false);
416da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams        mOutPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapOut);
417572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
418572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDisplayView = (ImageView) findViewById(R.id.display);
419572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDisplayView.setImageBitmap(mBitmapOut);
420572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
421572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSpinner = (Spinner) findViewById(R.id.spinner1);
422572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
423572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1 = (SeekBar) findViewById(R.id.slider1);
424572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2 = (SeekBar) findViewById(R.id.slider2);
425572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3 = (SeekBar) findViewById(R.id.slider3);
426572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4 = (SeekBar) findViewById(R.id.slider4);
427572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5 = (SeekBar) findViewById(R.id.slider5);
428572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
429572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1.setOnSeekBarChangeListener(this);
430572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2.setOnSeekBarChangeListener(this);
431572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3.setOnSeekBarChangeListener(this);
432572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4.setOnSeekBarChangeListener(this);
433572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5.setOnSeekBarChangeListener(this);
434572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
435572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText1 = (TextView) findViewById(R.id.slider1Text);
436572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText2 = (TextView) findViewById(R.id.slider2Text);
437572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText3 = (TextView) findViewById(R.id.slider3Text);
438572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText4 = (TextView) findViewById(R.id.slider4Text);
439572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText5 = (TextView) findViewById(R.id.slider5Text);
440572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
441572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTestSpinner = (Spinner) findViewById(R.id.filterselection);
442572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTestSpinner.setOnItemSelectedListener(mTestSpinnerListener);
443572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
444572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
445572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: not run");
446572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
447572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setupTests();
448572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        changeTest(TestName.LEVELS_VEC3_RELAXED);
449572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
450572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
451572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void cleanup() {
452572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        synchronized(this) {
453572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            RenderScript rs = mRS;
454572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRS = null;
455572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            while(mDoingBenchmark) {
456572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                try {
457572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    Thread.sleep(1, 0);
458572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                } catch(InterruptedException e) {
459572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
460572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
461572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
462572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            rs.destroy();
463572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
464572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
465572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInPixelsAllocation = null;
466572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInPixelsAllocation2 = null;
467572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOutPixelsAllocation = null;
468572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapOut = null;
469572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
470572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
471572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
472572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onCreate(Bundle savedInstanceState) {
473572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.onCreate(savedInstanceState);
474572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setContentView(R.layout.main);
475572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
476572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        init();
477572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
478572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
479572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
480572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onPause() {
481572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.onPause();
482572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
483572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        cleanup();
484572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
485572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
486572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
487572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
488572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onResume() {
489572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.onResume();
490572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
49105b269323e6f28f244d74b00cd63d81d9f8a1db4Jason Sams        if (null == mRS) {
49205b269323e6f28f244d74b00cd63d81d9f8a1db4Jason Sams            init();
49305b269323e6f28f244d74b00cd63d81d9f8a1db4Jason Sams        }
494572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
495572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
496572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    // button hook
497572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void benchmark(View v) {
498572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float t = getBenchmark();
499572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //long javaTime = javaFilter();
500572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //mBenchmarkResult.setText("RS: " + t + " ms  Java: " + javaTime + " ms");
501572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: " + t + " ms");
502572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t);
503572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
504572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
505572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void benchmark_all(View v) {
506572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // write result into a file
507572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        File externalStorage = Environment.getExternalStorageDirectory();
508572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (!externalStorage.canWrite()) {
509572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            Log.v(TAG, "sdcard is not writable");
510572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return;
511572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
512572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        File resultFile = new File(externalStorage, RESULT_FILE);
513572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        resultFile.setWritable(true, false);
514572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        try {
515572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
516572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
517572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            for (TestName tn: TestName.values()) {
518572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                changeTest(tn);
519572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                float t = getBenchmark();
520572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                String s = new String("" + tn.toString() + ", " + t);
521572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                rsWriter.write(s + "\n");
522572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                Log.v(TAG, "Test " + s + "ms\n");
523572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
524572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            rsWriter.close();
525572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        } catch (IOException e) {
526572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            Log.v(TAG, "Unable to write result file " + e.getMessage());
527572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
528572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        changeTest(TestName.LEVELS_VEC3_RELAXED);
529572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
530572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
531572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
532572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
533572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    // For benchmark test
534572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public float getBenchmark() {
535572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (mRS == null) {
536572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return 0;
537572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
538572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDoingBenchmark = true;
539572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
540572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.setupBenchmark();
541572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        long result = 0;
542572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
543572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //Log.v(TAG, "Warming");
544572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        long t = java.lang.System.currentTimeMillis() + 250;
545572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        do {
546572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.runTest();
547572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.finish();
548572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        } while (t > java.lang.System.currentTimeMillis());
549572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
550572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //Log.v(TAG, "Benchmarking");
551572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int ct = 0;
552572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t = java.lang.System.currentTimeMillis();
553572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        do {
554572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.runTest();
555572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mTest.finish();
556572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            ct++;
557572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        } while ((t+1000) > java.lang.System.currentTimeMillis());
558572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t = java.lang.System.currentTimeMillis() - t;
559572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float ft = (float)t;
560572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        ft /= ct;
561572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
562572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTest.exitBenchmark();
563572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDoingBenchmark = false;
564dbad8eb5a8bb16488351c5236974812d282b7b82Jason Sams
565572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return ft;
566572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
567572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
568