summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy McFadden <fadden@android.com>2012-08-23 17:36:41 -0700
committerAndy McFadden <fadden@android.com>2012-08-24 09:19:56 -0700
commit53ade0853ca003c9e917b5e7d34e1b1338d7b87d (patch)
tree2a0132b15c8dff361e917048f523bcf59f613fbd
parentf435863467ab407f2a482604beed5fa6f0144c62 (diff)
downloadframeworks_native-53ade0853ca003c9e917b5e7d34e1b1338d7b87d.zip
frameworks_native-53ade0853ca003c9e917b5e7d34e1b1338d7b87d.tar.gz
frameworks_native-53ade0853ca003c9e917b5e7d34e1b1338d7b87d.tar.bz2
Added display initialization method
The primary display device was being configured to "blank" by default, which prevented the boot animation from appearing (unless you got lucky with the hardware composer state). Bug 6975688 (This reverts an earlier revert.)
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp44
-rw-r--r--services/surfaceflinger/SurfaceFlinger.h9
2 files changed, 42 insertions, 11 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index e6e258f..9de3649 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -137,15 +137,8 @@ void SurfaceFlinger::binderDied(const wp<IBinder>& who)
{
// the window manager died on us. prepare its eulogy.
- // reset screen orientation
- Vector<ComposerState> state;
- Vector<DisplayState> displays;
- DisplayState d;
- d.what = DisplayState::eOrientationChanged;
- d.token = mDefaultDisplays[DisplayDevice::DISPLAY_ID_MAIN];
- d.orientation = DisplayState::eOrientationDefault;
- displays.add(d);
- setTransactionState(state, displays, 0);
+ // restore initial conditions (default device unblank, etc)
+ initializeDisplays();
// restart the boot-animation
startBootAnim();
@@ -432,6 +425,9 @@ status_t SurfaceFlinger::readyToRun()
// We're now ready to accept clients...
mReadyToRunBarrier.open();
+ // set initial conditions (e.g. unblank default device)
+ initializeDisplays();
+
// start boot animation
startBootAnim();
@@ -1710,6 +1706,36 @@ status_t SurfaceFlinger::onLayerDestroyed(const wp<LayerBaseClient>& layer)
// ---------------------------------------------------------------------------
+void SurfaceFlinger::onInitializeDisplays() {
+ // reset screen orientation
+ Vector<ComposerState> state;
+ Vector<DisplayState> displays;
+ DisplayState d;
+ d.what = DisplayState::eOrientationChanged;
+ d.token = mDefaultDisplays[DisplayDevice::DISPLAY_ID_MAIN];
+ d.orientation = DisplayState::eOrientationDefault;
+ displays.add(d);
+ setTransactionState(state, displays, 0);
+
+ // XXX: this should init default device to "unblank" and all other devices to "blank"
+ onScreenAcquired();
+}
+
+void SurfaceFlinger::initializeDisplays() {
+ class MessageScreenInitialized : public MessageBase {
+ SurfaceFlinger* flinger;
+ public:
+ MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
+ virtual bool handler() {
+ flinger->onInitializeDisplays();
+ return true;
+ }
+ };
+ sp<MessageBase> msg = new MessageScreenInitialized(this);
+ postMessageAsync(msg); // we may be called from main thread, use async message
+}
+
+
void SurfaceFlinger::onScreenAcquired() {
ALOGD("Screen about to return, flinger = %p", this);
sp<const DisplayDevice> hw(getDefaultDisplayDevice()); // XXX: this should be per DisplayDevice
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 1f79906..b1fe738 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -231,9 +231,11 @@ private:
void signalLayerUpdate();
void signalRefresh();
- // called on the main thread in response to screenReleased()
+ // called on the main thread in response to initializeDisplays()
+ void onInitializeDisplays();
+ // called on the main thread in response to blank()
void onScreenReleased();
- // called on the main thread in response to screenAcquired()
+ // called on the main thread in response to unblank()
void onScreenAcquired();
void handleMessageTransaction();
@@ -321,6 +323,9 @@ private:
/* ------------------------------------------------------------------------
* Display and layer stack management
*/
+ // called when starting, or restarting after system_server death
+ void initializeDisplays();
+
sp<const DisplayDevice> getDisplayDevice(DisplayID dpy) const {
return mDisplays.valueFor(dpy);
}