Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(239)

Unified Diff: src/gpu/GrReducedClip.cpp

Issue 48593003: Avoid re-rendering stencil clip for every draw with reducable clip stack (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: rebase Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/GrReducedClip.cpp
diff --git a/src/gpu/GrReducedClip.cpp b/src/gpu/GrReducedClip.cpp
index 2b6583e3e328f2a5454620a3c2ae68b3a992c7de..9a7fc97529566b3a6324bcd35c0df07775875e03 100644
--- a/src/gpu/GrReducedClip.cpp
+++ b/src/gpu/GrReducedClip.cpp
@@ -70,7 +70,9 @@ void ReduceClipStack(const SkClipStack& stack,
SkRect scalarTighterBounds = SkRect::MakeFromIRect(*tighterBounds);
if (scalarTighterBounds == isectRect) {
// the round-out didn't add any area outside the clip rect.
- *requiresAA = false;
+ if (NULL != requiresAA) {
+ *requiresAA = false;
+ }
*initialState = kAllIn_InitialState;
return;
}
@@ -78,7 +80,12 @@ void ReduceClipStack(const SkClipStack& stack,
// iior should only be true if aa/non-aa status matches among all elements.
SkClipStack::Iter iter(stack, SkClipStack::Iter::kTop_IterStart);
bool doAA = iter.prev()->isAA();
- SkNEW_INSERT_AT_LLIST_HEAD(result, Element, (isectRect, SkRegion::kReplace_Op, doAA));
+ // The clip established by the element list might be cached based on the last
+ // generation id. Without walking the stack, we do not knoow what was the generation
+ // id that lead to this state. Make a conservative guess.
+ SkNEW_INSERT_AT_LLIST_HEAD(result, Element, (isectRect, SkRegion::kReplace_Op, doAA,
bsalomon 2013/10/30 14:25:59 Rather than assigning a genID to the manufactured
Kimmo Kinnunen 2013/11/01 12:12:20 Done.
+ stack.getTopmostGenID()));
+
if (NULL != requiresAA) {
*requiresAA = doAA;
}
@@ -124,6 +131,10 @@ void ReduceClipStack(const SkClipStack& stack,
// Now that we have determined the bounds to use and filtered out the trivial cases, call the
// helper that actually walks the stack.
reduced_stack_walker(stack, scalarBounds, result, initialState, requiresAA);
+
+ // The list that was computed in this function may be cached based on the gen id of the last
+ // element.
+ SkASSERT(0 == result->count() || SkClipStack::kInvalidGenID != result->tail()->getGenID());
}
void reduced_stack_walker(const SkClipStack& stack,
@@ -318,7 +329,7 @@ void reduced_stack_walker(const SkClipStack& stack,
SkRegion::kReverseDifference_Op == element->getOp());
SkNEW_INSERT_AT_LLIST_HEAD(result,
Element,
- (queryBounds, SkRegion::kReverseDifference_Op, false));
+ (queryBounds, SkRegion::kReverseDifference_Op, false, element->getGenID()));
} else {
Element* newElement = result->addToHead(*element);
if (newElement->isAA()) {

Powered by Google App Engine
This is Rietveld 408576698