diff options
author | Chris Craik <ccraik@google.com> | 2015-06-24 17:57:59 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-06-24 17:58:01 +0000 |
commit | 6659ac77edc9b328aacd8b07d656661c3a3f50c9 (patch) | |
tree | 816e5f33b39fd6690e53791776e11450138404fd /libs/hwui | |
parent | ccba036dd37a99c3beaf1cdf58665109c4931b19 (diff) | |
parent | 3375f8ad30997482317b5ade5618cc8a01b96d7d (diff) | |
download | frameworks_base-6659ac77edc9b328aacd8b07d656661c3a3f50c9.zip frameworks_base-6659ac77edc9b328aacd8b07d656661c3a3f50c9.tar.gz frameworks_base-6659ac77edc9b328aacd8b07d656661c3a3f50c9.tar.bz2 |
Merge "Avoid over-damaging layer area for multidraws" into mnc-dev
Diffstat (limited to 'libs/hwui')
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 19 | ||||
-rwxr-xr-x | libs/hwui/OpenGLRenderer.h | 8 |
2 files changed, 19 insertions, 8 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 433e178..3d48fa6 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -1097,7 +1097,7 @@ void OpenGLRenderer::dirtyLayer(const float left, const float top, } void OpenGLRenderer::dirtyLayerUnchecked(Rect& bounds, Region* region) { - if (bounds.intersect(mState.currentClipRect())) { + if (CC_LIKELY(!bounds.isEmpty() && bounds.intersect(mState.currentClipRect()))) { bounds.snapToPixelBoundaries(); android::Rect dirty(bounds.left, bounds.top, bounds.right, bounds.bottom); if (!dirty.isEmpty()) { @@ -1146,7 +1146,7 @@ void OpenGLRenderer::clearLayerRegions() { .setTransform(*currentSnapshot(), transformFlags) .setModelViewOffsetRect(0, 0, Rect(currentSnapshot()->getClipRect())) .build(); - renderGlop(glop, false); + renderGlop(glop, GlopRenderType::LayerClear); if (scissorChanged) mRenderState.scissor().setEnabled(true); } else { @@ -1454,10 +1454,15 @@ void OpenGLRenderer::debugClip() { #endif } -void OpenGLRenderer::renderGlop(const Glop& glop, bool clearLayer) { +void OpenGLRenderer::renderGlop(const Glop& glop, GlopRenderType type) { // TODO: It would be best if we could do this before quickRejectSetupScissor() // changes the scissor test state - if (clearLayer) clearLayerRegions(); + if (type != GlopRenderType::LayerClear) { + // Regular draws need to clear the dirty area on the layer before they start drawing on top + // of it. If this draw *is* a layer clear, it skips the clear step (since it would + // infinitely recurse) + clearLayerRegions(); + } if (mState.getDirtyClip()) { if (mRenderState.scissor().isEnabled()) { @@ -1467,7 +1472,7 @@ void OpenGLRenderer::renderGlop(const Glop& glop, bool clearLayer) { setStencilFromClip(); } mRenderState.render(glop); - if (!mRenderState.stencil().isWriteEnabled()) { + if (type == GlopRenderType::Standard && !mRenderState.stencil().isWriteEnabled()) { // TODO: specify more clearly when a draw should dirty the layer. // is writing to the stencil the only time we should ignore this? dirtyLayer(glop.bounds.left, glop.bounds.top, glop.bounds.right, glop.bounds.bottom); @@ -1540,7 +1545,7 @@ void OpenGLRenderer::drawBitmaps(const SkBitmap* bitmap, AssetAtlas::Entry* entr .setTransform(*currentSnapshot(), transformFlags) .setModelViewOffsetRectOptionalSnap(snap, x, y, Rect(0, 0, bounds.getWidth(), bounds.getHeight())) .build(); - renderGlop(glop); + renderGlop(glop, GlopRenderType::Multi); } void OpenGLRenderer::drawBitmap(const SkBitmap* bitmap, const SkPaint* paint) { @@ -1738,7 +1743,7 @@ void OpenGLRenderer::drawPatches(const SkBitmap* bitmap, AssetAtlas::Entry* entr .setTransform(*currentSnapshot(), transformFlags) .setModelViewOffsetRect(0, 0, Rect(0, 0, 0, 0)) .build(); - renderGlop(glop); + renderGlop(glop, GlopRenderType::Multi); } void OpenGLRenderer::drawVertexBuffer(float translateX, float translateY, diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index 5850dc6..800a9f9 100755 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -535,7 +535,13 @@ protected: RenderState& mRenderState; private: - void renderGlop(const Glop& glop, bool clearLayer = true); + enum class GlopRenderType { + Standard, + Multi, + LayerClear + }; + + void renderGlop(const Glop& glop, GlopRenderType type = GlopRenderType::Standard); /** * Discards the content of the framebuffer if supported by the driver. |