summaryrefslogtreecommitdiffstats
path: root/services/surfaceflinger
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2010-10-14 14:54:06 -0700
committerMathias Agopian <mathias@google.com>2010-10-14 14:57:34 -0700
commitabd671a08a41519a7ab3d438a500efe0ef0bfc1d (patch)
tree31479b1c4e2cecfbfe8fd24eebdd24e06d4f19f4 /services/surfaceflinger
parent63be8ccc942bd47c8cfdbe227f9cd4c1cdad7737 (diff)
downloadframeworks_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.cpp45
-rw-r--r--services/surfaceflinger/SurfaceFlinger.h6
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;