16b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk/*
2394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk * Copyright (C) 2010-2011 The Android Open Source Project
36b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk *
46b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
56b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk * you may not use this file except in compliance with the License.
66b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk * You may obtain a copy of the License at
76b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk *
86b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
96b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk *
106b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
116b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
126b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk * See the License for the specific language governing permissions and
146b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk * limitations under the License.
156b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk */
166b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
17c29a4442812d5f0e9f1af13b36cb6a806b6b46e0Alex Sakhartchoukpackage com.android.perftest;
186b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
196b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchoukimport java.io.Writer;
204d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchoukimport java.io.BufferedWriter;
214d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchoukimport java.io.FileWriter;
224d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchoukimport java.io.IOException;
234d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchoukimport java.io.File;
244d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchoukimport java.io.FileOutputStream;
254d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchoukimport java.io.OutputStream;
264d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk
274d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchoukimport android.os.Environment;
286b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchoukimport android.content.res.Resources;
296b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchoukimport android.renderscript.*;
308e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukimport android.renderscript.Element.DataKind;
318e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukimport android.renderscript.Element.DataType;
326d8eb266dd398abf0511685fdaf98abba3396174Jason Samsimport android.renderscript.Allocation.MipmapControl;
336b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchoukimport android.renderscript.Program.TextureType;
342738fb1cb13314e68ea5442e335de427261cde3cXia Wangimport android.renderscript.RenderScript.RSMessageHandler;
356b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchoukimport android.renderscript.Sampler.Value;
362dc7afd9c4307fba45120371abbf8b953d33a6b0Xia Wangimport android.renderscript.Mesh.Primitive;
372dc7afd9c4307fba45120371abbf8b953d33a6b0Xia Wangimport android.renderscript.Matrix4f;
382dc7afd9c4307fba45120371abbf8b953d33a6b0Xia Wangimport android.renderscript.ProgramVertexFixedFunction;
392dc7afd9c4307fba45120371abbf8b953d33a6b0Xia Wang
406b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchoukimport android.util.Log;
416b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
426b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
436b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchoukpublic class RsBenchRS {
446b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
454d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk    private static final String TAG = "RsBenchRS";
466b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    int mWidth;
476b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    int mHeight;
482738fb1cb13314e68ea5442e335de427261cde3cXia Wang    int mLoops;
494d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk    int mCurrentLoop;
504d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk
514d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk    int mBenchmarkDimX;
524d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk    int mBenchmarkDimY;
536b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
546b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    public RsBenchRS() {
556b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    }
566b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
572738fb1cb13314e68ea5442e335de427261cde3cXia Wang    public void init(RenderScriptGL rs, Resources res, int width, int height, int loops) {
586b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        mRS = rs;
596b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        mRes = res;
606b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        mWidth = width;
616b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        mHeight = height;
626b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        mMode = 0;
632738fb1cb13314e68ea5442e335de427261cde3cXia Wang        mLoops = loops;
644d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        mCurrentLoop = 0;
654d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        mBenchmarkDimX = 1280;
664d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        mBenchmarkDimY = 720;
676b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        initRS();
686b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    }
696b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
702738fb1cb13314e68ea5442e335de427261cde3cXia Wang    private boolean stopTest = false;
712738fb1cb13314e68ea5442e335de427261cde3cXia Wang
726b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    private Resources mRes;
736b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    private RenderScriptGL mRS;
746b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
756b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    private ProgramStore mProgStoreBlendNone;
766b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    private ProgramStore mProgStoreBlendAlpha;
776b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
786b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    private ProgramFragment mProgFragmentTexture;
796b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    private ProgramFragment mProgFragmentColor;
806b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
816b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    private ProgramVertex mProgVertex;
82b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    private ProgramVertexFixedFunction.Constants mPVA;
838596457bc34151dff2a465c90994130deac7f148Xia Wang    private ProgramVertexFixedFunction.Constants mPvProjectionAlloc;
846b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
856b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    private ScriptC_rsbench mScript;
866b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
87394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    ScriptField_TestScripts_s.Item[] mIndividualTests;
886b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
896b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    int mMode;
906b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
914d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk    String[] mTestNames;
924d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk    float[] mLocalTestResults;
934d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk
945de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk    static Allocation createZeroTerminatedAlloc(RenderScript rs,
955de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk                                                String str,
965de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk                                                int usage) {
975de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk        byte[] allocArray = null;
985de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk        try {
995de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk            allocArray = str.getBytes("UTF-8");
1005de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk            byte[] allocArrayZero = new byte[allocArray.length + 1];
1015de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk            System.arraycopy(allocArray, 0, allocArrayZero, 0, allocArray.length);
1025de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk            allocArrayZero[allocArrayZero.length - 1] = '\0';
1035de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk            Allocation alloc = Allocation.createSized(rs, Element.U8(rs),
1045de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk                                                      allocArrayZero.length, usage);
1055de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk            alloc.copyFrom(allocArrayZero);
1065de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk            return alloc;
1075de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk        }
1085de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk        catch (Exception e) {
1095de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk            throw new RSRuntimeException("Could not convert string to utf-8.");
1105de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk        }
1115de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk
1125de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk    }
1135de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk
114394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    void appendTests(RsBenchBaseTest testSet) {
115394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ScriptField_TestScripts_s.Item[] newTests = testSet.getTests();
116394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        if (mIndividualTests != null) {
117394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            ScriptField_TestScripts_s.Item[] combined;
118394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            combined = new ScriptField_TestScripts_s.Item[newTests.length + mIndividualTests.length];
119394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            System.arraycopy(mIndividualTests, 0, combined, 0, mIndividualTests.length);
120394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            System.arraycopy(newTests, 0, combined, mIndividualTests.length, newTests.length);
121394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            mIndividualTests = combined;
122394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        } else {
123394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            mIndividualTests = newTests;
124394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
125394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
126394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        String[] newNames = testSet.getTestNames();
127394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        if (mTestNames != null) {
128394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            String[] combinedNames;
129394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            combinedNames = new String[newNames.length + mTestNames.length];
130394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            System.arraycopy(mTestNames, 0, combinedNames, 0, mTestNames.length);
131394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            System.arraycopy(newNames, 0, combinedNames, mTestNames.length, newNames.length);
132394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            mTestNames = combinedNames;
133394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        } else {
134394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            mTestNames = newNames;
135394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
136394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
137394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
138394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    void createTestAllocation() {
139394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        int numTests = mIndividualTests.length;
1405de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk        mLocalTestResults = new float[numTests];
141394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ScriptField_TestScripts_s allTests;
142394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        allTests = new ScriptField_TestScripts_s(mRS, numTests);
143394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        for (int i = 0; i < numTests; i ++) {
144394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            allTests.set(mIndividualTests[i], i, false);
145394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
146394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        allTests.copyAll();
147394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mScript.bind_gTestScripts(allTests);
1486b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    }
1496b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
1504d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk    private void saveTestResults() {
1514d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        String state = Environment.getExternalStorageState();
1524d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        if (!Environment.MEDIA_MOUNTED.equals(state)) {
1534d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            Log.v(TAG, "sdcard is read only");
1544d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            return;
1554d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        }
1564d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        File sdCard = Environment.getExternalStorageDirectory();
1574d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        if (!sdCard.canWrite()) {
1584d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            Log.v(TAG, "ssdcard is read only");
1594d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            return;
1604d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        }
1614d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk
1624d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        File resultFile = new File(sdCard, "rsbench_result" + mCurrentLoop + ".csv");
1634d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        resultFile.setWritable(true, false);
1644d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk
1654d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        try {
1664d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            BufferedWriter results = new BufferedWriter(new FileWriter(resultFile));
1674d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            for (int i = 0; i < mLocalTestResults.length; i ++) {
1684d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk                results.write(mTestNames[i] + ", " + mLocalTestResults[i] + ",\n");
1694d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            }
1704d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            results.close();
1714d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
1724d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        } catch (IOException e) {
1734d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            Log.v(TAG, "Unable to write result file " + e.getMessage());
1744d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        }
1754d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk    }
1764d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk
1772738fb1cb13314e68ea5442e335de427261cde3cXia Wang    /**
1782738fb1cb13314e68ea5442e335de427261cde3cXia Wang     * Create a message handler to handle message sent from the script
1792738fb1cb13314e68ea5442e335de427261cde3cXia Wang     */
1802738fb1cb13314e68ea5442e335de427261cde3cXia Wang    protected RSMessageHandler mRsMessage = new RSMessageHandler() {
1812738fb1cb13314e68ea5442e335de427261cde3cXia Wang        public void run() {
1824d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            if (mID == mScript.get_RS_MSG_RESULTS_READY()) {
1834d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk                for (int i = 0; i < mLocalTestResults.length; i ++) {
1844d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk                    mLocalTestResults[i] = Float.intBitsToFloat(mData[i]);
1854d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk                }
1864d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk                saveTestResults();
1874d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk                if (mLoops > 0) {
1884d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk                    mCurrentLoop ++;
1894d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk                    mCurrentLoop = mCurrentLoop % mLoops;
1904d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk                }
1914d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk                return;
1924d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk
1934d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            } else if (mID == mScript.get_RS_MSG_TEST_DONE()) {
1942738fb1cb13314e68ea5442e335de427261cde3cXia Wang                synchronized(this) {
1952738fb1cb13314e68ea5442e335de427261cde3cXia Wang                    stopTest = true;
1962738fb1cb13314e68ea5442e335de427261cde3cXia Wang                    this.notifyAll();
1972738fb1cb13314e68ea5442e335de427261cde3cXia Wang                }
1982738fb1cb13314e68ea5442e335de427261cde3cXia Wang                return;
1992738fb1cb13314e68ea5442e335de427261cde3cXia Wang            } else {
2004d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk                Log.v(TAG, "Perf test got unexpected message");
2012738fb1cb13314e68ea5442e335de427261cde3cXia Wang                return;
2022738fb1cb13314e68ea5442e335de427261cde3cXia Wang            }
2032738fb1cb13314e68ea5442e335de427261cde3cXia Wang        }
2042738fb1cb13314e68ea5442e335de427261cde3cXia Wang    };
2052738fb1cb13314e68ea5442e335de427261cde3cXia Wang
2062738fb1cb13314e68ea5442e335de427261cde3cXia Wang    /**
2072738fb1cb13314e68ea5442e335de427261cde3cXia Wang     * Wait for message from the script
2082738fb1cb13314e68ea5442e335de427261cde3cXia Wang     */
2092738fb1cb13314e68ea5442e335de427261cde3cXia Wang    public boolean testIsFinished() {
2102738fb1cb13314e68ea5442e335de427261cde3cXia Wang        synchronized(this) {
2112738fb1cb13314e68ea5442e335de427261cde3cXia Wang            while (true) {
2122738fb1cb13314e68ea5442e335de427261cde3cXia Wang                if (stopTest) {
2132738fb1cb13314e68ea5442e335de427261cde3cXia Wang                    return true;
2142738fb1cb13314e68ea5442e335de427261cde3cXia Wang                } else {
2152738fb1cb13314e68ea5442e335de427261cde3cXia Wang                    try {
2162738fb1cb13314e68ea5442e335de427261cde3cXia Wang                        this.wait(60*1000);
2172738fb1cb13314e68ea5442e335de427261cde3cXia Wang                    } catch (InterruptedException e) {
2182738fb1cb13314e68ea5442e335de427261cde3cXia Wang                        e.printStackTrace();
2192738fb1cb13314e68ea5442e335de427261cde3cXia Wang                    }
2202738fb1cb13314e68ea5442e335de427261cde3cXia Wang                }
2212738fb1cb13314e68ea5442e335de427261cde3cXia Wang            }
2222738fb1cb13314e68ea5442e335de427261cde3cXia Wang        }
2232738fb1cb13314e68ea5442e335de427261cde3cXia Wang    }
2242738fb1cb13314e68ea5442e335de427261cde3cXia Wang
2256b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    private void initProgramFragment() {
2266b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
227b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
228b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
229b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                              ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
2306b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        mProgFragmentTexture = texBuilder.create();
23146bd32ece2e6ae5ae95ac47dacf2801322d156e9Alex Sakhartchouk        mProgFragmentTexture.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
2326b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
233b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        ProgramFragmentFixedFunction.Builder colBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
2346b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        colBuilder.setVaryingColor(false);
2356b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        mProgFragmentColor = colBuilder.create();
2366b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
2376b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        mScript.set_gProgFragmentTexture(mProgFragmentTexture);
2386b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    }
2396b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
2406b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    private void initProgramVertex() {
241b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
2426b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        mProgVertex = pvb.create();
2436b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
244b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        mPVA = new ProgramVertexFixedFunction.Constants(mRS);
245b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        ((ProgramVertexFixedFunction)mProgVertex).bindConstants(mPVA);
246b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        Matrix4f proj = new Matrix4f();
2474d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        proj.loadOrthoWindow(mBenchmarkDimX, mBenchmarkDimY);
248b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        mPVA.setProjection(proj);
2496b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
2506b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        mScript.set_gProgVertex(mProgVertex);
2516b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    }
2526b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
2534d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk    private int strlen(byte[] array) {
2544d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        int count = 0;
2554d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        while(count < array.length && array[count] != 0) {
2564d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk            count ++;
2574d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        }
2584d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        return count;
2594d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk    }
2604d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk
26146bd32ece2e6ae5ae95ac47dacf2801322d156e9Alex Sakhartchouk    public void setDebugMode(int num) {
26246bd32ece2e6ae5ae95ac47dacf2801322d156e9Alex Sakhartchouk        mScript.invoke_setDebugMode(num);
26346bd32ece2e6ae5ae95ac47dacf2801322d156e9Alex Sakhartchouk    }
26446bd32ece2e6ae5ae95ac47dacf2801322d156e9Alex Sakhartchouk
26537333001cb7801ab510ce0216183bf8df2e93b08Alex Sakhartchouk    public void setBenchmarkMode(int benchNum) {
26637333001cb7801ab510ce0216183bf8df2e93b08Alex Sakhartchouk        mScript.invoke_setBenchmarkMode(benchNum);
26746bd32ece2e6ae5ae95ac47dacf2801322d156e9Alex Sakhartchouk    }
26846bd32ece2e6ae5ae95ac47dacf2801322d156e9Alex Sakhartchouk
269e7a5b5aa9a3c8b371dd89f44b7d4cef445f7f7c2Alex Sakhartchouk    public void pause(boolean pause) {
270e7a5b5aa9a3c8b371dd89f44b7d4cef445f7f7c2Alex Sakhartchouk        mScript.set_gPauseRendering(pause);
271e7a5b5aa9a3c8b371dd89f44b7d4cef445f7f7c2Alex Sakhartchouk    }
272e7a5b5aa9a3c8b371dd89f44b7d4cef445f7f7c2Alex Sakhartchouk
2736b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    private void initRS() {
2746b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
2756b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        mScript = new ScriptC_rsbench(mRS, mRes, R.raw.rsbench);
276394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mRS.bindRootScript(mScript);
27746bd32ece2e6ae5ae95ac47dacf2801322d156e9Alex Sakhartchouk
2782738fb1cb13314e68ea5442e335de427261cde3cXia Wang        mRS.setMessageHandler(mRsMessage);
2796b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
2802738fb1cb13314e68ea5442e335de427261cde3cXia Wang        mScript.set_gMaxLoops(mLoops);
2816b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
2826b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk        initProgramVertex();
2838596457bc34151dff2a465c90994130deac7f148Xia Wang        initProgramFragment();
284394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mScript.set_gFontSerif(Font.create(mRS, mRes, "serif", Font.Style.NORMAL, 8));
2856b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk
2868e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        Type.Builder b = new Type.Builder(mRS, Element.RGBA_8888(mRS));
2874d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        b.setX(mBenchmarkDimX).setY(mBenchmarkDimY);
2888e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        Allocation offscreen = Allocation.createTyped(mRS,
2898e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                                                      b.create(),
2908e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                                                      Allocation.USAGE_GRAPHICS_TEXTURE |
2918e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                                                      Allocation.USAGE_GRAPHICS_RENDER_TARGET);
2928e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        mScript.set_gRenderBufferColor(offscreen);
2938e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
2948e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        b = new Type.Builder(mRS,
2958e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                             Element.createPixel(mRS, DataType.UNSIGNED_16,
2968e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                             DataKind.PIXEL_DEPTH));
2974d7b19aa23f7546e2e26baf27cd7c4b9479b9384Alex Sakhartchouk        b.setX(mBenchmarkDimX).setY(mBenchmarkDimY);
2988e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        offscreen = Allocation.createTyped(mRS,
2998e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                                           b.create(),
3008e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                                           Allocation.USAGE_GRAPHICS_RENDER_TARGET);
3018e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        mScript.set_gRenderBufferDepth(offscreen);
302394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mScript.set_gLinearClamp(Sampler.CLAMP_LINEAR(mRS));
3038e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
304394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        RsBenchBaseTest test = new TextTest();
305394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        if (test.init(mRS, mRes)) {
306394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            appendTests(test);
30762e8f2228f81c3ae6a55c665b6ec0fe8c09b271eXia Wang        }
308394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        test = new FillTest();
309394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        if (test.init(mRS, mRes)) {
310394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            appendTests(test);
311cb040a063fd527afc37f6f703fab882ac3ab63cdXia Wang        }
312394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        test = new MeshTest();
313394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        if (test.init(mRS, mRes)) {
314394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            appendTests(test);
3157c7d135790ccc66bbee793c42c7ed65cf5bb76cdXia Wang        }
316394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        test = new TorusTest();
317394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        if (test.init(mRS, mRes)) {
318394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            appendTests(test);
319394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
320394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        test = new UiTest();
321394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        if (test.init(mRS, mRes)) {
322394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            appendTests(test);
323394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
324394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        createTestAllocation();
32546bd32ece2e6ae5ae95ac47dacf2801322d156e9Alex Sakhartchouk
326394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mScript.set_gLoadComplete(true);
3276b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk    }
3286b5222dd5334ebd8c8b641fa507776714505d198Alex Sakhartchouk}
329