Home | History | Annotate | Download | only in perftest
      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 TorusTest implements RsBenchBaseTest{
     37 
     38     private static final String TAG = "TorusTest";
     39     private RenderScriptGL mRS;
     40     private Resources mRes;
     41 
     42     private ProgramStore mProgStoreBlendNoneDepth;
     43     private ProgramStore mProgStoreBlendNone;
     44     private ProgramStore mProgStoreBlendAlpha;
     45 
     46     private ProgramFragment mProgFragmentTexture;
     47     private ProgramFragment mProgFragmentColor;
     48 
     49     private ProgramVertex mProgVertex;
     50     private ProgramVertexFixedFunction.Constants mPVA;
     51     private ProgramVertexFixedFunction.Constants mPvProjectionAlloc;
     52 
     53     // Custom shaders
     54     private ProgramVertex mProgVertexCustom;
     55     private ProgramFragment mProgFragmentCustom;
     56     private ProgramFragment mProgFragmentMultitex;
     57     private ProgramVertex mProgVertexPixelLight;
     58     private ProgramVertex mProgVertexPixelLightMove;
     59     private ProgramFragment mProgFragmentPixelLight;
     60     private ScriptField_VertexShaderConstants_s mVSConst;
     61     private ScriptField_FragentShaderConstants_s mFSConst;
     62     private ScriptField_VertexShaderConstants3_s mVSConstPixel;
     63     private ScriptField_FragentShaderConstants3_s mFSConstPixel;
     64 
     65     private Allocation mTexTorus;
     66     private Mesh mTorus;
     67 
     68     private ScriptC_torus_test mTorusScript;
     69 
     70     private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options();
     71 
     72     ScriptField_TestScripts_s.Item[] mTests;
     73 
     74     private final String[] mNames = {
     75         "Geo test 25.6k flat color",
     76         "Geo test 51.2k flat color",
     77         "Geo test 204.8k small tries flat color",
     78         "Geo test 25.6k single texture",
     79         "Geo test 51.2k single texture",
     80         "Geo test 204.8k small tries single texture",
     81         "Geo test 25.6k geo heavy vertex",
     82         "Geo test 51.2k geo heavy vertex",
     83         "Geo test 204.8k geo raster load heavy vertex",
     84         "Geo test 25.6k heavy fragment",
     85         "Geo test 51.2k heavy fragment",
     86         "Geo test 204.8k small tries heavy fragment",
     87         "Geo test 25.6k heavy fragment heavy vertex",
     88         "Geo test 51.2k heavy fragment heavy vertex",
     89         "Geo test 204.8k small tries heavy fragment heavy vertex"
     90     };
     91 
     92     public TorusTest() {
     93     }
     94 
     95     void addTest(int index, int testId, int user1, int user2) {
     96         mTests[index] = new ScriptField_TestScripts_s.Item();
     97         mTests[index].testScript = mTorusScript;
     98         mTests[index].testName = Allocation.createFromString(mRS,
     99                                                              mNames[index],
    100                                                              Allocation.USAGE_SCRIPT);
    101         mTests[index].debugName = RsBenchRS.createZeroTerminatedAlloc(mRS,
    102                                                                       mNames[index],
    103                                                                       Allocation.USAGE_SCRIPT);
    104 
    105         ScriptField_TorusTestData_s.Item dataItem = new ScriptField_TorusTestData_s.Item();
    106         dataItem.testId = testId;
    107         dataItem.user1 = user1;
    108         dataItem.user2 = user2;
    109         ScriptField_TorusTestData_s testData = new ScriptField_TorusTestData_s(mRS, 1);
    110         testData.set(dataItem, 0, true);
    111         mTests[index].testData = testData.getAllocation();
    112     }
    113 
    114     public boolean init(RenderScriptGL rs, Resources res) {
    115         mRS = rs;
    116         mRes = res;
    117         initCustomShaders();
    118         loadImages();
    119         initMesh();
    120         initTorusScript();
    121         mTests = new ScriptField_TestScripts_s.Item[mNames.length];
    122 
    123         int index = 0;
    124         addTest(index++, 0, 0 /*useTexture*/, 1 /*numMeshes*/);
    125         addTest(index++, 0, 0 /*useTexture*/, 2 /*numMeshes*/);
    126         addTest(index++, 0, 0 /*useTexture*/, 8 /*numMeshes*/);
    127         addTest(index++, 0, 1 /*useTexture*/, 1 /*numMeshes*/);
    128         addTest(index++, 0, 1 /*useTexture*/, 2 /*numMeshes*/);
    129         addTest(index++, 0, 1 /*useTexture*/, 8 /*numMeshes*/);
    130 
    131         // Secont test
    132         addTest(index++, 1, 1 /*numMeshes*/, 0 /*unused*/);
    133         addTest(index++, 1, 2 /*numMeshes*/, 0 /*unused*/);
    134         addTest(index++, 1, 8 /*numMeshes*/, 0 /*unused*/);
    135 
    136         // Third test
    137         addTest(index++, 2, 1 /*numMeshes*/, 0 /*heavyVertex*/);
    138         addTest(index++, 2, 2 /*numMeshes*/, 0 /*heavyVertex*/);
    139         addTest(index++, 2, 8 /*numMeshes*/, 0 /*heavyVertex*/);
    140         addTest(index++, 2, 1 /*numMeshes*/, 1 /*heavyVertex*/);
    141         addTest(index++, 2, 2 /*numMeshes*/, 1 /*heavyVertex*/);
    142         addTest(index++, 2, 8 /*numMeshes*/, 1 /*heavyVertex*/);
    143 
    144         return true;
    145     }
    146 
    147     public ScriptField_TestScripts_s.Item[] getTests() {
    148         return mTests;
    149     }
    150 
    151     public String[] getTestNames() {
    152         return mNames;
    153     }
    154 
    155     private void initCustomShaders() {
    156         mVSConst = new ScriptField_VertexShaderConstants_s(mRS, 1);
    157         mFSConst = new ScriptField_FragentShaderConstants_s(mRS, 1);
    158 
    159         mVSConstPixel = new ScriptField_VertexShaderConstants3_s(mRS, 1);
    160         mFSConstPixel = new ScriptField_FragentShaderConstants3_s(mRS, 1);
    161 
    162         // Initialize the shader builder
    163         ProgramVertex.Builder pvbCustom = new ProgramVertex.Builder(mRS);
    164         // Specify the resource that contains the shader string
    165         pvbCustom.setShader(mRes, R.raw.shaderv);
    166         // Use a script field to specify the input layout
    167         pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
    168         // Define the constant input layout
    169         pvbCustom.addConstant(mVSConst.getAllocation().getType());
    170         mProgVertexCustom = pvbCustom.create();
    171         // Bind the source of constant data
    172         mProgVertexCustom.bindConstants(mVSConst.getAllocation(), 0);
    173 
    174         ProgramFragment.Builder pfbCustom = new ProgramFragment.Builder(mRS);
    175         // Specify the resource that contains the shader string
    176         pfbCustom.setShader(mRes, R.raw.shaderf);
    177         // Tell the builder how many textures we have
    178         pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
    179         // Define the constant input layout
    180         pfbCustom.addConstant(mFSConst.getAllocation().getType());
    181         mProgFragmentCustom = pfbCustom.create();
    182         // Bind the source of constant data
    183         mProgFragmentCustom.bindConstants(mFSConst.getAllocation(), 0);
    184 
    185         pvbCustom = new ProgramVertex.Builder(mRS);
    186         pvbCustom.setShader(mRes, R.raw.shader2v);
    187         pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
    188         pvbCustom.addConstant(mVSConstPixel.getAllocation().getType());
    189         mProgVertexPixelLight = pvbCustom.create();
    190         mProgVertexPixelLight.bindConstants(mVSConstPixel.getAllocation(), 0);
    191 
    192         pvbCustom = new ProgramVertex.Builder(mRS);
    193         pvbCustom.setShader(mRes, R.raw.shader2movev);
    194         pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
    195         pvbCustom.addConstant(mVSConstPixel.getAllocation().getType());
    196         mProgVertexPixelLightMove = pvbCustom.create();
    197         mProgVertexPixelLightMove.bindConstants(mVSConstPixel.getAllocation(), 0);
    198 
    199         pfbCustom = new ProgramFragment.Builder(mRS);
    200         pfbCustom.setShader(mRes, R.raw.shader2f);
    201         pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
    202         pfbCustom.addConstant(mFSConstPixel.getAllocation().getType());
    203         mProgFragmentPixelLight = pfbCustom.create();
    204         mProgFragmentPixelLight.bindConstants(mFSConstPixel.getAllocation(), 0);
    205 
    206         pfbCustom = new ProgramFragment.Builder(mRS);
    207         pfbCustom.setShader(mRes, R.raw.multitexf);
    208         for (int texCount = 0; texCount < 3; texCount ++) {
    209             pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
    210         }
    211         mProgFragmentMultitex = pfbCustom.create();
    212 
    213         ProgramFragmentFixedFunction.Builder colBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
    214         colBuilder.setVaryingColor(false);
    215         mProgFragmentColor = colBuilder.create();
    216 
    217         ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
    218         texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
    219                               ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
    220         mProgFragmentTexture = texBuilder.create();
    221 
    222         ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
    223         mProgVertex = pvb.create();
    224         ProgramVertexFixedFunction.Constants PVA = new ProgramVertexFixedFunction.Constants(mRS);
    225         ((ProgramVertexFixedFunction)mProgVertex).bindConstants(PVA);
    226         Matrix4f proj = new Matrix4f();
    227         proj.loadOrthoWindow(1280, 720);
    228         PVA.setProjection(proj);
    229     }
    230 
    231     private Allocation loadTextureRGB(int id) {
    232         return Allocation.createFromBitmapResource(mRS, mRes, id,
    233                 Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
    234                 Allocation.USAGE_GRAPHICS_TEXTURE);
    235     }
    236 
    237     private void loadImages() {
    238         mTexTorus = loadTextureRGB(R.drawable.torusmap);
    239     }
    240 
    241     private void initMesh() {
    242         FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.torus);
    243         FileA3D.IndexEntry entry = model.getIndexEntry(0);
    244         if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
    245             Log.e("rs", "could not load model");
    246         } else {
    247             mTorus = (Mesh)entry.getObject();
    248         }
    249     }
    250 
    251     void initTorusScript() {
    252         mTorusScript = new ScriptC_torus_test(mRS, mRes, R.raw.torus_test);
    253         mTorusScript.set_gCullFront(ProgramRaster.CULL_FRONT(mRS));
    254         mTorusScript.set_gCullBack(ProgramRaster.CULL_BACK(mRS));
    255         mTorusScript.set_gLinearClamp(Sampler.CLAMP_LINEAR(mRS));
    256         mTorusScript.set_gTorusMesh(mTorus);
    257         mTorusScript.set_gTexTorus(mTexTorus);
    258         mTorusScript.set_gProgVertexCustom(mProgVertexCustom);
    259         mTorusScript.set_gProgFragmentCustom(mProgFragmentCustom);
    260         mTorusScript.set_gProgVertexPixelLight(mProgVertexPixelLight);
    261         mTorusScript.set_gProgVertexPixelLightMove(mProgVertexPixelLightMove);
    262         mTorusScript.set_gProgFragmentPixelLight(mProgFragmentPixelLight);
    263         mTorusScript.bind_gVSConstPixel(mVSConstPixel);
    264         mTorusScript.bind_gFSConstPixel(mFSConstPixel);
    265         mTorusScript.bind_gVSConstants(mVSConst);
    266         mTorusScript.bind_gFSConstants(mFSConst);
    267         mTorusScript.set_gProgVertex(mProgVertex);
    268         mTorusScript.set_gProgFragmentTexture(mProgFragmentTexture);
    269         mTorusScript.set_gProgFragmentColor(mProgFragmentColor);
    270         mTorusScript.set_gProgStoreBlendNoneDepth(mProgStoreBlendNoneDepth);
    271     }
    272 }
    273