1 /* 2 * Copyright (C) 2015 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 package android.surfacecomposition; 17 18 import android.app.Activity; 19 import android.graphics.PixelFormat; 20 import android.os.Build; 21 import android.os.Bundle; 22 import android.surfacecomposition.SurfaceCompositionMeasuringActivity.AllocationScore; 23 import android.surfacecomposition.SurfaceCompositionMeasuringActivity.CompositorScore; 24 import android.test.ActivityInstrumentationTestCase2; 25 import android.test.suitebuilder.annotation.SmallTest; 26 import android.util.Log; 27 28 public class SurfaceCompositionTest extends 29 ActivityInstrumentationTestCase2<SurfaceCompositionMeasuringActivity> { 30 private final static String TAG = "SurfaceCompositionTest"; 31 private final static String KEY_SURFACE_COMPOSITION_PERFORMANCE = 32 "surface-compoistion-peformance-sps"; 33 private final static String KEY_SURFACE_COMPOSITION_BANDWITH = 34 "surface-compoistion-bandwidth-gbps"; 35 private final static String KEY_SURFACE_ALLOCATION_PERFORMANCE_MEDIAN = 36 "surface-allocation-performance-median-sps"; 37 private final static String KEY_SURFACE_ALLOCATION_PERFORMANCE_MIN = 38 "surface-allocation-performance-min-sps"; 39 private final static String KEY_SURFACE_ALLOCATION_PERFORMANCE_MAX = 40 "surface-allocation-performance-max-sps"; 41 42 // Pass threshold for major pixel formats. 43 private final static int[] TEST_PIXEL_FORMATS = new int[] { 44 PixelFormat.TRANSLUCENT, 45 PixelFormat.OPAQUE, 46 }; 47 48 // Nexus 9 performance is around 8.8. We distinguish results for Andromeda and 49 // Android devices. Andromeda devices require higher performance score. 50 private final static double[] MIN_ACCEPTED_COMPOSITION_SCORE_ANDROMDEDA = new double[] { 51 8.0, 52 8.0, 53 }; 54 private final static double[] MIN_ACCEPTED_COMPOSITION_SCORE_ANDROID = new double[] { 55 4.0, 56 4.0, 57 }; 58 59 // Based on Nexus 6 performance which is usually < 28.0. 60 private final static double[] MIN_ACCEPTED_ALLOCATION_SCORE = new double[] { 61 20.0, 62 20.0, 63 }; 64 SurfaceCompositionTest()65 public SurfaceCompositionTest() { 66 super(SurfaceCompositionMeasuringActivity.class); 67 } 68 69 @SmallTest testSurfaceCompositionPerformance()70 public void testSurfaceCompositionPerformance() { 71 Bundle status = new Bundle(); 72 double[] minScores = getActivity().isAndromeda() ? 73 MIN_ACCEPTED_COMPOSITION_SCORE_ANDROMDEDA : MIN_ACCEPTED_COMPOSITION_SCORE_ANDROID; 74 for (int i = 0; i < TEST_PIXEL_FORMATS.length; ++i) { 75 int pixelFormat = TEST_PIXEL_FORMATS[i]; 76 String formatName = SurfaceCompositionMeasuringActivity.getPixelFormatInfo(pixelFormat); 77 CompositorScore score = getActivity().measureCompositionScore(pixelFormat); 78 Log.i(TAG, "testSurfaceCompositionPerformance(" + formatName + ") = " + score); 79 assertTrue("Device does not support surface(" + formatName + ") composition " + 80 "performance score. " + score.mSurfaces + " < " + 81 minScores[i] + ". Build: " + Build.FINGERPRINT + ".", 82 score.mSurfaces >= minScores[i]); 83 // Send status only for TRANSLUCENT format. 84 if (pixelFormat == PixelFormat.TRANSLUCENT) { 85 status.putDouble(KEY_SURFACE_COMPOSITION_PERFORMANCE, score.mSurfaces); 86 // Put bandwidth in GBPS. 87 status.putDouble(KEY_SURFACE_COMPOSITION_BANDWITH, score.mBandwidth / 88 (1024.0 * 1024.0 * 1024.0)); 89 } 90 } 91 getInstrumentation().sendStatus(Activity.RESULT_OK, status); 92 } 93 94 @SmallTest testSurfaceAllocationPerformance()95 public void testSurfaceAllocationPerformance() { 96 Bundle status = new Bundle(); 97 for (int i = 0; i < TEST_PIXEL_FORMATS.length; ++i) { 98 int pixelFormat = TEST_PIXEL_FORMATS[i]; 99 String formatName = SurfaceCompositionMeasuringActivity.getPixelFormatInfo(pixelFormat); 100 AllocationScore score = getActivity().measureAllocationScore(pixelFormat); 101 Log.i(TAG, "testSurfaceAllocationPerformance(" + formatName + ") = " + score); 102 assertTrue("Device does not support surface(" + formatName + ") allocation " + 103 "performance score. " + score.mMedian + " < " + 104 MIN_ACCEPTED_ALLOCATION_SCORE[i] + ". Build: " + 105 Build.FINGERPRINT + ".", 106 score.mMedian >= MIN_ACCEPTED_ALLOCATION_SCORE[i]); 107 // Send status only for TRANSLUCENT format. 108 if (pixelFormat == PixelFormat.TRANSLUCENT) { 109 status.putDouble(KEY_SURFACE_ALLOCATION_PERFORMANCE_MEDIAN, score.mMedian); 110 status.putDouble(KEY_SURFACE_ALLOCATION_PERFORMANCE_MIN, score.mMin); 111 status.putDouble(KEY_SURFACE_ALLOCATION_PERFORMANCE_MAX, score.mMax); 112 } 113 } 114 getInstrumentation().sendStatus(Activity.RESULT_OK, status); 115 } 116 } 117