Fail createVirtualDisplay with single-buffered Surface
Bug 30106031
Change-Id: I434df329eb3c162dd9ef01245ac5e0da97216e70
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 286e097..dc19d32 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -96,6 +96,8 @@
private HwuiContext mHwuiContext;
+ private boolean mIsSingleBuffered;
+
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef({SCALING_MODE_FREEZE, SCALING_MODE_SCALE_TO_WINDOW,
@@ -158,7 +160,7 @@
if (surfaceTexture == null) {
throw new IllegalArgumentException("surfaceTexture must not be null");
}
-
+ mIsSingleBuffered = surfaceTexture.isSingleBuffered();
synchronized (mLock) {
mName = surfaceTexture.toString();
setNativeObjectLocked(nativeCreateFromSurfaceTexture(surfaceTexture));
@@ -458,6 +460,7 @@
// the reference count on mNativeObject. Either way, it is
// not necessary to call nativeRelease() here.
mName = source.readString();
+ mIsSingleBuffered = source.readInt() != 0;
setNativeObjectLocked(nativeReadFromParcel(mNativeObject, source));
}
}
@@ -469,6 +472,7 @@
}
synchronized (mLock) {
dest.writeString(mName);
+ dest.writeInt(mIsSingleBuffered ? 1 : 0);
nativeWriteToParcel(mNativeObject, dest);
}
if ((flags & Parcelable.PARCELABLE_WRITE_RETURN_VALUE) != 0) {
@@ -531,6 +535,14 @@
}
/**
+ * Returns whether or not this Surface is backed by a single-buffered SurfaceTexture
+ * @hide
+ */
+ public boolean isSingleBuffered() {
+ return mIsSingleBuffered;
+ }
+
+ /**
* Exception thrown when a Canvas couldn't be locked with {@link Surface#lockCanvas}, or
* when a SurfaceTexture could not successfully be allocated.
*/
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 0d8a95c..73b3f52 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -371,7 +371,12 @@
if (sur != NULL) {
bufferProducer = sur->getIGraphicBufferProducer();
}
- SurfaceComposerClient::setDisplaySurface(token, bufferProducer);
+ status_t err = SurfaceComposerClient::setDisplaySurface(token,
+ bufferProducer);
+ if (err != NO_ERROR) {
+ doThrowIAE(env, "Illegal Surface, could not enable async mode. Was this"
+ " Surface created with singleBufferMode?");
+ }
}
static void nativeSetDisplayLayerStack(JNIEnv* env, jclass clazz,