Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9f7e10b7 authored by Mark Renouf's avatar Mark Renouf Committed by Android (Google) Code Review
Browse files

Merge "No longer block the main thread on rendering"

parents 90e19169 72becb30
Loading
Loading
Loading
Loading
+27 −29
Original line number Diff line number Diff line
@@ -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);
                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() {