don't emit GL commands when sf is in freeze mode
We were emitting GL commands, calling composition complete and releasing clients without ever calling eglSwapBuffers(), which is completely wrong on non-direct renders. This could cause transient drawing artifacts when unfreezing the screen (upon orientaion change for instance) and could also block the clients for ever as they are waiting for their previous buffer to be rendered.
This commit is contained in:
@@ -491,7 +491,7 @@ bool SurfaceFlinger::threadLoop()
|
|||||||
handlePageFlip();
|
handlePageFlip();
|
||||||
|
|
||||||
const DisplayHardware& hw(graphicPlane(0).displayHardware());
|
const DisplayHardware& hw(graphicPlane(0).displayHardware());
|
||||||
if (LIKELY(hw.canDraw())) {
|
if (LIKELY(hw.canDraw() && !isFrozen())) {
|
||||||
// repaint the framebuffer (if needed)
|
// repaint the framebuffer (if needed)
|
||||||
handleRepaint();
|
handleRepaint();
|
||||||
|
|
||||||
@@ -512,14 +512,6 @@ bool SurfaceFlinger::threadLoop()
|
|||||||
|
|
||||||
void SurfaceFlinger::postFramebuffer()
|
void SurfaceFlinger::postFramebuffer()
|
||||||
{
|
{
|
||||||
if (isFrozen()) {
|
|
||||||
// we are not allowed to draw, but pause a bit to make sure
|
|
||||||
// apps don't end up using the whole CPU, if they depend on
|
|
||||||
// surfaceflinger for synchronization.
|
|
||||||
usleep(8333); // 8.3ms ~ 120fps
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mInvalidRegion.isEmpty()) {
|
if (!mInvalidRegion.isEmpty()) {
|
||||||
const DisplayHardware& hw(graphicPlane(0).displayHardware());
|
const DisplayHardware& hw(graphicPlane(0).displayHardware());
|
||||||
const nsecs_t now = systemTime();
|
const nsecs_t now = systemTime();
|
||||||
|
|||||||
Reference in New Issue
Block a user