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