1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.perftest;
18 
19 import android.os.Environment;
20 import android.content.res.Resources;
21 import android.graphics.Bitmap;
22 import android.graphics.BitmapFactory;
23 import android.renderscript.*;
24 import android.renderscript.Element.DataKind;
25 import android.renderscript.Element.DataType;
26 import android.renderscript.Allocation.MipmapControl;
27 import android.renderscript.Program.TextureType;
28 import android.renderscript.RenderScript.RSMessageHandler;
29 import android.renderscript.Mesh.Primitive;
30 import android.renderscript.Matrix4f;
31 import android.renderscript.ProgramVertexFixedFunction;
32 
33 import android.util.Log;
34 
35 
36 public class MeshTest implements RsBenchBaseTest{
37 
38     private static final String TAG = "MeshTest";
39     private RenderScriptGL mRS;
40     private Resources mRes;
41 
42     int mBenchmarkDimX;
43     int mBenchmarkDimY;
44 
45     private Mesh m10by10Mesh;
46     private Mesh m100by100Mesh;
47     private Mesh mWbyHMesh;
48 
49     private ScriptC_mesh_test mGeoScript;
50 
51     private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options();
52 
53     ScriptField_TestScripts_s.Item[] mTests;
54 
55     private final String[] mNames = {
56         "Full screen mesh 10 by 10",
57         "Full screen mesh 100 by 100",
58         "Full screen mesh W / 4 by H / 4"
59     };
60 
MeshTest()61     public MeshTest() {
62         mBenchmarkDimX = 1280;
63         mBenchmarkDimY = 720;
64     }
65 
addTest(int index, int meshNum)66     void addTest(int index, int meshNum) {
67         mTests[index] = new ScriptField_TestScripts_s.Item();
68         mTests[index].testScript = mGeoScript;
69         mTests[index].testName = Allocation.createFromString(mRS,
70                                                              mNames[index],
71                                                              Allocation.USAGE_SCRIPT);
72         mTests[index].debugName = RsBenchRS.createZeroTerminatedAlloc(mRS,
73                                                                       mNames[index],
74                                                                       Allocation.USAGE_SCRIPT);
75 
76         ScriptField_MeshTestData_s.Item dataItem = new ScriptField_MeshTestData_s.Item();
77         dataItem.meshNum = meshNum;
78         ScriptField_MeshTestData_s testData = new ScriptField_MeshTestData_s(mRS, 1);
79         testData.set(dataItem, 0, true);
80         mTests[index].testData = testData.getAllocation();
81     }
82 
init(RenderScriptGL rs, Resources res)83     public boolean init(RenderScriptGL rs, Resources res) {
84         mRS = rs;
85         mRes = res;
86         initGeoScript();
87         mTests = new ScriptField_TestScripts_s.Item[mNames.length];
88 
89         int index = 0;
90         addTest(index++, 0 /*meshNum*/);
91         addTest(index++, 1 /*meshNum*/);
92         addTest(index++, 2 /*meshNum*/);
93 
94         return true;
95     }
96 
getTests()97     public ScriptField_TestScripts_s.Item[] getTests() {
98         return mTests;
99     }
100 
getTestNames()101     public String[] getTestNames() {
102         return mNames;
103     }
104 
getMbyNMesh(float width, float height, int wResolution, int hResolution)105     private Mesh getMbyNMesh(float width, float height, int wResolution, int hResolution) {
106 
107         Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
108                                            2, Mesh.TriangleMeshBuilder.TEXTURE_0);
109 
110         for (int y = 0; y <= hResolution; y++) {
111             final float normalizedY = (float)y / hResolution;
112             final float yOffset = (normalizedY - 0.5f) * height;
113             for (int x = 0; x <= wResolution; x++) {
114                 float normalizedX = (float)x / wResolution;
115                 float xOffset = (normalizedX - 0.5f) * width;
116                 tmb.setTexture((float)x % 2, (float)y % 2);
117                 tmb.addVertex(xOffset, yOffset);
118              }
119         }
120 
121         for (int y = 0; y < hResolution; y++) {
122             final int curY = y * (wResolution + 1);
123             final int belowY = (y + 1) * (wResolution + 1);
124             for (int x = 0; x < wResolution; x++) {
125                 int curV = curY + x;
126                 int belowV = belowY + x;
127                 tmb.addTriangle(curV, belowV, curV + 1);
128                 tmb.addTriangle(belowV, belowV + 1, curV + 1);
129             }
130         }
131 
132         return tmb.create(true);
133     }
134 
loadTextureRGB(int id)135     private Allocation loadTextureRGB(int id) {
136         return Allocation.createFromBitmapResource(mRS, mRes, id,
137                 Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
138                 Allocation.USAGE_GRAPHICS_TEXTURE);
139     }
140 
initGeoScript()141     void initGeoScript() {
142         mGeoScript = new ScriptC_mesh_test(mRS, mRes, R.raw.mesh_test);
143 
144         ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
145         ProgramVertexFixedFunction progVertex = pvb.create();
146         ProgramVertexFixedFunction.Constants PVA = new ProgramVertexFixedFunction.Constants(mRS);
147         ((ProgramVertexFixedFunction)progVertex).bindConstants(PVA);
148         Matrix4f proj = new Matrix4f();
149         proj.loadOrthoWindow(mBenchmarkDimX, mBenchmarkDimY);
150         PVA.setProjection(proj);
151 
152         mGeoScript.set_gProgVertex(progVertex);
153         ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
154         texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
155                               ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
156         mGeoScript.set_gProgFragmentTexture(texBuilder.create());
157         mGeoScript.set_gProgStoreBlendNone(ProgramStore.BLEND_NONE_DEPTH_NONE(mRS));
158 
159         mGeoScript.set_gLinearClamp(Sampler.CLAMP_LINEAR(mRS));
160         mGeoScript.set_gTexOpaque(loadTextureRGB(R.drawable.data));
161 
162         m10by10Mesh = getMbyNMesh(mBenchmarkDimX, mBenchmarkDimY, 10, 10);
163         m100by100Mesh = getMbyNMesh(mBenchmarkDimX, mBenchmarkDimY, 100, 100);
164         mWbyHMesh= getMbyNMesh(mBenchmarkDimX, mBenchmarkDimY, mBenchmarkDimX/4, mBenchmarkDimY/4);
165 
166         mGeoScript.set_g10by10Mesh(m10by10Mesh);
167         mGeoScript.set_g100by100Mesh(m100by100Mesh);
168         mGeoScript.set_gWbyHMesh(mWbyHMesh);
169     }
170 }
171