From 2df6f515675917a7a2812cf35faa5a1f47a6305f Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Thu, 6 May 2010 20:21:45 -0700 Subject: fix [2664345] Flash: Bad flicker at the end of a pinch zoom. the window manger puts SurfaceViews up before they have been rendered into, because of that surfaceflinger doesn't have anything ready to draw for that surface when an udpate occurs and responds by filling the surface with black. With this fix, we only fill those areas of the framebuffer that would otherwise be undefined (no content at all). in the Flash case, the "flash" window is not drawn at all until it has some content, instead the underlaying browser window is shown. Change-Id: Ifb610f7f8c27b88edf83e09adc4803fc295c15a1 --- libs/surfaceflinger/Layer.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'libs/surfaceflinger/Layer.cpp') diff --git a/libs/surfaceflinger/Layer.cpp b/libs/surfaceflinger/Layer.cpp index 0a3254dec5c0..ce7e9aa3f9bc 100644 --- a/libs/surfaceflinger/Layer.cpp +++ b/libs/surfaceflinger/Layer.cpp @@ -281,9 +281,28 @@ void Layer::onDraw(const Region& clip) const GLuint textureName = mTextures[index].name; if (UNLIKELY(textureName == -1LU)) { // the texture has not been created yet, this Layer has - // in fact never been drawn into. this happens frequently with - // SurfaceView. - clearWithOpenGL(clip); + // in fact never been drawn into. This happens frequently with + // SurfaceView because the WindowManager can't know when the client + // has drawn the first time. + + // If there is nothing under us, we paint the screen in black, otherwise + // we just skip this update. + + // figure out if there is something below us + Region under; + const SurfaceFlinger::LayerVector& drawingLayers(mFlinger->mDrawingState.layersSortedByZ); + const size_t count = drawingLayers.size(); + for (size_t i=0 ; i& layer(drawingLayers[i]); + if (layer.get() == static_cast(this)) + break; + under.orSelf(layer->visibleRegionScreen); + } + // if not everything below us is covered, we plug the holes! + Region holes(clip.subtract(under)); + if (!holes.isEmpty()) { + clearWithOpenGL(holes); + } return; } drawWithOpenGL(clip, mTextures[index]); -- cgit v1.2.3-59-g8ed1b