Merge "Perform magnification viewport drawing outside of WM global lock." into udc-qpr-dev

This commit is contained in:
Daniel Norman
2023-06-29 00:18:46 +00:00
committed by Android (Google) Code Review

View File

@@ -1280,46 +1280,54 @@ final class AccessibilityController {
} }
void drawIfNeeded(SurfaceControl.Transaction t) { void drawIfNeeded(SurfaceControl.Transaction t) {
// Drawing variables (alpha, dirty rect, and bounds) access is synchronized
// using WindowManagerGlobalLock. Grab copies of these values before
// drawing on the canvas so that drawing can be performed outside of the lock.
int alpha;
Rect drawingRect = null;
Region drawingBounds = null;
synchronized (mService.mGlobalLock) { synchronized (mService.mGlobalLock) {
if (!mInvalidated) { if (!mInvalidated) {
return; return;
} }
mInvalidated = false; mInvalidated = false;
if (mAlpha > 0) {
Canvas canvas = null; alpha = mAlpha;
try { if (alpha > 0) {
drawingBounds = new Region(mBounds);
// Empty dirty rectangle means unspecified. // Empty dirty rectangle means unspecified.
if (mDirtyRect.isEmpty()) { if (mDirtyRect.isEmpty()) {
mBounds.getBounds(mDirtyRect); mBounds.getBounds(mDirtyRect);
} }
mDirtyRect.inset(-mHalfBorderWidth, -mHalfBorderWidth); mDirtyRect.inset(-mHalfBorderWidth, -mHalfBorderWidth);
canvas = mSurface.lockCanvas(mDirtyRect); drawingRect = new Rect(mDirtyRect);
if (DEBUG_VIEWPORT_WINDOW) { if (DEBUG_VIEWPORT_WINDOW) {
Slog.i(LOG_TAG, "Dirty rect: " + mDirtyRect); Slog.i(LOG_TAG, "ViewportWindow bounds: " + mBounds);
Slog.i(LOG_TAG, "ViewportWindow dirty rect: " + mDirtyRect);
} }
} catch (IllegalArgumentException iae) { }
/* ignore */ }
} catch (Surface.OutOfResourcesException oore) {
// Draw without holding WindowManagerGlobalLock.
if (alpha > 0) {
Canvas canvas = null;
try {
canvas = mSurface.lockCanvas(drawingRect);
} catch (IllegalArgumentException | OutOfResourcesException e) {
/* ignore */ /* ignore */
} }
if (canvas == null) { if (canvas == null) {
return; return;
} }
if (DEBUG_VIEWPORT_WINDOW) {
Slog.i(LOG_TAG, "Bounds: " + mBounds);
}
canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR); canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
mPaint.setAlpha(mAlpha); mPaint.setAlpha(alpha);
Path path = mBounds.getBoundaryPath(); canvas.drawPath(drawingBounds.getBoundaryPath(), mPaint);
canvas.drawPath(path, mPaint);
mSurface.unlockCanvasAndPost(canvas); mSurface.unlockCanvasAndPost(canvas);
t.show(mSurfaceControl); t.show(mSurfaceControl);
} else { } else {
t.hide(mSurfaceControl); t.hide(mSurfaceControl);
} }
} }
}
void releaseSurface() { void releaseSurface() {
if (mBlastBufferQueue != null) { if (mBlastBufferQueue != null) {