diff options
author | csmartdalton <csmartdalton@google.com> | 2016-07-13 13:37:08 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-07-13 13:37:08 -0700 |
commit | 97f6cd5d0fc84dbed7cd8770b79695df83c69444 (patch) | |
tree | 1df24975d67c510631feb8598c4a4fb3131904d2 /include/gpu | |
parent | 0d2c234e447d54110ee080d9f54ab347944393b0 (diff) |
Pre-crop filled rects to avoid scissor
Updates GrDrawContext to crop filled rects to the clip bounds before
creating batches for them. Also adds clipping logic to ignore scissor
when the draw falls completely inside. These two changes combined
reduce API traffic and improve batching.
In the future this can and should be improved by switching to floating
point clip boundaries, thus allowing us to throw out non pixel aligned
rectangle clips as well.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2132073002
Committed: https://skia.googlesource.com/skia/+/7969838702135b9f127bd738728da61bc49b050a
Committed: https://skia.googlesource.com/skia/+/86de59f4a99b5f54be0483c60ff0335be55b2bdf
Review-Url: https://codereview.chromium.org/2132073002
Diffstat (limited to 'include/gpu')
-rw-r--r-- | include/gpu/GrClip.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/include/gpu/GrClip.h b/include/gpu/GrClip.h index b177d6fda3..ab83441f41 100644 --- a/include/gpu/GrClip.h +++ b/include/gpu/GrClip.h @@ -112,6 +112,26 @@ public: GrAppliedClip* out) const = 0; virtual ~GrClip() {} + +protected: + /** + * Returns true if a clip can safely disable its scissor test for a particular draw. + */ + static bool CanIgnoreScissor(const SkIRect& scissorRect, const SkRect& drawBounds) { + // This is the maximum distance that a draw may extend beyond a clip's scissor and still + // count as inside. We use a sloppy compare because the draw may have chosen its bounds in a + // different coord system. The rationale for 1e-3 is that in the coverage case (and barring + // unexpected rounding), as long as coverage stays below 0.5 * 1/256 we ought to be OK. + constexpr SkScalar fuzz = 1e-3f; + SkASSERT(!scissorRect.isEmpty()); + SkASSERT(!drawBounds.isEmpty()); + return scissorRect.fLeft <= drawBounds.fLeft + fuzz && + scissorRect.fTop <= drawBounds.fTop + fuzz && + scissorRect.fRight >= drawBounds.fRight - fuzz && + scissorRect.fBottom >= drawBounds.fBottom - fuzz; + } + + friend class GrClipMaskManager; }; /** |