From 01e29054e672301e4adbbca15b3562a59a20f267 Mon Sep 17 00:00:00 2001 From: Jesse Hall Date: Tue, 19 Feb 2013 16:13:35 -0800 Subject: [PATCH] Init displays to null layer stack When a display is added, initialize it to use an empty layer stack, so if it is somehow visible it will show black. It will be assigned the real layer stack -- along with a projection and other properties -- by window manager soon. Normally a display remains blanked until window manager has decided what to show on it, but for HDMI connected at boot that isn't currently the case. Bug: 7258935 Change-Id: Ic9bb25f7a9b8d9d3772b097ab1d6fa03bc8780a1 --- services/surfaceflinger/DisplayDevice.cpp | 6 +++--- services/surfaceflinger/DisplayDevice.h | 6 +++++- services/surfaceflinger/SurfaceFlinger.cpp | 10 ++++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index 946694449..4fc9c6a3d 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -89,7 +89,7 @@ DisplayDevice::DisplayDevice( mIsSecure(isSecure), mSecureLayerVisible(false), mScreenAcquired(false), - mLayerStack(0), + mLayerStack(NO_LAYER_STACK), mOrientation() { init(config); @@ -196,13 +196,13 @@ void DisplayDevice::flip(const Region& dirty) const EGLDisplay dpy = mDisplay; EGLSurface surface = mSurface; -#ifdef EGL_ANDROID_swap_rectangle +#ifdef EGL_ANDROID_swap_rectangle if (mFlags & SWAP_RECTANGLE) { const Region newDirty(dirty.intersect(bounds())); const Rect b(newDirty.getBounds()); eglSetSwapRectangleANDROID(dpy, surface, b.left, b.top, b.width(), b.height()); - } + } #endif mPageFlipCount++; diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index bb6eb70e9..856366b33 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -65,6 +65,10 @@ public: SWAP_RECTANGLE = 0x00080000, }; + enum { + NO_LAYER_STACK = 0xFFFFFFFF, + }; + DisplayDevice( const sp& flinger, DisplayType type, @@ -117,7 +121,7 @@ public: void swapBuffers(HWComposer& hwc) const; status_t compositionComplete() const; - + // called after h/w composer has completed its set() call void onSwapBuffersCompleted(HWComposer& hwc) const; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index ee3e93b1a..c8d2eb653 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1347,7 +1347,7 @@ void SurfaceFlinger::computeVisibleRegions( // start with the whole surface at its current location const Layer::State& s(layer->drawingState()); - // only consider the layers on the given later stack + // only consider the layers on the given layer stack if (s.layerStack != layerStack) continue; @@ -2072,12 +2072,14 @@ status_t SurfaceFlinger::onLayerDestroyed(const wp& layer) // --------------------------------------------------------------------------- void SurfaceFlinger::onInitializeDisplays() { - // reset screen orientation + // reset screen orientation and use primary layer stack Vector state; Vector displays; DisplayState d; - d.what = DisplayState::eDisplayProjectionChanged; + d.what = DisplayState::eDisplayProjectionChanged | + DisplayState::eLayerStackChanged; d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY]; + d.layerStack = 0; d.orientation = DisplayState::eOrientationDefault; d.frame.makeInvalid(); d.viewport.makeInvalid(); @@ -2901,7 +2903,7 @@ SurfaceFlinger::DisplayDeviceState::DisplayDeviceState() } SurfaceFlinger::DisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type) - : type(type), layerStack(0), orientation(0) { + : type(type), layerStack(DisplayDevice::NO_LAYER_STACK), orientation(0) { viewport.makeInvalid(); frame.makeInvalid(); }