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.renderscript.*;
22394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.graphics.Bitmap;
23394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.graphics.BitmapFactory;
24394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
25394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
26394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.util.Log;
27394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
28394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
29394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukpublic class FillTest implements RsBenchBaseTest{
30394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
31394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private static final String TAG = "FillTest";
32394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private RenderScriptGL mRS;
33394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Resources mRes;
34394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
35394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    // Custom shaders
36394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private ProgramFragment mProgFragmentMultitex;
37394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private ProgramFragment mProgFragmentSingletex;
38c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams    private ProgramFragment mProgFragmentSingletexModulate;
39394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options();
40394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    int mBenchmarkDimX;
41394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    int mBenchmarkDimY;
42394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
43394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private ScriptC_fill_test mFillScript;
44394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    ScriptField_TestScripts_s.Item[] mTests;
45c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams    ScriptField_FillTestFragData_s mFragData;
46394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
47394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private final String[] mNames = {
48394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "Fill screen 10x singletexture",
49394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "Fill screen 10x 3tex multitexture",
50394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "Fill screen 10x blended singletexture",
51c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        "Fill screen 10x blended 3tex multitexture",
52c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        "Fill screen 3x modulate blended singletexture",
53c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        "Fill screen 1x modulate blended singletexture",
54394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    };
55394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
56394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public FillTest() {
57394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mOptionsARGB.inScaled = false;
58394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mOptionsARGB.inPreferredConfig = Bitmap.Config.ARGB_8888;
59394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mBenchmarkDimX = 1280;
60394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mBenchmarkDimY = 720;
61394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
62394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
63394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    void addTest(int index, int testId, int blend, int quadCount) {
64394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index] = new ScriptField_TestScripts_s.Item();
65394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index].testScript = mFillScript;
66394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index].testName = Allocation.createFromString(mRS,
67394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                                                             mNames[index],
68394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                                                             Allocation.USAGE_SCRIPT);
695de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk        mTests[index].debugName = RsBenchRS.createZeroTerminatedAlloc(mRS,
705de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk                                                                      mNames[index],
715de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk                                                                      Allocation.USAGE_SCRIPT);
72394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
73394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ScriptField_FillTestData_s.Item dataItem = new ScriptField_FillTestData_s.Item();
74394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        dataItem.testId = testId;
75394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        dataItem.blend = blend;
76394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        dataItem.quadCount = quadCount;
77394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ScriptField_FillTestData_s testData = new ScriptField_FillTestData_s(mRS, 1);
78394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        testData.set(dataItem, 0, true);
79394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index].testData = testData.getAllocation();
80394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
81394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
82394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public boolean init(RenderScriptGL rs, Resources res) {
83394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mRS = rs;
84394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mRes = res;
85394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        initCustomShaders();
86394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        initFillScript();
87394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests = new ScriptField_TestScripts_s.Item[mNames.length];
88394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
89394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        int index = 0;
90394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
91394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 1 /*testId*/, 0 /*blend*/, 10 /*quadCount*/);
92394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 0 /*testId*/, 0 /*blend*/, 10 /*quadCount*/);
93394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 1 /*testId*/, 1 /*blend*/, 10 /*quadCount*/);
94394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 0 /*testId*/, 1 /*blend*/, 10 /*quadCount*/);
95c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        addTest(index++, 2 /*testId*/, 1 /*blend*/, 3 /*quadCount*/);
96c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        addTest(index++, 2 /*testId*/, 1 /*blend*/, 1 /*quadCount*/);
97394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
98394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return true;
99394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
100394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
101394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public ScriptField_TestScripts_s.Item[] getTests() {
102394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return mTests;
103394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
104394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
105394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public String[] getTestNames() {
106394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return mNames;
107394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
108394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
109394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private void initCustomShaders() {
110394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramFragment.Builder pfbCustom = new ProgramFragment.Builder(mRS);
111394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        pfbCustom.setShader(mRes, R.raw.multitexf);
112394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        for (int texCount = 0; texCount < 3; texCount ++) {
113394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
114394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
115394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mProgFragmentMultitex = pfbCustom.create();
116394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
117394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        pfbCustom = new ProgramFragment.Builder(mRS);
118394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        pfbCustom.setShader(mRes, R.raw.singletexf);
119394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
120394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mProgFragmentSingletex = pfbCustom.create();
121c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams
122c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        pfbCustom = new ProgramFragment.Builder(mRS);
123c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        pfbCustom.setShader(mRes, R.raw.singletexfm);
124c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
125c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        mFragData = new ScriptField_FillTestFragData_s(mRS, 1);
126c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        pfbCustom.addConstant(mFragData.getType());
127c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        mProgFragmentSingletexModulate = pfbCustom.create();
128c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        mProgFragmentSingletexModulate.bindConstants(mFragData.getAllocation(), 0);
129394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
130394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
131394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Allocation loadTextureARGB(int id) {
132394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        Bitmap b = BitmapFactory.decodeResource(mRes, id, mOptionsARGB);
133394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return Allocation.createFromBitmap(mRS, b,
134394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
135394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                Allocation.USAGE_GRAPHICS_TEXTURE);
136394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
137394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
138394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Allocation loadTextureRGB(int id) {
139394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return Allocation.createFromBitmapResource(mRS, mRes, id,
140394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
141394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                Allocation.USAGE_GRAPHICS_TEXTURE);
142394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
143394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
144394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    void initFillScript() {
145394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript = new ScriptC_fill_test(mRS, mRes, R.raw.fill_test);
146394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
147394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
148394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertexFixedFunction progVertex = pvb.create();
149394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertexFixedFunction.Constants PVA = new ProgramVertexFixedFunction.Constants(mRS);
150394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ((ProgramVertexFixedFunction)progVertex).bindConstants(PVA);
151394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        Matrix4f proj = new Matrix4f();
152394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        proj.loadOrthoWindow(mBenchmarkDimX, mBenchmarkDimY);
153394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        PVA.setProjection(proj);
154394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript.set_gProgVertex(progVertex);
155394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
156394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript.set_gProgFragmentTexture(mProgFragmentSingletex);
157c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        mFillScript.set_gProgFragmentTextureModulate(mProgFragmentSingletexModulate);
158394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript.set_gProgFragmentMultitex(mProgFragmentMultitex);
159394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript.set_gProgStoreBlendNone(ProgramStore.BLEND_NONE_DEPTH_NONE(mRS));
160394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript.set_gProgStoreBlendAlpha(ProgramStore.BLEND_ALPHA_DEPTH_NONE(mRS));
161394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
162394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript.set_gLinearClamp(Sampler.CLAMP_LINEAR(mRS));
163394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript.set_gLinearWrap(Sampler.WRAP_LINEAR(mRS));
164394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript.set_gTexTorus(loadTextureRGB(R.drawable.torusmap));
165394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript.set_gTexOpaque(loadTextureRGB(R.drawable.data));
166394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript.set_gTexTransparent(loadTextureARGB(R.drawable.leaf));
167394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFillScript.set_gTexChecker(loadTextureRGB(R.drawable.checker));
168c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams
169c3cff15b90e191b9d96ba383e65300e1f0807107Jason Sams        mFillScript.bind_gFragData(mFragData);
170394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
171394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk}
172