From 72becb3095658fb882d7da045fc66228bc3cd40c Mon Sep 17 00:00:00 2001 From: Mark Renouf Date: Thu, 29 Jul 2021 16:48:11 -0400 Subject: [PATCH] No longer block the main thread on rendering This change removes the use of setWaitForPresent(true) on the FrameRenderRequest. This allows the method to return as soon as the request is synced to the RenderThread and no longer block while the frame is drawn. Depends on ag/15411889 Bug: 194927650 Test: manual, capture long screenshot Change-Id: I93795f3aad52067e52d3614982fd871de4f3432e --- .../view/ScrollCaptureViewSupport.java | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/core/java/com/android/internal/view/ScrollCaptureViewSupport.java b/core/java/com/android/internal/view/ScrollCaptureViewSupport.java index 8d63a400c63c5..2f25d60bf3aec 100644 --- a/core/java/com/android/internal/view/ScrollCaptureViewSupport.java +++ b/core/java/com/android/internal/view/ScrollCaptureViewSupport.java @@ -21,10 +21,12 @@ import android.content.ContentResolver; import android.content.Context; import android.content.pm.ActivityInfo; import android.graphics.HardwareRenderer; +import android.graphics.HardwareRenderer.SyncAndDrawResult; import android.graphics.RecordingCanvas; import android.graphics.Rect; import android.graphics.RenderNode; import android.os.CancellationSignal; +import android.os.SystemClock; import android.provider.Settings; import android.util.DisplayMetrics; import android.util.Log; @@ -52,7 +54,7 @@ import java.util.function.Consumer; @UiThread public class ScrollCaptureViewSupport implements ScrollCaptureCallback { - private static final String TAG = "ScrollCaptureViewSupport"; + private static final String TAG = "SCViewSupport"; private static final String SETTING_CAPTURE_DELAY = "screenshot.scroll_capture_delay"; private static final long SETTING_CAPTURE_DELAY_DEFAULT = 60L; // millis @@ -264,8 +266,25 @@ public class ScrollCaptureViewSupport implements ScrollCaptureCa if (signal.isCanceled()) { Log.w(TAG, "onScrollCaptureImageRequest: cancelled! skipping render."); } else { - mRenderer.renderView(view, viewCaptureArea); - onComplete.accept(new Rect(scrollResult.availableArea)); + int result = mRenderer.renderView(view, viewCaptureArea); + switch (result) { + case HardwareRenderer.SYNC_OK: + case HardwareRenderer.SYNC_REDRAW_REQUESTED: + /* Frame synced, buffer will be produced... notify client. */ + onComplete.accept(new Rect(scrollResult.availableArea)); + return; + case HardwareRenderer.SYNC_FRAME_DROPPED: + Log.e(TAG, "syncAndDraw(): SYNC_FRAME_DROPPED !"); + break; + case HardwareRenderer.SYNC_LOST_SURFACE_REWARD_IF_FOUND: + Log.e(TAG, "syncAndDraw(): SYNC_LOST_SURFACE !"); + break; + case HardwareRenderer.SYNC_CONTEXT_IS_STOPPED: + Log.e(TAG, "syncAndDraw(): SYNC_CONTEXT_IS_STOPPED !"); + break; + } + // No buffer will be produced. + onComplete.accept(new Rect(/* empty */)); } }; @@ -373,37 +392,16 @@ public class ScrollCaptureViewSupport implements ScrollCaptureCa mCaptureRenderNode.endRecording(); } - public void renderView(View view, Rect sourceRect) { + @SyncAndDrawResult + public int renderView(View view, Rect sourceRect) { + HardwareRenderer.FrameRenderRequest request = mRenderer.createRenderRequest(); + request.setVsyncTime(SystemClock.elapsedRealtimeNanos()); if (updateForView(view)) { setupLighting(view); } view.invalidate(); updateRootNode(view, sourceRect); - HardwareRenderer.FrameRenderRequest request = mRenderer.createRenderRequest(); - long timestamp = System.nanoTime(); - request.setVsyncTime(timestamp); - - // Would be nice to access nextFrameNumber from HwR without having to hold on to Surface - final long frameNumber = mSurface.getNextFrameNumber(); - - // Block until a frame is presented to the Surface - request.setWaitForPresent(true); - - switch (request.syncAndDraw()) { - case HardwareRenderer.SYNC_OK: - case HardwareRenderer.SYNC_REDRAW_REQUESTED: - return; - - case HardwareRenderer.SYNC_FRAME_DROPPED: - Log.e(TAG, "syncAndDraw(): SYNC_FRAME_DROPPED !"); - break; - case HardwareRenderer.SYNC_LOST_SURFACE_REWARD_IF_FOUND: - Log.e(TAG, "syncAndDraw(): SYNC_LOST_SURFACE !"); - break; - case HardwareRenderer.SYNC_CONTEXT_IS_STOPPED: - Log.e(TAG, "syncAndDraw(): SYNC_CONTEXT_IS_STOPPED !"); - break; - } + return request.syncAndDraw(); } public void trimMemory() {