diff options
author | Chris Dalton <csmartdalton@google.com> | 2017-11-07 13:35:22 -0700 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-11-07 21:30:44 +0000 |
commit | bbfd5161ed08710de6106101e64e3417ab32d2db (patch) | |
tree | 387cb49ad153fce7e685f2dbad13ffbb7b1238d9 /src/gpu/GrStencilClip.h | |
parent | cbba29ed4764b9a9da58710aed18aec6f3bd0ce0 (diff) |
Don't use analytic clip FPs when drawing to stencil
It doesn't make sense to multiply by coverage when drawing to stencil.
This could theoretically work with FPs that discard and/or modify
the sample mask, but for the time being an analytic FP means one that
calculates a coverage value.
Bug: skia:7190
Change-Id: I44140a5823f8683ec08244bdf9d369f51fa05dd9
Reviewed-on: https://skia-review.googlesource.com/68362
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Diffstat (limited to 'src/gpu/GrStencilClip.h')
-rw-r--r-- | src/gpu/GrStencilClip.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/gpu/GrStencilClip.h b/src/gpu/GrStencilClip.h new file mode 100644 index 0000000000..2bbf3b44de --- /dev/null +++ b/src/gpu/GrStencilClip.h @@ -0,0 +1,59 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef GrStencilClip_DEFINED +#define GrStencilClip_DEFINED + +#include "GrAppliedClip.h" +#include "GrFixedClip.h" + +/** + * Implements GrHardClip with the currently-existing stencil buffer contents and GrFixedClip. + */ +class GrStencilClip final : public GrHardClip { +public: + GrStencilClip(uint32_t stencilStackID = SK_InvalidGenID) : fStencilStackID(stencilStackID) {} + + explicit GrStencilClip(const SkIRect& scissorRect, uint32_t stencilStackID = SK_InvalidGenID) + : fFixedClip(scissorRect) + , fStencilStackID(stencilStackID) { + } + + const GrFixedClip& fixedClip() const { return fFixedClip; } + GrFixedClip& fixedClip() { return fFixedClip; } + + bool stencilStackID() const { return fStencilStackID; } + bool hasStencilClip() const { return SK_InvalidGenID != fStencilStackID; } + void setStencilClip(uint32_t stencilStackID) { fStencilStackID = stencilStackID; } + + bool quickContains(const SkRect& rect) const override { + return !this->hasStencilClip() && fFixedClip.quickContains(rect); + } + 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, GrAA* aa) const override { + return !this->hasStencilClip() && fFixedClip.isRRect(rtBounds, rr, aa); + } + bool apply(int rtWidth, int rtHeight, GrAppliedHardClip* out, SkRect* bounds) const override { + if (!fFixedClip.apply(rtWidth, rtHeight, out, bounds)) { + return false; + } + if (this->hasStencilClip()) { + out->addStencilClip(fStencilStackID); + } + return true; + } + +private: + GrFixedClip fFixedClip; + uint32_t fStencilStackID; + + typedef GrClip INHERITED; +}; + +#endif |