Merge "No longer block the main thread on rendering"

This commit is contained in:
Mark Renouf
2021-09-14 23:45:18 +00:00
committed by Android (Google) Code Review

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() {