From 93a379bd4d6b30d86c270b879cf172d80172a72b Mon Sep 17 00:00:00 2001 From: cdalton Date: Wed, 11 May 2016 13:58:08 -0700 Subject: Separate user and raw stencil settings Adds a new GrUserStencilSettings class that describes in abstract terms how a draw will use the stencil (e.g. kAlwaysIfInClip, kSetClipBit, etc.). GrPipelineBuilder now only defines the GrUserStencilSettings. When the GrPipeline is finalized, the user stencil settings are then translated into concrete GrStencilSettings. At this point, GrClipMaskManager only needs to tell the GrAppliedClip whether or not there is a stencil clip. It does not need to modify stencil settings and GrPipelineBuilder does not need AutoRestoreStencil. This is one step of the stencil overhaul. In the future it will also allow us to clean up the special case handling for nvpr and the stateful fClipMode member of GrClipMaskManager. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1962243002 Committed: https://skia.googlesource.com/skia/+/12dbb3947e1aaf205b4fcf13b40e54e50650eb37 Review-Url: https://codereview.chromium.org/1962243002 --- src/gpu/vk/GrVkPipeline.cpp | 114 +++++++++++++++++++++-------------------- src/gpu/vk/GrVkPipelineState.h | 1 + 2 files changed, 60 insertions(+), 55 deletions(-) (limited to 'src/gpu/vk') diff --git a/src/gpu/vk/GrVkPipeline.cpp b/src/gpu/vk/GrVkPipeline.cpp index 2a9c6e2dd4..8227e12cb1 100644 --- a/src/gpu/vk/GrVkPipeline.cpp +++ b/src/gpu/vk/GrVkPipeline.cpp @@ -100,51 +100,51 @@ static void setup_input_assembly_state(GrPrimitiveType primitiveType, VkStencilOp stencil_op_to_vk_stencil_op(GrStencilOp op) { static const VkStencilOp gTable[] = { - VK_STENCIL_OP_KEEP, // kKeep_StencilOp - VK_STENCIL_OP_REPLACE, // kReplace_StencilOp - VK_STENCIL_OP_INCREMENT_AND_WRAP, // kIncWrap_StencilOp - VK_STENCIL_OP_INCREMENT_AND_CLAMP, // kIncClamp_StencilOp - VK_STENCIL_OP_DECREMENT_AND_WRAP, // kDecWrap_StencilOp - VK_STENCIL_OP_DECREMENT_AND_CLAMP, // kDecClamp_StencilOp - VK_STENCIL_OP_ZERO, // kZero_StencilOp - VK_STENCIL_OP_INVERT, // kInvert_StencilOp + VK_STENCIL_OP_KEEP, // kKeep + VK_STENCIL_OP_ZERO, // kZero + VK_STENCIL_OP_REPLACE, // kReplace + VK_STENCIL_OP_INVERT, // kInvert + VK_STENCIL_OP_INCREMENT_AND_WRAP, // kIncWrap + VK_STENCIL_OP_DECREMENT_AND_WRAP, // kDecWrap + VK_STENCIL_OP_INCREMENT_AND_CLAMP, // kIncClamp + VK_STENCIL_OP_DECREMENT_AND_CLAMP, // kDecClamp }; - GR_STATIC_ASSERT(SK_ARRAY_COUNT(gTable) == kStencilOpCnt); - GR_STATIC_ASSERT(0 == kKeep_StencilOp); - GR_STATIC_ASSERT(1 == kReplace_StencilOp); - GR_STATIC_ASSERT(2 == kIncWrap_StencilOp); - GR_STATIC_ASSERT(3 == kIncClamp_StencilOp); - GR_STATIC_ASSERT(4 == kDecWrap_StencilOp); - GR_STATIC_ASSERT(5 == kDecClamp_StencilOp); - GR_STATIC_ASSERT(6 == kZero_StencilOp); - GR_STATIC_ASSERT(7 == kInvert_StencilOp); - SkASSERT((unsigned)op < kStencilOpCnt); - return gTable[op]; + GR_STATIC_ASSERT(SK_ARRAY_COUNT(gTable) == kGrStencilOpCount); + GR_STATIC_ASSERT(0 == (int)GrStencilOp::kKeep); + GR_STATIC_ASSERT(1 == (int)GrStencilOp::kZero); + GR_STATIC_ASSERT(2 == (int)GrStencilOp::kReplace); + GR_STATIC_ASSERT(3 == (int)GrStencilOp::kInvert); + GR_STATIC_ASSERT(4 == (int)GrStencilOp::kIncWrap); + GR_STATIC_ASSERT(5 == (int)GrStencilOp::kDecWrap); + GR_STATIC_ASSERT(6 == (int)GrStencilOp::kIncClamp); + GR_STATIC_ASSERT(7 == (int)GrStencilOp::kDecClamp); + SkASSERT(op < (GrStencilOp)kGrStencilOpCount); + return gTable[(int)op]; } -VkCompareOp stencil_func_to_vk_compare_op(GrStencilFunc basicFunc) { +VkCompareOp stencil_func_to_vk_compare_op(GrStencilTest test) { static const VkCompareOp gTable[] = { - VK_COMPARE_OP_ALWAYS, // kAlways_StencilFunc - VK_COMPARE_OP_NEVER, // kNever_StencilFunc - VK_COMPARE_OP_GREATER, // kGreater_StencilFunc - VK_COMPARE_OP_GREATER_OR_EQUAL, // kGEqual_StencilFunc - VK_COMPARE_OP_LESS, // kLess_StencilFunc - VK_COMPARE_OP_LESS_OR_EQUAL, // kLEqual_StencilFunc, - VK_COMPARE_OP_EQUAL, // kEqual_StencilFunc, - VK_COMPARE_OP_NOT_EQUAL, // kNotEqual_StencilFunc, + VK_COMPARE_OP_ALWAYS, // kAlways + VK_COMPARE_OP_NEVER, // kNever + VK_COMPARE_OP_GREATER, // kGreater + VK_COMPARE_OP_GREATER_OR_EQUAL, // kGEqual + VK_COMPARE_OP_LESS, // kLess + VK_COMPARE_OP_LESS_OR_EQUAL, // kLEqual + VK_COMPARE_OP_EQUAL, // kEqual + VK_COMPARE_OP_NOT_EQUAL, // kNotEqual }; - GR_STATIC_ASSERT(SK_ARRAY_COUNT(gTable) == kBasicStencilFuncCnt); - GR_STATIC_ASSERT(0 == kAlways_StencilFunc); - GR_STATIC_ASSERT(1 == kNever_StencilFunc); - GR_STATIC_ASSERT(2 == kGreater_StencilFunc); - GR_STATIC_ASSERT(3 == kGEqual_StencilFunc); - GR_STATIC_ASSERT(4 == kLess_StencilFunc); - GR_STATIC_ASSERT(5 == kLEqual_StencilFunc); - GR_STATIC_ASSERT(6 == kEqual_StencilFunc); - GR_STATIC_ASSERT(7 == kNotEqual_StencilFunc); - SkASSERT((unsigned)basicFunc < kBasicStencilFuncCnt); - - return gTable[basicFunc]; + GR_STATIC_ASSERT(SK_ARRAY_COUNT(gTable) == kGrStencilTestCount); + GR_STATIC_ASSERT(0 == (int)GrStencilTest::kAlways); + GR_STATIC_ASSERT(1 == (int)GrStencilTest::kNever); + GR_STATIC_ASSERT(2 == (int)GrStencilTest::kGreater); + GR_STATIC_ASSERT(3 == (int)GrStencilTest::kGEqual); + GR_STATIC_ASSERT(4 == (int)GrStencilTest::kLess); + GR_STATIC_ASSERT(5 == (int)GrStencilTest::kLEqual); + GR_STATIC_ASSERT(6 == (int)GrStencilTest::kEqual); + GR_STATIC_ASSERT(7 == (int)GrStencilTest::kNotEqual); + SkASSERT(test < (GrStencilTest)kGrStencilTestCount); + + return gTable[(int)test]; } void setup_depth_stencil_state(const GrVkGpu* gpu, @@ -162,24 +162,28 @@ void setup_depth_stencil_state(const GrVkGpu* gpu, stencilInfo->stencilTestEnable = !stencilSettings.isDisabled(); if (!stencilSettings.isDisabled()) { // Set front face - GrStencilSettings::Face face = GrStencilSettings::kFront_Face; - stencilInfo->front.failOp = stencil_op_to_vk_stencil_op(stencilSettings.failOp(face)); - stencilInfo->front.passOp = stencil_op_to_vk_stencil_op(stencilSettings.passOp(face)); + const GrStencilSettings::Face& front = stencilSettings.front(); + stencilInfo->front.failOp = stencil_op_to_vk_stencil_op(front.fFailOp); + stencilInfo->front.passOp = stencil_op_to_vk_stencil_op(front.fPassOp); stencilInfo->front.depthFailOp = stencilInfo->front.failOp; - stencilInfo->front.compareOp = stencil_func_to_vk_compare_op(stencilSettings.func(face)); - stencilInfo->front.compareMask = stencilSettings.funcMask(face); - stencilInfo->front.writeMask = stencilSettings.writeMask(face); - stencilInfo->front.reference = stencilSettings.funcRef(face); + stencilInfo->front.compareOp = stencil_func_to_vk_compare_op(front.fTest); + stencilInfo->front.compareMask = front.fTestMask; + stencilInfo->front.writeMask = front.fWriteMask; + stencilInfo->front.reference = front.fRef; // Set back face - face = GrStencilSettings::kBack_Face; - stencilInfo->back.failOp = stencil_op_to_vk_stencil_op(stencilSettings.failOp(face)); - stencilInfo->back.passOp = stencil_op_to_vk_stencil_op(stencilSettings.passOp(face)); - stencilInfo->back.depthFailOp = stencilInfo->front.failOp; - stencilInfo->back.compareOp = stencil_func_to_vk_compare_op(stencilSettings.func(face)); - stencilInfo->back.compareMask = stencilSettings.funcMask(face); - stencilInfo->back.writeMask = stencilSettings.writeMask(face); - stencilInfo->back.reference = stencilSettings.funcRef(face); + if (!stencilSettings.isTwoSided()) { + stencilInfo->back = stencilInfo->front; + } else { + const GrStencilSettings::Face& back = stencilSettings.back(); + stencilInfo->back.failOp = stencil_op_to_vk_stencil_op(back.fFailOp); + stencilInfo->back.passOp = stencil_op_to_vk_stencil_op(back.fPassOp); + stencilInfo->back.depthFailOp = stencilInfo->front.failOp; + stencilInfo->back.compareOp = stencil_func_to_vk_compare_op(back.fTest); + stencilInfo->back.compareMask = back.fTestMask; + stencilInfo->back.writeMask = back.fWriteMask; + stencilInfo->back.reference = back.fRef; + } } stencilInfo->minDepthBounds = 0.0f; stencilInfo->maxDepthBounds = 1.0f; diff --git a/src/gpu/vk/GrVkPipelineState.h b/src/gpu/vk/GrVkPipelineState.h index b7f954ccbd..d0b0f564de 100644 --- a/src/gpu/vk/GrVkPipelineState.h +++ b/src/gpu/vk/GrVkPipelineState.h @@ -9,6 +9,7 @@ #ifndef GrVkPipelineState_DEFINED #define GrVkPipelineState_DEFINED +#include "GrStencilSettings.h" #include "GrVkImage.h" #include "GrVkProgramDesc.h" #include "GrVkPipelineStateDataManager.h" -- cgit v1.2.3