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

Unified Diff: src/gpu/GrReducedClip.cpp

Issue 2312173002: Revert of Improve usage of window rectangles (Closed) Base URL: https://skia.googlesource.com/skia.git@upload_drawsinreducedclip
Patch Set: Created 4 years, 3 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
« no previous file with comments | « src/gpu/GrReducedClip.h ('k') | src/gpu/GrRenderTarget.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrReducedClip.cpp
diff --git a/src/gpu/GrReducedClip.cpp b/src/gpu/GrReducedClip.cpp
index 948f7e9947b55c9ba9680ebbb5e277df406de349..dfc0a2651bd45be8ff51a637f25523f6dd1633f2 100644
--- a/src/gpu/GrReducedClip.cpp
+++ b/src/gpu/GrReducedClip.cpp
@@ -28,8 +28,7 @@
* based on later intersect operations, and perhaps remove intersect-rects. We could optionally
* take a rect in case the caller knows a bound on what is to be drawn through this clip.
*/
-GrReducedClip::GrReducedClip(const SkClipStack& stack, const SkRect& queryBounds,
- int maxWindowRectangles) {
+GrReducedClip::GrReducedClip(const SkClipStack& stack, const SkRect& queryBounds) {
SkASSERT(!queryBounds.isEmpty());
fHasIBounds = false;
@@ -95,15 +94,10 @@
// Now that we have determined the bounds to use and filtered out the trivial cases, call the
// helper that actually walks the stack.
- this->walkStack(stack, tighterQuery, maxWindowRectangles);
-
- if (fWindowRects.count() < maxWindowRectangles) {
- this->addInteriorWindowRectangles(maxWindowRectangles);
- }
+ this->walkStack(stack, tighterQuery);
}
-void GrReducedClip::walkStack(const SkClipStack& stack, const SkRect& queryBounds,
- int maxWindowRectangles) {
+void GrReducedClip::walkStack(const SkClipStack& stack, const SkRect& queryBounds) {
// walk backwards until we get to:
// a) the beginning
// b) an operation that is known to make the bounds all inside/outside
@@ -161,10 +155,6 @@
initialTriState = InitialTriState::kAllOut;
skippable = true;
} else if (GrClip::IsOutsideClip(element->getBounds(), queryBounds)) {
- skippable = true;
- } else if (fWindowRects.count() < maxWindowRectangles && !embiggens &&
- !element->isAA() && Element::kRect_Type == element->getType()) {
- this->addWindowRectangle(element->getRect(), false);
skippable = true;
}
}
@@ -430,85 +420,10 @@
fInitialState = static_cast<GrReducedClip::InitialState>(initialTriState);
}
-static bool element_is_pure_subtract(SkRegion::Op op) {
- SkASSERT(op >= 0);
- return op <= SkRegion::kIntersect_Op;
-
- GR_STATIC_ASSERT(0 == SkRegion::kDifference_Op);
- GR_STATIC_ASSERT(1 == SkRegion::kIntersect_Op);
-}
-
-void GrReducedClip::addInteriorWindowRectangles(int maxWindowRectangles) {
- SkASSERT(fWindowRects.count() < maxWindowRectangles);
- // Walk backwards through the element list and add window rectangles to the interiors of
- // "difference" elements. Quit if we encounter an element that may grow the clip.
- ElementList::Iter iter(fElements, ElementList::Iter::kTail_IterStart);
- for (; iter.get() && element_is_pure_subtract(iter.get()->getOp()); iter.prev()) {
- const Element* element = iter.get();
- if (SkRegion::kDifference_Op != element->getOp()) {
- continue;
- }
-
- if (Element::kRect_Type == element->getType()) {
- SkASSERT(element->isAA());
- this->addWindowRectangle(element->getRect(), true);
- if (fWindowRects.count() >= maxWindowRectangles) {
- return;
- }
- continue;
- }
-
- if (Element::kRRect_Type == element->getType()) {
- // For round rects we add two overlapping windows in the shape of a plus.
- const SkRRect& clipRRect = element->getRRect();
- SkVector insetTL = clipRRect.radii(SkRRect::kUpperLeft_Corner);
- SkVector insetBR = clipRRect.radii(SkRRect::kLowerRight_Corner);
- if (SkRRect::kComplex_Type == clipRRect.getType()) {
- const SkVector& insetTR = clipRRect.radii(SkRRect::kUpperRight_Corner);
- const SkVector& insetBL = clipRRect.radii(SkRRect::kLowerLeft_Corner);
- insetTL.fX = SkTMax(insetTL.x(), insetBL.x());
- insetTL.fY = SkTMax(insetTL.y(), insetTR.y());
- insetBR.fX = SkTMax(insetBR.x(), insetTR.x());
- insetBR.fY = SkTMax(insetBR.y(), insetBL.y());
- }
- const SkRect& bounds = clipRRect.getBounds();
- if (insetTL.x() + insetBR.x() >= bounds.width() ||
- insetTL.y() + insetBR.y() >= bounds.height()) {
- continue; // The interior "plus" is empty.
- }
-
- SkRect horzRect = SkRect::MakeLTRB(bounds.left(), bounds.top() + insetTL.y(),
- bounds.right(), bounds.bottom() - insetBR.y());
- this->addWindowRectangle(horzRect, element->isAA());
- if (fWindowRects.count() >= maxWindowRectangles) {
- return;
- }
-
- SkRect vertRect = SkRect::MakeLTRB(bounds.left() + insetTL.x(), bounds.top(),
- bounds.right() - insetBR.x(), bounds.bottom());
- this->addWindowRectangle(vertRect, element->isAA());
- if (fWindowRects.count() >= maxWindowRectangles) {
- return;
- }
- continue;
- }
- }
-}
-
-inline void GrReducedClip::addWindowRectangle(const SkRect& elementInteriorRect, bool elementIsAA) {
- SkIRect* window = &fWindowRects.addWindow();
- if (!elementIsAA) {
- elementInteriorRect.round(window);
- } else {
- elementInteriorRect.roundIn(window);
- }
-}
-
inline bool GrReducedClip::intersectIBounds(const SkIRect& irect) {
SkASSERT(fHasIBounds);
if (!fIBounds.intersect(irect)) {
fHasIBounds = false;
- fWindowRects.reset();
fElements.reset();
fRequiresAA = false;
fInitialState = InitialState::kAllOut;
@@ -587,11 +502,6 @@
// The texture may be larger than necessary, this rect represents the part of the texture
// we populate with a rasterization of the clip.
GrFixedClip clip(SkIRect::MakeWH(fIBounds.width(), fIBounds.height()));
-
- if (!fWindowRects.empty()) {
- clip.setWindowRectangles(fWindowRects, {fIBounds.left(), fIBounds.top()},
- GrWindowRectsState::Mode::kExclusive);
- }
// The scratch texture that we are drawing into can be substantially larger than the mask. Only
// clear the part that we care about.
@@ -660,23 +570,18 @@
StencilClip(const SkIRect& scissorRect) : fFixedClip(scissorRect) {}
const GrFixedClip& fixedClip() const { return fFixedClip; }
- void setWindowRectangles(const GrWindowRectangles& windows, const SkIPoint& origin,
- GrWindowRectsState::Mode mode) {
- fFixedClip.setWindowRectangles(windows, origin, mode);
- }
-
private:
- bool quickContains(const SkRect&) const override {
+ bool quickContains(const SkRect&) const final {
return false;
}
- void getConservativeBounds(int width, int height, SkIRect* bounds, bool* iior) const override {
- fFixedClip.getConservativeBounds(width, height, bounds, iior);
- }
- bool isRRect(const SkRect& rtBounds, SkRRect* rr, bool* aa) const override {
+ void getConservativeBounds(int width, int height, SkIRect* devResult, bool* iior) const final {
+ fFixedClip.getConservativeBounds(width, height, devResult, iior);
+ }
+ bool isRRect(const SkRect& rtBounds, SkRRect* rr, bool* aa) const final {
return false;
}
bool apply(GrContext* context, GrDrawContext* drawContext, bool useHWAA,
- bool hasUserStencilSettings, GrAppliedClip* out) const override {
+ bool hasUserStencilSettings, GrAppliedClip* out) const final {
if (!fFixedClip.apply(context, drawContext, useHWAA, hasUserStencilSettings, out)) {
return false;
}
@@ -694,11 +599,6 @@
const SkIPoint& clipOrigin) const {
// We set the current clip to the bounds so that our recursive draws are scissored to them.
StencilClip stencilClip(fIBounds.makeOffset(-clipOrigin.x(), -clipOrigin.y()));
-
- if (!fWindowRects.empty()) {
- stencilClip.setWindowRectangles(fWindowRects, clipOrigin,
- GrWindowRectsState::Mode::kExclusive);
- }
bool initialState = InitialState::kAllIn == this->initialState();
drawContext->drawContextPriv().clearStencilClip(stencilClip.fixedClip(), initialState);
« no previous file with comments | « src/gpu/GrReducedClip.h ('k') | src/gpu/GrRenderTarget.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698