diff options
Diffstat (limited to 'com/android/server/wm/WindowSurfaceController.java')
-rw-r--r-- | com/android/server/wm/WindowSurfaceController.java | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/com/android/server/wm/WindowSurfaceController.java b/com/android/server/wm/WindowSurfaceController.java index d56df55d..2e1e3f76 100644 --- a/com/android/server/wm/WindowSurfaceController.java +++ b/com/android/server/wm/WindowSurfaceController.java @@ -22,6 +22,7 @@ import static android.view.Surface.SCALING_MODE_SCALE_TO_WINDOW; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; @@ -564,4 +565,262 @@ class WindowSurfaceController { public String toString() { return mSurfaceControl.toString(); } + + static class SurfaceTrace extends SurfaceControl { + private final static String SURFACE_TAG = TAG_WITH_CLASS_NAME ? "SurfaceTrace" : TAG_WM; + private final static boolean LOG_SURFACE_TRACE = DEBUG_SURFACE_TRACE; + final static ArrayList<SurfaceTrace> sSurfaces = new ArrayList<SurfaceTrace>(); + + private float mSurfaceTraceAlpha = 0; + private int mLayer; + private final PointF mPosition = new PointF(); + private final Point mSize = new Point(); + private final Rect mWindowCrop = new Rect(); + private final Rect mFinalCrop = new Rect(); + private boolean mShown = false; + private int mLayerStack; + private boolean mIsOpaque; + private float mDsdx, mDtdx, mDsdy, mDtdy; + private final String mName; + + public SurfaceTrace(SurfaceSession s, String name, int w, int h, int format, int flags, + int windowType, int ownerUid) + throws OutOfResourcesException { + super(s, name, w, h, format, flags, windowType, ownerUid); + mName = name != null ? name : "Not named"; + mSize.set(w, h); + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " + + Debug.getCallers(3)); + synchronized (sSurfaces) { + sSurfaces.add(0, this); + } + } + + public SurfaceTrace(SurfaceSession s, + String name, int w, int h, int format, int flags) { + super(s, name, w, h, format, flags); + mName = name != null ? name : "Not named"; + mSize.set(w, h); + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " + + Debug.getCallers(3)); + synchronized (sSurfaces) { + sSurfaces.add(0, this); + } + } + + @Override + public void setAlpha(float alpha) { + if (mSurfaceTraceAlpha != alpha) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setAlpha(" + alpha + "): OLD:" + this + + ". Called by " + Debug.getCallers(3)); + mSurfaceTraceAlpha = alpha; + } + super.setAlpha(alpha); + } + + @Override + public void setLayer(int zorder) { + if (zorder != mLayer) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setLayer(" + zorder + "): OLD:" + this + + ". Called by " + Debug.getCallers(3)); + mLayer = zorder; + } + super.setLayer(zorder); + + synchronized (sSurfaces) { + sSurfaces.remove(this); + int i; + for (i = sSurfaces.size() - 1; i >= 0; i--) { + SurfaceTrace s = sSurfaces.get(i); + if (s.mLayer < zorder) { + break; + } + } + sSurfaces.add(i + 1, this); + } + } + + @Override + public void setPosition(float x, float y) { + if (x != mPosition.x || y != mPosition.y) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setPosition(" + x + "," + y + "): OLD:" + + this + ". Called by " + Debug.getCallers(3)); + mPosition.set(x, y); + } + super.setPosition(x, y); + } + + @Override + public void setGeometryAppliesWithResize() { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setGeometryAppliesWithResize(): OLD: " + + this + ". Called by" + Debug.getCallers(3)); + super.setGeometryAppliesWithResize(); + } + + @Override + public void setSize(int w, int h) { + if (w != mSize.x || h != mSize.y) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setSize(" + w + "," + h + "): OLD:" + + this + ". Called by " + Debug.getCallers(3)); + mSize.set(w, h); + } + super.setSize(w, h); + } + + @Override + public void setWindowCrop(Rect crop) { + if (crop != null) { + if (!crop.equals(mWindowCrop)) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setWindowCrop(" + + crop.toShortString() + "): OLD:" + this + ". Called by " + + Debug.getCallers(3)); + mWindowCrop.set(crop); + } + } + super.setWindowCrop(crop); + } + + @Override + public void setFinalCrop(Rect crop) { + if (crop != null) { + if (!crop.equals(mFinalCrop)) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setFinalCrop(" + + crop.toShortString() + "): OLD:" + this + ". Called by " + + Debug.getCallers(3)); + mFinalCrop.set(crop); + } + } + super.setFinalCrop(crop); + } + + @Override + public void setLayerStack(int layerStack) { + if (layerStack != mLayerStack) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setLayerStack(" + layerStack + "): OLD:" + + this + ". Called by " + Debug.getCallers(3)); + mLayerStack = layerStack; + } + super.setLayerStack(layerStack); + } + + @Override + public void setOpaque(boolean isOpaque) { + if (isOpaque != mIsOpaque) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setOpaque(" + isOpaque + "): OLD:" + + this + ". Called by " + Debug.getCallers(3)); + mIsOpaque = isOpaque; + } + super.setOpaque(isOpaque); + } + + @Override + public void setSecure(boolean isSecure) { + super.setSecure(isSecure); + } + + @Override + public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) { + if (dsdx != mDsdx || dtdx != mDtdx || dsdy != mDsdy || dtdy != mDtdy) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setMatrix(" + dsdx + "," + dtdx + "," + + dsdy + "," + dtdy + "): OLD:" + this + ". Called by " + + Debug.getCallers(3)); + mDsdx = dsdx; + mDtdx = dtdx; + mDsdy = dsdy; + mDtdy = dtdy; + } + super.setMatrix(dsdx, dtdx, dsdy, dtdy); + } + + @Override + public void hide() { + if (mShown) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "hide: OLD:" + this + ". Called by " + + Debug.getCallers(3)); + mShown = false; + } + super.hide(); + } + + @Override + public void show() { + if (!mShown) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "show: OLD:" + this + ". Called by " + + Debug.getCallers(3)); + mShown = true; + } + super.show(); + } + + @Override + public void destroy() { + super.destroy(); + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "destroy: " + this + ". Called by " + + Debug.getCallers(3)); + synchronized (sSurfaces) { + sSurfaces.remove(this); + } + } + + @Override + public void release() { + super.release(); + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "release: " + this + ". Called by " + + Debug.getCallers(3)); + synchronized (sSurfaces) { + sSurfaces.remove(this); + } + } + + @Override + public void setTransparentRegionHint(Region region) { + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setTransparentRegionHint(" + region + + "): OLD: " + this + " . Called by " + Debug.getCallers(3)); + super.setTransparentRegionHint(region); + } + + static void dumpAllSurfaces(PrintWriter pw, String header) { + synchronized (sSurfaces) { + final int N = sSurfaces.size(); + if (N <= 0) { + return; + } + if (header != null) { + pw.println(header); + } + pw.println("WINDOW MANAGER SURFACES (dumpsys window surfaces)"); + for (int i = 0; i < N; i++) { + SurfaceTrace s = sSurfaces.get(i); + pw.print(" Surface #"); pw.print(i); pw.print(": #"); + pw.print(Integer.toHexString(System.identityHashCode(s))); + pw.print(" "); pw.println(s.mName); + pw.print(" mLayerStack="); pw.print(s.mLayerStack); + pw.print(" mLayer="); pw.println(s.mLayer); + pw.print(" mShown="); pw.print(s.mShown); pw.print(" mAlpha="); + pw.print(s.mSurfaceTraceAlpha); pw.print(" mIsOpaque="); + pw.println(s.mIsOpaque); + pw.print(" mPosition="); pw.print(s.mPosition.x); pw.print(","); + pw.print(s.mPosition.y); + pw.print(" mSize="); pw.print(s.mSize.x); pw.print("x"); + pw.println(s.mSize.y); + pw.print(" mCrop="); s.mWindowCrop.printShortString(pw); pw.println(); + pw.print(" mFinalCrop="); s.mFinalCrop.printShortString(pw); pw.println(); + pw.print(" Transform: ("); pw.print(s.mDsdx); pw.print(", "); + pw.print(s.mDtdx); pw.print(", "); pw.print(s.mDsdy); + pw.print(", "); pw.print(s.mDtdy); pw.println(")"); + } + } + } + + @Override + public String toString() { + return "Surface " + Integer.toHexString(System.identityHashCode(this)) + " " + + mName + " (" + mLayerStack + "): shown=" + mShown + " layer=" + mLayer + + " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y + + " " + mSize.x + "x" + mSize.y + + " crop=" + mWindowCrop.toShortString() + + " opaque=" + mIsOpaque + + " (" + mDsdx + "," + mDtdx + "," + mDsdy + "," + mDtdy + ")"; + } + } } |