From 660a6679d97d04b732b4317d38902320da9167ee Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 22 Feb 2021 12:29:36 -0800 Subject: [PATCH] SurfaceFlinger: Prepare to remove BufferQueueLayer To prepare to remove BufferQueueLayer we port over the public Java API (getSurface) and a few remaining clients (largely tests), by returning a BBQ from getSurface. Bug: 185492007 Test: Existing tests pass Change-Id: I5c59dc5785333c543ef9f5e70faafab5da110bbd --- core/java/android/view/SurfaceControl.java | 27 +++++++++++++++++----- core/jni/android_view_SurfaceControl.cpp | 10 ++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 21f75d419a5e0..3a50f6388c28e 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -34,6 +34,7 @@ import android.annotation.Size; import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.graphics.Bitmap; +import android.graphics.BLASTBufferQueue; import android.graphics.ColorSpace; import android.graphics.Matrix; import android.graphics.PixelFormat; @@ -94,6 +95,7 @@ public final class SurfaceControl implements Parcelable { private static native void nativeWriteToParcel(long nativeObject, Parcel out); private static native void nativeRelease(long nativeObject); private static native void nativeDisconnect(long nativeObject); + private static native void nativeUpdateDefaultBufferSize(long nativeObject, int width, int height); private static native int nativeCaptureDisplay(DisplayCaptureArgs captureArgs, ScreenCaptureListener captureListener); private static native int nativeCaptureLayers(LayerCaptureArgs captureArgs, @@ -1078,6 +1080,11 @@ public final class SurfaceControl implements Parcelable { throw new IllegalStateException( "Only buffer layers can set a valid buffer size."); } + boolean isBqLayer = isBufferQueueLayer(); + if (isBqLayer) { + setBLASTLayer(); + } + return new SurfaceControl( mSession, mName, mWidth, mHeight, mFormat, mFlags, mParent, mMetadata, mLocalOwnerView, mCallsite); @@ -1134,9 +1141,6 @@ public final class SurfaceControl implements Parcelable { return setFlags(FX_SURFACE_NORMAL, FX_SURFACE_MASK); } - /** - * Set the initial size of the controlled surface's buffers in pixels. - */ private void unsetBufferSize() { mWidth = 0; mHeight = 0; @@ -1301,11 +1305,14 @@ public final class SurfaceControl implements Parcelable { return (mFlags & FX_SURFACE_EFFECT) == FX_SURFACE_EFFECT; } + private boolean isBufferQueueLayer() { + return (mFlags & FX_SURFACE_NORMAL) == FX_SURFACE_NORMAL; + } + /** * @hide */ public Builder setBLASTLayer() { - unsetBufferSize(); return setFlags(FX_SURFACE_BLAST, FX_SURFACE_MASK); } @@ -2644,8 +2651,7 @@ public final class SurfaceControl implements Parcelable { final Point size = mResizedSurfaces.valueAt(i); final SurfaceControl surfaceControl = mResizedSurfaces.keyAt(i); synchronized (surfaceControl.mLock) { - surfaceControl.mWidth = size.x; - surfaceControl.mHeight = size.y; + surfaceControl.resize(size.x, size.y); } } mResizedSurfaces.clear(); @@ -3536,4 +3542,13 @@ public final class SurfaceControl implements Parcelable { public static Transaction getGlobalTransaction() { return sGlobalTransaction; } + + /** + * @hide + */ + public void resize(int w, int h) { + mWidth = w; + mHeight = h; + nativeUpdateDefaultBufferSize(mNativeObject, w, h); + } } diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index ffba628f73ab9..d290b375d0758 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -384,6 +384,14 @@ static void nativeDisconnect(JNIEnv* env, jclass clazz, jlong nativeObject) { } } +static void nativeSetDefaultBufferSize(JNIEnv* env, jclass clazz, jlong nativeObject, + jint width, jint height) { + SurfaceControl* const ctrl = reinterpret_cast(nativeObject); + if (ctrl != NULL) { + ctrl->updateDefaultBufferSize(width, height); + } +} + static Rect rectFromObj(JNIEnv* env, jobject rectObj) { int left = env->GetIntField(rectObj, gRectClassInfo.left); int top = env->GetIntField(rectObj, gRectClassInfo.top); @@ -1744,6 +1752,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeRelease }, {"nativeDisconnect", "(J)V", (void*)nativeDisconnect }, + {"nativeUpdateDefaultBufferSize", "(JII)V", + (void*)nativeSetDefaultBufferSize}, {"nativeCreateTransaction", "()J", (void*)nativeCreateTransaction }, {"nativeApplyTransaction", "(JZ)V",