summaryrefslogtreecommitdiff
path: root/core/java/android/view/ViewRootImpl.java
diff options
context:
space:
mode:
authorGalia Peycheva <galinap@google.com>2021-02-06 13:00:14 +0100
committerGalia Peycheva <galinap@google.com>2021-02-25 18:33:33 +0100
commitd129f1e00ef7de136908dce9e74fd7e23adcaf22 (patch)
treef7fff6e67aca2944dc84d806e1e706314a55687e /core/java/android/view/ViewRootImpl.java
parent09f52aa440ab32e66dfabeb4cb40b72166930b4f (diff)
Fix synchronisation in BackgroundBlurDrawable
The PositionUpdateListener in BackgroundBlurDrawable is called from a thread pool to update the position of the BlurRegion. After that, in frame drawing callback (RenderThread), the Aggregator takes all the settings in BackgroundBlurDrawable and dispatches them to SF. However, while the RenderThread is working on frame N, the Ui thread is working on frame N+1. So when the frame drawing callback is called on RenderThread for frame N, BackgroundBlurDrawable might already be holding settings for frame N+1. In this CL, we fix that by making BackgroundBlurDrawable work only on Ui thread, while BlurRegion lives only on RenderThread. Just before drawing, we copy the state of BackgroundBlurDrawable into a BlurRegion. So when render thread starts doing its thing for frame N, Ui thread can start setting up BackgroundBlurDrawable for frame N+1. The settings for frame N are already copied over to BlurRegion. In frame drawing callback, we take the blur regions if there is a pending update and send them to SF. Bug: 167166562 Test: m && atest BlurAggregatorTest Change-Id: Icec0fa8e97de30b7bad15b97f848ae642076652f
Diffstat (limited to 'core/java/android/view/ViewRootImpl.java')
-rw-r--r--core/java/android/view/ViewRootImpl.java21
1 files changed, 13 insertions, 8 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 144691d3eaa0..b3b547f50b40 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -3962,11 +3962,12 @@ public final class ViewRootImpl implements ViewParent,
}
private void addFrameCallbackIfNeeded() {
- boolean nextDrawUseBlastSync = mNextDrawUseBlastSync;
- boolean hasBlur = mBlurRegionAggregator.hasRegions();
- boolean reportNextDraw = mReportNextDraw;
+ final boolean nextDrawUseBlastSync = mNextDrawUseBlastSync;
+ final boolean reportNextDraw = mReportNextDraw;
+ final boolean hasBlurUpdates = mBlurRegionAggregator.hasUpdates();
+ final boolean needsCallbackForBlur = hasBlurUpdates || mBlurRegionAggregator.hasRegions();
- if (!nextDrawUseBlastSync && !reportNextDraw && !hasBlur) {
+ if (!nextDrawUseBlastSync && !reportNextDraw && !needsCallbackForBlur) {
return;
}
@@ -3974,18 +3975,22 @@ public final class ViewRootImpl implements ViewParent,
Log.d(mTag, "Creating frameDrawingCallback"
+ " nextDrawUseBlastSync=" + nextDrawUseBlastSync
+ " reportNextDraw=" + reportNextDraw
- + " hasBlur=" + hasBlur);
+ + " hasBlurUpdates=" + hasBlurUpdates);
}
- // The callback will run on a worker thread pool from the render thread.
+ final BackgroundBlurDrawable.BlurRegion[] blurRegionsForFrame =
+ needsCallbackForBlur ? mBlurRegionAggregator.getBlurRegionsCopyForRT() : null;
+
+ // The callback will run on the render thread.
HardwareRenderer.FrameDrawingCallback frameDrawingCallback = frame -> {
if (DEBUG_BLAST) {
Log.d(mTag, "Received frameDrawingCallback frameNum=" + frame + "."
+ " Creating transactionCompleteCallback=" + nextDrawUseBlastSync);
}
- if (hasBlur) {
- mBlurRegionAggregator.dispatchBlurTransactionIfNeeded(frame);
+ if (needsCallbackForBlur) {
+ mBlurRegionAggregator
+ .dispatchBlurTransactionIfNeeded(frame, blurRegionsForFrame, hasBlurUpdates);
}
if (mBlastBufferQueue == null) {