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.rs.imagejb; 18 19 20 import android.app.Activity; 21 import android.os.Bundle; 22 import android.os.Environment; 23 import android.test.ActivityInstrumentationTestCase2; 24 import android.test.suitebuilder.annotation.MediumTest; 25 import android.util.Log; 26 27 import com.android.rs.imagejb.IPTestListJB.TestName; 28 29 import java.io.BufferedWriter; 30 import java.io.File; 31 import java.io.FileWriter; 32 import java.io.IOException; 33 34 /** 35 * ImageProcessing benchmark test. 36 * To run the test, please use command 37 * 38 * adb shell am instrument -w com.android.rs.imagejb/androidx.test.runner.AndroidJUnitRunner 39 * 40 */ 41 public class ImageProcessingTest extends ActivityInstrumentationTestCase2<ImageProcessingActivityJB> { 42 private final String TAG = "ImageProcessingTest"; 43 // Only run 1 iteration now to fit the MediumTest time requirement. 44 // One iteration means running the tests continuous for 1s. 45 private ImageProcessingActivityJB mActivity; 46 ImageProcessingTest()47 public ImageProcessingTest() { 48 super(ImageProcessingActivityJB.class); 49 } 50 51 52 // Initialize the parameter for ImageProcessingActivityJB. prepareTest()53 protected void prepareTest() { 54 mActivity = getActivity(); 55 mActivity.prepareInstrumentationTest(); 56 } 57 58 @Override setUp()59 public void setUp() throws Exception { 60 super.setUp(); 61 prepareTest(); 62 setActivityInitialTouchMode(false); 63 } 64 65 @Override tearDown()66 public void tearDown() throws Exception { 67 if (mActivity.mProcessor != null) { 68 mActivity.mProcessor.exit(); 69 mActivity.mProcessor = null; 70 } 71 super.tearDown(); 72 } 73 74 class TestAction implements Runnable { 75 private TestName mTestName; 76 private Result mResult; TestAction(TestName testName)77 public TestAction(TestName testName) { 78 mTestName = testName; 79 } run()80 public void run() { 81 mResult = mActivity.mProcessor.getInstrumentationResult(mTestName); 82 Log.v(TAG, "Benchmark for test \"" + mTestName.toString() + "\" is: " + 83 mResult.getAvg() * 1000.f); 84 synchronized(this) { 85 this.notify(); 86 } 87 } getBenchmark()88 public Result getBenchmark() { 89 return mResult; 90 } 91 } 92 93 // Set the benchmark thread to run on ui thread 94 // Synchronized the thread such that the test will wait for the benchmark thread to finish runOnUiThread(Runnable action)95 public void runOnUiThread(Runnable action) { 96 synchronized(action) { 97 mActivity.runOnUiThread(action); 98 try { 99 action.wait(); 100 } catch (InterruptedException e) { 101 Log.v(TAG, "waiting for action running on UI thread is interrupted: " + 102 e.toString()); 103 } 104 } 105 } 106 107 // TODO: Report more info: mean, median, std, etc. runTest(TestAction ta, String testName)108 public void runTest(TestAction ta, String testName) { 109 runOnUiThread(ta); 110 Result times = ta.getBenchmark(); 111 112 // post result to INSTRUMENTATION_STATUS 113 Bundle results = new Bundle(); 114 results.putFloat(testName + "_avg", times.getAvg() * 1000.0f); // ms 115 results.putFloat(testName + "_stdevp", times.getStdevp() * 1000.0f); // ms 116 results.putFloat(testName + "_stdcoef", times.getStdCoef() * 100.0f); // % 117 getInstrumentation().sendStatus(Activity.RESULT_OK, results); 118 119 // save the runtime distribution to a file on the sdcard so a script can plot it 120 writeResults("rsTimes/", testName + "_DATA.txt", times); 121 } 122 writeResults(String directory, String filename, Result times)123 private void writeResults(String directory, String filename, Result times) { 124 // write result into a file 125 File externalStorage = Environment.getExternalStorageDirectory(); 126 if (!externalStorage.canWrite()) { 127 Log.v(TAG, "sdcard is not writable"); 128 return; 129 } 130 File resultDirectory = new File(externalStorage, directory); 131 resultDirectory.mkdirs(); 132 File resultFile = new File(externalStorage, directory + filename); 133 resultFile.setWritable(true, false); 134 try { 135 BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile)); 136 Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath()); 137 138 float[] datapoints = times.getTimes(); 139 for (int i = 0; i < times.getIterations(); i++) { 140 rsWriter.write(String.format("%d %f\n", i, datapoints[i] * 1000.0)); 141 } 142 rsWriter.close(); 143 } catch (IOException e) { 144 Log.v(TAG, "Unable to write result file " + e.getMessage()); 145 } 146 } 147 148 // Test case 0: Levels Vec3 Relaxed 149 @MediumTest testLevelsVec3Relaxed()150 public void testLevelsVec3Relaxed() { 151 TestAction ta = new TestAction(TestName.LEVELS_VEC3_RELAXED); 152 runTest(ta, TestName.LEVELS_VEC3_RELAXED.name()); 153 } 154 155 // Test case 1: Levels Vec4 Relaxed 156 @MediumTest testLevelsVec4Relaxed()157 public void testLevelsVec4Relaxed() { 158 TestAction ta = new TestAction(TestName.LEVELS_VEC4_RELAXED); 159 runTest(ta, TestName.LEVELS_VEC4_RELAXED.name()); 160 } 161 162 // Test case 2: Levels Vec3 Full 163 @MediumTest testLevelsVec3Full()164 public void testLevelsVec3Full() { 165 TestAction ta = new TestAction(TestName.LEVELS_VEC3_FULL); 166 runTest(ta, TestName.LEVELS_VEC3_FULL.name()); 167 } 168 169 // Test case 3: Levels Vec4 Full 170 @MediumTest testLevelsVec4Full()171 public void testLevelsVec4Full() { 172 TestAction ta = new TestAction(TestName.LEVELS_VEC4_FULL); 173 runTest(ta, TestName.LEVELS_VEC4_FULL.name()); 174 } 175 176 // Test case 4: Blur Radius 25 177 @MediumTest testBlurRadius25()178 public void testBlurRadius25() { 179 TestAction ta = new TestAction(TestName.BLUR_RADIUS_25); 180 runTest(ta, TestName.BLUR_RADIUS_25.name()); 181 } 182 183 // Test case 5: Intrinsic Blur Radius 25 184 @MediumTest testIntrinsicBlurRadius25()185 public void testIntrinsicBlurRadius25() { 186 TestAction ta = new TestAction(TestName.INTRINSIC_BLUR_RADIUS_25); 187 runTest(ta, TestName.INTRINSIC_BLUR_RADIUS_25.name()); 188 } 189 190 // Test case 6: Greyscale 191 @MediumTest testGreyscale()192 public void testGreyscale() { 193 TestAction ta = new TestAction(TestName.GREYSCALE); 194 runTest(ta, TestName.GREYSCALE.name()); 195 } 196 197 // Test case 7: Grain 198 @MediumTest testGrain()199 public void testGrain() { 200 TestAction ta = new TestAction(TestName.GRAIN); 201 runTest(ta, TestName.GRAIN.name()); 202 } 203 204 // Test case 8: Fisheye Full 205 @MediumTest testFisheyeFull()206 public void testFisheyeFull() { 207 TestAction ta = new TestAction(TestName.FISHEYE_FULL); 208 runTest(ta, TestName.FISHEYE_FULL.name()); 209 } 210 211 // Test case 9: Fisheye Relaxed 212 @MediumTest testFishEyeRelaxed()213 public void testFishEyeRelaxed() { 214 TestAction ta = new TestAction(TestName.FISHEYE_RELAXED); 215 runTest(ta, TestName.FISHEYE_RELAXED.name()); 216 } 217 218 // Test case 10: Fisheye Approximate Full 219 @MediumTest testFisheyeApproximateFull()220 public void testFisheyeApproximateFull() { 221 TestAction ta = new TestAction(TestName.FISHEYE_APPROXIMATE_FULL); 222 runTest(ta, TestName.FISHEYE_APPROXIMATE_FULL.name()); 223 } 224 225 // Test case 11: Fisheye Approximate Relaxed 226 @MediumTest testFisheyeApproximateRelaxed()227 public void testFisheyeApproximateRelaxed() { 228 TestAction ta = new TestAction(TestName.FISHEYE_APPROXIMATE_RELAXED); 229 runTest(ta, TestName.FISHEYE_APPROXIMATE_RELAXED.name()); 230 } 231 232 // Test case 12: Vignette Full 233 @MediumTest testVignetteFull()234 public void testVignetteFull() { 235 TestAction ta = new TestAction(TestName.VIGNETTE_FULL); 236 runTest(ta, TestName.VIGNETTE_FULL.name()); 237 } 238 239 // Test case 13: Vignette Relaxed 240 @MediumTest testVignetteRelaxed()241 public void testVignetteRelaxed() { 242 TestAction ta = new TestAction(TestName.VIGNETTE_RELAXED); 243 runTest(ta, TestName.VIGNETTE_RELAXED.name()); 244 } 245 246 // Test case 14: Vignette Approximate Full 247 @MediumTest testVignetteApproximateFull()248 public void testVignetteApproximateFull() { 249 TestAction ta = new TestAction(TestName.VIGNETTE_APPROXIMATE_FULL); 250 runTest(ta, TestName.VIGNETTE_APPROXIMATE_FULL.name()); 251 } 252 253 // Test case 15: Vignette Approximate Relaxed 254 @MediumTest testVignetteApproximateRelaxed()255 public void testVignetteApproximateRelaxed() { 256 TestAction ta = new TestAction(TestName.VIGNETTE_APPROXIMATE_RELAXED); 257 runTest(ta, TestName.VIGNETTE_APPROXIMATE_RELAXED.name()); 258 } 259 260 // Test case 16: Group Test (emulated) 261 @MediumTest testGroupTestEmulated()262 public void testGroupTestEmulated() { 263 TestAction ta = new TestAction(TestName.GROUP_TEST_EMULATED); 264 runTest(ta, TestName.GROUP_TEST_EMULATED.name()); 265 } 266 267 // Test case 17: Group Test (native) 268 @MediumTest testGroupTestNative()269 public void testGroupTestNative() { 270 TestAction ta = new TestAction(TestName.GROUP_TEST_NATIVE); 271 runTest(ta, TestName.GROUP_TEST_NATIVE.name()); 272 } 273 274 // Test case 18: Convolve 3x3 275 @MediumTest testConvolve3x3()276 public void testConvolve3x3() { 277 TestAction ta = new TestAction(TestName.CONVOLVE_3X3); 278 runTest(ta, TestName.CONVOLVE_3X3.name()); 279 } 280 281 // Test case 19: Intrinsics Convolve 3x3 282 @MediumTest testIntrinsicsConvolve3x3()283 public void testIntrinsicsConvolve3x3() { 284 TestAction ta = new TestAction(TestName.INTRINSICS_CONVOLVE_3X3); 285 runTest(ta, TestName.INTRINSICS_CONVOLVE_3X3.name()); 286 } 287 288 // Test case 20: ColorMatrix 289 @MediumTest testColorMatrix()290 public void testColorMatrix() { 291 TestAction ta = new TestAction(TestName.COLOR_MATRIX); 292 runTest(ta, TestName.COLOR_MATRIX.name()); 293 } 294 295 // Test case 21: Intrinsics ColorMatrix 296 @MediumTest testIntrinsicsColorMatrix()297 public void testIntrinsicsColorMatrix() { 298 TestAction ta = new TestAction(TestName.INTRINSICS_COLOR_MATRIX); 299 runTest(ta, TestName.INTRINSICS_COLOR_MATRIX.name()); 300 } 301 302 // Test case 22: Intrinsics ColorMatrix Grey 303 @MediumTest testIntrinsicsColorMatrixGrey()304 public void testIntrinsicsColorMatrixGrey() { 305 TestAction ta = new TestAction(TestName.INTRINSICS_COLOR_MATRIX_GREY); 306 runTest(ta, TestName.INTRINSICS_COLOR_MATRIX_GREY.name()); 307 } 308 309 // Test case 23: Copy 310 @MediumTest testCopy()311 public void testCopy() { 312 TestAction ta = new TestAction(TestName.COPY); 313 runTest(ta, TestName.COPY.name()); 314 } 315 316 // Test case 24: CrossProcess (using LUT) 317 @MediumTest testCrossProcessUsingLUT()318 public void testCrossProcessUsingLUT() { 319 TestAction ta = new TestAction(TestName.CROSS_PROCESS_USING_LUT); 320 runTest(ta, TestName.CROSS_PROCESS_USING_LUT.name()); 321 } 322 323 // Test case 25: Convolve 5x5 324 @MediumTest testConvolve5x5()325 public void testConvolve5x5() { 326 TestAction ta = new TestAction(TestName.CONVOLVE_5X5); 327 runTest(ta, TestName.CONVOLVE_5X5.name()); 328 } 329 330 // Test case 26: Intrinsics Convolve 5x5 331 @MediumTest testIntrinsicsConvolve5x5()332 public void testIntrinsicsConvolve5x5() { 333 TestAction ta = new TestAction(TestName.INTRINSICS_CONVOLVE_5X5); 334 runTest(ta, TestName.INTRINSICS_CONVOLVE_5X5.name()); 335 } 336 337 // Test case 27: Mandelbrot 338 @MediumTest testMandelbrot()339 public void testMandelbrot() { 340 TestAction ta = new TestAction(TestName.MANDELBROT_FLOAT); 341 runTest(ta, TestName.MANDELBROT_FLOAT.name()); 342 } 343 344 // Test case 28: Intrinsics Blend 345 @MediumTest testIntrinsicsBlend()346 public void testIntrinsicsBlend() { 347 TestAction ta = new TestAction(TestName.INTRINSICS_BLEND); 348 runTest(ta, TestName.INTRINSICS_BLEND.name()); 349 } 350 351 // Test case 29: Intrinsics Blur 25 uchar 352 @MediumTest testIntrinsicsBlur25G()353 public void testIntrinsicsBlur25G() { 354 TestAction ta = new TestAction(TestName.INTRINSICS_BLUR_25G); 355 runTest(ta, TestName.INTRINSICS_BLUR_25G.name()); 356 } 357 358 // Test case 30: Vibrance 359 @MediumTest testVibrance()360 public void testVibrance() { 361 TestAction ta = new TestAction(TestName.VIBRANCE); 362 runTest(ta, TestName.VIBRANCE.name()); 363 } 364 365 // Test case 31: BWFilter 366 @MediumTest testBWFilter()367 public void testBWFilter() { 368 TestAction ta = new TestAction(TestName.BW_FILTER); 369 runTest(ta, TestName.BW_FILTER.name()); 370 } 371 372 // Test case 32: Shadows 373 @MediumTest testShadows()374 public void testShadows() { 375 TestAction ta = new TestAction(TestName.SHADOWS); 376 runTest(ta, TestName.SHADOWS.name()); 377 } 378 379 // Test case 33: Contrast 380 @MediumTest testContrast()381 public void testContrast() { 382 TestAction ta = new TestAction(TestName.CONTRAST); 383 runTest(ta, TestName.CONTRAST.name()); 384 } 385 386 // Test case 34: Exposure 387 @MediumTest testExposure()388 public void testExposure(){ 389 TestAction ta = new TestAction(TestName.EXPOSURE); 390 runTest(ta, TestName.EXPOSURE.name()); 391 } 392 393 // Test case 35: White Balance 394 @MediumTest testWhiteBalance()395 public void testWhiteBalance() { 396 TestAction ta = new TestAction(TestName.WHITE_BALANCE); 397 runTest(ta, TestName.WHITE_BALANCE.name()); 398 } 399 400 // Test case 36: Color Cube 401 @MediumTest testColorCube()402 public void testColorCube() { 403 TestAction ta = new TestAction(TestName.COLOR_CUBE); 404 runTest(ta, TestName.COLOR_CUBE.name()); 405 } 406 407 // Test case 37: Color Cube (3D Intrinsic) 408 @MediumTest testColorCube3DIntrinsic()409 public void testColorCube3DIntrinsic() { 410 TestAction ta = new TestAction(TestName.COLOR_CUBE_3D_INTRINSIC); 411 runTest(ta, TestName.COLOR_CUBE_3D_INTRINSIC.name()); 412 } 413 414 // Test case 38: Artistic 1 415 @MediumTest testArtistic1()416 public void testArtistic1() { 417 TestAction ta = new TestAction(TestName.ARTISTIC1); 418 runTest(ta, TestName.ARTISTIC1.name()); 419 } 420 421 // Test case 39: Resize BiCubic Script 422 @MediumTest testResizeBiCubicScript()423 public void testResizeBiCubicScript() { 424 TestAction ta = new TestAction(TestName.RESIZE_BI_SCRIPT); 425 runTest(ta, TestName.RESIZE_BI_SCRIPT.name()); 426 } 427 428 // Test case 40: Resize BiCubic Intrinsic 429 @MediumTest testResizeBiCubicIntrinsic()430 public void testResizeBiCubicIntrinsic() { 431 TestAction ta = new TestAction(TestName.RESIZE_BI_INTRINSIC); 432 runTest(ta, TestName.RESIZE_BI_INTRINSIC.name()); 433 } 434 435 // Test case 41: Posterize with invoke 436 @MediumTest testPosterizeInvoke()437 public void testPosterizeInvoke() { 438 TestAction ta = new TestAction(TestName.POSTERIZE_INVOKE); 439 runTest(ta, TestName.POSTERIZE_INVOKE.name()); 440 } 441 442 // Test case 42: Posterize with set 443 @MediumTest testPosterizeSet()444 public void testPosterizeSet() { 445 TestAction ta = new TestAction(TestName.POSTERIZE_SET); 446 runTest(ta, TestName.POSTERIZE_SET.name()); 447 } 448 449 // Test case 43 Histogram intrinsic 450 @MediumTest testHistogramIntrinsic()451 public void testHistogramIntrinsic() { 452 TestAction ta = new TestAction(TestName.HISTOGRAM_INTRINSIC); 453 runTest(ta, TestName.HISTOGRAM_INTRINSIC.name()); 454 } 455 456 // Test case 44 Histogram script 457 @MediumTest testHistogramScript()458 public void testHistogramScript() { 459 TestAction ta = new TestAction(TestName.HISTOGRAM_SCRIPT); 460 runTest(ta, TestName.HISTOGRAM_SCRIPT.name()); 461 } 462 463 // Test case 45: Mandelbrot fp64 464 @MediumTest testMandelbrotfp64()465 public void testMandelbrotfp64() { 466 TestAction ta = new TestAction(TestName.MANDELBROT_DOUBLE); 467 runTest(ta, TestName.MANDELBROT_DOUBLE.name()); 468 } 469 470 // Test case 46: Blur Radius 25 Half Precision 471 @MediumTest testBlurRadius25Half()472 public void testBlurRadius25Half() { 473 TestAction ta = new TestAction(TestName.BLUR_RADIUS_25_HALF); 474 runTest(ta, TestName.BLUR_RADIUS_25_HALF.name()); 475 } 476 } 477