Merge "Optimize display lists"

This commit is contained in:
Romain Guy
2011-08-25 14:08:13 -07:00
committed by Android (Google) Code Review
4 changed files with 25 additions and 7 deletions

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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);
}