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.graphics.Bitmap;
22394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.graphics.BitmapFactory;
23394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.*;
24394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Element.DataKind;
25394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Element.DataType;
26394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Allocation.MipmapControl;
27394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Program.TextureType;
28394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.ProgramStore.DepthFunc;
29394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.ProgramStore.BlendSrcFunc;
30394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.ProgramStore.BlendDstFunc;
31394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.RenderScript.RSMessageHandler;
32394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Mesh.Primitive;
33394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.Matrix4f;
34394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.renderscript.ProgramVertexFixedFunction;
35394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
36394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukimport android.util.Log;
37394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
38394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
39394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchoukpublic class UiTest implements RsBenchBaseTest{
40394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
41394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private static final String TAG = "UiTest";
42394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private static final String SAMPLE_TEXT = "Bench Test";
43394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private static final String LIST_TEXT =
44394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk      "This is a sample list of text to show in the list view";
45394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private static int PARTICLES_COUNT = 12000;
46394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
47394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private RenderScriptGL mRS;
48394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Resources mRes;
49394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
50394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    Font mFontSans;
51394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
52394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private ScriptField_ListAllocs_s mTextureAllocs;
53394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private ScriptField_ListAllocs_s mSampleTextAllocs;
54394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private ScriptField_ListAllocs_s mSampleListViewAllocs;
55394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private ScriptField_VpConsts mPvStarAlloc;
56394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private ProgramVertexFixedFunction.Constants mPvProjectionAlloc;
57394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
58394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Mesh mSingleMesh;
59394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Mesh mParticlesMesh;
60394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
61394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private ScriptC_ui_test mUiScript;
62394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
63394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options();
64394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
65394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    ScriptField_TestScripts_s.Item[] mTests;
66394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
67394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private final String[] mNames = {
68394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "UI test with icon display 10 by 10",
69394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "UI test with icon display 100 by 100",
70394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "UI test with image and text display 3 pages",
71394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "UI test with image and text display 5 pages",
72394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "UI test with list view",
73394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        "UI test with live wallpaper"
74394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    };
75394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
76394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public UiTest() {
77394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
78394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
79394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    void addTest(int index, int testId, int user1, int user2, int user3) {
80394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index] = new ScriptField_TestScripts_s.Item();
81394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index].testScript = mUiScript;
82394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index].testName = Allocation.createFromString(mRS,
83394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                                                             mNames[index],
84394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                                                             Allocation.USAGE_SCRIPT);
855de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk        mTests[index].debugName = RsBenchRS.createZeroTerminatedAlloc(mRS,
865de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk                                                                      mNames[index],
875de7657ac2aea7ae671e2cadb05dcb6207a51404Alex Sakhartchouk                                                                      Allocation.USAGE_SCRIPT);
88394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
89394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ScriptField_UiTestData_s.Item dataItem = new ScriptField_UiTestData_s.Item();
90394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        dataItem.testId = testId;
91394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        dataItem.user1 = user1;
92394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        dataItem.user2 = user2;
93394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        dataItem.user3 = user3;
94394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ScriptField_UiTestData_s testData = new ScriptField_UiTestData_s(mRS, 1);
95394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        testData.set(dataItem, 0, true);
96394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests[index].testData = testData.getAllocation();
97394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
98394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
99394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public boolean init(RenderScriptGL rs, Resources res) {
100394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mRS = rs;
101394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mRes = res;
102394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mFontSans = Font.create(mRS, mRes, "sans-serif", Font.Style.NORMAL, 8);
103394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mSingleMesh = getSingleMesh(1, 1);  // a unit size mesh
104394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
105394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        initUiScript();
106394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTests = new ScriptField_TestScripts_s.Item[mNames.length];
107394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
108394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        int index = 0;
109394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
110394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 0, 0 /*meshMode*/, 0 /*unused*/, 0 /*unused*/);
111394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 0, 1 /*meshMode*/, 0 /*unused*/, 0 /*unused*/);
112394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 1, 7 /*wResolution*/, 5 /*hResolution*/, 0 /*meshMode*/);
113394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 1, 7 /*wResolution*/, 5 /*hResolution*/, 1 /*meshMode*/);
114394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 2, 0 /*unused*/, 0 /*unused*/, 0 /*unused*/);
115394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        addTest(index++, 3, 7 /*wResolution*/, 5 /*hResolution*/, 0 /*unused*/);
116394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
117394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return true;
118394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
119394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
120394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public ScriptField_TestScripts_s.Item[] getTests() {
121394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return mTests;
122394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
123394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
124394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    public String[] getTestNames() {
125394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return mNames;
126394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
127394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
128394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Allocation loadTextureRGB(int id) {
129394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return Allocation.createFromBitmapResource(mRS, mRes, id,
130394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
131394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                Allocation.USAGE_GRAPHICS_TEXTURE);
132394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
133394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
134394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Allocation loadTextureARGB(int id) {
135394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        Bitmap b = BitmapFactory.decodeResource(mRes, id, mOptionsARGB);
136394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return Allocation.createFromBitmap(mRS, b,
137394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
138394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                Allocation.USAGE_GRAPHICS_TEXTURE);
139394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
140394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
141394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private void createParticlesMesh() {
142394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ScriptField_Particle p = new ScriptField_Particle(mRS, PARTICLES_COUNT);
143394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
144394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        final Mesh.AllocationBuilder meshBuilder = new Mesh.AllocationBuilder(mRS);
145394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        meshBuilder.addVertexAllocation(p.getAllocation());
146394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        final int vertexSlot = meshBuilder.getCurrentVertexTypeIndex();
147394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        meshBuilder.addIndexSetType(Primitive.POINT);
148394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mParticlesMesh = meshBuilder.create();
149394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
150394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gParticlesMesh(mParticlesMesh);
151394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.bind_Particles(p);
152394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
153394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
154394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    /**
155394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk     * Create a mesh with a single quad for the given width and height.
156394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk     */
157394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Mesh getSingleMesh(float width, float height) {
158394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
159394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                                           2, Mesh.TriangleMeshBuilder.TEXTURE_0);
160394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        float xOffset = width/2;
161394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        float yOffset = height/2;
162394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        tmb.setTexture(0, 0);
163394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        tmb.addVertex(-1.0f * xOffset, -1.0f * yOffset);
164394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        tmb.setTexture(1, 0);
165394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        tmb.addVertex(xOffset, -1.0f * yOffset);
166394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        tmb.setTexture(1, 1);
167394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        tmb.addVertex(xOffset, yOffset);
168394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        tmb.setTexture(0, 1);
169394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        tmb.addVertex(-1.0f * xOffset, yOffset);
170394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        tmb.addTriangle(0, 3, 1);
171394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        tmb.addTriangle(1, 3, 2);
172394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return tmb.create(true);
173394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
174394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
175394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private Matrix4f getProjectionNormalized(int w, int h) {
176394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        // range -1,1 in the narrow axis at z = 0.
177394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        Matrix4f m1 = new Matrix4f();
178394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        Matrix4f m2 = new Matrix4f();
179394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
180394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        if(w > h) {
181394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            float aspect = ((float)w) / h;
182394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            m1.loadFrustum(-aspect,aspect,  -1,1,  1,100);
183394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        } else {
184394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            float aspect = ((float)h) / w;
185394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            m1.loadFrustum(-1,1, -aspect,aspect, 1,100);
186394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
187394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
188394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        m2.loadRotate(180, 0, 1, 0);
189394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        m1.loadMultiply(m1, m2);
190394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
191394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        m2.loadScale(-2, 2, 1);
192394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        m1.loadMultiply(m1, m2);
193394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
194394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        m2.loadTranslate(0, 0, 2);
195394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        m1.loadMultiply(m1, m2);
196394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        return m1;
197394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
198394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
199394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    private void updateProjectionMatrices() {
200394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        Matrix4f projNorm = getProjectionNormalized(1280, 720);
201394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ScriptField_VpConsts.Item i = new ScriptField_VpConsts.Item();
202394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        i.Proj = projNorm;
203394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        i.MVP = projNorm;
204394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mPvStarAlloc.set(i, 0, true);
205394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mPvProjectionAlloc.setProjection(projNorm);
206394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
207394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
208394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    void initUiScript() {
209394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript = new ScriptC_ui_test(mRS, mRes, R.raw.ui_test);
210394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
211394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramFragmentFixedFunction.Builder colBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
212394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        colBuilder.setVaryingColor(false);
213394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
214394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
215394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                              ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
216394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
217394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
218394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertexFixedFunction progVertex = pvb.create();
219394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertexFixedFunction.Constants PVA = new ProgramVertexFixedFunction.Constants(mRS);
220394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ((ProgramVertexFixedFunction)progVertex).bindConstants(PVA);
221394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        Matrix4f proj = new Matrix4f();
222394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        proj.loadOrthoWindow(1280, 720);
223394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        PVA.setProjection(proj);
224394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
225394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gProgVertex(progVertex);
226394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gProgFragmentColor(colBuilder.create());
227394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gProgFragmentTexture(texBuilder.create());
228394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gProgStoreBlendAlpha(ProgramStore.BLEND_ALPHA_DEPTH_NONE(mRS));
229394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
230394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gLinearClamp(Sampler.CLAMP_LINEAR(mRS));
231394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
232394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gTexTorus(loadTextureRGB(R.drawable.torusmap));
233394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gTexOpaque(loadTextureRGB(R.drawable.data));
234394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gTexGlobe(loadTextureRGB(R.drawable.globe));
235394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gSingleMesh(mSingleMesh);
236394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
237394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        // For GALAXY
238394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramStore.Builder psb = new ProgramStore.Builder(mRS);
239394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        psb.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
240394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mRS.bindProgramStore(psb.create());
241394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
242394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        psb.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE);
243394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gPSLights(psb.create());
244394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
245394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        // For Galaxy live wallpaper drawing
246394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramFragmentFixedFunction.Builder builder = new ProgramFragmentFixedFunction.Builder(mRS);
247394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        builder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
248394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                           ProgramFragmentFixedFunction.Builder.Format.RGB, 0);
249394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramFragment pfb = builder.create();
250394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        pfb.bindSampler(Sampler.WRAP_NEAREST(mRS), 0);
251394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gPFBackground(pfb);
252394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
253394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        builder = new ProgramFragmentFixedFunction.Builder(mRS);
254394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        builder.setPointSpriteTexCoordinateReplacement(true);
255394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        builder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.MODULATE,
256394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                           ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
257394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        builder.setVaryingColor(true);
258394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramFragment pfs = builder.create();
259394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        pfs.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0);
260394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gPFStars(pfs);
261394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
262394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTextureAllocs = new ScriptField_ListAllocs_s(mRS, 100);
263394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        for (int i = 0; i < 100; i++) {
264394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            ScriptField_ListAllocs_s.Item texElem = new ScriptField_ListAllocs_s.Item();
265394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            texElem.item = loadTextureRGB(R.drawable.globe);
266394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            mTextureAllocs.set(texElem, i, false);
267394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
268394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mTextureAllocs.copyAll();
269394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.bind_gTexList100(mTextureAllocs);
270394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
271394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mSampleTextAllocs = new ScriptField_ListAllocs_s(mRS, 100);
272394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        for (int i = 0; i < 100; i++) {
273394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            ScriptField_ListAllocs_s.Item textElem = new ScriptField_ListAllocs_s.Item();
274394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            textElem.item = Allocation.createFromString(mRS, SAMPLE_TEXT, Allocation.USAGE_SCRIPT);
275394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            mSampleTextAllocs.set(textElem, i, false);
276394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
277394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mSampleTextAllocs.copyAll();
278394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.bind_gSampleTextList100(mSampleTextAllocs);
279394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
280394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mSampleListViewAllocs = new ScriptField_ListAllocs_s(mRS, 1000);
281394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        for (int i = 0; i < 1000; i++) {
282394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            ScriptField_ListAllocs_s.Item textElem = new ScriptField_ListAllocs_s.Item();
283394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            textElem.item = Allocation.createFromString(mRS, LIST_TEXT, Allocation.USAGE_SCRIPT);
284394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk            mSampleListViewAllocs.set(textElem, i, false);
285394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        }
286394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mSampleListViewAllocs.copyAll();
287394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.bind_gListViewText(mSampleListViewAllocs);
288394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
289394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        // For galaxy live wallpaper
290394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mPvStarAlloc = new ScriptField_VpConsts(mRS, 1);
291394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.bind_vpConstants(mPvStarAlloc);
292394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mPvProjectionAlloc = new ProgramVertexFixedFunction.Constants(mRS);
293394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        updateProjectionMatrices();
294394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
295394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        pvb = new ProgramVertexFixedFunction.Builder(mRS);
296394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertex pvbp = pvb.create();
297394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ((ProgramVertexFixedFunction)pvbp).bindConstants(mPvProjectionAlloc);
298394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gPVBkProj(pvbp);
299394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
300394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        createParticlesMesh();
301394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
302394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertex.Builder sb = new ProgramVertex.Builder(mRS);
303394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        String t =  "varying vec4 varColor;\n" +
304394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "varying vec2 varTex0;\n" +
305394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "void main() {\n" +
306394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  float dist = ATTRIB_position.y;\n" +
307394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  float angle = ATTRIB_position.x;\n" +
308394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  float x = dist * sin(angle);\n" +
309394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  float y = dist * cos(angle) * 0.892;\n" +
310394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  float p = dist * 5.5;\n" +
311394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  float s = cos(p);\n" +
312394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  float t = sin(p);\n" +
313394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  vec4 pos;\n" +
314394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  pos.x = t * x + s * y;\n" +
315394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  pos.y = s * x - t * y;\n" +
316394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  pos.z = ATTRIB_position.z;\n" +
317394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  pos.w = 1.0;\n" +
318394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  gl_Position = UNI_MVP * pos;\n" +
319394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  gl_PointSize = ATTRIB_color.a * 10.0;\n" +
320394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  varColor.rgb = ATTRIB_color.rgb;\n" +
321394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "  varColor.a = 1.0;\n" +
322394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk                    "}\n";
323394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        sb.setShader(t);
324394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        sb.addInput(mParticlesMesh.getVertexAllocation(0).getType().getElement());
325394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        sb.addConstant(mPvStarAlloc.getType());
326394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        ProgramVertex pvs = sb.create();
327394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        pvs.bindConstants(mPvStarAlloc.getAllocation(), 0);
328394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gPVStars(pvs);
329394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
330394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        // For Galaxy live wallpaper
331394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gTSpace(loadTextureRGB(R.drawable.space));
332394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gTLight1(loadTextureRGB(R.drawable.light1));
333394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gTFlares(loadTextureARGB(R.drawable.flares));
334394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk
335394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk        mUiScript.set_gFontSans(mFontSans);
336394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk    }
337394956bf229c438a680ab87d4118ae06efda7a90Alex Sakhartchouk}
338