Merge "Optimize display lists"
This commit is contained in:
@@ -9992,8 +9992,6 @@ public class View implements Drawable.Callback2, KeyEvent.Callback, Accessibilit
|
||||
// The dirty rect should always be null for a display list
|
||||
canvas.onPreDraw(null);
|
||||
|
||||
final int restoreCount = canvas.save();
|
||||
|
||||
computeScroll();
|
||||
canvas.translate(-mScrollX, -mScrollY);
|
||||
mPrivateFlags |= DRAWN | DRAWING_CACHE_VALID;
|
||||
@@ -10005,8 +10003,6 @@ public class View implements Drawable.Callback2, KeyEvent.Callback, Accessibilit
|
||||
} else {
|
||||
draw(canvas);
|
||||
}
|
||||
|
||||
canvas.restoreToCount(restoreCount);
|
||||
} finally {
|
||||
canvas.onPostDraw();
|
||||
|
||||
|
||||
@@ -194,6 +194,7 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
|
||||
|
||||
void DisplayList::init() {
|
||||
mSize = 0;
|
||||
mIsRenderable = true;
|
||||
}
|
||||
|
||||
size_t DisplayList::getSize() {
|
||||
@@ -892,7 +893,7 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level)
|
||||
// Base structure
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE) {
|
||||
DisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE), mHasDrawOps(false) {
|
||||
}
|
||||
|
||||
DisplayListRenderer::~DisplayListRenderer() {
|
||||
@@ -926,6 +927,8 @@ void DisplayListRenderer::reset() {
|
||||
mPathMap.clear();
|
||||
|
||||
mMatrices.clear();
|
||||
|
||||
mHasDrawOps = false;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@@ -938,6 +941,7 @@ DisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
|
||||
} else {
|
||||
displayList->initFromDisplayListRenderer(*this, true);
|
||||
}
|
||||
displayList->setRenderable(mHasDrawOps);
|
||||
return displayList;
|
||||
}
|
||||
|
||||
@@ -982,7 +986,11 @@ int DisplayListRenderer::save(int flags) {
|
||||
}
|
||||
|
||||
void DisplayListRenderer::restore() {
|
||||
addOp(DisplayList::Restore);
|
||||
if (mRestoreSaveCount < 0) {
|
||||
addOp(DisplayList::Restore);
|
||||
} else {
|
||||
mRestoreSaveCount--;
|
||||
}
|
||||
OpenGLRenderer::restore();
|
||||
}
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@ public:
|
||||
// IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
|
||||
// when modifying this file
|
||||
enum Op {
|
||||
// Non-drawing operations
|
||||
Save = 0,
|
||||
Restore,
|
||||
RestoreToCount,
|
||||
@@ -75,6 +76,7 @@ public:
|
||||
SetMatrix,
|
||||
ConcatMatrix,
|
||||
ClipRect,
|
||||
// Drawing operations
|
||||
DrawDisplayList,
|
||||
DrawLayer,
|
||||
DrawBitmap,
|
||||
@@ -113,6 +115,14 @@ public:
|
||||
|
||||
static void outputLogBuffer(int fd);
|
||||
|
||||
void setRenderable(bool renderable) {
|
||||
mIsRenderable = renderable;
|
||||
}
|
||||
|
||||
bool isRenderable() const {
|
||||
return mIsRenderable;
|
||||
}
|
||||
|
||||
private:
|
||||
void init();
|
||||
|
||||
@@ -207,6 +217,8 @@ private:
|
||||
mutable SkFlattenableReadBuffer mReader;
|
||||
|
||||
size_t mSize;
|
||||
|
||||
bool mIsRenderable;
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@@ -328,6 +340,7 @@ private:
|
||||
inline void addOp(DisplayList::Op drawOp) {
|
||||
insertRestoreToCount();
|
||||
mWriter.writeInt(drawOp);
|
||||
mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
|
||||
}
|
||||
|
||||
inline void addInt(int value) {
|
||||
@@ -479,6 +492,7 @@ private:
|
||||
SkWriter32 mWriter;
|
||||
|
||||
int mRestoreSaveCount;
|
||||
bool mHasDrawOps;
|
||||
|
||||
friend class DisplayList;
|
||||
|
||||
|
||||
@@ -1278,7 +1278,7 @@ bool OpenGLRenderer::drawDisplayList(DisplayList* displayList, uint32_t width, u
|
||||
|
||||
// All the usual checks and setup operations (quickReject, setupDraw, etc.)
|
||||
// will be performed by the display list itself
|
||||
if (displayList) {
|
||||
if (displayList && displayList->isRenderable()) {
|
||||
return displayList->replay(*this, dirty, level);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user