void GrGLPathRendering::flushPathStencilSettings(const GrStencilSettings& stencilSettings) { if (fHWPathStencilSettings != stencilSettings) { // Just the func, ref, and mask is set here. The op and write mask are params to the call // that draws the path to the SB (glStencilFillPath) GrGLenum func = GrToGLStencilFunc(stencilSettings.func(GrStencilSettings::kFront_Face)); GL_CALL(PathStencilFunc(func, stencilSettings.funcRef(GrStencilSettings::kFront_Face), stencilSettings.funcMask(GrStencilSettings::kFront_Face))); fHWPathStencilSettings = stencilSettings; } }
static bool path_fill_type_is_winding(const GrStencilSettings& pathStencilSettings) { static const GrStencilSettings::Face pathFace = GrStencilSettings::kFront_Face; bool isWinding = kInvert_StencilOp != pathStencilSettings.passOp(pathFace); if (isWinding) { // Double check that it is in fact winding. SkASSERT(kIncClamp_StencilOp == pathStencilSettings.passOp(pathFace)); SkASSERT(kIncClamp_StencilOp == pathStencilSettings.failOp(pathFace)); SkASSERT(0x1 != pathStencilSettings.writeMask(pathFace)); SkASSERT(!pathStencilSettings.isTwoSided()); } return isWinding; }
void GrGLPathRendering::flushPathStencilSettings(const GrStencilSettings& stencilSettings) { if (fHWPathStencilSettings != stencilSettings) { SkASSERT(stencilSettings.isValid()); // Just the func, ref, and mask is set here. The op and write mask are params to the call // that draws the path to the SB (glStencilFillPath) uint16_t ref = stencilSettings.front().fRef; GrStencilTest test = stencilSettings.front().fTest; uint16_t testMask = stencilSettings.front().fTestMask; if (!fHWPathStencilSettings.isValid() || ref != fHWPathStencilSettings.front().fRef || test != fHWPathStencilSettings.front().fTest || testMask != fHWPathStencilSettings.front().fTestMask) { GL_CALL(PathStencilFunc(GrToGLStencilFunc(test), ref, testMask)); } fHWPathStencilSettings = stencilSettings; } }
void setup_depth_stencil_state(const GrVkGpu* gpu, const GrStencilSettings& stencilSettings, VkPipelineDepthStencilStateCreateInfo* stencilInfo) { memset(stencilInfo, 0, sizeof(VkPipelineDepthStencilStateCreateInfo)); stencilInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; stencilInfo->pNext = nullptr; stencilInfo->flags = 0; // set depth testing defaults stencilInfo->depthTestEnable = VK_FALSE; stencilInfo->depthWriteEnable = VK_FALSE; stencilInfo->depthCompareOp = VK_COMPARE_OP_ALWAYS; stencilInfo->depthBoundsTestEnable = VK_FALSE; stencilInfo->stencilTestEnable = !stencilSettings.isDisabled(); if (!stencilSettings.isDisabled()) { // Set front 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(front.fTest); stencilInfo->front.compareMask = front.fTestMask; stencilInfo->front.writeMask = front.fWriteMask; stencilInfo->front.reference = front.fRef; // Set back 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; }
void GrClipMaskManager::setPipelineBuilderStencil(const GrPipelineBuilder& pipelineBuilder, GrPipelineBuilder::AutoRestoreStencil* ars) { // We make two copies of the StencilSettings here (except in the early // exit scenario. One copy from draw state to the stack var. Then another // from the stack var to the gpu. We could make this class hold a ptr to // GrGpu's fStencilSettings and eliminate the stack copy here. // use stencil for clipping if clipping is enabled and the clip // has been written into the stencil. GrStencilSettings settings; // The GrGpu client may not be using the stencil buffer but we may need to // enable it in order to respect a stencil clip. if (pipelineBuilder.getStencil().isDisabled()) { if (GrClipMaskManager::kRespectClip_StencilClipMode == fClipMode) { settings = basic_apply_stencil_clip_settings(); } else { return; } } else { settings = pipelineBuilder.getStencil(); } int stencilBits = 0; GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); GrStencilAttachment* stencilAttachment = fDrawTarget->cmmAccess().resourceProvider()->attachStencilAttachment(rt); if (stencilAttachment) { stencilBits = stencilAttachment->bits(); } SkASSERT(fDrawTarget->caps()->stencilWrapOpsSupport() || !settings.usesWrapOp()); SkASSERT(fDrawTarget->caps()->twoSidedStencilSupport() || !settings.isTwoSided()); this->adjustStencilParams(&settings, fClipMode, stencilBits); ars->set(&pipelineBuilder); ars->setStencil(settings); }
void setup_depth_stencil_state(const GrVkGpu* gpu, const GrStencilSettings& stencilSettings, VkPipelineDepthStencilStateCreateInfo* stencilInfo) { memset(stencilInfo, 0, sizeof(VkPipelineDepthStencilStateCreateInfo)); stencilInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; stencilInfo->pNext = nullptr; stencilInfo->flags = 0; // set depth testing defaults stencilInfo->depthTestEnable = VK_FALSE; stencilInfo->depthWriteEnable = VK_FALSE; stencilInfo->depthCompareOp = VK_COMPARE_OP_ALWAYS; stencilInfo->depthBoundsTestEnable = VK_FALSE; 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)); 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 = 0; stencilInfo->front.reference = 0; // 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 = 0; stencilInfo->back.reference = 0; } stencilInfo->minDepthBounds = 0.0f; stencilInfo->maxDepthBounds = 1.0f; }