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
This commit is contained in:
Mark Renouf
2021-07-29 16:48:11 -04:00
parent 575c989cb8
commit 72becb3095

View File

@@ -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<V extends View> 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<V extends View> 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<V extends View> 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() {