Use new ISurfaceComposer::destroyDisplay method

Bug: 10191053
Change-Id: I3ecc6880db4a4c77c6db4e8b50faa9b4021d17c6
This commit is contained in:
Jesse Hall
2013-08-08 12:15:03 -07:00
committed by Jeff Brown
parent 4104d32952
commit 6a6bc216d1
6 changed files with 60 additions and 53 deletions

View File

@@ -59,13 +59,14 @@ public class SurfaceControl {
private static native IBinder nativeGetBuiltInDisplay(int physicalDisplayId);
private static native IBinder nativeCreateDisplay(String name, boolean secure);
private static native void nativeDestroyDisplay(IBinder displayToken);
private static native void nativeSetDisplaySurface(
IBinder displayToken, int nativeSurfaceObject);
private static native void nativeSetDisplayLayerStack(
IBinder displayToken, int layerStack);
private static native void nativeSetDisplayProjection(
IBinder displayToken, int orientation,
int l, int t, int r, int b,
int l, int t, int r, int b,
int L, int T, int R, int B);
private static native boolean nativeGetDisplayInfo(
IBinder displayToken, SurfaceControl.PhysicalDisplayInfo outInfo);
@@ -103,7 +104,7 @@ public class SurfaceControl {
* measures will be taken to disallow the surface's content to be copied
* from another process. In particular, screenshots and VNC servers will
* be disabled, but other measures can take place, for instance the
* surface might not be hardware accelerated.
* surface might not be hardware accelerated.
*
*/
public static final int SECURE = 0x00000080;
@@ -247,10 +248,10 @@ public class SurfaceControl {
throw new OutOfResourcesException(
"Couldn't allocate SurfaceControl native object");
}
mCloseGuard.open("release");
}
@Override
protected void finalize() throws Throwable {
try {
@@ -300,7 +301,7 @@ public class SurfaceControl {
if (mNativeObject == 0) throw new NullPointerException(
"mNativeObject is null. Have you called release() already?");
}
/*
* set surface parameters.
* needs to be inside open/closeTransaction block
@@ -369,7 +370,7 @@ public class SurfaceControl {
public void setWindowCrop(Rect crop) {
checkNotReleased();
if (crop != null) {
nativeSetWindowCrop(mNativeObject,
nativeSetWindowCrop(mNativeObject,
crop.left, crop.top, crop.right, crop.bottom);
} else {
nativeSetWindowCrop(mNativeObject, 0, 0, 0, 0);
@@ -397,19 +398,19 @@ public class SurfaceControl {
public float xDpi;
public float yDpi;
public boolean secure;
public PhysicalDisplayInfo() {
}
public PhysicalDisplayInfo(PhysicalDisplayInfo other) {
copyFrom(other);
}
@Override
public boolean equals(Object o) {
return o instanceof PhysicalDisplayInfo && equals((PhysicalDisplayInfo)o);
}
public boolean equals(PhysicalDisplayInfo other) {
return other != null
&& width == other.width
@@ -420,12 +421,12 @@ public class SurfaceControl {
&& yDpi == other.yDpi
&& secure == other.secure;
}
@Override
public int hashCode() {
return 0; // don't care
}
public void copyFrom(PhysicalDisplayInfo other) {
width = other.width;
height = other.height;
@@ -435,7 +436,7 @@ public class SurfaceControl {
yDpi = other.yDpi;
secure = other.secure;
}
// For debugging purposes
@Override
public String toString() {
@@ -481,7 +482,7 @@ public class SurfaceControl {
throw new IllegalArgumentException("displayRect must not be null");
}
nativeSetDisplayProjection(displayToken, orientation,
layerStackRect.left, layerStackRect.top, layerStackRect.right, layerStackRect.bottom,
layerStackRect.left, layerStackRect.top, layerStackRect.right, layerStackRect.bottom,
displayRect.left, displayRect.top, displayRect.right, displayRect.bottom);
}
@@ -513,6 +514,13 @@ public class SurfaceControl {
return nativeCreateDisplay(name, secure);
}
public static void destroyDisplay(IBinder displayToken) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
}
nativeDestroyDisplay(displayToken);
}
public static IBinder getBuiltInDisplay(int builtInDisplayId) {
return nativeGetBuiltInDisplay(builtInDisplayId);
}
@@ -608,7 +616,7 @@ public class SurfaceControl {
SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN);
return nativeScreenshot(displayToken, width, height, 0, 0, true);
}
private static void screenshot(IBinder display, Surface consumer,
int width, int height, int minLayer, int maxLayer, boolean allLayers) {
if (display == null) {

View File

@@ -333,6 +333,12 @@ static jobject nativeCreateDisplay(JNIEnv* env, jclass clazz, jstring nameObj,
return javaObjectForIBinder(env, token);
}
static void nativeDestroyDisplay(JNIEnv* env, jclass clazz, jobject tokenObj) {
sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
if (token == NULL) return;
SurfaceComposerClient::destroyDisplay(token);
}
static void nativeSetDisplaySurface(JNIEnv* env, jclass clazz,
jobject tokenObj, jint nativeSurfaceObject) {
sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
@@ -441,6 +447,8 @@ static JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeGetBuiltInDisplay },
{"nativeCreateDisplay", "(Ljava/lang/String;Z)Landroid/os/IBinder;",
(void*)nativeCreateDisplay },
{"nativeDestroyDisplay", "(Landroid/os/IBinder;)V",
(void*)nativeDestroyDisplay },
{"nativeSetDisplaySurface", "(Landroid/os/IBinder;I)V",
(void*)nativeSetDisplaySurface },
{"nativeSetDisplayLayerStack", "(Landroid/os/IBinder;I)V",

View File

@@ -154,9 +154,6 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
// List of all currently connected display devices.
private final ArrayList<DisplayDevice> mDisplayDevices = new ArrayList<DisplayDevice>();
// List of all removed display devices.
private final ArrayList<DisplayDevice> mRemovedDisplayDevices = new ArrayList<DisplayDevice>();
// List of all logical displays indexed by logical display id.
private final SparseArray<LogicalDisplay> mLogicalDisplays =
new SparseArray<LogicalDisplay>();
@@ -798,7 +795,6 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
Slog.i(TAG, "Display device removed: " + device.getDisplayDeviceInfoLocked());
mRemovedDisplayDevices.add(device);
updateLogicalDisplaysLocked();
scheduleTraversalLocked(false);
}
@@ -900,14 +896,6 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
}
private void performTraversalInTransactionLocked() {
// Perform one last traversal for each removed display device.
final int removedCount = mRemovedDisplayDevices.size();
for (int i = 0; i < removedCount; i++) {
DisplayDevice device = mRemovedDisplayDevices.get(i);
device.performTraversalInTransactionLocked();
}
mRemovedDisplayDevices.clear();
// Clear all viewports before configuring displays so that we can keep
// track of which ones we have configured.
clearViewportsLocked();

View File

@@ -211,11 +211,13 @@ final class OverlayDisplayAdapter extends DisplayAdapter {
mSurfaceTexture = surfaceTexture;
}
public void clearSurfaceTextureLocked() {
if (mSurfaceTexture != null) {
mSurfaceTexture = null;
public void destroyLocked() {
mSurfaceTexture = null;
if (mSurface != null) {
mSurface.release();
mSurface = null;
}
sendTraversalRequestLocked();
SurfaceControl.destroyDisplay(getDisplayTokenLocked());
}
@Override
@@ -225,12 +227,6 @@ final class OverlayDisplayAdapter extends DisplayAdapter {
mSurface = new Surface(mSurfaceTexture);
}
setSurfaceInTransactionLocked(mSurface);
} else {
setSurfaceInTransactionLocked(null);
if (mSurface != null) {
mSurface.destroy();
mSurface = null;
}
}
}
@@ -307,7 +303,7 @@ final class OverlayDisplayAdapter extends DisplayAdapter {
public void onWindowDestroyed() {
synchronized (getSyncRoot()) {
if (mDevice != null) {
mDevice.clearSurfaceTextureLocked();
mDevice.destroyLocked();
sendDisplayDeviceEventLocked(mDevice, DISPLAY_DEVICE_EVENT_REMOVED);
}
}

View File

@@ -58,7 +58,7 @@ final class VirtualDisplayAdapter extends DisplayAdapter {
try {
appToken.linkToDeath(device, 0);
} catch (RemoteException ex) {
device.releaseLocked();
device.destroyLocked();
return null;
}
@@ -72,6 +72,7 @@ final class VirtualDisplayAdapter extends DisplayAdapter {
public DisplayDevice releaseVirtualDisplayLocked(IBinder appToken) {
VirtualDisplayDevice device = mVirtualDisplayDevices.remove(appToken);
if (device != null) {
device.destroyLocked();
appToken.unlinkToDeath(device, 0);
}
@@ -85,6 +86,7 @@ final class VirtualDisplayAdapter extends DisplayAdapter {
if (device != null) {
Slog.i(TAG, "Virtual display device released because application token died: "
+ device.mOwnerPackageName);
device.destroyLocked();
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_REMOVED);
}
}
@@ -100,7 +102,6 @@ final class VirtualDisplayAdapter extends DisplayAdapter {
private final int mDensityDpi;
private final int mFlags;
private boolean mReleased;
private Surface mSurface;
private DisplayDeviceInfo mInfo;
@@ -122,24 +123,25 @@ final class VirtualDisplayAdapter extends DisplayAdapter {
@Override
public void binderDied() {
synchronized (getSyncRoot()) {
if (!mReleased) {
if (mSurface != null) {
handleBinderDiedLocked(mAppToken);
}
}
}
public void releaseLocked() {
mReleased = true;
sendTraversalRequestLocked();
public void destroyLocked() {
if (mSurface != null) {
mSurface.release();
mSurface = null;
}
SurfaceControl.destroyDisplay(getDisplayTokenLocked());
}
@Override
public void performTraversalInTransactionLocked() {
if (mReleased && mSurface != null) {
mSurface.destroy();
mSurface = null;
if (mSurface != null) {
setSurfaceInTransactionLocked(mSurface);
}
setSurfaceInTransactionLocked(mSurface);
}
@Override

View File

@@ -374,7 +374,7 @@ final class WifiDisplayAdapter extends DisplayAdapter {
private void removeDisplayDeviceLocked() {
if (mDisplayDevice != null) {
mDisplayDevice.clearSurfaceLocked();
mDisplayDevice.destroyLocked();
sendDisplayDeviceEventLocked(mDisplayDevice, DISPLAY_DEVICE_EVENT_REMOVED);
mDisplayDevice = null;
@@ -633,9 +633,12 @@ final class WifiDisplayAdapter extends DisplayAdapter {
mSurface = surface;
}
public void clearSurfaceLocked() {
mSurface = null;
sendTraversalRequestLocked();
public void destroyLocked() {
if (mSurface != null) {
mSurface.release();
mSurface = null;
}
SurfaceControl.destroyDisplay(getDisplayTokenLocked());
}
public void setNameLocked(String name) {
@@ -645,7 +648,9 @@ final class WifiDisplayAdapter extends DisplayAdapter {
@Override
public void performTraversalInTransactionLocked() {
setSurfaceInTransactionLocked(mSurface);
if (mSurface != null) {
setSurfaceInTransactionLocked(mSurface);
}
}
@Override