diff options
author | Mathias Agopian <mathias@google.com> | 2010-10-14 14:54:06 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2010-10-14 14:57:34 -0700 |
commit | abd671a08a41519a7ab3d438a500efe0ef0bfc1d (patch) | |
tree | 31479b1c4e2cecfbfe8fd24eebdd24e06d4f19f4 /services/surfaceflinger | |
parent | 63be8ccc942bd47c8cfdbe227f9cd4c1cdad7737 (diff) | |
download | frameworks_native-abd671a08a41519a7ab3d438a500efe0ef0bfc1d.zip frameworks_native-abd671a08a41519a7ab3d438a500efe0ef0bfc1d.tar.gz frameworks_native-abd671a08a41519a7ab3d438a500efe0ef0bfc1d.tar.bz2 |
addresses parts of 3096779 and 3097475
3097475: Animation setting should control the screen on animation
3096779: CRT power-on animation can briefly show the top app instead of lockscreen
There is now a parameter that controls wether the ON and/or OFF animation are
performed. we also always clear the screen to black on power off, to make
sure it won't briefly appear on power on.
HOWEVER, 3096779 is not 100% fixed in the case where we're doing the animation
because there is a race, where SF doesn't wait (b/c it doesn't know) for the
framework to have redrawn the lockscreen.
Change-Id: Ie0f02c9225fcdf24b1e8907e268eb7da2c5b0a03
Diffstat (limited to 'services/surfaceflinger')
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 45 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 6 |
2 files changed, 32 insertions, 19 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index a975480..e37e446 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -80,7 +80,7 @@ SurfaceFlinger::SurfaceFlinger() mVisibleRegionsDirty(false), mDeferReleaseConsole(false), mFreezeDisplay(false), - mElectronBeamAnimation(false), + mElectronBeamAnimationMode(0), mFreezeCount(0), mFreezeDisplayTime(0), mDebugRegion(0), @@ -424,8 +424,7 @@ void SurfaceFlinger::handleConsoleEvents() hw.acquireScreen(); // this is a temporary work-around, eventually this should be called // by the power-manager - if (mElectronBeamAnimation) - SurfaceFlinger::turnElectronBeamOn(0); + SurfaceFlinger::turnElectronBeamOn(mElectronBeamAnimationMode); } if (mDeferReleaseConsole && hw.isScreenAcquired()) { @@ -1901,14 +1900,24 @@ status_t SurfaceFlinger::electronBeamOnAnimationImplLocked() // --------------------------------------------------------------------------- -status_t SurfaceFlinger::turnElectronBeamOffImplLocked() +status_t SurfaceFlinger::turnElectronBeamOffImplLocked(int32_t mode) { DisplayHardware& hw(graphicPlane(0).editDisplayHardware()); if (!hw.canDraw()) { // we're already off return NO_ERROR; } - electronBeamOffAnimationImplLocked(); + if (mode & ISurfaceComposer::eElectronBeamAnimationOff) { + electronBeamOffAnimationImplLocked(); + } + + // always clear the whole screen at the end of the animation + glClearColor(0,0,0,1); + glDisable(GL_SCISSOR_TEST); + glClear(GL_COLOR_BUFFER_BIT); + glEnable(GL_SCISSOR_TEST); + hw.flip( Region(hw.bounds()) ); + hw.setCanDraw(false); return NO_ERROR; } @@ -1917,22 +1926,23 @@ status_t SurfaceFlinger::turnElectronBeamOff(int32_t mode) { class MessageTurnElectronBeamOff : public MessageBase { SurfaceFlinger* flinger; + int32_t mode; status_t result; public: - MessageTurnElectronBeamOff(SurfaceFlinger* flinger) - : flinger(flinger), result(PERMISSION_DENIED) { + MessageTurnElectronBeamOff(SurfaceFlinger* flinger, int32_t mode) + : flinger(flinger), mode(mode), result(PERMISSION_DENIED) { } status_t getResult() const { return result; } virtual bool handler() { Mutex::Autolock _l(flinger->mStateLock); - result = flinger->turnElectronBeamOffImplLocked(); + result = flinger->turnElectronBeamOffImplLocked(mode); return true; } }; - sp<MessageBase> msg = new MessageTurnElectronBeamOff(this); + sp<MessageBase> msg = new MessageTurnElectronBeamOff(this, mode); status_t res = postMessageSync(msg); if (res == NO_ERROR) { res = static_cast<MessageTurnElectronBeamOff*>( msg.get() )->getResult(); @@ -1940,21 +1950,23 @@ status_t SurfaceFlinger::turnElectronBeamOff(int32_t mode) // work-around: when the power-manager calls us we activate the // animation. eventually, the "on" animation will be called // by the power-manager itself - mElectronBeamAnimation = true; + mElectronBeamAnimationMode = mode; } return res; } // --------------------------------------------------------------------------- -status_t SurfaceFlinger::turnElectronBeamOnImplLocked() +status_t SurfaceFlinger::turnElectronBeamOnImplLocked(int32_t mode) { DisplayHardware& hw(graphicPlane(0).editDisplayHardware()); if (hw.canDraw()) { // we're already on return NO_ERROR; } - electronBeamOnAnimationImplLocked(); + if (mode & ISurfaceComposer::eElectronBeamAnimationOn) { + electronBeamOnAnimationImplLocked(); + } hw.setCanDraw(true); // make sure to redraw the whole screen when the animation is done @@ -1968,22 +1980,23 @@ status_t SurfaceFlinger::turnElectronBeamOn(int32_t mode) { class MessageTurnElectronBeamOn : public MessageBase { SurfaceFlinger* flinger; + int32_t mode; status_t result; public: - MessageTurnElectronBeamOn(SurfaceFlinger* flinger) - : flinger(flinger), result(PERMISSION_DENIED) { + MessageTurnElectronBeamOn(SurfaceFlinger* flinger, int32_t mode) + : flinger(flinger), mode(mode), result(PERMISSION_DENIED) { } status_t getResult() const { return result; } virtual bool handler() { Mutex::Autolock _l(flinger->mStateLock); - result = flinger->turnElectronBeamOnImplLocked(); + result = flinger->turnElectronBeamOnImplLocked(mode); return true; } }; - postMessageAsync( new MessageTurnElectronBeamOn(this) ); + postMessageAsync( new MessageTurnElectronBeamOn(this, mode) ); return NO_ERROR; } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index d07a3ad..4262175 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -328,8 +328,8 @@ private: uint32_t* width, uint32_t* height, PixelFormat* format, uint32_t reqWidth = 0, uint32_t reqHeight = 0); - status_t turnElectronBeamOffImplLocked(); - status_t turnElectronBeamOnImplLocked(); + status_t turnElectronBeamOffImplLocked(int32_t mode); + status_t turnElectronBeamOnImplLocked(int32_t mode); status_t electronBeamOffAnimationImplLocked(); status_t electronBeamOnAnimationImplLocked(); status_t renderScreenToTextureLocked(DisplayID dpy, @@ -395,7 +395,7 @@ private: bool mVisibleRegionsDirty; bool mDeferReleaseConsole; bool mFreezeDisplay; - bool mElectronBeamAnimation; + int32_t mElectronBeamAnimationMode; int32_t mFreezeCount; nsecs_t mFreezeDisplayTime; Vector< sp<LayerBase> > mVisibleLayersSortedByZ; |