Chromium Code Reviews| 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; |
| } |