| Index: src/gpu/batches/GrPathStencilSettings.h
|
| diff --git a/src/gpu/batches/GrPathStencilSettings.h b/src/gpu/batches/GrPathStencilSettings.h
|
| index dd930a0da7c47e67dd135036b63e8fa62264c0fb..f37d1b2f18074a3909155fc748363937d0c4a59c 100644
|
| --- a/src/gpu/batches/GrPathStencilSettings.h
|
| +++ b/src/gpu/batches/GrPathStencilSettings.h
|
| @@ -8,36 +8,44 @@
|
| #ifndef GrPathStencilSettings_DEFINED
|
| #define GrPathStencilSettings_DEFINED
|
|
|
| +#include "GrUserStencilSettings.h"
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // Stencil rules for paths
|
|
|
| ////// Even/Odd
|
|
|
| -static constexpr GrStencilSettings gEOStencilPass(
|
| - kInvert_StencilOp,
|
| - kKeep_StencilOp,
|
| - kAlwaysIfInClip_StencilFunc,
|
| - 0xffff,
|
| - 0xffff,
|
| - 0xffff);
|
| +static constexpr GrUserStencilSettings gEOStencilPass(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0xffff,
|
| + GrUserStencilTest::kAlwaysIfInClip,
|
| + 0xffff,
|
| + GrUserStencilOp::kInvert,
|
| + GrUserStencilOp::kKeep,
|
| + 0xffff>()
|
| +);
|
|
|
| // ok not to check clip b/c stencil pass only wrote inside clip
|
| -static constexpr GrStencilSettings gEOColorPass(
|
| - kZero_StencilOp,
|
| - kZero_StencilOp,
|
| - kNotEqual_StencilFunc,
|
| - 0xffff,
|
| - 0x0000,
|
| - 0xffff);
|
| +static constexpr GrUserStencilSettings gEOColorPass(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0x0000,
|
| + GrUserStencilTest::kNotEqual,
|
| + 0xffff,
|
| + GrUserStencilOp::kZero,
|
| + GrUserStencilOp::kZero,
|
| + 0xffff>()
|
| +);
|
|
|
| // have to check clip b/c outside clip will always be zero.
|
| -static constexpr GrStencilSettings gInvEOColorPass(
|
| - kZero_StencilOp,
|
| - kZero_StencilOp,
|
| - kEqualIfInClip_StencilFunc,
|
| - 0xffff,
|
| - 0x0000,
|
| - 0xffff);
|
| +static constexpr GrUserStencilSettings gInvEOColorPass(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0x0000,
|
| + GrUserStencilTest::kEqualIfInClip,
|
| + 0xffff,
|
| + GrUserStencilOp::kZero,
|
| + GrUserStencilOp::kZero,
|
| + 0xffff>()
|
| +);
|
|
|
| ////// Winding
|
|
|
| @@ -45,90 +53,108 @@ static constexpr GrStencilSettings gInvEOColorPass(
|
| // when we don't have wrap incr and decr we use the stencil test to simulate
|
| // them.
|
|
|
| -static constexpr GrStencilSettings gWindStencilSeparateWithWrap(
|
| - kIncWrap_StencilOp, kDecWrap_StencilOp,
|
| - kKeep_StencilOp, kKeep_StencilOp,
|
| - kAlwaysIfInClip_StencilFunc, kAlwaysIfInClip_StencilFunc,
|
| - 0xffff, 0xffff,
|
| - 0xffff, 0xffff,
|
| - 0xffff, 0xffff);
|
| +static constexpr GrUserStencilSettings gWindStencilSeparateWithWrap(
|
| + GrUserStencilSettings::StaticInitSeparate<
|
| + 0xffff, 0xffff,
|
| + GrUserStencilTest::kAlwaysIfInClip, GrUserStencilTest::kAlwaysIfInClip,
|
| + 0xffff, 0xffff,
|
| + GrUserStencilOp::kIncWrap, GrUserStencilOp::kDecWrap,
|
| + GrUserStencilOp::kKeep, GrUserStencilOp::kKeep,
|
| + 0xffff, 0xffff>()
|
| +);
|
|
|
| // if inc'ing the max value, invert to make 0
|
| // if dec'ing zero invert to make all ones.
|
| // we can't avoid touching the stencil on both passing and
|
| // failing, so we can't resctrict ourselves to the clip.
|
| -static constexpr GrStencilSettings gWindStencilSeparateNoWrap(
|
| - kInvert_StencilOp, kInvert_StencilOp,
|
| - kIncClamp_StencilOp, kDecClamp_StencilOp,
|
| - kEqual_StencilFunc, kEqual_StencilFunc,
|
| - 0xffff, 0xffff,
|
| - 0xffff, 0x0000,
|
| - 0xffff, 0xffff);
|
| +static constexpr GrUserStencilSettings gWindStencilSeparateNoWrap(
|
| + GrUserStencilSettings::StaticInitSeparate<
|
| + 0xffff, 0x0000,
|
| + GrUserStencilTest::kEqual, GrUserStencilTest::kEqual,
|
| + 0xffff, 0xffff,
|
| + GrUserStencilOp::kInvert, GrUserStencilOp::kInvert,
|
| + GrUserStencilOp::kIncMaybeClamp, GrUserStencilOp::kDecMaybeClamp,
|
| + 0xffff, 0xffff>()
|
| +);
|
|
|
| // When there are no separate faces we do two passes to setup the winding rule
|
| // stencil. First we draw the front faces and inc, then we draw the back faces
|
| // and dec. These are same as the above two split into the incrementing and
|
| // decrementing passes.
|
| -static constexpr GrStencilSettings gWindSingleStencilWithWrapInc(
|
| - kIncWrap_StencilOp,
|
| - kKeep_StencilOp,
|
| - kAlwaysIfInClip_StencilFunc,
|
| - 0xffff,
|
| - 0xffff,
|
| - 0xffff);
|
| -
|
| -static constexpr GrStencilSettings gWindSingleStencilWithWrapDec(
|
| - kDecWrap_StencilOp,
|
| - kKeep_StencilOp,
|
| - kAlwaysIfInClip_StencilFunc,
|
| - 0xffff,
|
| - 0xffff,
|
| - 0xffff);
|
| -
|
| -static constexpr GrStencilSettings gWindSingleStencilNoWrapInc(
|
| - kInvert_StencilOp,
|
| - kIncClamp_StencilOp,
|
| - kEqual_StencilFunc,
|
| - 0xffff,
|
| - 0xffff,
|
| - 0xffff);
|
| -
|
| -static constexpr GrStencilSettings gWindSingleStencilNoWrapDec(
|
| - kInvert_StencilOp,
|
| - kDecClamp_StencilOp,
|
| - kEqual_StencilFunc,
|
| - 0xffff,
|
| - 0x0000,
|
| - 0xffff);
|
| +static constexpr GrUserStencilSettings gWindSingleStencilWithWrapInc(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0xffff,
|
| + GrUserStencilTest::kAlwaysIfInClip,
|
| + 0xffff,
|
| + GrUserStencilOp::kIncWrap,
|
| + GrUserStencilOp::kKeep,
|
| + 0xffff>()
|
| +);
|
| +
|
| +static constexpr GrUserStencilSettings gWindSingleStencilWithWrapDec(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0xffff,
|
| + GrUserStencilTest::kAlwaysIfInClip,
|
| + 0xffff,
|
| + GrUserStencilOp::kDecWrap,
|
| + GrUserStencilOp::kKeep,
|
| + 0xffff>()
|
| +);
|
| +
|
| +static constexpr GrUserStencilSettings gWindSingleStencilNoWrapInc(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0xffff,
|
| + GrUserStencilTest::kEqual,
|
| + 0xffff,
|
| + GrUserStencilOp::kInvert,
|
| + GrUserStencilOp::kIncMaybeClamp,
|
| + 0xffff>()
|
| +);
|
| +
|
| +static constexpr GrUserStencilSettings gWindSingleStencilNoWrapDec(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0x0000,
|
| + GrUserStencilTest::kEqual,
|
| + 0xffff,
|
| + GrUserStencilOp::kInvert,
|
| + GrUserStencilOp::kDecMaybeClamp,
|
| + 0xffff>()
|
| +);
|
|
|
| // Color passes are the same whether we use the two-sided stencil or two passes
|
|
|
| -static constexpr GrStencilSettings gWindColorPass(
|
| - kZero_StencilOp,
|
| - kZero_StencilOp,
|
| - kNonZeroIfInClip_StencilFunc,
|
| - 0xffff,
|
| - 0x0000,
|
| - 0xffff);
|
| -
|
| -static constexpr GrStencilSettings gInvWindColorPass(
|
| - kZero_StencilOp,
|
| - kZero_StencilOp,
|
| - kEqualIfInClip_StencilFunc,
|
| - 0xffff,
|
| - 0x0000,
|
| - 0xffff);
|
| +static constexpr GrUserStencilSettings gWindColorPass(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0x0000,
|
| + GrUserStencilTest::kLessIfInClip, // "0 < stencil" is equivalent to "0 != stencil".
|
| + 0xffff,
|
| + GrUserStencilOp::kZero,
|
| + GrUserStencilOp::kZero,
|
| + 0xffff>()
|
| +);
|
| +
|
| +static constexpr GrUserStencilSettings gInvWindColorPass(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0x0000,
|
| + GrUserStencilTest::kEqualIfInClip,
|
| + 0xffff,
|
| + GrUserStencilOp::kZero,
|
| + GrUserStencilOp::kZero,
|
| + 0xffff>()
|
| +);
|
|
|
| ////// Normal render to stencil
|
|
|
| // Sometimes the default path renderer can draw a path directly to the stencil
|
| // buffer without having to first resolve the interior / exterior.
|
| -static constexpr GrStencilSettings gDirectToStencil(
|
| - kZero_StencilOp,
|
| - kIncClamp_StencilOp,
|
| - kAlwaysIfInClip_StencilFunc,
|
| - 0xffff,
|
| - 0x0000,
|
| - 0xffff);
|
| +static constexpr GrUserStencilSettings gDirectToStencil(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0x0000,
|
| + GrUserStencilTest::kAlwaysIfInClip,
|
| + 0xffff,
|
| + GrUserStencilOp::kZero,
|
| + GrUserStencilOp::kIncMaybeClamp,
|
| + 0xffff>()
|
| +);
|
|
|
| #endif
|
|
|