/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.perftest; import android.os.Environment; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.renderscript.*; import android.renderscript.Element.DataKind; import android.renderscript.Element.DataType; import android.renderscript.Allocation.MipmapControl; import android.renderscript.Program.TextureType; import android.renderscript.RenderScript.RSMessageHandler; import android.renderscript.Mesh.Primitive; import android.renderscript.Matrix4f; import android.renderscript.ProgramVertexFixedFunction; import android.util.Log; public class MeshTest implements RsBenchBaseTest{ private static final String TAG = "MeshTest"; private RenderScriptGL mRS; private Resources mRes; int mBenchmarkDimX; int mBenchmarkDimY; private Mesh m10by10Mesh; private Mesh m100by100Mesh; private Mesh mWbyHMesh; private ScriptC_mesh_test mGeoScript; private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options(); ScriptField_TestScripts_s.Item[] mTests; private final String[] mNames = { "Full screen mesh 10 by 10", "Full screen mesh 100 by 100", "Full screen mesh W / 4 by H / 4" }; public MeshTest() { mBenchmarkDimX = 1280; mBenchmarkDimY = 720; } void addTest(int index, int meshNum) { mTests[index] = new ScriptField_TestScripts_s.Item(); mTests[index].testScript = mGeoScript; mTests[index].testName = Allocation.createFromString(mRS, mNames[index], Allocation.USAGE_SCRIPT); mTests[index].debugName = RsBenchRS.createZeroTerminatedAlloc(mRS, mNames[index], Allocation.USAGE_SCRIPT); ScriptField_MeshTestData_s.Item dataItem = new ScriptField_MeshTestData_s.Item(); dataItem.meshNum = meshNum; ScriptField_MeshTestData_s testData = new ScriptField_MeshTestData_s(mRS, 1); testData.set(dataItem, 0, true); mTests[index].testData = testData.getAllocation(); } public boolean init(RenderScriptGL rs, Resources res) { mRS = rs; mRes = res; initGeoScript(); mTests = new ScriptField_TestScripts_s.Item[mNames.length]; int index = 0; addTest(index++, 0 /*meshNum*/); addTest(index++, 1 /*meshNum*/); addTest(index++, 2 /*meshNum*/); return true; } public ScriptField_TestScripts_s.Item[] getTests() { return mTests; } public String[] getTestNames() { return mNames; } private Mesh getMbyNMesh(float width, float height, int wResolution, int hResolution) { Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS, 2, Mesh.TriangleMeshBuilder.TEXTURE_0); for (int y = 0; y <= hResolution; y++) { final float normalizedY = (float)y / hResolution; final float yOffset = (normalizedY - 0.5f) * height; for (int x = 0; x <= wResolution; x++) { float normalizedX = (float)x / wResolution; float xOffset = (normalizedX - 0.5f) * width; tmb.setTexture((float)x % 2, (float)y % 2); tmb.addVertex(xOffset, yOffset); } } for (int y = 0; y < hResolution; y++) { final int curY = y * (wResolution + 1); final int belowY = (y + 1) * (wResolution + 1); for (int x = 0; x < wResolution; x++) { int curV = curY + x; int belowV = belowY + x; tmb.addTriangle(curV, belowV, curV + 1); tmb.addTriangle(belowV, belowV + 1, curV + 1); } } return tmb.create(true); } private Allocation loadTextureRGB(int id) { return Allocation.createFromBitmapResource(mRS, mRes, id, Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, Allocation.USAGE_GRAPHICS_TEXTURE); } void initGeoScript() { mGeoScript = new ScriptC_mesh_test(mRS, mRes, R.raw.mesh_test); ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS); ProgramVertexFixedFunction progVertex = pvb.create(); ProgramVertexFixedFunction.Constants PVA = new ProgramVertexFixedFunction.Constants(mRS); ((ProgramVertexFixedFunction)progVertex).bindConstants(PVA); Matrix4f proj = new Matrix4f(); proj.loadOrthoWindow(mBenchmarkDimX, mBenchmarkDimY); PVA.setProjection(proj); mGeoScript.set_gProgVertex(progVertex); ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(mRS); texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, ProgramFragmentFixedFunction.Builder.Format.RGBA, 0); mGeoScript.set_gProgFragmentTexture(texBuilder.create()); mGeoScript.set_gProgStoreBlendNone(ProgramStore.BLEND_NONE_DEPTH_NONE(mRS)); mGeoScript.set_gLinearClamp(Sampler.CLAMP_LINEAR(mRS)); mGeoScript.set_gTexOpaque(loadTextureRGB(R.drawable.data)); m10by10Mesh = getMbyNMesh(mBenchmarkDimX, mBenchmarkDimY, 10, 10); m100by100Mesh = getMbyNMesh(mBenchmarkDimX, mBenchmarkDimY, 100, 100); mWbyHMesh= getMbyNMesh(mBenchmarkDimX, mBenchmarkDimY, mBenchmarkDimX/4, mBenchmarkDimY/4); mGeoScript.set_g10by10Mesh(m10by10Mesh); mGeoScript.set_g100by100Mesh(m100by100Mesh); mGeoScript.set_gWbyHMesh(mWbyHMesh); } }