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

Unified Diff: src/gpu/GrClipMaskManager.cpp

Issue 2135673002: Don't scissor draws overlapping the render target's edges (Closed) Base URL: https://chromium.googlesource.com/skia.git@hidebounds
Patch Set: Created 4 years, 5 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 | « include/gpu/GrClip.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrClipMaskManager.cpp
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
index b9eaa412a8078aefa4f87bcb0f55e65aadb370b2..cce0b20eeeb7b12ae2e93cc95e0343929a04668b 100644
--- a/src/gpu/GrClipMaskManager.cpp
+++ b/src/gpu/GrClipMaskManager.cpp
@@ -146,13 +146,10 @@ bool GrClipMaskManager::UseSWOnlyPath(GrContext* context,
static bool get_analytic_clip_processor(const GrReducedClip::ElementList& elements,
bool abortIfAA,
SkVector& clipToRTOffset,
- const SkRect* drawBounds,
+ const SkRect& drawBounds,
sk_sp<GrFragmentProcessor>* resultFP) {
SkRect boundsInClipSpace;
- if (drawBounds) {
- boundsInClipSpace = *drawBounds;
- boundsInClipSpace.offset(-clipToRTOffset.fX, -clipToRTOffset.fY);
- }
+ boundsInClipSpace = drawBounds.makeOffset(-clipToRTOffset.fX, -clipToRTOffset.fY);
SkASSERT(elements.count() <= kMaxAnalyticElements);
SkSTArray<kMaxAnalyticElements, sk_sp<GrFragmentProcessor>> fps;
GrReducedClip::ElementList::Iter iter(elements);
@@ -166,7 +163,7 @@ static bool get_analytic_clip_processor(const GrReducedClip::ElementList& elemen
// Fallthrough, handled same as intersect.
case SkRegion::kIntersect_Op:
invert = false;
- if (drawBounds && iter.get()->contains(boundsInClipSpace)) {
+ if (iter.get()->contains(boundsInClipSpace)) {
skip = true;
}
break;
@@ -232,7 +229,7 @@ bool GrClipMaskManager::SetupClipping(GrContext* context,
const GrPipelineBuilder& pipelineBuilder,
GrDrawContext* drawContext,
const GrClipStackClip& clip,
- const SkRect* devBounds,
+ const SkRect* origDevBounds,
GrAppliedClip* out) {
if (!clip.clipStack() || clip.clipStack()->isWideOpen()) {
return true;
@@ -244,19 +241,19 @@ bool GrClipMaskManager::SetupClipping(GrContext* context,
SkIRect clipSpaceIBounds;
bool requiresAA = false;
- SkIRect clipSpaceRTIBounds = SkIRect::MakeWH(drawContext->width(), drawContext->height());
- clipSpaceRTIBounds.offset(clip.origin());
-
SkIRect clipSpaceReduceQueryBounds;
-#define DISABLE_DEV_BOUNDS_FOR_CLIP_REDUCTION 0
- if (devBounds && !DISABLE_DEV_BOUNDS_FOR_CLIP_REDUCTION) {
- SkIRect devIBounds = devBounds->roundOut();
- devIBounds.offset(clip.origin());
- if (!clipSpaceReduceQueryBounds.intersect(clipSpaceRTIBounds, devIBounds)) {
+ SkRect devBounds;
+ if (origDevBounds) {
robertphillips 2016/07/08 14:21:58 Are there any issues with this reject and hairline
bsalomon 2016/07/08 14:25:56 Because of 'empty' rects? No, because GrDT bloats
+ if (!devBounds.intersect(SkRect::MakeIWH(drawContext->width(), drawContext->height()),
+ *origDevBounds)) {
return false;
}
+ devBounds.roundOut(&clipSpaceReduceQueryBounds);
+ clipSpaceReduceQueryBounds.offset(clip.origin());
} else {
- clipSpaceReduceQueryBounds = clipSpaceRTIBounds;
+ devBounds = SkRect::MakeIWH(drawContext->width(), drawContext->height());
+ clipSpaceReduceQueryBounds.setXYWH(0, 0, drawContext->width(), drawContext->height());
+ clipSpaceReduceQueryBounds.offset(clip.origin());
}
GrReducedClip::ReduceClipStack(*clip.clipStack(),
clipSpaceReduceQueryBounds,
@@ -266,12 +263,15 @@ bool GrClipMaskManager::SetupClipping(GrContext* context,
&clipSpaceIBounds,
&requiresAA);
if (elements.isEmpty()) {
- if (GrReducedClip::kAllIn_InitialState == initialState) {
- if (clipSpaceIBounds == clipSpaceRTIBounds) {
- return true;
- }
- } else {
+ if (GrReducedClip::kAllOut_InitialState == initialState) {
return false;
+ } else {
+ SkIRect scissorSpaceIBounds(clipSpaceIBounds);
+ scissorSpaceIBounds.offset(-clip.origin());
+ if (!SkRect::Make(scissorSpaceIBounds).contains(devBounds)) {
+ out->makeScissored(scissorSpaceIBounds);
+ }
+ return true;
}
}
@@ -297,13 +297,12 @@ bool GrClipMaskManager::SetupClipping(GrContext* context,
pipelineBuilder.hasUserStencilSettings();
}
sk_sp<GrFragmentProcessor> clipFP;
- if (elements.isEmpty() ||
- (requiresAA &&
- get_analytic_clip_processor(elements, disallowAnalyticAA, clipToRTOffset, devBounds,
- &clipFP))) {
+ if (requiresAA &&
+ get_analytic_clip_processor(elements, disallowAnalyticAA, clipToRTOffset, devBounds,
+ &clipFP)) {
SkIRect scissorSpaceIBounds(clipSpaceIBounds);
scissorSpaceIBounds.offset(-clip.origin());
- if (!devBounds || !SkRect::Make(scissorSpaceIBounds).contains(*devBounds)) {
+ if (!SkRect::Make(scissorSpaceIBounds).contains(devBounds)) {
out->makeScissoredFPBased(std::move(clipFP), scissorSpaceIBounds);
return true;
}
« no previous file with comments | « include/gpu/GrClip.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698