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.image2;
18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
19572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.app.Activity;
206a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
216a804605b99cab4ffa3cc55c691338fd4a5396eaJason Samsimport android.content.Intent;
22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Bundle;
23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.BitmapFactory;
24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Bitmap;
25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Canvas;
26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.support.v8.renderscript.*;
276a804605b99cab4ffa3cc55c691338fd4a5396eaJason Samsimport android.os.Handler;
286a804605b99cab4ffa3cc55c691338fd4a5396eaJason Samsimport android.os.Message;
29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.AdapterView;
30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.ArrayAdapter;
31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.ImageView;
32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.SeekBar;
33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.Spinner;
34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.TextView;
35572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.View;
36382bae43c51c2f7224879172a6d8fab238434f04Miao Wangimport android.view.TextureView;
37382bae43c51c2f7224879172a6d8fab238434f04Miao Wangimport android.view.Surface;
38382bae43c51c2f7224879172a6d8fab238434f04Miao Wangimport android.graphics.SurfaceTexture;
396a804605b99cab4ffa3cc55c691338fd4a5396eaJason Samsimport android.graphics.Point;
406a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.Log;
42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class ImageProcessingActivity2 extends Activity
45382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                                       implements SeekBar.OnSeekBarChangeListener,
46382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                                                  TextureView.SurfaceTextureListener {
47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private final String TAG = "Img";
48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Spinner mSpinner;
50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar1;
51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar2;
52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar3;
53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar4;
54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private SeekBar mBar5;
556a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
566a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private int mBars[] = new int[5];
576a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private int mBarsOld[] = new int[5];
586a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText1;
60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText2;
61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText3;
62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText4;
63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mText5;
646a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private ImageView mDisplayView;
65382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    private SizedTV mDisplayViewIO;
66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
676a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private int mTestList[];
686a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private float mTestResults[];
69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
706a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private boolean mToggleLong;
716a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private boolean mTogglePause;
726a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private boolean mToggleAnimate;
736a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private boolean mToggleDisplay;
74382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    private boolean mToggleIO;
756a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private int mBitmapWidth;
766a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private int mBitmapHeight;
776a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private boolean mDemoMode;
78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
796a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    // Updates pending is a counter of how many kernels have been
80f73ae162ff9f599909937dcbd32345b636620f8fJason Sams    // sent to RS for processing and are not yet started.
816a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private int mUpdatesPending;
826a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
83f73ae162ff9f599909937dcbd32345b636620f8fJason Sams    // This is used to count updates in the pipeline.  It's
84f73ae162ff9f599909937dcbd32345b636620f8fJason Sams    // incremented when work is submitted to RS and decremented when we
85f73ae162ff9f599909937dcbd32345b636620f8fJason Sams    // receive the callback the kernel has finished.
866a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private int mShowsPending;
876a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
88f73ae162ff9f599909937dcbd32345b636620f8fJason Sams    private boolean mTestNameChanged = true;
89f73ae162ff9f599909937dcbd32345b636620f8fJason Sams    private String mTestName;
906a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
91382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    static public class SizedTV extends TextureView {
92382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        int mWidth;
93382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        int mHeight;
94382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
95382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        public SizedTV(android.content.Context c) {
96382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            super(c);
97382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mWidth = 800;
98382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mHeight = 450;
99382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        }
100382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
101382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        public SizedTV(android.content.Context c, android.util.AttributeSet attrs) {
102382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            super(c, attrs);
103382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mWidth = 800;
104382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mHeight = 450;
105382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        }
106382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
107382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        public SizedTV(android.content.Context c, android.util.AttributeSet attrs, int f) {
108382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            super(c, attrs, f);
109382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mWidth = 800;
110382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mHeight = 450;
111382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        }
112382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
113382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        protected void onMeasure(int w, int h) {
114382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            setMeasuredDimension(mWidth, mHeight);
115382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        }
116382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    }
117382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
1186a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
1196a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    /////////////////////////////////////////////////////////////////////////
1206a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
1216a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    // Message processor to handle notifications for when kernel completes
1226a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    private class MessageProcessor extends RenderScript.RSMessageHandler {
1236a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        MessageProcessor() {
1246a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
1256a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
1266a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        public void run() {
1276a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            synchronized(mProcessor) {
128f73ae162ff9f599909937dcbd32345b636620f8fJason Sams                // Decrement the pending displays and notify the
1296a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                // UI processor it can now enqueue more work if additional updates
1306a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                // are blocked by a full pipeline.
1316a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                if (mShowsPending > 0) {
1326a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    mShowsPending --;
1336a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    mProcessor.notifyAll();
1346a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    if (mToggleDisplay) {
1356a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mProcessor.mHandler.sendMessage(Message.obtain());
1366a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    }
1376a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                }
1386a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
1396a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
1406a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    }
1416a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
1426a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
1436a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    /////////////////////////////////////////////////////////////////////////
1446a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    // Processor is a helper thread for running the work without
1456a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    // blocking the UI thread.
1466a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    class Processor extends Thread {
1476a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        RenderScript mRS;
1486a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        ScriptC_util mScriptUtils;
1496a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        Allocation mInPixelsAllocation;
1506a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        Allocation mInPixelsAllocation2;
1516a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        Allocation mOutDisplayAllocation1;
1526a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        Allocation mOutDisplayAllocation2;
1536a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        Bitmap mBitmapOut1;
1546a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        Bitmap mBitmapOut2;
1556a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        int mActiveBitmap;
1566a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
1576a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        private float mLastResult;
1586a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        private boolean mRun = true;
1596a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        private boolean mDoingBenchmark;
1606a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        private TestBase mTest;
1616a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
1626a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        private boolean mBenchmarkMode;
1636a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
164382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        Allocation mOutDisplayAllocationIO;
165382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        Allocation mOutPixelsAllocationIO;
166382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        private TextureView mDisplayViewIO;
167382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        private Surface mOutSurface;
1686a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        // We don't want to call the "changed" methods excessively as this
1696a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        // can cause extra work for drivers.  Before running a test update
1706a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        // any bars which have changed.
171f73ae162ff9f599909937dcbd32345b636620f8fJason Sams        //
172f73ae162ff9f599909937dcbd32345b636620f8fJason Sams        // These are UI elements which can be used to control the operation of
173f73ae162ff9f599909937dcbd32345b636620f8fJason Sams        // a filter.  For example, blur radius or white level.
1746a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        void runTest() {
1756a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            if (mBars[0] != mBarsOld[0]) {
1766a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mTest.onBar1Changed(mBars[0]);
1776a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBarsOld[0] = mBars[0];
1786a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
1796a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            if (mBars[1] != mBarsOld[1]) {
1806a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mTest.onBar2Changed(mBars[1]);
1816a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBarsOld[1] = mBars[1];
1826a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
1836a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            if (mBars[2] != mBarsOld[2]) {
1846a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mTest.onBar3Changed(mBars[2]);
1856a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBarsOld[2] = mBars[2];
1866a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
1876a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            if (mBars[3] != mBarsOld[3]) {
1886a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mTest.onBar4Changed(mBars[3]);
1896a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBarsOld[3] = mBars[3];
1906a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
1916a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            if (mBars[4] != mBarsOld[4]) {
1926a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mTest.onBar5Changed(mBars[4]);
1936a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBarsOld[4] = mBars[4];
1946a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
1956a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mTest.runTest();
1966a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
1976a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
1986a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        Processor(RenderScript rs, boolean benchmarkMode) {
1996a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mRS = rs;
2006a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mRS.setMessageHandler(new MessageProcessor());
2016a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mScriptUtils = new ScriptC_util(mRS);
2026a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
2036a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            switch(mBitmapWidth) {
2046a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            case 1920:
2056a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mInPixelsAllocation = Allocation.createFromBitmapResource(
2066a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mRS, getResources(), R.drawable.img1920x1080a);
2076a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mInPixelsAllocation2 = Allocation.createFromBitmapResource(
2086a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mRS, getResources(), R.drawable.img1920x1080b);
2096a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBitmapOut1 = Bitmap.createBitmap(1920, 1080, Bitmap.Config.ARGB_8888);
2106a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBitmapOut2 = Bitmap.createBitmap(1920, 1080, Bitmap.Config.ARGB_8888);
2116a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                break;
2126a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            case 1280:
2136a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mInPixelsAllocation = Allocation.createFromBitmapResource(
2146a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mRS, getResources(), R.drawable.img1280x720a);
2156a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mInPixelsAllocation2 = Allocation.createFromBitmapResource(
2166a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mRS, getResources(), R.drawable.img1280x720b);
2176a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBitmapOut1 = Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888);
2186a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBitmapOut2 = Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888);
2196a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                break;
2206a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            case 800:
2216a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mInPixelsAllocation = Allocation.createFromBitmapResource(
2226a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mRS, getResources(), R.drawable.img800x450a);
2236a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mInPixelsAllocation2 = Allocation.createFromBitmapResource(
2246a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mRS, getResources(), R.drawable.img800x450b);
2256a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBitmapOut1 = Bitmap.createBitmap(800, 450, Bitmap.Config.ARGB_8888);
2266a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBitmapOut2 = Bitmap.createBitmap(800, 450, Bitmap.Config.ARGB_8888);
2276a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                break;
228f73ae162ff9f599909937dcbd32345b636620f8fJason Sams            default:
229f73ae162ff9f599909937dcbd32345b636620f8fJason Sams                throw new RuntimeException("unhandled bitmap width.");
2306a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
2316a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
2326a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mBitmapOut1.setHasAlpha(false);
2336a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mBitmapOut2.setHasAlpha(false);
2346a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mOutDisplayAllocation1 = Allocation.createFromBitmap(mRS, mBitmapOut1);
2356a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mOutDisplayAllocation2 = Allocation.createFromBitmap(mRS, mBitmapOut2);
2366a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mBenchmarkMode = benchmarkMode;
2376a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            start();
2386a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
2396a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
240382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        Processor(RenderScript rs, TextureView v, boolean benchmarkMode) {
241382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mRS = rs;
242382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mRS.setMessageHandler(new MessageProcessor());
243382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mScriptUtils = new ScriptC_util(mRS);
244382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mDisplayViewIO = v;
245382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
246382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            switch(mBitmapWidth) {
247382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            case 1920:
248382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mInPixelsAllocation = Allocation.createFromBitmapResource(
249382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        mRS, getResources(), R.drawable.img1920x1080a);
250382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mInPixelsAllocation2 = Allocation.createFromBitmapResource(
251382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        mRS, getResources(), R.drawable.img1920x1080b);
252382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                break;
253382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            case 1280:
254382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mInPixelsAllocation = Allocation.createFromBitmapResource(
255382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        mRS, getResources(), R.drawable.img1280x720a);
256382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mInPixelsAllocation2 = Allocation.createFromBitmapResource(
257382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        mRS, getResources(), R.drawable.img1280x720b);
258382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                break;
259382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            case 800:
260382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mInPixelsAllocation = Allocation.createFromBitmapResource(
261382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        mRS, getResources(), R.drawable.img800x450a);
262382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mInPixelsAllocation2 = Allocation.createFromBitmapResource(
263382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        mRS, getResources(), R.drawable.img800x450b);
264382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                break;
265382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            }
266382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
267382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mOutDisplayAllocationIO = Allocation.createTyped(mRS, mInPixelsAllocation.getType(),
268382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                                                               Allocation.MipmapControl.MIPMAP_NONE,
269382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                                                               Allocation.USAGE_SCRIPT |
270382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                                                               Allocation.USAGE_IO_OUTPUT);
271382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mOutPixelsAllocationIO = mOutDisplayAllocationIO;
272382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
273382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mBenchmarkMode = benchmarkMode;
274382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            start();
275382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        }
276382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
2776a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        class Result {
2786a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            float totalTime;
279f73ae162ff9f599909937dcbd32345b636620f8fJason Sams            int iterations;
2806a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
2816a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
2826a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        // Run one loop of kernels for at least the specified minimum time.
2836a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        // The function returns the average time in ms for the test run
2846a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        private Result runBenchmarkLoop(float minTime) {
2856a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mUpdatesPending = 0;
2866a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            Result r = new Result();
2876a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
2886a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            long t = java.lang.System.currentTimeMillis();
2896a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            do {
2906a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                synchronized(this) {
2916a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    // Shows pending is used to track the number of kernels in the RS pipeline
2926a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    // We throttle it to 2.  This provide some buffering to allow a kernel to be started
2936a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    // before we are nofitied the previous finished.  However, larger numbers are uncommon
2946a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    // in interactive apps as they introduce 'lag' between user input and display.
2956a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    mShowsPending++;
2966a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    if (mShowsPending > 2) {
2976a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        try {
2986a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            this.wait();
2996a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        } catch(InterruptedException e) {
3006a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        }
3016a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    }
3026a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                }
3036a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
3046a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                // If animations are enabled update the test state.
3056a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                if (mToggleAnimate) {
3066a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    mTest.animateBars(r.totalTime);
3076a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                }
3086a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
3096a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                // Run the kernel
310382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                if (!mToggleIO) {
311382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    if (mActiveBitmap == 0) {
312382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        mTest.mOutPixelsAllocation = mOutDisplayAllocation1;
313382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    } else {
314382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        mTest.mOutPixelsAllocation = mOutDisplayAllocation2;
315382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    }
3166a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                } else {
317382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    mTest.mOutPixelsAllocation = mOutDisplayAllocationIO;
3186a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                }
319382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
3206a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mTest.runTest();
321f73ae162ff9f599909937dcbd32345b636620f8fJason Sams                r.iterations ++;
3226a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
323382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                if (!mToggleIO) {
324382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    if (mToggleDisplay) {
325382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        if (mActiveBitmap == 0) {
326382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                            mOutDisplayAllocation1.copyTo(mBitmapOut1);
327382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        } else {
328382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                            mOutDisplayAllocation2.copyTo(mBitmapOut2);
329382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        }
3306a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    }
3316a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
332382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                }
3336a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                // Send our RS message handler a message so we know when this work has completed
3346a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mScriptUtils.invoke_utilSendMessage(mActiveBitmap);
3356a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mActiveBitmap ^= 1;
3366a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
3376a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                long t2 = java.lang.System.currentTimeMillis();
338f73ae162ff9f599909937dcbd32345b636620f8fJason Sams                r.totalTime = (t2 - t) / 1000.f;
3396a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            } while (r.totalTime < minTime);
3406a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
3416a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mRS.finish();
3426a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            long t2 = java.lang.System.currentTimeMillis();
343f73ae162ff9f599909937dcbd32345b636620f8fJason Sams            r.totalTime = (t2 - t) / 1000.f;
344f73ae162ff9f599909937dcbd32345b636620f8fJason Sams
345f73ae162ff9f599909937dcbd32345b636620f8fJason Sams            // Even if we are not displaying as we go, show the final output
346382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            if (!mToggleIO) {
347382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mOutDisplayAllocation1.copyTo(mBitmapOut1);
348382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mOutDisplayAllocation2.copyTo(mBitmapOut2);
349382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            }
3506a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            return r;
3516a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
3526a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
3536a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
3546a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        // Get a benchmark result for a specific test
3556a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        private float getBenchmark() {
3566a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mDoingBenchmark = true;
3576a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mUpdatesPending = 0;
3586a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
3596a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            long result = 0;
3606a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            float runtime = 1.f;
3616a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            if (mToggleLong) {
3626a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                runtime = 10.f;
3636a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
3646a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
3656a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            // We run a short bit of work before starting the actual test
3666a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            // this is to let any power management do its job and respond
3676a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            runBenchmarkLoop(0.3f);
3686a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
3696a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            // Run the actual benchmark
3706a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            Result r = runBenchmarkLoop(runtime);
3716a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
372f73ae162ff9f599909937dcbd32345b636620f8fJason Sams            Log.v("rs", "Test: time=" + r.totalTime +"s,  frames=" + r.iterations +
373f73ae162ff9f599909937dcbd32345b636620f8fJason Sams                  ", avg=" + r.totalTime / r.iterations * 1000.f);
3746a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
3756a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mDoingBenchmark = false;
376f73ae162ff9f599909937dcbd32345b636620f8fJason Sams            return r.totalTime / r.iterations * 1000.f;
3776a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
3786a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
3796a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        private int mDisplayedBitmap;
3806a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        private Handler mHandler = new Handler() {
3816a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            @Override
3826a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            public void handleMessage(Message msg) {
383f73ae162ff9f599909937dcbd32345b636620f8fJason Sams                if (mTestNameChanged) {
384f73ae162ff9f599909937dcbd32345b636620f8fJason Sams                    getActionBar().setTitle("IP-Compat test: " + mTestName);
385f73ae162ff9f599909937dcbd32345b636620f8fJason Sams                }
386f73ae162ff9f599909937dcbd32345b636620f8fJason Sams
387382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                if (!mToggleIO) {
388382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    if (mDisplayedBitmap == 0) {
389382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        mDisplayView.setImageBitmap(mBitmapOut1);
390382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    } else {
391382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        mDisplayView.setImageBitmap(mBitmapOut2);
392382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    }
393382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    mDisplayedBitmap ^= 1;
394382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    mDisplayView.invalidate();
3956a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                } else {
396382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    synchronized(this) {
397382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        if (mRS == null || mOutPixelsAllocationIO == null) {
398382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                            return;
399382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        }
400382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        if (mOutDisplayAllocationIO != mOutPixelsAllocationIO) {
401382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                            mOutDisplayAllocationIO.copyFrom(mOutPixelsAllocationIO);
402382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        }
403382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        mOutDisplayAllocationIO.ioSend();
404382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    }
4056a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                }
4066a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
4076a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        };
4086a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
4096a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        public void run() {
410382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            Surface lastSurface = null;
4116a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            while (mRun) {
4126a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                // Our loop for launching tests or benchmarks
4136a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                synchronized(this) {
4146a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    // If we have no work to do, or we have displays pending, wait
4156a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    if ((mUpdatesPending == 0) || (mShowsPending != 0)) {
4166a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        try {
4176a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            this.wait();
4186a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        } catch(InterruptedException e) {
4196a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        }
4206a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    }
421382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    if (mToggleIO) {
422382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        if ((mOutSurface == null) || (mOutPixelsAllocationIO == null)) {
423382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                            continue;
424382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        }
425382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        if (lastSurface != mOutSurface) {
426382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                            mOutDisplayAllocationIO.setSurface(mOutSurface);
427382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                            lastSurface = mOutSurface;
428382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        }
429382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    }
4306a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    // We may have been asked to exit while waiting
4316a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    if (!mRun) return;
432382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
4336a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                }
4346a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
4356a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                if (mBenchmarkMode) {
4366a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    // Loop over the tests we want to benchmark
4376a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    for (int ct=0; (ct < mTestList.length) && mRun; ct++) {
4386a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
4396a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        // For reproducibility we wait a short time for any sporadic work
4406a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        // created by the user touching the screen to launch the test to pass.
4416a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        // Also allows for things to settle after the test changes.
4426a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mRS.finish();
4436a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        try {
4446a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            sleep(250);
4456a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        } catch(InterruptedException e) {
4466a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        }
4476a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
4486a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        // If we just ran a test, we destroy it here to relieve some memory pressure
4496a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        if (mTest != null) {
4506a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            mTest.destroy();
4516a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        }
4526a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
4536a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        // Select the next test
4546a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mTest = changeTest(mTestList[ct], false);
4556a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
4566a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        // If the user selected the "long pause" option, wait
4576a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        if (mTogglePause) {
4586a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            for (int i=0; (i < 100) && mRun; i++) {
4596a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                                try {
4606a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                                    sleep(100);
4616a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                                } catch(InterruptedException e) {
4626a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                                }
4636a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            }
4646a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        }
4656a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
4666a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        // Run the test
4676a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mTestResults[ct] = getBenchmark();
4686a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    }
4696a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    onBenchmarkFinish(mRun);
4706a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    return;
4716a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                } else {
4726a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    boolean update = false;
4736a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    synchronized(this) {
4746a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        // If we have updates to process and are not blocked by pending shows,
4756a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        // start the next kernel
4766a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        if ((mUpdatesPending > 0) && (mShowsPending == 0)) {
4776a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            mUpdatesPending = 0;
4786a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            update = true;
4796a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            mShowsPending++;
4806a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        }
4816a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    }
4826a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
4836a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    if (update) {
4846a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        // Run the kernel
4856a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        if (mActiveBitmap == 0) {
4866a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            mTest.mOutPixelsAllocation = mOutDisplayAllocation1;
4876a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        } else {
4886a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            mTest.mOutPixelsAllocation = mOutDisplayAllocation2;
4896a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        }
490382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        if (mToggleIO) {
491382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                            mTest.mOutPixelsAllocation = mOutDisplayAllocationIO;
492382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        }
4936a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        runTest();
4946a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
495382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                        if (mToggleDisplay && !mToggleIO) {
4966a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            if (mActiveBitmap == 0) {
4976a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                                mOutDisplayAllocation1.copyTo(mBitmapOut1);
4986a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            } else {
4996a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                                mOutDisplayAllocation2.copyTo(mBitmapOut2);
5006a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                            }
5016a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        }
5026a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
5036a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        // Send our RS message handler a message so we know when this work has completed
5046a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mScriptUtils.invoke_utilSendMessage(mActiveBitmap);
5056a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                        mActiveBitmap ^= 1;
5066a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    }
5076a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                }
5086a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
5096a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
5106a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
5116a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
5126a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        public void update() {
513f73ae162ff9f599909937dcbd32345b636620f8fJason Sams            // Something UI related has changed, enqueue an update if one is not
514f73ae162ff9f599909937dcbd32345b636620f8fJason Sams            // already pending.  Wake the worker if needed.
5156a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            synchronized(this) {
5166a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                if (mUpdatesPending < 2) {
5176a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    mUpdatesPending++;
5186a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                    notifyAll();
5196a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                }
5206a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
5216a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
5226a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
523382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        public void setSurface(Surface s) {
524382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            synchronized(this) {
525382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mOutSurface = s;
526382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                notifyAll();
527382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            }
528382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            //update();
529382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        }
530382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
5316a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        public void exit() {
5326a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mRun = false;
5336a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
5346a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            synchronized(this) {
5356a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                notifyAll();
5366a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
5376a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
5386a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            try {
5396a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                this.join();
5406a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            } catch(InterruptedException e) {
5416a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
5426a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
5436a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mInPixelsAllocation.destroy();
5446a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mInPixelsAllocation2.destroy();
5456a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
5466a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            if (mTest != null) {
5476a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mTest.destroy();
5486a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mTest = null;
5496a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            }
550382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
551382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            if(!mToggleIO) {
552382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mOutDisplayAllocation1.destroy();
553382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mOutDisplayAllocation2.destroy();
554382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            } else {
555382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                if (mOutPixelsAllocationIO != mOutDisplayAllocationIO) {
556382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                    mOutPixelsAllocationIO.destroy();
557382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                }
558382bae43c51c2f7224879172a6d8fab238434f04Miao Wang                mOutDisplayAllocationIO.destroy();
559382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            }
5606a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mRS.destroy();
5616a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
5626a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mInPixelsAllocation = null;
5636a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mInPixelsAllocation2 = null;
5646a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mOutDisplayAllocation1 = null;
5656a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mOutDisplayAllocation2 = null;
566382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mOutDisplayAllocationIO = null;
567382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mOutPixelsAllocationIO = null;
5686a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mRS = null;
5696a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
5706a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    }
5716a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
5726a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    ///////////////////////////////////////////////////////////////////////////////////////
573572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
574572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private boolean mDoingBenchmark;
5756a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    public Processor mProcessor;
576572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
5776a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    TestBase changeTest(IPTestList.TestName t, boolean setupUI) {
5786a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        TestBase tb = IPTestList.newTest(t);
579572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
580f73ae162ff9f599909937dcbd32345b636620f8fJason Sams        mTestNameChanged = true;
581f73ae162ff9f599909937dcbd32345b636620f8fJason Sams        mTestName = t.toString();
582f73ae162ff9f599909937dcbd32345b636620f8fJason Sams        mProcessor.mHandler.sendMessage(Message.obtain());
583f73ae162ff9f599909937dcbd32345b636620f8fJason Sams
5846a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        tb.createBaseTest(this);
5856a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        if (setupUI) {
5866a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            setupBars(tb);
5876a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
5886a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        return tb;
5896a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    }
5906a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
5916a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    TestBase changeTest(int id, boolean setupUI) {
5926a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        IPTestList.TestName t = IPTestList.TestName.values()[id];
5936a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        return changeTest(t, setupUI);
594572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
595572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
596572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
597572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (fromUser) {
598572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (seekBar == mBar1) {
5996a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBars[0] = progress;
600572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar2) {
6016a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBars[1] = progress;
602572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar3) {
6036a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBars[2] = progress;
604572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar4) {
6056a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBars[3] = progress;
606572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else if (seekBar == mBar5) {
6076a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                mBars[4] = progress;
608572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
6096a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mProcessor.update();
610572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
611572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
612572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
613572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStartTrackingTouch(SeekBar seekBar) {
614572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
615572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
616572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStopTrackingTouch(SeekBar seekBar) {
617572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
618572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6196a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    void setupBars(TestBase t) {
620572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSpinner.setVisibility(View.VISIBLE);
6216a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        t.onSpinner1Setup(mSpinner);
622572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
623572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1.setVisibility(View.VISIBLE);
624572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText1.setVisibility(View.VISIBLE);
6256a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        t.onBar1Setup(mBar1, mText1);
626572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
627572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2.setVisibility(View.VISIBLE);
628572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText2.setVisibility(View.VISIBLE);
6296a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        t.onBar2Setup(mBar2, mText2);
630572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
631572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3.setVisibility(View.VISIBLE);
632572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText3.setVisibility(View.VISIBLE);
6336a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        t.onBar3Setup(mBar3, mText3);
634572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
635572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4.setVisibility(View.VISIBLE);
636572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText4.setVisibility(View.VISIBLE);
6376a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        t.onBar4Setup(mBar4, mText4);
638572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
639572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5.setVisibility(View.VISIBLE);
640572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mText5.setVisibility(View.VISIBLE);
6416a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        t.onBar5Setup(mBar5, mText5);
642572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
643572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6446a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    void hideBars() {
6456a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mSpinner.setVisibility(View.INVISIBLE);
646572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6476a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mBar1.setVisibility(View.INVISIBLE);
6486a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mText1.setVisibility(View.INVISIBLE);
649572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6506a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mBar2.setVisibility(View.INVISIBLE);
6516a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mText2.setVisibility(View.INVISIBLE);
652572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6536a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mBar3.setVisibility(View.INVISIBLE);
6546a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mText3.setVisibility(View.INVISIBLE);
655572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6566a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mBar4.setVisibility(View.INVISIBLE);
6576a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mText4.setVisibility(View.INVISIBLE);
658572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6596a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mBar5.setVisibility(View.INVISIBLE);
6606a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mText5.setVisibility(View.INVISIBLE);
6616a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    }
662572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
663572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
664572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onCreate(Bundle savedInstanceState) {
665572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.onCreate(savedInstanceState);
666572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setContentView(R.layout.main);
667572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6688467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mDisplayView = findViewById(R.id.display);
6698467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mDisplayViewIO = findViewById(R.id.display2);
6706a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        //mDisplayView.setImageBitmap(mBitmapOut);
671572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6728467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mSpinner = findViewById(R.id.spinner1);
673572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6748467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mBar1 = findViewById(R.id.slider1);
6758467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mBar2 = findViewById(R.id.slider2);
6768467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mBar3 = findViewById(R.id.slider3);
6778467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mBar4 = findViewById(R.id.slider4);
6788467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mBar5 = findViewById(R.id.slider5);
679572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
680572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar1.setOnSeekBarChangeListener(this);
681572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar2.setOnSeekBarChangeListener(this);
682572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar3.setOnSeekBarChangeListener(this);
683572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar4.setOnSeekBarChangeListener(this);
684572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBar5.setOnSeekBarChangeListener(this);
685572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6868467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mText1 = findViewById(R.id.slider1Text);
6878467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mText2 = findViewById(R.id.slider2Text);
6888467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mText3 = findViewById(R.id.slider3Text);
6898467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mText4 = findViewById(R.id.slider4Text);
6908467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mText5 = findViewById(R.id.slider5Text);
6916a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    }
692572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6936a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    @Override
6946a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    protected void onPause() {
6956a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        super.onPause();
6966a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mProcessor.exit();
6976a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    }
698572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
6996a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    public void onBenchmarkFinish(boolean ok) {
7006a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        if (ok) {
7016a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            Intent intent = new Intent();
7026a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            intent.putExtra("tests", mTestList);
7036a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            intent.putExtra("results", mTestResults);
7046a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            setResult(RESULT_OK, intent);
7056a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        } else {
7066a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            setResult(RESULT_CANCELED);
7076a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
7086a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        finish();
7096a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    }
710572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
711572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
7126a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    void startProcessor() {
7136a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        if (!mDemoMode) {
7146a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            hideBars();
7156a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
716572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
7176a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        Point size = new Point();
7186a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        getWindowManager().getDefaultDisplay().getSize(size);
719572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
7206a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        int mScreenWidth = size.x;
7216a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        int mScreenHeight = size.y;
722572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
7236a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        int tw = mBitmapWidth;
7246a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        int th = mBitmapHeight;
725572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
7266a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        if (tw > mScreenWidth || th > mScreenHeight) {
7276a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            float s1 = (float)tw / (float)mScreenWidth;
7286a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            float s2 = (float)th / (float)mScreenHeight;
729572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
7306a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            if (s1 > s2) {
7316a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                tw /= s1;
7326a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                th /= s1;
7336a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            } else {
7346a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                tw /= s2;
7356a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams                th /= s2;
736572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
737572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
738572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
7396a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        android.util.Log.v("rs", "TV sizes " + tw + ", " + th);
740382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        if (mToggleIO) {
741382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mDisplayViewIO.mWidth = tw;
742382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mDisplayViewIO.mHeight = th;
743572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
744382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mProcessor = new Processor(RenderScript.create(this), mDisplayViewIO, !mDemoMode);
745382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mDisplayViewIO.setSurfaceTextureListener(this);
746382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        } else {
747382bae43c51c2f7224879172a6d8fab238434f04Miao Wang            mProcessor = new Processor(RenderScript.create(this), !mDemoMode);
748382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        }
7496a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        if (mDemoMode) {
7506a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams            mProcessor.mTest = changeTest(mTestList[0], true);
7516a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        }
7526a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mProcessor.update();
7536a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    }
754572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
7556a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    @Override
7566a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    protected void onResume() {
7576a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        super.onResume();
7586a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        Intent i = getIntent();
7596a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mTestList = i.getIntArrayExtra("tests");
760382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        mToggleIO = i.getBooleanExtra("enable io", false);
7616a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mToggleLong = i.getBooleanExtra("enable long", false);
7626a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mTogglePause = i.getBooleanExtra("enable pause", false);
7636a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mToggleAnimate = i.getBooleanExtra("enable animate", false);
7646a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mToggleDisplay = i.getBooleanExtra("enable display", false);
7656a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mBitmapWidth = i.getIntExtra("resolution X", 0);
7666a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mBitmapHeight = i.getIntExtra("resolution Y", 0);
7676a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mDemoMode = i.getBooleanExtra("demo", false);
7686a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        mTestResults = new float[mTestList.length];
7696a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
7706a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        startProcessor();
7716a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    }
772572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
7736a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams    protected void onDestroy() {
7746a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams        super.onDestroy();
775572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
776382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    @Override
777382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
778382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        mProcessor.setSurface(new Surface(surface));
779382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    }
780382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
781382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    @Override
782382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
783382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        mProcessor.setSurface(new Surface(surface));
784382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    }
785382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
786382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    @Override
787382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
788382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        mProcessor.setSurface(null);
789382bae43c51c2f7224879172a6d8fab238434f04Miao Wang        return true;
790382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    }
791382bae43c51c2f7224879172a6d8fab238434f04Miao Wang
792382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    @Override
793382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
794382bae43c51c2f7224879172a6d8fab238434f04Miao Wang    }
7956a804605b99cab4ffa3cc55c691338fd4a5396eaJason Sams
796572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
797