Merge "No longer block the main thread on rendering"
This commit is contained in:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user