diff options
author | Chris Craik <ccraik@google.com> | 2014-09-18 16:05:35 -0700 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2014-09-18 16:05:35 -0700 |
commit | 284b24358410cb0200e525a5ba36994090c83f20 (patch) | |
tree | 6251ddc72a3e29f68a94159b89539acf90b30a5a /libs | |
parent | c1e1550bf489b5fafff70154232c24bc5026b7df (diff) | |
download | frameworks_base-284b24358410cb0200e525a5ba36994090c83f20.zip frameworks_base-284b24358410cb0200e525a5ba36994090c83f20.tar.gz frameworks_base-284b24358410cb0200e525a5ba36994090c83f20.tar.bz2 |
Fix garbage showing up beneath dialogs
bug:17463894
Fixes the setViewport method to immediately affect the return values
of getViewportWidth/Height methods.
Also works around tiling extension issues observed on first frame
after window resize by disabling tiling for that frame.
Change-Id: Ie172d572d20d74a1be9cc58ad389af2cffa0e4b6
Diffstat (limited to 'libs')
-rwxr-xr-x | libs/hwui/OpenGLRenderer.cpp | 7 | ||||
-rwxr-xr-x | libs/hwui/OpenGLRenderer.h | 1 | ||||
-rw-r--r-- | libs/hwui/StatefulBaseRenderer.cpp | 7 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 2 |
4 files changed, 15 insertions, 2 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 25ea729..ce1d09f 100755 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -134,6 +134,8 @@ OpenGLRenderer::OpenGLRenderer(RenderState& renderState) , mExtensions(Extensions::getInstance()) , mRenderState(renderState) , mScissorOptimizationDisabled(false) + , mSuppressTiling(false) + , mFirstFrameAfterResize(true) , mCountOverdraw(false) , mLightCenter((Vector3){FLT_MIN, FLT_MIN, FLT_MIN}) , mLightRadius(FLT_MIN) @@ -179,6 +181,7 @@ void OpenGLRenderer::onViewportInitialized() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glEnableVertexAttribArray(Program::kBindingPosition); + mFirstFrameAfterResize = true; } void OpenGLRenderer::setupFrameState(float left, float top, @@ -202,7 +205,9 @@ status_t OpenGLRenderer::startFrame() { // Functors break the tiling extension in pretty spectacular ways // This ensures we don't use tiling when a functor is going to be // invoked during the frame - mSuppressTiling = mCaches.hasRegisteredFunctors(); + mSuppressTiling = mCaches.hasRegisteredFunctors() + || mFirstFrameAfterResize; + mFirstFrameAfterResize = false; startTilingCurrentClip(true); diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index e295b1a..47ef1a9 100755 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -1013,6 +1013,7 @@ private: // No-ops start/endTiling when set bool mSuppressTiling; + bool mFirstFrameAfterResize; // If true, this renderer will setup drawing to emulate // an increment stencil buffer in the color buffer diff --git a/libs/hwui/StatefulBaseRenderer.cpp b/libs/hwui/StatefulBaseRenderer.cpp index 12b8c8d..88d6f68 100644 --- a/libs/hwui/StatefulBaseRenderer.cpp +++ b/libs/hwui/StatefulBaseRenderer.cpp @@ -49,6 +49,13 @@ void StatefulBaseRenderer::setViewport(int width, int height) { mHeight = height; mFirstSnapshot->initializeViewport(width, height); onViewportInitialized(); + + // create a temporary 1st snapshot, so old snapshots are released, + // and viewport can be queried safely. + // TODO: remove, combine viewport + save stack initialization + mSnapshot = new Snapshot(mFirstSnapshot, + SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + mSaveCount = 1; } /////////////////////////////////////////////////////////////////////////////// diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 5e6796c..56ec797 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -117,10 +117,10 @@ void CanvasContext::pauseSurface(ANativeWindow* window) { stopDrawing(); } +// TODO: don't pass viewport size, it's automatic via EGL void CanvasContext::setup(int width, int height, const Vector3& lightCenter, float lightRadius, uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha) { if (!mCanvas) return; - mCanvas->setViewport(width, height); mCanvas->initLight(lightCenter, lightRadius, ambientShadowAlpha, spotShadowAlpha); } |