| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrClipMaskManager.h" | 8 #include "GrClipMaskManager.h" |
| 9 #include "GrCaps.h" | 9 #include "GrCaps.h" |
| 10 #include "GrDrawingManager.h" |
| 10 #include "GrDrawContext.h" | 11 #include "GrDrawContext.h" |
| 11 #include "GrDrawTarget.h" | 12 #include "GrDrawTarget.h" |
| 12 #include "GrGpuResourcePriv.h" | 13 #include "GrGpuResourcePriv.h" |
| 13 #include "GrPaint.h" | 14 #include "GrPaint.h" |
| 14 #include "GrPathRenderer.h" | 15 #include "GrPathRenderer.h" |
| 15 #include "GrRenderTarget.h" | 16 #include "GrRenderTarget.h" |
| 16 #include "GrRenderTargetPriv.h" | 17 #include "GrRenderTargetPriv.h" |
| 17 #include "GrResourceProvider.h" | 18 #include "GrResourceProvider.h" |
| 18 #include "GrStencilAttachment.h" | 19 #include "GrStencilAttachment.h" |
| 19 #include "GrSWMaskHelper.h" | 20 #include "GrSWMaskHelper.h" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 42 mat, | 43 mat, |
| 43 GrTextureDomain::MakeTexelDomain(result
, domainTexels), | 44 GrTextureDomain::MakeTexelDomain(result
, domainTexels), |
| 44 GrTextureDomain::kDecal_Mode, | 45 GrTextureDomain::kDecal_Mode, |
| 45 GrTextureParams::kNone_FilterMode, | 46 GrTextureParams::kNone_FilterMode, |
| 46 kDevice_GrCoordSet); | 47 kDevice_GrCoordSet); |
| 47 } | 48 } |
| 48 | 49 |
| 49 // Does the path in 'element' require SW rendering? If so, return true (and, | 50 // Does the path in 'element' require SW rendering? If so, return true (and, |
| 50 // optionally, set 'prOut' to NULL. If not, return false (and, optionally, set | 51 // optionally, set 'prOut' to NULL. If not, return false (and, optionally, set |
| 51 // 'prOut' to the non-SW path renderer that will do the job). | 52 // 'prOut' to the non-SW path renderer that will do the job). |
| 52 static bool path_needs_SW_renderer(GrContext* context, | 53 bool GrClipMaskManager::PathNeedsSWRenderer(GrContext* context, |
| 53 const GrPipelineBuilder& pipelineBuilder, | 54 bool isStencilDisabled, |
| 54 const SkMatrix& viewMatrix, | 55 const GrRenderTarget* rt, |
| 55 const Element* element, | 56 const SkMatrix& viewMatrix, |
| 56 GrPathRenderer** prOut, | 57 const Element* element, |
| 57 bool needsStencil) { | 58 GrPathRenderer** prOut, |
| 59 bool needsStencil) { |
| 58 if (Element::kRect_Type == element->getType()) { | 60 if (Element::kRect_Type == element->getType()) { |
| 59 // rects can always be drawn directly w/o using the software path | 61 // rects can always be drawn directly w/o using the software path |
| 60 // TODO: skip rrects once we're drawing them directly. | 62 // TODO: skip rrects once we're drawing them directly. |
| 61 if (prOut) { | 63 if (prOut) { |
| 62 *prOut = nullptr; | 64 *prOut = nullptr; |
| 63 } | 65 } |
| 64 return false; | 66 return false; |
| 65 } else { | 67 } else { |
| 66 // We shouldn't get here with an empty clip element. | 68 // We shouldn't get here with an empty clip element. |
| 67 SkASSERT(Element::kEmpty_Type != element->getType()); | 69 SkASSERT(Element::kEmpty_Type != element->getType()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 79 if (needsStencil) { | 81 if (needsStencil) { |
| 80 type = element->isAA() | 82 type = element->isAA() |
| 81 ? GrPathRendererChain::kStencilAndColorAntiAlias_Dra
wType | 83 ? GrPathRendererChain::kStencilAndColorAntiAlias_Dra
wType |
| 82 : GrPathRendererChain::kStencilAndColor_DrawType; | 84 : GrPathRendererChain::kStencilAndColor_DrawType; |
| 83 } else { | 85 } else { |
| 84 type = element->isAA() | 86 type = element->isAA() |
| 85 ? GrPathRendererChain::kColorAntiAlias_DrawType | 87 ? GrPathRendererChain::kColorAntiAlias_DrawType |
| 86 : GrPathRendererChain::kColor_DrawType; | 88 : GrPathRendererChain::kColor_DrawType; |
| 87 } | 89 } |
| 88 | 90 |
| 91 GrPathRenderer::CanDrawPathArgs canDrawArgs; |
| 92 canDrawArgs.fShaderCaps = context->caps()->shaderCaps(); |
| 93 canDrawArgs.fViewMatrix = &viewMatrix; |
| 94 canDrawArgs.fPath = &path; |
| 95 canDrawArgs.fStroke = &stroke; |
| 96 canDrawArgs.fAntiAlias = element->isAA(); |
| 97 canDrawArgs.fIsStencilDisabled = isStencilDisabled; |
| 98 canDrawArgs.fIsStencilBufferMSAA = rt->isStencilBufferMultisampled(); |
| 99 |
| 89 // the 'false' parameter disallows use of the SW path renderer | 100 // the 'false' parameter disallows use of the SW path renderer |
| 90 GrPathRenderer* pr = context->getPathRenderer(pipelineBuilder, viewMatri
x, path, | 101 GrPathRenderer* pr = context->drawingManager()->getPathRenderer(canDrawA
rgs, false, type); |
| 91 stroke, false, type); | |
| 92 if (prOut) { | 102 if (prOut) { |
| 93 *prOut = pr; | 103 *prOut = pr; |
| 94 } | 104 } |
| 95 return SkToBool(!pr); | 105 return SkToBool(!pr); |
| 96 } | 106 } |
| 97 } | 107 } |
| 98 | 108 |
| 99 // Determines whether it is possible to draw the element to both the stencil buf
fer and the | 109 // Determines whether it is possible to draw the element to both the stencil buf
fer and the |
| 100 // alpha mask simultaneously. If so and the element is a path a compatible path
renderer is | 110 // alpha mask simultaneously. If so and the element is a path a compatible path
renderer is |
| 101 // also returned. | 111 // also returned. |
| 102 static GrPathRenderer* get_path_renderer(GrContext* context, | 112 GrPathRenderer* GrClipMaskManager::GetPathRenderer(GrContext* context, |
| 103 GrPipelineBuilder* pipelineBuilder, | 113 GrTexture* texture, |
| 104 const SkMatrix& viewMatrix, | 114 const SkMatrix& viewMatrix, |
| 105 const SkClipStack::Element* element) { | 115 const SkClipStack::Element* e
lement) { |
| 106 GrPathRenderer* pr; | 116 GrPathRenderer* pr; |
| 107 static const bool kNeedsStencil = true; | 117 static const bool kNeedsStencil = true; |
| 108 path_needs_SW_renderer(context, *pipelineBuilder, viewMatrix, element, &pr,
kNeedsStencil); | 118 static const bool kStencilIsDisabled = true; |
| 119 PathNeedsSWRenderer(context, |
| 120 kStencilIsDisabled, |
| 121 texture->asRenderTarget(), |
| 122 viewMatrix, |
| 123 element, |
| 124 &pr, |
| 125 kNeedsStencil); |
| 109 return pr; | 126 return pr; |
| 110 } | 127 } |
| 111 | 128 |
| 112 GrClipMaskManager::GrClipMaskManager(GrDrawTarget* drawTarget) | 129 GrClipMaskManager::GrClipMaskManager(GrDrawTarget* drawTarget) |
| 113 : fDrawTarget(drawTarget) | 130 : fDrawTarget(drawTarget) |
| 114 , fClipMode(kIgnoreClip_StencilClipMode) { | 131 , fClipMode(kIgnoreClip_StencilClipMode) { |
| 115 } | 132 } |
| 116 | 133 |
| 117 GrContext* GrClipMaskManager::getContext() { | 134 GrContext* GrClipMaskManager::getContext() { |
| 118 return fDrawTarget->cmmAccess().context(); | 135 return fDrawTarget->cmmAccess().context(); |
| 119 } | 136 } |
| 120 | 137 |
| 121 const GrCaps* GrClipMaskManager::caps() const { | 138 const GrCaps* GrClipMaskManager::caps() const { |
| 122 return fDrawTarget->caps(); | 139 return fDrawTarget->caps(); |
| 123 } | 140 } |
| 124 | 141 |
| 125 GrResourceProvider* GrClipMaskManager::resourceProvider() { | 142 GrResourceProvider* GrClipMaskManager::resourceProvider() { |
| 126 return fDrawTarget->cmmAccess().resourceProvider(); | 143 return fDrawTarget->cmmAccess().resourceProvider(); |
| 127 } | 144 } |
| 128 /* | 145 /* |
| 129 * This method traverses the clip stack to see if the GrSoftwarePathRenderer | 146 * This method traverses the clip stack to see if the GrSoftwarePathRenderer |
| 130 * will be used on any element. If so, it returns true to indicate that the | 147 * will be used on any element. If so, it returns true to indicate that the |
| 131 * entire clip should be rendered in SW and then uploaded en masse to the gpu. | 148 * entire clip should be rendered in SW and then uploaded en masse to the gpu. |
| 132 */ | 149 */ |
| 133 bool GrClipMaskManager::useSWOnlyPath(const GrPipelineBuilder& pipelineBuilder, | 150 bool GrClipMaskManager::useSWOnlyPath(const GrPipelineBuilder& pipelineBuilder, |
| 151 const GrRenderTarget* rt, |
| 134 const SkVector& clipToMaskOffset, | 152 const SkVector& clipToMaskOffset, |
| 135 const GrReducedClip::ElementList& elements
) { | 153 const GrReducedClip::ElementList& elements
) { |
| 136 // TODO: generalize this function so that when | 154 // TODO: generalize this function so that when |
| 137 // a clip gets complex enough it can just be done in SW regardless | 155 // a clip gets complex enough it can just be done in SW regardless |
| 138 // of whether it would invoke the GrSoftwarePathRenderer. | 156 // of whether it would invoke the GrSoftwarePathRenderer. |
| 139 | 157 |
| 140 // Set the matrix so that rendered clip elements are transformed to mask spa
ce from clip | 158 // Set the matrix so that rendered clip elements are transformed to mask spa
ce from clip |
| 141 // space. | 159 // space. |
| 142 const SkMatrix translate = SkMatrix::MakeTrans(clipToMaskOffset.fX, clipToMa
skOffset.fY); | 160 const SkMatrix translate = SkMatrix::MakeTrans(clipToMaskOffset.fX, clipToMa
skOffset.fY); |
| 143 | 161 |
| 144 for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.get();
iter.next()) { | 162 for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.get();
iter.next()) { |
| 145 const Element* element = iter.get(); | 163 const Element* element = iter.get(); |
| 146 | 164 |
| 147 SkRegion::Op op = element->getOp(); | 165 SkRegion::Op op = element->getOp(); |
| 148 bool invert = element->isInverseFilled(); | 166 bool invert = element->isInverseFilled(); |
| 149 bool needsStencil = invert || | 167 bool needsStencil = invert || |
| 150 SkRegion::kIntersect_Op == op || SkRegion::kReverseD
ifference_Op == op; | 168 SkRegion::kIntersect_Op == op || SkRegion::kReverseD
ifference_Op == op; |
| 151 | 169 |
| 152 if (path_needs_SW_renderer(this->getContext(), pipelineBuilder, translat
e, | 170 if (PathNeedsSWRenderer(this->getContext(), pipelineBuilder.getStencil()
.isDisabled(), |
| 153 element, nullptr, needsStencil)) { | 171 rt, translate, element, nullptr, needsStencil))
{ |
| 154 return true; | 172 return true; |
| 155 } | 173 } |
| 156 } | 174 } |
| 157 return false; | 175 return false; |
| 158 } | 176 } |
| 159 | 177 |
| 160 bool GrClipMaskManager::getAnalyticClipProcessor(const GrReducedClip::ElementLis
t& elements, | 178 bool GrClipMaskManager::getAnalyticClipProcessor(const GrReducedClip::ElementLis
t& elements, |
| 161 bool abortIfAA, | 179 bool abortIfAA, |
| 162 SkVector& clipToRTOffset, | 180 SkVector& clipToRTOffset, |
| 163 const SkRect* drawBounds, | 181 const SkRect* drawBounds, |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 // If MSAA is enabled we can do everything in the stencil buffer. | 371 // If MSAA is enabled we can do everything in the stencil buffer. |
| 354 if (0 == rt->numStencilSamples() && requiresAA) { | 372 if (0 == rt->numStencilSamples() && requiresAA) { |
| 355 SkAutoTUnref<GrTexture> result; | 373 SkAutoTUnref<GrTexture> result; |
| 356 | 374 |
| 357 // The top-left of the mask corresponds to the top-left corner of the bo
unds. | 375 // The top-left of the mask corresponds to the top-left corner of the bo
unds. |
| 358 SkVector clipToMaskOffset = { | 376 SkVector clipToMaskOffset = { |
| 359 SkIntToScalar(-clipSpaceIBounds.fLeft), | 377 SkIntToScalar(-clipSpaceIBounds.fLeft), |
| 360 SkIntToScalar(-clipSpaceIBounds.fTop) | 378 SkIntToScalar(-clipSpaceIBounds.fTop) |
| 361 }; | 379 }; |
| 362 | 380 |
| 363 if (this->useSWOnlyPath(pipelineBuilder, clipToMaskOffset, elements)) { | 381 if (this->useSWOnlyPath(pipelineBuilder, rt, clipToMaskOffset, elements)
) { |
| 364 // The clip geometry is complex enough that it will be more efficien
t to create it | 382 // The clip geometry is complex enough that it will be more efficien
t to create it |
| 365 // entirely in software | 383 // entirely in software |
| 366 result.reset(this->createSoftwareClipMask(genID, | 384 result.reset(this->createSoftwareClipMask(genID, |
| 367 initialState, | 385 initialState, |
| 368 elements, | 386 elements, |
| 369 clipToMaskOffset, | 387 clipToMaskOffset, |
| 370 clipSpaceIBounds)); | 388 clipSpaceIBounds)); |
| 371 } else { | 389 } else { |
| 372 result.reset(this->createAlphaClipMask(genID, | 390 result.reset(this->createAlphaClipMask(genID, |
| 373 initialState, | 391 initialState, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 } | 437 } |
| 420 } | 438 } |
| 421 | 439 |
| 422 //////////////////////////////////////////////////////////////////////////////// | 440 //////////////////////////////////////////////////////////////////////////////// |
| 423 bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder, | 441 bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder, |
| 424 const SkMatrix& viewMatrix, | 442 const SkMatrix& viewMatrix, |
| 425 GrTexture* target, | 443 GrTexture* target, |
| 426 const SkClipStack::Element* element, | 444 const SkClipStack::Element* element, |
| 427 GrPathRenderer* pr) { | 445 GrPathRenderer* pr) { |
| 428 | 446 |
| 429 pipelineBuilder->setRenderTarget(target->asRenderTarget()); | 447 GrRenderTarget* rt = target->asRenderTarget(); |
| 448 pipelineBuilder->setRenderTarget(rt); |
| 430 | 449 |
| 431 // The color we use to draw does not matter since we will always be using a
GrCoverageSetOpXP | 450 // The color we use to draw does not matter since we will always be using a
GrCoverageSetOpXP |
| 432 // which ignores color. | 451 // which ignores color. |
| 433 GrColor color = GrColor_WHITE; | 452 GrColor color = GrColor_WHITE; |
| 434 | 453 |
| 435 // TODO: Draw rrects directly here. | 454 // TODO: Draw rrects directly here. |
| 436 switch (element->getType()) { | 455 switch (element->getType()) { |
| 437 case Element::kEmpty_Type: | 456 case Element::kEmpty_Type: |
| 438 SkDEBUGFAIL("Should never get here with an empty element."); | 457 SkDEBUGFAIL("Should never get here with an empty element."); |
| 439 break; | 458 break; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 455 SkPath path; | 474 SkPath path; |
| 456 element->asPath(&path); | 475 element->asPath(&path); |
| 457 if (path.isInverseFillType()) { | 476 if (path.isInverseFillType()) { |
| 458 path.toggleInverseFillType(); | 477 path.toggleInverseFillType(); |
| 459 } | 478 } |
| 460 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); | 479 GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); |
| 461 if (nullptr == pr) { | 480 if (nullptr == pr) { |
| 462 GrPathRendererChain::DrawType type; | 481 GrPathRendererChain::DrawType type; |
| 463 type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_Dr
awType : | 482 type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_Dr
awType : |
| 464 GrPathRendererChain::kColor_DrawType; | 483 GrPathRendererChain::kColor_DrawType; |
| 465 pr = this->getContext()->getPathRenderer(*pipelineBuilder, viewM
atrix, | 484 |
| 466 path, stroke, false, ty
pe); | 485 GrPathRenderer::CanDrawPathArgs canDrawArgs; |
| 486 canDrawArgs.fShaderCaps = this->getContext()->caps()->shaderCaps
(); |
| 487 canDrawArgs.fViewMatrix = &viewMatrix; |
| 488 canDrawArgs.fPath = &path; |
| 489 canDrawArgs.fStroke = &stroke; |
| 490 canDrawArgs.fAntiAlias = element->isAA();; |
| 491 canDrawArgs.fIsStencilDisabled = pipelineBuilder->getStencil().i
sDisabled(); |
| 492 canDrawArgs.fIsStencilBufferMSAA = rt->isStencilBufferMultisampl
ed(); |
| 493 |
| 494 pr = this->getContext()->drawingManager()->getPathRenderer(canDr
awArgs, false, type); |
| 467 } | 495 } |
| 468 if (nullptr == pr) { | 496 if (nullptr == pr) { |
| 469 return false; | 497 return false; |
| 470 } | 498 } |
| 471 GrPathRenderer::DrawPathArgs args; | 499 GrPathRenderer::DrawPathArgs args; |
| 472 args.fTarget = fDrawTarget; | 500 args.fTarget = fDrawTarget; |
| 473 args.fResourceProvider = this->getContext()->resourceProvider(); | 501 args.fResourceProvider = this->getContext()->resourceProvider(); |
| 474 args.fPipelineBuilder = pipelineBuilder; | 502 args.fPipelineBuilder = pipelineBuilder; |
| 475 args.fColor = color; | 503 args.fColor = color; |
| 476 args.fViewMatrix = &viewMatrix; | 504 args.fViewMatrix = &viewMatrix; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 for (GrReducedClip::ElementList::Iter iter = elements.headIter(); iter.get()
; iter.next()) { | 587 for (GrReducedClip::ElementList::Iter iter = elements.headIter(); iter.get()
; iter.next()) { |
| 560 const Element* element = iter.get(); | 588 const Element* element = iter.get(); |
| 561 SkRegion::Op op = element->getOp(); | 589 SkRegion::Op op = element->getOp(); |
| 562 bool invert = element->isInverseFilled(); | 590 bool invert = element->isInverseFilled(); |
| 563 if (invert || SkRegion::kIntersect_Op == op || SkRegion::kReverseDiffere
nce_Op == op) { | 591 if (invert || SkRegion::kIntersect_Op == op || SkRegion::kReverseDiffere
nce_Op == op) { |
| 564 GrPipelineBuilder pipelineBuilder; | 592 GrPipelineBuilder pipelineBuilder; |
| 565 | 593 |
| 566 pipelineBuilder.setClip(clip); | 594 pipelineBuilder.setClip(clip); |
| 567 pipelineBuilder.setRenderTarget(texture->asRenderTarget()); | 595 pipelineBuilder.setRenderTarget(texture->asRenderTarget()); |
| 568 | 596 |
| 569 GrPathRenderer* pr = get_path_renderer(this->getContext(), &pipeline
Builder, | 597 SkASSERT(pipelineBuilder.getStencil().isDisabled()); |
| 570 translate, element); | 598 GrPathRenderer* pr = GetPathRenderer(this->getContext(), |
| 599 texture, translate, element); |
| 571 if (Element::kRect_Type != element->getType() && !pr) { | 600 if (Element::kRect_Type != element->getType() && !pr) { |
| 572 // useSWOnlyPath should now filter out all cases where gpu-side
mask merging would | 601 // useSWOnlyPath should now filter out all cases where gpu-side
mask merging would |
| 573 // be performed (i.e., pr would be NULL for a non-rect path). Se
e skbug.com/4519 | 602 // be performed (i.e., pr would be NULL for a non-rect path). Se
e skbug.com/4519 |
| 574 // for rationale and details. | 603 // for rationale and details. |
| 575 SkASSERT(0); | 604 SkASSERT(0); |
| 576 continue; | 605 continue; |
| 577 } | 606 } |
| 578 | 607 |
| 579 // draw directly into the result with the stencil set to make the pi
xels affected | 608 // draw directly into the result with the stencil set to make the pi
xels affected |
| 580 // by the clip shape be non-zero. | 609 // by the clip shape be non-zero. |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 SkPath clipPath; | 723 SkPath clipPath; |
| 695 if (Element::kRect_Type == element->getType()) { | 724 if (Element::kRect_Type == element->getType()) { |
| 696 stencilSupport = GrPathRenderer::kNoRestriction_StencilSupport; | 725 stencilSupport = GrPathRenderer::kNoRestriction_StencilSupport; |
| 697 fillInverted = false; | 726 fillInverted = false; |
| 698 } else { | 727 } else { |
| 699 element->asPath(&clipPath); | 728 element->asPath(&clipPath); |
| 700 fillInverted = clipPath.isInverseFillType(); | 729 fillInverted = clipPath.isInverseFillType(); |
| 701 if (fillInverted) { | 730 if (fillInverted) { |
| 702 clipPath.toggleInverseFillType(); | 731 clipPath.toggleInverseFillType(); |
| 703 } | 732 } |
| 704 pr = this->getContext()->getPathRenderer(pipelineBuilder, | 733 |
| 705 viewMatrix, | 734 SkASSERT(pipelineBuilder.getStencil().isDisabled()); |
| 706 clipPath, | 735 |
| 707 stroke, | 736 GrPathRenderer::CanDrawPathArgs canDrawArgs; |
| 708 false, | 737 canDrawArgs.fShaderCaps = this->getContext()->caps()->shaderCaps
(); |
| 709 GrPathRendererChain::kS
tencilOnly_DrawType, | 738 canDrawArgs.fViewMatrix = &viewMatrix; |
| 710 &stencilSupport); | 739 canDrawArgs.fPath = &clipPath; |
| 740 canDrawArgs.fStroke = &stroke; |
| 741 canDrawArgs.fAntiAlias = false; |
| 742 canDrawArgs.fIsStencilDisabled = pipelineBuilder.getStencil().is
Disabled(); |
| 743 canDrawArgs.fIsStencilBufferMSAA = rt->isStencilBufferMultisampl
ed(); |
| 744 |
| 745 pr = this->getContext()->drawingManager()->getPathRenderer(canDr
awArgs, false, |
| 746 GrPat
hRendererChain::kStencilOnly_DrawType, |
| 747 &sten
cilSupport); |
| 711 if (nullptr == pr) { | 748 if (nullptr == pr) { |
| 712 return false; | 749 return false; |
| 713 } | 750 } |
| 714 } | 751 } |
| 715 | 752 |
| 716 int passes; | 753 int passes; |
| 717 GrStencilSettings stencilSettings[GrStencilSettings::kMaxStencilClip
Passes]; | 754 GrStencilSettings stencilSettings[GrStencilSettings::kMaxStencilClip
Passes]; |
| 718 | 755 |
| 719 bool canRenderDirectToStencil = | 756 bool canRenderDirectToStencil = |
| 720 GrPathRenderer::kNoRestriction_StencilSupport == stencilSupport; | 757 GrPathRenderer::kNoRestriction_StencilSupport == stencilSupport; |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1056 | 1093 |
| 1057 //////////////////////////////////////////////////////////////////////////////// | 1094 //////////////////////////////////////////////////////////////////////////////// |
| 1058 | 1095 |
| 1059 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, | 1096 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, |
| 1060 GrStencilSettings* settings) { | 1097 GrStencilSettings* settings) { |
| 1061 if (stencilAttachment) { | 1098 if (stencilAttachment) { |
| 1062 int stencilBits = stencilAttachment->bits(); | 1099 int stencilBits = stencilAttachment->bits(); |
| 1063 this->adjustStencilParams(settings, fClipMode, stencilBits); | 1100 this->adjustStencilParams(settings, fClipMode, stencilBits); |
| 1064 } | 1101 } |
| 1065 } | 1102 } |
| OLD | NEW |