blob: cdb443514eb0b00691c7f19187346985d5068a0b [file] [log] [blame]
/*
* 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);
}
}