Alex Sakhartchouk | 394956b | 2011-11-15 10:35:32 -0800 | [diff] [blame] | 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.ProgramStore.DepthFunc; |
| 29 | import android.renderscript.ProgramStore.BlendSrcFunc; |
| 30 | import android.renderscript.ProgramStore.BlendDstFunc; |
| 31 | import android.renderscript.RenderScript.RSMessageHandler; |
| 32 | import android.renderscript.Mesh.Primitive; |
| 33 | import android.renderscript.Matrix4f; |
| 34 | import android.renderscript.ProgramVertexFixedFunction; |
| 35 | |
| 36 | import android.util.Log; |
| 37 | |
| 38 | |
| 39 | public class UiTest implements RsBenchBaseTest{ |
| 40 | |
| 41 | private static final String TAG = "UiTest"; |
| 42 | private static final String SAMPLE_TEXT = "Bench Test"; |
| 43 | private static final String LIST_TEXT = |
| 44 | "This is a sample list of text to show in the list view"; |
| 45 | private static int PARTICLES_COUNT = 12000; |
| 46 | |
| 47 | private RenderScriptGL mRS; |
| 48 | private Resources mRes; |
| 49 | |
| 50 | Font mFontSans; |
| 51 | |
| 52 | private ScriptField_ListAllocs_s mTextureAllocs; |
| 53 | private ScriptField_ListAllocs_s mSampleTextAllocs; |
| 54 | private ScriptField_ListAllocs_s mSampleListViewAllocs; |
| 55 | private ScriptField_VpConsts mPvStarAlloc; |
| 56 | private ProgramVertexFixedFunction.Constants mPvProjectionAlloc; |
| 57 | |
| 58 | private Mesh mSingleMesh; |
| 59 | private Mesh mParticlesMesh; |
| 60 | |
| 61 | private ScriptC_ui_test mUiScript; |
| 62 | |
| 63 | private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options(); |
| 64 | |
| 65 | ScriptField_TestScripts_s.Item[] mTests; |
| 66 | |
| 67 | private final String[] mNames = { |
| 68 | "UI test with icon display 10 by 10", |
| 69 | "UI test with icon display 100 by 100", |
| 70 | "UI test with image and text display 3 pages", |
| 71 | "UI test with image and text display 5 pages", |
| 72 | "UI test with list view", |
| 73 | "UI test with live wallpaper" |
| 74 | }; |
| 75 | |
| 76 | public UiTest() { |
| 77 | } |
| 78 | |
| 79 | void addTest(int index, int testId, int user1, int user2, int user3) { |
| 80 | mTests[index] = new ScriptField_TestScripts_s.Item(); |
| 81 | mTests[index].testScript = mUiScript; |
| 82 | mTests[index].testName = Allocation.createFromString(mRS, |
| 83 | mNames[index], |
| 84 | Allocation.USAGE_SCRIPT); |
Alex Sakhartchouk | 5de7657 | 2011-12-06 14:49:12 -0800 | [diff] [blame] | 85 | mTests[index].debugName = RsBenchRS.createZeroTerminatedAlloc(mRS, |
| 86 | mNames[index], |
| 87 | Allocation.USAGE_SCRIPT); |
Alex Sakhartchouk | 394956b | 2011-11-15 10:35:32 -0800 | [diff] [blame] | 88 | |
| 89 | ScriptField_UiTestData_s.Item dataItem = new ScriptField_UiTestData_s.Item(); |
| 90 | dataItem.testId = testId; |
| 91 | dataItem.user1 = user1; |
| 92 | dataItem.user2 = user2; |
| 93 | dataItem.user3 = user3; |
| 94 | ScriptField_UiTestData_s testData = new ScriptField_UiTestData_s(mRS, 1); |
| 95 | testData.set(dataItem, 0, true); |
| 96 | mTests[index].testData = testData.getAllocation(); |
| 97 | } |
| 98 | |
| 99 | public boolean init(RenderScriptGL rs, Resources res) { |
| 100 | mRS = rs; |
| 101 | mRes = res; |
| 102 | mFontSans = Font.create(mRS, mRes, "sans-serif", Font.Style.NORMAL, 8); |
| 103 | mSingleMesh = getSingleMesh(1, 1); // a unit size mesh |
| 104 | |
| 105 | initUiScript(); |
| 106 | mTests = new ScriptField_TestScripts_s.Item[mNames.length]; |
| 107 | |
| 108 | int index = 0; |
| 109 | |
| 110 | addTest(index++, 0, 0 /*meshMode*/, 0 /*unused*/, 0 /*unused*/); |
| 111 | addTest(index++, 0, 1 /*meshMode*/, 0 /*unused*/, 0 /*unused*/); |
| 112 | addTest(index++, 1, 7 /*wResolution*/, 5 /*hResolution*/, 0 /*meshMode*/); |
| 113 | addTest(index++, 1, 7 /*wResolution*/, 5 /*hResolution*/, 1 /*meshMode*/); |
| 114 | addTest(index++, 2, 0 /*unused*/, 0 /*unused*/, 0 /*unused*/); |
| 115 | addTest(index++, 3, 7 /*wResolution*/, 5 /*hResolution*/, 0 /*unused*/); |
| 116 | |
| 117 | return true; |
| 118 | } |
| 119 | |
| 120 | public ScriptField_TestScripts_s.Item[] getTests() { |
| 121 | return mTests; |
| 122 | } |
| 123 | |
| 124 | public String[] getTestNames() { |
| 125 | return mNames; |
| 126 | } |
| 127 | |
| 128 | private Allocation loadTextureRGB(int id) { |
| 129 | return Allocation.createFromBitmapResource(mRS, mRes, id, |
| 130 | Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, |
| 131 | Allocation.USAGE_GRAPHICS_TEXTURE); |
| 132 | } |
| 133 | |
| 134 | private Allocation loadTextureARGB(int id) { |
| 135 | Bitmap b = BitmapFactory.decodeResource(mRes, id, mOptionsARGB); |
| 136 | return Allocation.createFromBitmap(mRS, b, |
| 137 | Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, |
| 138 | Allocation.USAGE_GRAPHICS_TEXTURE); |
| 139 | } |
| 140 | |
| 141 | private void createParticlesMesh() { |
| 142 | ScriptField_Particle p = new ScriptField_Particle(mRS, PARTICLES_COUNT); |
| 143 | |
| 144 | final Mesh.AllocationBuilder meshBuilder = new Mesh.AllocationBuilder(mRS); |
| 145 | meshBuilder.addVertexAllocation(p.getAllocation()); |
| 146 | final int vertexSlot = meshBuilder.getCurrentVertexTypeIndex(); |
| 147 | meshBuilder.addIndexSetType(Primitive.POINT); |
| 148 | mParticlesMesh = meshBuilder.create(); |
| 149 | |
| 150 | mUiScript.set_gParticlesMesh(mParticlesMesh); |
| 151 | mUiScript.bind_Particles(p); |
| 152 | } |
| 153 | |
| 154 | /** |
| 155 | * Create a mesh with a single quad for the given width and height. |
| 156 | */ |
| 157 | private Mesh getSingleMesh(float width, float height) { |
| 158 | Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS, |
| 159 | 2, Mesh.TriangleMeshBuilder.TEXTURE_0); |
| 160 | float xOffset = width/2; |
| 161 | float yOffset = height/2; |
| 162 | tmb.setTexture(0, 0); |
| 163 | tmb.addVertex(-1.0f * xOffset, -1.0f * yOffset); |
| 164 | tmb.setTexture(1, 0); |
| 165 | tmb.addVertex(xOffset, -1.0f * yOffset); |
| 166 | tmb.setTexture(1, 1); |
| 167 | tmb.addVertex(xOffset, yOffset); |
| 168 | tmb.setTexture(0, 1); |
| 169 | tmb.addVertex(-1.0f * xOffset, yOffset); |
| 170 | tmb.addTriangle(0, 3, 1); |
| 171 | tmb.addTriangle(1, 3, 2); |
| 172 | return tmb.create(true); |
| 173 | } |
| 174 | |
| 175 | private Matrix4f getProjectionNormalized(int w, int h) { |
| 176 | // range -1,1 in the narrow axis at z = 0. |
| 177 | Matrix4f m1 = new Matrix4f(); |
| 178 | Matrix4f m2 = new Matrix4f(); |
| 179 | |
| 180 | if(w > h) { |
| 181 | float aspect = ((float)w) / h; |
| 182 | m1.loadFrustum(-aspect,aspect, -1,1, 1,100); |
| 183 | } else { |
| 184 | float aspect = ((float)h) / w; |
| 185 | m1.loadFrustum(-1,1, -aspect,aspect, 1,100); |
| 186 | } |
| 187 | |
| 188 | m2.loadRotate(180, 0, 1, 0); |
| 189 | m1.loadMultiply(m1, m2); |
| 190 | |
| 191 | m2.loadScale(-2, 2, 1); |
| 192 | m1.loadMultiply(m1, m2); |
| 193 | |
| 194 | m2.loadTranslate(0, 0, 2); |
| 195 | m1.loadMultiply(m1, m2); |
| 196 | return m1; |
| 197 | } |
| 198 | |
| 199 | private void updateProjectionMatrices() { |
| 200 | Matrix4f projNorm = getProjectionNormalized(1280, 720); |
| 201 | ScriptField_VpConsts.Item i = new ScriptField_VpConsts.Item(); |
| 202 | i.Proj = projNorm; |
| 203 | i.MVP = projNorm; |
| 204 | mPvStarAlloc.set(i, 0, true); |
| 205 | mPvProjectionAlloc.setProjection(projNorm); |
| 206 | } |
| 207 | |
| 208 | void initUiScript() { |
| 209 | mUiScript = new ScriptC_ui_test(mRS, mRes, R.raw.ui_test); |
| 210 | |
| 211 | ProgramFragmentFixedFunction.Builder colBuilder = new ProgramFragmentFixedFunction.Builder(mRS); |
| 212 | colBuilder.setVaryingColor(false); |
| 213 | ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(mRS); |
| 214 | texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, |
| 215 | ProgramFragmentFixedFunction.Builder.Format.RGBA, 0); |
| 216 | |
| 217 | ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS); |
| 218 | ProgramVertexFixedFunction progVertex = pvb.create(); |
| 219 | ProgramVertexFixedFunction.Constants PVA = new ProgramVertexFixedFunction.Constants(mRS); |
| 220 | ((ProgramVertexFixedFunction)progVertex).bindConstants(PVA); |
| 221 | Matrix4f proj = new Matrix4f(); |
| 222 | proj.loadOrthoWindow(1280, 720); |
| 223 | PVA.setProjection(proj); |
| 224 | |
| 225 | mUiScript.set_gProgVertex(progVertex); |
| 226 | mUiScript.set_gProgFragmentColor(colBuilder.create()); |
| 227 | mUiScript.set_gProgFragmentTexture(texBuilder.create()); |
| 228 | mUiScript.set_gProgStoreBlendAlpha(ProgramStore.BLEND_ALPHA_DEPTH_NONE(mRS)); |
| 229 | |
| 230 | mUiScript.set_gLinearClamp(Sampler.CLAMP_LINEAR(mRS)); |
| 231 | |
| 232 | mUiScript.set_gTexTorus(loadTextureRGB(R.drawable.torusmap)); |
| 233 | mUiScript.set_gTexOpaque(loadTextureRGB(R.drawable.data)); |
| 234 | mUiScript.set_gTexGlobe(loadTextureRGB(R.drawable.globe)); |
| 235 | mUiScript.set_gSingleMesh(mSingleMesh); |
| 236 | |
| 237 | // For GALAXY |
| 238 | ProgramStore.Builder psb = new ProgramStore.Builder(mRS); |
| 239 | psb.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO); |
| 240 | mRS.bindProgramStore(psb.create()); |
| 241 | |
| 242 | psb.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE); |
| 243 | mUiScript.set_gPSLights(psb.create()); |
| 244 | |
| 245 | // For Galaxy live wallpaper drawing |
| 246 | ProgramFragmentFixedFunction.Builder builder = new ProgramFragmentFixedFunction.Builder(mRS); |
| 247 | builder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, |
| 248 | ProgramFragmentFixedFunction.Builder.Format.RGB, 0); |
| 249 | ProgramFragment pfb = builder.create(); |
| 250 | pfb.bindSampler(Sampler.WRAP_NEAREST(mRS), 0); |
| 251 | mUiScript.set_gPFBackground(pfb); |
| 252 | |
| 253 | builder = new ProgramFragmentFixedFunction.Builder(mRS); |
| 254 | builder.setPointSpriteTexCoordinateReplacement(true); |
| 255 | builder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.MODULATE, |
| 256 | ProgramFragmentFixedFunction.Builder.Format.RGBA, 0); |
| 257 | builder.setVaryingColor(true); |
| 258 | ProgramFragment pfs = builder.create(); |
| 259 | pfs.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); |
| 260 | mUiScript.set_gPFStars(pfs); |
| 261 | |
| 262 | mTextureAllocs = new ScriptField_ListAllocs_s(mRS, 100); |
| 263 | for (int i = 0; i < 100; i++) { |
| 264 | ScriptField_ListAllocs_s.Item texElem = new ScriptField_ListAllocs_s.Item(); |
| 265 | texElem.item = loadTextureRGB(R.drawable.globe); |
| 266 | mTextureAllocs.set(texElem, i, false); |
| 267 | } |
| 268 | mTextureAllocs.copyAll(); |
| 269 | mUiScript.bind_gTexList100(mTextureAllocs); |
| 270 | |
| 271 | mSampleTextAllocs = new ScriptField_ListAllocs_s(mRS, 100); |
| 272 | for (int i = 0; i < 100; i++) { |
| 273 | ScriptField_ListAllocs_s.Item textElem = new ScriptField_ListAllocs_s.Item(); |
| 274 | textElem.item = Allocation.createFromString(mRS, SAMPLE_TEXT, Allocation.USAGE_SCRIPT); |
| 275 | mSampleTextAllocs.set(textElem, i, false); |
| 276 | } |
| 277 | mSampleTextAllocs.copyAll(); |
| 278 | mUiScript.bind_gSampleTextList100(mSampleTextAllocs); |
| 279 | |
| 280 | mSampleListViewAllocs = new ScriptField_ListAllocs_s(mRS, 1000); |
| 281 | for (int i = 0; i < 1000; i++) { |
| 282 | ScriptField_ListAllocs_s.Item textElem = new ScriptField_ListAllocs_s.Item(); |
| 283 | textElem.item = Allocation.createFromString(mRS, LIST_TEXT, Allocation.USAGE_SCRIPT); |
| 284 | mSampleListViewAllocs.set(textElem, i, false); |
| 285 | } |
| 286 | mSampleListViewAllocs.copyAll(); |
| 287 | mUiScript.bind_gListViewText(mSampleListViewAllocs); |
| 288 | |
| 289 | // For galaxy live wallpaper |
| 290 | mPvStarAlloc = new ScriptField_VpConsts(mRS, 1); |
| 291 | mUiScript.bind_vpConstants(mPvStarAlloc); |
| 292 | mPvProjectionAlloc = new ProgramVertexFixedFunction.Constants(mRS); |
| 293 | updateProjectionMatrices(); |
| 294 | |
| 295 | pvb = new ProgramVertexFixedFunction.Builder(mRS); |
| 296 | ProgramVertex pvbp = pvb.create(); |
| 297 | ((ProgramVertexFixedFunction)pvbp).bindConstants(mPvProjectionAlloc); |
| 298 | mUiScript.set_gPVBkProj(pvbp); |
| 299 | |
| 300 | createParticlesMesh(); |
| 301 | |
| 302 | ProgramVertex.Builder sb = new ProgramVertex.Builder(mRS); |
| 303 | String t = "varying vec4 varColor;\n" + |
| 304 | "varying vec2 varTex0;\n" + |
| 305 | "void main() {\n" + |
| 306 | " float dist = ATTRIB_position.y;\n" + |
| 307 | " float angle = ATTRIB_position.x;\n" + |
| 308 | " float x = dist * sin(angle);\n" + |
| 309 | " float y = dist * cos(angle) * 0.892;\n" + |
| 310 | " float p = dist * 5.5;\n" + |
| 311 | " float s = cos(p);\n" + |
| 312 | " float t = sin(p);\n" + |
| 313 | " vec4 pos;\n" + |
| 314 | " pos.x = t * x + s * y;\n" + |
| 315 | " pos.y = s * x - t * y;\n" + |
| 316 | " pos.z = ATTRIB_position.z;\n" + |
| 317 | " pos.w = 1.0;\n" + |
| 318 | " gl_Position = UNI_MVP * pos;\n" + |
| 319 | " gl_PointSize = ATTRIB_color.a * 10.0;\n" + |
| 320 | " varColor.rgb = ATTRIB_color.rgb;\n" + |
| 321 | " varColor.a = 1.0;\n" + |
| 322 | "}\n"; |
| 323 | sb.setShader(t); |
| 324 | sb.addInput(mParticlesMesh.getVertexAllocation(0).getType().getElement()); |
| 325 | sb.addConstant(mPvStarAlloc.getType()); |
| 326 | ProgramVertex pvs = sb.create(); |
| 327 | pvs.bindConstants(mPvStarAlloc.getAllocation(), 0); |
| 328 | mUiScript.set_gPVStars(pvs); |
| 329 | |
| 330 | // For Galaxy live wallpaper |
| 331 | mUiScript.set_gTSpace(loadTextureRGB(R.drawable.space)); |
| 332 | mUiScript.set_gTLight1(loadTextureRGB(R.drawable.light1)); |
| 333 | mUiScript.set_gTFlares(loadTextureARGB(R.drawable.flares)); |
| 334 | |
| 335 | mUiScript.set_gFontSans(mFontSans); |
| 336 | } |
| 337 | } |