Merge "Register frame callbacks for sync right before draw" into udc-qpr-dev

This commit is contained in:
Chavi Weingarten
2023-06-23 20:23:35 +00:00
committed by Android (Google) Code Review

View File

@@ -3820,7 +3820,7 @@ public final class ViewRootImpl implements ViewParent,
} }
mPendingTransitions.clear(); mPendingTransitions.clear();
} }
if (!performDraw() && mActiveSurfaceSyncGroup != null) { if (!performDraw(mActiveSurfaceSyncGroup) && mActiveSurfaceSyncGroup != null) {
mActiveSurfaceSyncGroup.markSyncReady(); mActiveSurfaceSyncGroup.markSyncReady();
} }
} }
@@ -4583,6 +4583,10 @@ public final class ViewRootImpl implements ViewParent,
}); });
} }
/**
* These callbacks check if the draw failed for any reason and apply
* those transactions directly so they don't get stuck forever.
*/
private void registerCallbackForPendingTransactions() { private void registerCallbackForPendingTransactions() {
Transaction t = new Transaction(); Transaction t = new Transaction();
t.merge(mPendingTransaction); t.merge(mPendingTransaction);
@@ -4611,7 +4615,7 @@ public final class ViewRootImpl implements ViewParent,
}); });
} }
private boolean performDraw() { private boolean performDraw(@Nullable SurfaceSyncGroup surfaceSyncGroup) {
mLastPerformDrawSkippedReason = null; mLastPerformDrawSkippedReason = null;
if (mAttachInfo.mDisplayState == Display.STATE_OFF && !mReportNextDraw) { if (mAttachInfo.mDisplayState == Display.STATE_OFF && !mReportNextDraw) {
mLastPerformDrawSkippedReason = "screen_off"; mLastPerformDrawSkippedReason = "screen_off";
@@ -4621,7 +4625,7 @@ public final class ViewRootImpl implements ViewParent,
return false; return false;
} }
final boolean fullRedrawNeeded = mFullRedrawNeeded || mActiveSurfaceSyncGroup != null; final boolean fullRedrawNeeded = mFullRedrawNeeded || surfaceSyncGroup != null;
mFullRedrawNeeded = false; mFullRedrawNeeded = false;
mIsDrawing = true; mIsDrawing = true;
@@ -4629,22 +4633,12 @@ public final class ViewRootImpl implements ViewParent,
addFrameCommitCallbackIfNeeded(); addFrameCommitCallbackIfNeeded();
boolean usingAsyncReport = isHardwareEnabled() && mActiveSurfaceSyncGroup != null; boolean usingAsyncReport;
if (usingAsyncReport) {
registerCallbacksForSync(mSyncBuffer, mActiveSurfaceSyncGroup);
} else if (mHasPendingTransactions) {
// These callbacks are only needed if there's no sync involved and there were calls to
// applyTransactionOnDraw. These callbacks check if the draw failed for any reason and
// apply those transactions directly so they don't get stuck forever.
registerCallbackForPendingTransactions();
}
mHasPendingTransactions = false;
try { try {
boolean canUseAsync = draw(fullRedrawNeeded, usingAsyncReport && mSyncBuffer); usingAsyncReport = draw(fullRedrawNeeded, surfaceSyncGroup, mSyncBuffer);
if (usingAsyncReport && !canUseAsync) { if (mAttachInfo.mThreadedRenderer != null && !usingAsyncReport) {
mAttachInfo.mThreadedRenderer.setFrameCallback(null); mAttachInfo.mThreadedRenderer.setFrameCallback(null);
usingAsyncReport = false;
} }
} finally { } finally {
mIsDrawing = false; mIsDrawing = false;
@@ -4682,10 +4676,12 @@ public final class ViewRootImpl implements ViewParent,
} }
if (mSurfaceHolder != null && mSurface.isValid()) { if (mSurfaceHolder != null && mSurface.isValid()) {
final SurfaceSyncGroup surfaceSyncGroup = mActiveSurfaceSyncGroup; usingAsyncReport = true;
SurfaceCallbackHelper sch = new SurfaceCallbackHelper(() -> SurfaceCallbackHelper sch = new SurfaceCallbackHelper(() -> {
mHandler.post(() -> surfaceSyncGroup.markSyncReady())); if (surfaceSyncGroup != null) {
mActiveSurfaceSyncGroup = null; surfaceSyncGroup.markSyncReady();
}
});
SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks(); SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
@@ -4696,8 +4692,9 @@ public final class ViewRootImpl implements ViewParent,
} }
} }
} }
if (mActiveSurfaceSyncGroup != null && !usingAsyncReport) {
mActiveSurfaceSyncGroup.markSyncReady(); if (surfaceSyncGroup != null && !usingAsyncReport) {
surfaceSyncGroup.markSyncReady();
} }
if (mPerformContentCapture) { if (mPerformContentCapture) {
performContentCaptureInitialReport(); performContentCaptureInitialReport();
@@ -4790,7 +4787,8 @@ public final class ViewRootImpl implements ViewParent,
} }
} }
private boolean draw(boolean fullRedrawNeeded, boolean forceDraw) { private boolean draw(boolean fullRedrawNeeded,
@Nullable SurfaceSyncGroup activeSyncGroup, boolean syncBuffer) {
Surface surface = mSurface; Surface surface = mSurface;
if (!surface.isValid()) { if (!surface.isValid()) {
return false; return false;
@@ -4934,9 +4932,19 @@ public final class ViewRootImpl implements ViewParent,
mAttachInfo.mThreadedRenderer.setTargetHdrSdrRatio(mRenderHdrSdrRatio); mAttachInfo.mThreadedRenderer.setTargetHdrSdrRatio(mRenderHdrSdrRatio);
} }
if (forceDraw) { if (activeSyncGroup != null) {
mAttachInfo.mThreadedRenderer.forceDrawNextFrame(); registerCallbacksForSync(syncBuffer, activeSyncGroup);
if (syncBuffer) {
mAttachInfo.mThreadedRenderer.forceDrawNextFrame();
}
} else if (mHasPendingTransactions) {
// Register a calback if there's no sync involved but there were calls to
// applyTransactionOnDraw. If there is a sync involved, the sync callback will
// handle merging the pending transaction.
registerCallbackForPendingTransactions();
} }
mHasPendingTransactions = false;
mAttachInfo.mThreadedRenderer.draw(mView, mAttachInfo, this); mAttachInfo.mThreadedRenderer.draw(mView, mAttachInfo, this);
} else { } else {
// If we get here with a disabled & requested hardware renderer, something went // If we get here with a disabled & requested hardware renderer, something went