diff options
author | 2016-04-04 07:57:39 -0700 | |
---|---|---|
committer | 2016-04-04 07:57:39 -0700 | |
commit | 47a2dc8e229e93e1bcf7405747320920da1ab742 (patch) | |
tree | dc189b62d9a71ef21fb5cae9a1a2516d7b3300bc /src/gpu/batches/GrPathStencilSettings.h | |
parent | 3bc969264d4720d67f0b137552b3777a03b431a8 (diff) |
added GrMSAAPathRenderer
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1834133003
Review URL: https://codereview.chromium.org/1834133003
Diffstat (limited to 'src/gpu/batches/GrPathStencilSettings.h')
-rw-r--r-- | src/gpu/batches/GrPathStencilSettings.h | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/src/gpu/batches/GrPathStencilSettings.h b/src/gpu/batches/GrPathStencilSettings.h new file mode 100644 index 0000000000..a04f77a200 --- /dev/null +++ b/src/gpu/batches/GrPathStencilSettings.h @@ -0,0 +1,131 @@ +/* + * 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 + +////// Even/Odd + +GR_STATIC_CONST_SAME_STENCIL(gEOStencilPass, + kInvert_StencilOp, + kKeep_StencilOp, + kAlwaysIfInClip_StencilFunc, + 0xffff, + 0xffff, + 0xffff); + +// ok not to check clip b/c stencil pass only wrote inside clip +GR_STATIC_CONST_SAME_STENCIL(gEOColorPass, + kZero_StencilOp, + kZero_StencilOp, + kNotEqual_StencilFunc, + 0xffff, + 0x0000, + 0xffff); + +// have to check clip b/c outside clip will always be zero. +GR_STATIC_CONST_SAME_STENCIL(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. + +GR_STATIC_CONST_STENCIL(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. +GR_STATIC_CONST_STENCIL(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. +GR_STATIC_CONST_SAME_STENCIL(gWindSingleStencilWithWrapInc, + kIncWrap_StencilOp, + kKeep_StencilOp, + kAlwaysIfInClip_StencilFunc, + 0xffff, + 0xffff, + 0xffff); + +GR_STATIC_CONST_SAME_STENCIL(gWindSingleStencilWithWrapDec, + kDecWrap_StencilOp, + kKeep_StencilOp, + kAlwaysIfInClip_StencilFunc, + 0xffff, + 0xffff, + 0xffff); + +GR_STATIC_CONST_SAME_STENCIL(gWindSingleStencilNoWrapInc, + kInvert_StencilOp, + kIncClamp_StencilOp, + kEqual_StencilFunc, + 0xffff, + 0xffff, + 0xffff); + +GR_STATIC_CONST_SAME_STENCIL(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 + +GR_STATIC_CONST_SAME_STENCIL(gWindColorPass, + kZero_StencilOp, + kZero_StencilOp, + kNonZeroIfInClip_StencilFunc, + 0xffff, + 0x0000, + 0xffff); + +GR_STATIC_CONST_SAME_STENCIL(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. +GR_STATIC_CONST_SAME_STENCIL(gDirectToStencil, + kZero_StencilOp, + kIncClamp_StencilOp, + kAlwaysIfInClip_StencilFunc, + 0xffff, + 0x0000, + 0xffff); + +#endif |