summaryrefslogtreecommitdiffstats
path: root/libs/hwui/OpenGLRenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/hwui/OpenGLRenderer.cpp')
-rw-r--r--libs/hwui/OpenGLRenderer.cpp19
1 files changed, 12 insertions, 7 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,