diff options
author | 2022-09-09 16:26:16 -0700 | |
---|---|---|
committer | 2022-09-09 16:26:16 -0700 | |
commit | 0b31685bc723d1ac0a34315eb855de0bb4735957 (patch) | |
tree | 8047d0879445a3a06b07b767b1f86dbb196f3daa | |
parent | ad9195bef6a5f5715d947a654c01dcb2cb5bbcc3 (diff) |
SurfaceFlingerPerfTests: Reduce variability in results
- use custom interation counter since simpleperf is run over entire test
- move all setup to @Before so its not recorded by simpleperf
- make test activity fullscreen to remove buffer updates from statusbar
Bug: 230039226
Test: atest SurfaceFlingerPerfTest
Change-Id: Id8c03b4dd32c012f091ab602fff780308420742f
4 files changed, 100 insertions, 118 deletions
diff --git a/apct-tests/perftests/surfaceflinger/AndroidTest.xml b/apct-tests/perftests/surfaceflinger/AndroidTest.xml index 53e5d99409e2..11d110670b7a 100644 --- a/apct-tests/perftests/surfaceflinger/AndroidTest.xml +++ b/apct-tests/perftests/surfaceflinger/AndroidTest.xml @@ -49,16 +49,20 @@ <!-- Guarantee that user defined RunListeners will be running before any of the default listeners defined in this runner. --> <option name="instrumentation-arg" key="newRunListenerMode" value="true" /> + <option name="instrumentation-arg" key="profiling-iterations" value="525" /> <!-- PerfettoListener related arguments --> <option name="instrumentation-arg" key="perfetto_config_text_proto" value="true" /> <option name="instrumentation-arg" key="perfetto_config_file" value="trace_config.textproto" /> <!-- SimpleperfListener related arguments --> <option name="instrumentation-arg" key="report" value="true" /> - <option name="instrumentation-arg" key="arguments" value="""" /> + <option name="instrumentation-arg" key="arguments" value="-g" /> <option name="instrumentation-arg" key="events_to_record" value="instructions,cpu-cycles,raw-l3d-cache-refill,sched:sched_waking" /> <option name="instrumentation-arg" key="processes_to_record" value="surfaceflinger" /> - <option name="instrumentation-arg" key="symbols_to_report" value=""android::SurfaceFlinger::commit(;android::SurfaceFlinger::composite("" /> + <option name="instrumentation-arg" key="symbols_to_report" value=""commit;android::SurfaceFlinger::commit(;composite;android::SurfaceFlinger::composite("" /> + + <!-- should match profiling-iterations --> + <option name="instrumentation-arg" key="test_iterations" value="525" /> <!-- ProcLoadListener related arguments --> <!-- Wait for device last minute threshold to reach 3 with 2 minute timeout before starting the test run --> diff --git a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/BufferFlinger.java b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/BufferFlinger.java index 52fb8a6023f1..8a447bb801f2 100644 --- a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/BufferFlinger.java +++ b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/BufferFlinger.java @@ -53,15 +53,17 @@ public class BufferFlinger { } } - public void addBuffer(SurfaceControl.Transaction t, SurfaceControl surfaceControl) - throws InterruptedException { - GraphicBuffer buffer = mBufferQ.take(); - t.setBuffer(surfaceControl, - HardwareBuffer.createFromGraphicBuffer(buffer), - null, - (SyncFence fence) -> { - releaseCallback(fence, buffer); - }); + public void addBuffer(SurfaceControl.Transaction t, SurfaceControl surfaceControl) { + try { + final GraphicBuffer buffer = mBufferQ.take(); + t.setBuffer(surfaceControl, + HardwareBuffer.createFromGraphicBuffer(buffer), + null, + (SyncFence fence) -> { + releaseCallback(fence, buffer); + }); + } catch (InterruptedException ignore) { + } } public void releaseCallback(SyncFence fence, GraphicBuffer buffer) { diff --git a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerPerfTest.java b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerPerfTest.java index 45d164c96cd8..f92c297936dd 100644 --- a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerPerfTest.java +++ b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerPerfTest.java @@ -18,8 +18,8 @@ package android.surfaceflinger; import android.graphics.Bitmap; import android.graphics.Color; -import android.perftests.utils.BenchmarkState; -import android.perftests.utils.PerfStatusReporter; +import android.os.Bundle; +import android.util.Log; import android.view.SurfaceControl; import androidx.test.ext.junit.rules.ActivityScenarioRule; @@ -29,6 +29,7 @@ import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.RuleChain; @@ -40,37 +41,66 @@ import java.util.Random; @LargeTest @RunWith(AndroidJUnit4.class) public class SurfaceFlingerPerfTest { - protected ActivityScenarioRule<SurfaceFlingerTestActivity> mActivityRule = + private static final String TAG = "SurfaceFlingerPerfTest"; + private final ActivityScenarioRule<SurfaceFlingerTestActivity> mActivityRule = new ActivityScenarioRule<>(SurfaceFlingerTestActivity.class); - protected PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); private SurfaceFlingerTestActivity mActivity; - static final int BUFFER_COUNT = 2; + private static final int BUFFER_COUNT = 2; + private static final int MAX_BUFFERS = 10; + private static final int MAX_POSITION = 10; + private static final float MAX_SCALE = 2.0f; + + private static final String ARGUMENT_PROFILING_ITERATIONS = "profiling-iterations"; + private static final String DEFAULT_PROFILING_ITERATIONS = "100"; + private static int sProfilingIterations; + private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction(); @Rule public final RuleChain mAllRules = RuleChain - .outerRule(mPerfStatusReporter) - .around(mActivityRule); + .outerRule(mActivityRule); + + @BeforeClass + public static void suiteSetup() { + final Bundle arguments = InstrumentationRegistry.getArguments(); + sProfilingIterations = Integer.parseInt( + arguments.getString(ARGUMENT_PROFILING_ITERATIONS, DEFAULT_PROFILING_ITERATIONS)); + Log.d(TAG, "suiteSetup: mProfilingIterations = " + sProfilingIterations); + } + @Before public void setup() { mActivityRule.getScenario().onActivity(activity -> mActivity = activity); + SurfaceControl.Transaction t = new SurfaceControl.Transaction(); + for (int i = 0; i < MAX_BUFFERS; i++) { + SurfaceControl sc = createSurfaceControl(); + BufferFlinger bufferTracker = createBufferTracker(Color.argb(getRandomColorComponent(), + getRandomColorComponent(), getRandomColorComponent(), + getRandomColorComponent())); + bufferTracker.addBuffer(t, sc); + t.setPosition(sc, i * 10, i * 10); + } + t.apply(true); } @After public void teardown() { mSurfaceControls.forEach(SurfaceControl::release); - mByfferTrackers.forEach(BufferFlinger::freeBuffers); + mBufferTrackers.forEach(BufferFlinger::freeBuffers); } + static int getRandomColorComponent() { + return new Random().nextInt(155) + 100; + } - private ArrayList<BufferFlinger> mByfferTrackers = new ArrayList<>(); + private final ArrayList<BufferFlinger> mBufferTrackers = new ArrayList<>(); private BufferFlinger createBufferTracker(int color) { BufferFlinger bufferTracker = new BufferFlinger(BUFFER_COUNT, color); - mByfferTrackers.add(bufferTracker); + mBufferTrackers.add(bufferTracker); return bufferTracker; } - private ArrayList<SurfaceControl> mSurfaceControls = new ArrayList<>(); - private SurfaceControl createSurfaceControl() throws InterruptedException { + private final ArrayList<SurfaceControl> mSurfaceControls = new ArrayList<>(); + private SurfaceControl createSurfaceControl() { SurfaceControl sc = mActivity.createChildSurfaceControl(); mSurfaceControls.add(sc); return sc; @@ -78,151 +108,90 @@ public class SurfaceFlingerPerfTest { @Test public void singleBuffer() throws Exception { - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.GREEN); - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - bufferTracker.addBuffer(t, sc); - t.show(sc); - - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { - bufferTracker.addBuffer(t, sc); - t.apply(); + for (int i = 0; i < sProfilingIterations; i++) { + mBufferTrackers.get(0).addBuffer(mTransaction, mSurfaceControls.get(0)); + mTransaction.show(mSurfaceControls.get(0)).apply(true); } } - static int getRandomColorComponent() { - return new Random().nextInt(155) + 100; - } - @Test public void multipleBuffers() throws Exception { - final int MAX_BUFFERS = 10; - - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - for (int i = 0; i < MAX_BUFFERS; i++) { - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.argb(getRandomColorComponent(), - getRandomColorComponent(), getRandomColorComponent(), - getRandomColorComponent())); - bufferTracker.addBuffer(t, sc); - t.setPosition(sc, i * 10, i * 10); - t.show(sc); - } - t.apply(true); - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int j = 0; j < sProfilingIterations; j++) { for (int i = 0; i < MAX_BUFFERS; i++) { - mByfferTrackers.get(i).addBuffer(t, mSurfaceControls.get(i)); + mBufferTrackers.get(i).addBuffer(mTransaction, mSurfaceControls.get(i)); + mTransaction.show(mSurfaceControls.get(i)); } - t.apply(); + mTransaction.apply(true); } } @Test public void multipleOpaqueBuffers() throws Exception { - final int MAX_BUFFERS = 10; - - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - for (int i = 0; i < MAX_BUFFERS; i++) { - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.rgb(getRandomColorComponent(), - getRandomColorComponent(), getRandomColorComponent())); - bufferTracker.addBuffer(t, sc); - t.setOpaque(sc, true); - t.setPosition(sc, i * 10, i * 10); - t.show(sc); - } - t.apply(true); - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int j = 0; j < sProfilingIterations; j++) { for (int i = 0; i < MAX_BUFFERS; i++) { - mByfferTrackers.get(i).addBuffer(t, mSurfaceControls.get(i)); + mBufferTrackers.get(i).addBuffer(mTransaction, mSurfaceControls.get(i)); + mTransaction.show(mSurfaceControls.get(i)).setOpaque(mSurfaceControls.get(i), true); } - t.apply(); + mTransaction.apply(true); } } @Test public void geometryChanges() throws Exception { - final int MAX_POSITION = 10; - final float MAX_SCALE = 2.0f; - - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.GREEN); - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - bufferTracker.addBuffer(t, sc); - t.show(sc).apply(true); - int step = 0; - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int i = 0; i < sProfilingIterations; i++) { step = ++step % MAX_POSITION; - t.setPosition(sc, step, step); + mTransaction.setPosition(mSurfaceControls.get(0), step, step); float scale = ((step * MAX_SCALE) / MAX_POSITION) + 0.5f; - t.setScale(sc, scale, scale); - t.apply(); + mTransaction.setScale(mSurfaceControls.get(0), scale, scale); + mTransaction.show(mSurfaceControls.get(0)).apply(true); } } @Test public void geometryWithBufferChanges() throws Exception { - final int MAX_POSITION = 10; - - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.GREEN); - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - bufferTracker.addBuffer(t, sc); - t.show(sc).apply(true); - int step = 0; - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int i = 0; i < sProfilingIterations; i++) { step = ++step % MAX_POSITION; - t.setPosition(sc, step, step); - float scale = ((step * 2.0f) / MAX_POSITION) + 0.5f; - t.setScale(sc, scale, scale); - bufferTracker.addBuffer(t, sc); - t.apply(); + mTransaction.setPosition(mSurfaceControls.get(0), step, step); + float scale = ((step * MAX_SCALE) / MAX_POSITION) + 0.5f; + mTransaction.setScale(mSurfaceControls.get(0), scale, scale); + mBufferTrackers.get(0).addBuffer(mTransaction, mSurfaceControls.get(0)); + mTransaction.show(mSurfaceControls.get(0)).apply(true); } } @Test public void addRemoveLayers() throws Exception { - SurfaceControl sc = createSurfaceControl(); - BufferFlinger bufferTracker = createBufferTracker(Color.GREEN); - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int i = 0; i < sProfilingIterations; i++) { SurfaceControl childSurfaceControl = new SurfaceControl.Builder() .setName("childLayer").setBLASTLayer().build(); - bufferTracker.addBuffer(t, childSurfaceControl); - t.reparent(childSurfaceControl, sc); - t.apply(); - t.remove(childSurfaceControl).apply(); + mBufferTrackers.get(0).addBuffer(mTransaction, childSurfaceControl); + mTransaction.reparent(childSurfaceControl, mSurfaceControls.get(0)); + mTransaction.show(childSurfaceControl).show(mSurfaceControls.get(0)); + mTransaction.apply(true); + mTransaction.remove(childSurfaceControl).apply(true); } } @Test public void displayScreenshot() throws Exception { - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int i = 0; i < sProfilingIterations; i++) { Bitmap screenshot = InstrumentationRegistry.getInstrumentation().getUiAutomation().takeScreenshot(); screenshot.recycle(); + mTransaction.apply(true); } } @Test public void layerScreenshot() throws Exception { - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { + for (int i = 0; i < sProfilingIterations; i++) { Bitmap screenshot = InstrumentationRegistry.getInstrumentation().getUiAutomation().takeScreenshot( mActivity.getWindow()); screenshot.recycle(); + mTransaction.apply(true); } } - } diff --git a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerTestActivity.java b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerTestActivity.java index 832a0cd1e917..bb956596c7eb 100644 --- a/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerTestActivity.java +++ b/apct-tests/perftests/surfaceflinger/src/android/surfaceflinger/SurfaceFlingerTestActivity.java @@ -22,6 +22,7 @@ import android.os.Bundle; import android.view.SurfaceControl; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.view.Window; import android.view.WindowManager; import java.util.concurrent.CountDownLatch; @@ -38,12 +39,15 @@ public class SurfaceFlingerTestActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); mTestSurfaceView = new TestSurfaceView(this); setContentView(mTestSurfaceView); } - public SurfaceControl createChildSurfaceControl() throws InterruptedException { + public SurfaceControl createChildSurfaceControl() { return mTestSurfaceView.getChildSurfaceControlHelper(); } @@ -65,8 +69,11 @@ public class SurfaceFlingerTestActivity extends Activity { }); } - public SurfaceControl getChildSurfaceControlHelper() throws InterruptedException { - mIsReady.await(); + public SurfaceControl getChildSurfaceControlHelper() { + try { + mIsReady.await(); + } catch (InterruptedException ignore) { + } SurfaceHolder holder = getHolder(); // check to see if surface is valid |