aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/batches/GrPathStencilSettings.h
diff options
context:
space:
mode:
authorGravatar ethannicholas <ethannicholas@google.com>2016-05-02 12:16:49 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-05-02 12:16:49 -0700
commit6536ae590e3873694cb02cf25dab8001a71f269e (patch)
treef944fbf08bb46bf044c3e01fce22c270b3a3a45e /src/gpu/batches/GrPathStencilSettings.h
parent0265707c191a31dfde08dd1cd7011c1fe5b8e643 (diff)
added GrMSAAPathRenderer
Diffstat (limited to 'src/gpu/batches/GrPathStencilSettings.h')
-rw-r--r--src/gpu/batches/GrPathStencilSettings.h134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/gpu/batches/GrPathStencilSettings.h b/src/gpu/batches/GrPathStencilSettings.h
new file mode 100644
index 0000000000..dd930a0da7
--- /dev/null
+++ b/src/gpu/batches/GrPathStencilSettings.h
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrPathStencilSettings_DEFINED
+#define GrPathStencilSettings_DEFINED
+
+////////////////////////////////////////////////////////////////////////////////
+// Stencil rules for paths
+
+////// Even/Odd
+
+static constexpr GrStencilSettings gEOStencilPass(
+ kInvert_StencilOp,
+ kKeep_StencilOp,
+ kAlwaysIfInClip_StencilFunc,
+ 0xffff,
+ 0xffff,
+ 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);
+
+// 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);
+
+////// Winding
+
+// when we have separate stencil we increment front faces / decrement back faces
+// 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);
+
+// 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);
+
+// 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);
+
+// 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);
+
+////// 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);
+
+#endif