diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index df446f9284db9..58ef7b3a16897 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -473,6 +473,12 @@ void DisplayListRenderer::prepare(bool opaque) { SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); mSaveCount = 1; mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight); + mRestoreSaveCount = -1; +} + +void DisplayListRenderer::finish() { + insertRestoreToCount(); + OpenGLRenderer::finish(); } void DisplayListRenderer::acquireContext() { @@ -497,8 +503,7 @@ void DisplayListRenderer::restore() { } void DisplayListRenderer::restoreToCount(int saveCount) { - addOp(DisplayList::RestoreToCount); - addInt(saveCount); + mRestoreSaveCount = saveCount; OpenGLRenderer::restoreToCount(saveCount); } diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h index 7f9db8a46e620..68e4359ee90c0 100644 --- a/libs/hwui/DisplayListRenderer.h +++ b/libs/hwui/DisplayListRenderer.h @@ -238,6 +238,7 @@ public: void setViewport(int width, int height); void prepare(bool opaque); + void finish(); void acquireContext(); void releaseContext(); @@ -318,7 +319,16 @@ public: } private: + void insertRestoreToCount() { + if (mRestoreSaveCount >= 0) { + mWriter.writeInt(DisplayList::RestoreToCount); + addInt(mRestoreSaveCount); + mRestoreSaveCount = -1; + } + } + inline void addOp(DisplayList::Op drawOp) { + insertRestoreToCount(); mWriter.writeInt(drawOp); } @@ -461,6 +471,8 @@ private: DisplayList *mDisplayList; + int mRestoreSaveCount; + friend class DisplayList; }; // class DisplayListRenderer