1394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk/*
2394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk *
4394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk * you may not use this file except in compliance with the License.
6394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk * You may obtain a copy of the License at
7394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk *
8394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk *
10394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk * See the License for the specific language governing permissions and
14394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk * limitations under the License.
15394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk */
16394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
17394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukpackage com.android.perftest;
18394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
19394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.os.Environment;
20394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.content.res.Resources;
21394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.graphics.Bitmap;
22394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.graphics.BitmapFactory;
23394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.*;
24394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Element.DataKind;
25394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Element.DataType;
26394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Allocation.MipmapControl;
27394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Program.TextureType;
28394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.RenderScript.RSMessageHandler;
29394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Mesh.Primitive;
30394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Matrix4f;
31394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.ProgramVertexFixedFunction;
32394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
33394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.util.Log;
34394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
35394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
36394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukpublic class MeshTest implements RsBenchBaseTest{
37394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
38394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private static final String TAG = "MeshTest";
39394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private RenderScriptGL mRS;
40394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Resources mRes;
41394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
42394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    int mBenchmarkDimX;
43394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    int mBenchmarkDimY;
44394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
45394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Mesh m10by10Mesh;
46394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Mesh m100by100Mesh;
47394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Mesh mWbyHMesh;
48394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
49394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private ScriptC_mesh_test mGeoScript;
50394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
51394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options();
52394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
53394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    ScriptField_TestScripts_s.Item[] mTests;
54394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
55394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private final String[] mNames = {
56394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "Full screen mesh 10 by 10",
57394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "Full screen mesh 100 by 100",
58394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "Full screen mesh W / 4 by H / 4"
59394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    };
60394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
61394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public MeshTest() {
62394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mBenchmarkDimX = 1280;
63394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mBenchmarkDimY = 720;
64394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
65394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
66394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    void addTest(int index, int meshNum) {
67394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index] = new ScriptField_TestScripts_s.Item();
68394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index].testScript = mGeoScript;
69394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index].testName = Allocation.createFromString(mRS,
70394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                                                             mNames[index],
71394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                                                             Allocation.USAGE_SCRIPT);
725de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk        mTests[index].debugName = RsBenchRS.createZeroTerminatedAlloc(mRS,
735de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk                                                                      mNames[index],
745de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk                                                                      Allocation.USAGE_SCRIPT);
75394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
76394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ScriptField_MeshTestData_s.Item dataItem = new ScriptField_MeshTestData_s.Item();
77394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        dataItem.meshNum = meshNum;
78394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ScriptField_MeshTestData_s testData = new ScriptField_MeshTestData_s(mRS, 1);
79394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        testData.set(dataItem, 0, true);
80394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index].testData = testData.getAllocation();
81394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
82394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
83394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public boolean init(RenderScriptGL rs, Resources res) {
84394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mRS = rs;
85394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mRes = res;
86394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        initGeoScript();
87394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests = new ScriptField_TestScripts_s.Item[mNames.length];
88394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
89394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        int index = 0;
90394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 0 /*meshNum*/);
91394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 1 /*meshNum*/);
92394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 2 /*meshNum*/);
93394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
94394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return true;
95394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
96394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
97394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public ScriptField_TestScripts_s.Item[] getTests() {
98394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return mTests;
99394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
100394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
101394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public String[] getTestNames() {
102394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return mNames;
103394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
104394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
105394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Mesh getMbyNMesh(float width, float height, int wResolution, int hResolution) {
106394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
107394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
108394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                                           2, Mesh.TriangleMeshBuilder.TEXTURE_0);
109394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
110394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        for (int y = 0; y <= hResolution; y++) {
111394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            final float normalizedY = (float)y / hResolution;
112394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            final float yOffset = (normalizedY - 0.5f) * height;
113394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            for (int x = 0; x <= wResolution; x++) {
114394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                float normalizedX = (float)x / wResolution;
115394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                float xOffset = (normalizedX - 0.5f) * width;
116394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                tmb.setTexture((float)x % 2, (float)y % 2);
117394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                tmb.addVertex(xOffset, yOffset);
118394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk             }
119394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
120394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
121394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        for (int y = 0; y < hResolution; y++) {
122394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            final int curY = y * (wResolution + 1);
123394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            final int belowY = (y + 1) * (wResolution + 1);
124394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            for (int x = 0; x < wResolution; x++) {
125394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                int curV = curY + x;
126394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                int belowV = belowY + x;
127394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                tmb.addTriangle(curV, belowV, curV + 1);
128394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                tmb.addTriangle(belowV, belowV + 1, curV + 1);
129394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            }
130394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
131394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
132394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return tmb.create(true);
133394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
134394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
135394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Allocation loadTextureRGB(int id) {
136394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return Allocation.createFromBitmapResource(mRS, mRes, id,
137394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
138394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                Allocation.USAGE_GRAPHICS_TEXTURE);
139394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
140394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
141394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    void initGeoScript() {
142394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mGeoScript = new ScriptC_mesh_test(mRS, mRes, R.raw.mesh_test);
143394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
144394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
145394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertexFixedFunction progVertex = pvb.create();
146394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertexFixedFunction.Constants PVA = new ProgramVertexFixedFunction.Constants(mRS);
147394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ((ProgramVertexFixedFunction)progVertex).bindConstants(PVA);
148394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        Matrix4f proj = new Matrix4f();
149394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        proj.loadOrthoWindow(mBenchmarkDimX, mBenchmarkDimY);
150394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        PVA.setProjection(proj);
151394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
152394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mGeoScript.set_gProgVertex(progVertex);
153394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
154394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
155394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                              ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
156394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mGeoScript.set_gProgFragmentTexture(texBuilder.create());
157394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mGeoScript.set_gProgStoreBlendNone(ProgramStore.BLEND_NONE_DEPTH_NONE(mRS));
158394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
159394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mGeoScript.set_gLinearClamp(Sampler.CLAMP_LINEAR(mRS));
160394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mGeoScript.set_gTexOpaque(loadTextureRGB(R.drawable.data));
161394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
162394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        m10by10Mesh = getMbyNMesh(mBenchmarkDimX, mBenchmarkDimY, 10, 10);
163394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        m100by100Mesh = getMbyNMesh(mBenchmarkDimX, mBenchmarkDimY, 100, 100);
164394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mWbyHMesh= getMbyNMesh(mBenchmarkDimX, mBenchmarkDimY, mBenchmarkDimX/4, mBenchmarkDimY/4);
165394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
166394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mGeoScript.set_g10by10Mesh(m10by10Mesh);
167394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mGeoScript.set_g100by100Mesh(m100by100Mesh);
168394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mGeoScript.set_gWbyHMesh(mWbyHMesh);
169394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
170394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk}
171