| 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 "GrDrawContext.h" | 10 #include "GrDrawContext.h" | 
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 69     // last (false) parameter disallows use of the SW path renderer | 69     // last (false) parameter disallows use of the SW path renderer | 
| 70     GrPathRendererChain::DrawType type = doAA ? | 70     GrPathRendererChain::DrawType type = doAA ? | 
| 71                                          GrPathRendererChain::kColorAntiAlias_Dr
      awType : | 71                                          GrPathRendererChain::kColorAntiAlias_Dr
      awType : | 
| 72                                          GrPathRendererChain::kColor_DrawType; | 72                                          GrPathRendererChain::kColor_DrawType; | 
| 73 | 73 | 
| 74     return nullptr == context->getPathRenderer(gpu, &pipelineBuilder, viewMatrix
      , *path, stroke, | 74     return nullptr == context->getPathRenderer(gpu, &pipelineBuilder, viewMatrix
      , *path, stroke, | 
| 75                                             false, type); | 75                                             false, type); | 
| 76 } | 76 } | 
| 77 } | 77 } | 
| 78 | 78 | 
| 79 GrClipMaskManager::GrClipMaskManager(GrClipTarget* clipTarget) | 79 GrClipMaskManager::GrClipMaskManager(GrDrawTarget* drawTarget) | 
| 80     : fCurrClipMaskType(kNone_ClipMaskType) | 80     : fCurrClipMaskType(kNone_ClipMaskType) | 
| 81     , fAACache(clipTarget->getContext()->resourceProvider()) | 81     , fAACache(drawTarget->cmmAccess().resourceProvider()) | 
| 82     , fClipTarget(clipTarget) | 82     , fDrawTarget(drawTarget) | 
| 83     , fClipMode(kIgnoreClip_StencilClipMode) { | 83     , fClipMode(kIgnoreClip_StencilClipMode) { | 
| 84 } | 84 } | 
| 85 | 85 | 
| 86 GrContext* GrClipMaskManager::getContext() { return fClipTarget->getContext(); } | 86 GrContext* GrClipMaskManager::getContext() { return fDrawTarget->cmmAccess().con
      text(); } | 
| 87 | 87 | 
| 88 /* | 88 /* | 
| 89  * This method traverses the clip stack to see if the GrSoftwarePathRenderer | 89  * This method traverses the clip stack to see if the GrSoftwarePathRenderer | 
| 90  * will be used on any element. If so, it returns true to indicate that the | 90  * will be used on any element. If so, it returns true to indicate that the | 
| 91  * entire clip should be rendered in SW and then uploaded en masse to the gpu. | 91  * entire clip should be rendered in SW and then uploaded en masse to the gpu. | 
| 92  */ | 92  */ | 
| 93 bool GrClipMaskManager::useSWOnlyPath(const GrPipelineBuilder& pipelineBuilder, | 93 bool GrClipMaskManager::useSWOnlyPath(const GrPipelineBuilder& pipelineBuilder, | 
| 94                                       const SkVector& clipToMaskOffset, | 94                                       const SkVector& clipToMaskOffset, | 
| 95                                       const GrReducedClip::ElementList& elements
      ) { | 95                                       const GrReducedClip::ElementList& elements
      ) { | 
| 96     // TODO: generalize this function so that when | 96     // TODO: generalize this function so that when | 
| 97     // a clip gets complex enough it can just be done in SW regardless | 97     // a clip gets complex enough it can just be done in SW regardless | 
| 98     // of whether it would invoke the GrSoftwarePathRenderer. | 98     // of whether it would invoke the GrSoftwarePathRenderer. | 
| 99     GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); | 99     GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); | 
| 100 | 100 | 
| 101     // Set the matrix so that rendered clip elements are transformed to mask spa
      ce from clip | 101     // Set the matrix so that rendered clip elements are transformed to mask spa
      ce from clip | 
| 102     // space. | 102     // space. | 
| 103     SkMatrix translate; | 103     SkMatrix translate; | 
| 104     translate.setTranslate(clipToMaskOffset); | 104     translate.setTranslate(clipToMaskOffset); | 
| 105 | 105 | 
| 106     for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.get();
       iter.next()) { | 106     for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.get();
       iter.next()) { | 
| 107         const Element* element = iter.get(); | 107         const Element* element = iter.get(); | 
| 108         // rects can always be drawn directly w/o using the software path | 108         // rects can always be drawn directly w/o using the software path | 
| 109         // Skip rrects once we're drawing them directly. | 109         // Skip rrects once we're drawing them directly. | 
| 110         if (Element::kRect_Type != element->getType()) { | 110         if (Element::kRect_Type != element->getType()) { | 
| 111             SkPath path; | 111             SkPath path; | 
| 112             element->asPath(&path); | 112             element->asPath(&path); | 
| 113             if (path_needs_SW_renderer(this->getContext(), fClipTarget, pipeline
      Builder, translate, | 113             if (path_needs_SW_renderer(this->getContext(), fDrawTarget, pipeline
      Builder, translate, | 
| 114                                        path, stroke, element->isAA())) { | 114                                        path, stroke, element->isAA())) { | 
| 115                 return true; | 115                 return true; | 
| 116             } | 116             } | 
| 117         } | 117         } | 
| 118     } | 118     } | 
| 119     return false; | 119     return false; | 
| 120 } | 120 } | 
| 121 | 121 | 
| 122 bool GrClipMaskManager::installClipEffects( | 122 bool GrClipMaskManager::installClipEffects( | 
| 123         const GrPipelineBuilder& pipelineBuilder, | 123         const GrPipelineBuilder& pipelineBuilder, | 
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 398         case Element::kEmpty_Type: | 398         case Element::kEmpty_Type: | 
| 399             SkDEBUGFAIL("Should never get here with an empty element."); | 399             SkDEBUGFAIL("Should never get here with an empty element."); | 
| 400             break; | 400             break; | 
| 401         case Element::kRect_Type: | 401         case Element::kRect_Type: | 
| 402             // TODO: Do rects directly to the accumulator using a aa-rect GrProc
      essor that covers | 402             // TODO: Do rects directly to the accumulator using a aa-rect GrProc
      essor that covers | 
| 403             // the entire mask bounds and writes 0 outside the rect. | 403             // the entire mask bounds and writes 0 outside the rect. | 
| 404             if (element->isAA()) { | 404             if (element->isAA()) { | 
| 405                 SkRect devRect = element->getRect(); | 405                 SkRect devRect = element->getRect(); | 
| 406                 viewMatrix.mapRect(&devRect); | 406                 viewMatrix.mapRect(&devRect); | 
| 407 | 407 | 
| 408                 fClipTarget->drawAARect(*pipelineBuilder, color, viewMatrix, | 408                 fDrawTarget->drawAARect(*pipelineBuilder, color, viewMatrix, | 
| 409                                         element->getRect(), devRect); | 409                                         element->getRect(), devRect); | 
| 410             } else { | 410             } else { | 
| 411                 fClipTarget->drawNonAARect(*pipelineBuilder, color, viewMatrix, | 411                 fDrawTarget->drawNonAARect(*pipelineBuilder, color, viewMatrix, | 
| 412                                            element->getRect()); | 412                                            element->getRect()); | 
| 413             } | 413             } | 
| 414             return true; | 414             return true; | 
| 415         default: { | 415         default: { | 
| 416             SkPath path; | 416             SkPath path; | 
| 417             element->asPath(&path); | 417             element->asPath(&path); | 
| 418             path.setIsVolatile(true); | 418             path.setIsVolatile(true); | 
| 419             if (path.isInverseFillType()) { | 419             if (path.isInverseFillType()) { | 
| 420                 path.toggleInverseFillType(); | 420                 path.toggleInverseFillType(); | 
| 421             } | 421             } | 
| 422             GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); | 422             GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); | 
| 423             if (nullptr == pr) { | 423             if (nullptr == pr) { | 
| 424                 GrPathRendererChain::DrawType type; | 424                 GrPathRendererChain::DrawType type; | 
| 425                 type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_Dr
      awType : | 425                 type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_Dr
      awType : | 
| 426                                          GrPathRendererChain::kColor_DrawType; | 426                                          GrPathRendererChain::kColor_DrawType; | 
| 427                 pr = this->getContext()->getPathRenderer(fClipTarget, pipelineBu
      ilder, viewMatrix, | 427                 pr = this->getContext()->getPathRenderer(fDrawTarget, pipelineBu
      ilder, viewMatrix, | 
| 428                                                          path, stroke, false, ty
      pe); | 428                                                          path, stroke, false, ty
      pe); | 
| 429             } | 429             } | 
| 430             if (nullptr == pr) { | 430             if (nullptr == pr) { | 
| 431                 return false; | 431                 return false; | 
| 432             } | 432             } | 
| 433             GrPathRenderer::DrawPathArgs args; | 433             GrPathRenderer::DrawPathArgs args; | 
| 434             args.fTarget = fClipTarget; | 434             args.fTarget = fDrawTarget; | 
| 435             args.fResourceProvider = this->getContext()->resourceProvider(); | 435             args.fResourceProvider = this->getContext()->resourceProvider(); | 
| 436             args.fPipelineBuilder = pipelineBuilder; | 436             args.fPipelineBuilder = pipelineBuilder; | 
| 437             args.fColor = color; | 437             args.fColor = color; | 
| 438             args.fViewMatrix = &viewMatrix; | 438             args.fViewMatrix = &viewMatrix; | 
| 439             args.fPath = &path; | 439             args.fPath = &path; | 
| 440             args.fStroke = &stroke; | 440             args.fStroke = &stroke; | 
| 441             args.fAntiAlias = element->isAA(); | 441             args.fAntiAlias = element->isAA(); | 
| 442             pr->drawPath(args); | 442             pr->drawPath(args); | 
| 443             break; | 443             break; | 
| 444         } | 444         } | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 459         SkASSERT(Element::kEmpty_Type != element->getType()); | 459         SkASSERT(Element::kEmpty_Type != element->getType()); | 
| 460         SkPath path; | 460         SkPath path; | 
| 461         element->asPath(&path); | 461         element->asPath(&path); | 
| 462         if (path.isInverseFillType()) { | 462         if (path.isInverseFillType()) { | 
| 463             path.toggleInverseFillType(); | 463             path.toggleInverseFillType(); | 
| 464         } | 464         } | 
| 465         GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); | 465         GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); | 
| 466         GrPathRendererChain::DrawType type = element->isAA() ? | 466         GrPathRendererChain::DrawType type = element->isAA() ? | 
| 467             GrPathRendererChain::kStencilAndColorAntiAlias_DrawType : | 467             GrPathRendererChain::kStencilAndColorAntiAlias_DrawType : | 
| 468             GrPathRendererChain::kStencilAndColor_DrawType; | 468             GrPathRendererChain::kStencilAndColor_DrawType; | 
| 469         *pr = this->getContext()->getPathRenderer(fClipTarget, pipelineBuilder, 
      SkMatrix::I(), path, | 469         *pr = this->getContext()->getPathRenderer(fDrawTarget, pipelineBuilder, 
      SkMatrix::I(), path, | 
| 470                                                   stroke, false, type); | 470                                                   stroke, false, type); | 
| 471         return SkToBool(*pr); | 471         return SkToBool(*pr); | 
| 472     } | 472     } | 
| 473 } | 473 } | 
| 474 | 474 | 
| 475 void GrClipMaskManager::mergeMask(GrPipelineBuilder* pipelineBuilder, | 475 void GrClipMaskManager::mergeMask(GrPipelineBuilder* pipelineBuilder, | 
| 476                                   GrTexture* dstMask, | 476                                   GrTexture* dstMask, | 
| 477                                   GrTexture* srcMask, | 477                                   GrTexture* srcMask, | 
| 478                                   SkRegion::Op op, | 478                                   SkRegion::Op op, | 
| 479                                   const SkIRect& dstBound, | 479                                   const SkIRect& dstBound, | 
| 480                                   const SkIRect& srcBound) { | 480                                   const SkIRect& srcBound) { | 
| 481     pipelineBuilder->setRenderTarget(dstMask->asRenderTarget()); | 481     pipelineBuilder->setRenderTarget(dstMask->asRenderTarget()); | 
| 482 | 482 | 
| 483     // We want to invert the coverage here | 483     // We want to invert the coverage here | 
| 484     set_coverage_drawing_xpf(op, false, pipelineBuilder); | 484     set_coverage_drawing_xpf(op, false, pipelineBuilder); | 
| 485 | 485 | 
| 486     SkMatrix sampleM; | 486     SkMatrix sampleM; | 
| 487     sampleM.setIDiv(srcMask->width(), srcMask->height()); | 487     sampleM.setIDiv(srcMask->width(), srcMask->height()); | 
| 488 | 488 | 
| 489     pipelineBuilder->addCoverageFragmentProcessor( | 489     pipelineBuilder->addCoverageFragmentProcessor( | 
| 490         GrTextureDomainEffect::Create(pipelineBuilder->getProcessorDataManager()
      , | 490         GrTextureDomainEffect::Create(pipelineBuilder->getProcessorDataManager()
      , | 
| 491                                       srcMask, | 491                                       srcMask, | 
| 492                                       sampleM, | 492                                       sampleM, | 
| 493                                       GrTextureDomain::MakeTexelDomain(srcMask, 
      srcBound), | 493                                       GrTextureDomain::MakeTexelDomain(srcMask, 
      srcBound), | 
| 494                                       GrTextureDomain::kDecal_Mode, | 494                                       GrTextureDomain::kDecal_Mode, | 
| 495                                       GrTextureParams::kNone_FilterMode))->unref
      (); | 495                                       GrTextureParams::kNone_FilterMode))->unref
      (); | 
| 496 | 496 | 
| 497     // The color passed in here does not matter since the coverageSetOpXP won't 
      read it. | 497     // The color passed in here does not matter since the coverageSetOpXP won't 
      read it. | 
| 498     fClipTarget->drawNonAARect(*pipelineBuilder, | 498     fDrawTarget->drawNonAARect(*pipelineBuilder, | 
| 499                                GrColor_WHITE, | 499                                GrColor_WHITE, | 
| 500                                SkMatrix::I(), | 500                                SkMatrix::I(), | 
| 501                                SkRect::Make(dstBound)); | 501                                SkRect::Make(dstBound)); | 
| 502 } | 502 } | 
| 503 | 503 | 
| 504 GrTexture* GrClipMaskManager::createTempMask(int width, int height) { | 504 GrTexture* GrClipMaskManager::createTempMask(int width, int height) { | 
| 505     GrSurfaceDesc desc; | 505     GrSurfaceDesc desc; | 
| 506     desc.fFlags = kRenderTarget_GrSurfaceFlag; | 506     desc.fFlags = kRenderTarget_GrSurfaceFlag; | 
| 507     desc.fWidth = width; | 507     desc.fWidth = width; | 
| 508     desc.fHeight = height; | 508     desc.fHeight = height; | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 579     // space. | 579     // space. | 
| 580     SkMatrix translate; | 580     SkMatrix translate; | 
| 581     translate.setTranslate(clipToMaskOffset); | 581     translate.setTranslate(clipToMaskOffset); | 
| 582 | 582 | 
| 583     // The texture may be larger than necessary, this rect represents the part o
      f the texture | 583     // The texture may be larger than necessary, this rect represents the part o
      f the texture | 
| 584     // we populate with a rasterization of the clip. | 584     // we populate with a rasterization of the clip. | 
| 585     SkIRect maskSpaceIBounds = SkIRect::MakeWH(clipSpaceIBounds.width(), clipSpa
      ceIBounds.height()); | 585     SkIRect maskSpaceIBounds = SkIRect::MakeWH(clipSpaceIBounds.width(), clipSpa
      ceIBounds.height()); | 
| 586 | 586 | 
| 587     // The scratch texture that we are drawing into can be substantially larger 
      than the mask. Only | 587     // The scratch texture that we are drawing into can be substantially larger 
      than the mask. Only | 
| 588     // clear the part that we care about. | 588     // clear the part that we care about. | 
| 589     fClipTarget->clear(&maskSpaceIBounds, | 589     fDrawTarget->clear(&maskSpaceIBounds, | 
| 590                        GrReducedClip::kAllIn_InitialState == initialState ? 0xff
      ffffff : 0x00000000, | 590                        GrReducedClip::kAllIn_InitialState == initialState ? 0xff
      ffffff : 0x00000000, | 
| 591                        true, | 591                        true, | 
| 592                        result->asRenderTarget()); | 592                        result->asRenderTarget()); | 
| 593 | 593 | 
| 594     // When we use the stencil in the below loop it is important to have this cl
      ip installed. | 594     // When we use the stencil in the below loop it is important to have this cl
      ip installed. | 
| 595     // The second pass that zeros the stencil buffer renders the rect maskSpaceI
      Bounds so the first | 595     // The second pass that zeros the stencil buffer renders the rect maskSpaceI
      Bounds so the first | 
| 596     // pass must not set values outside of this bounds or stencil values outside
       the rect won't be | 596     // pass must not set values outside of this bounds or stencil values outside
       the rect won't be | 
| 597     // cleared. | 597     // cleared. | 
| 598     GrClip clip(maskSpaceIBounds); | 598     GrClip clip(maskSpaceIBounds); | 
| 599     SkAutoTUnref<GrTexture> temp; | 599     SkAutoTUnref<GrTexture> temp; | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 628                 if (!temp) { | 628                 if (!temp) { | 
| 629                     temp.reset(this->createTempMask(maskSpaceIBounds.fRight, | 629                     temp.reset(this->createTempMask(maskSpaceIBounds.fRight, | 
| 630                                                     maskSpaceIBounds.fBottom)); | 630                                                     maskSpaceIBounds.fBottom)); | 
| 631                     if (!temp) { | 631                     if (!temp) { | 
| 632                         fAACache.reset(); | 632                         fAACache.reset(); | 
| 633                         return nullptr; | 633                         return nullptr; | 
| 634                     } | 634                     } | 
| 635                 } | 635                 } | 
| 636                 dst = temp; | 636                 dst = temp; | 
| 637                 // clear the temp target and set blend to replace | 637                 // clear the temp target and set blend to replace | 
| 638                 fClipTarget->clear(&maskSpaceElementIBounds, | 638                 fDrawTarget->clear(&maskSpaceElementIBounds, | 
| 639                                    invert ? 0xffffffff : 0x00000000, | 639                                    invert ? 0xffffffff : 0x00000000, | 
| 640                                    true, | 640                                    true, | 
| 641                                    dst->asRenderTarget()); | 641                                    dst->asRenderTarget()); | 
| 642                 set_coverage_drawing_xpf(SkRegion::kReplace_Op, invert, &pipelin
      eBuilder); | 642                 set_coverage_drawing_xpf(SkRegion::kReplace_Op, invert, &pipelin
      eBuilder); | 
| 643             } else { | 643             } else { | 
| 644                 // draw directly into the result with the stencil set to make th
      e pixels affected | 644                 // draw directly into the result with the stencil set to make th
      e pixels affected | 
| 645                 // by the clip shape be non-zero. | 645                 // by the clip shape be non-zero. | 
| 646                 dst = result; | 646                 dst = result; | 
| 647                 GR_STATIC_CONST_SAME_STENCIL(kStencilInElement, | 647                 GR_STATIC_CONST_SAME_STENCIL(kStencilInElement, | 
| 648                                              kReplace_StencilOp, | 648                                              kReplace_StencilOp, | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 681                 GR_STATIC_CONST_SAME_STENCIL(kDrawOutsideElement, | 681                 GR_STATIC_CONST_SAME_STENCIL(kDrawOutsideElement, | 
| 682                                              kZero_StencilOp, | 682                                              kZero_StencilOp, | 
| 683                                              kZero_StencilOp, | 683                                              kZero_StencilOp, | 
| 684                                              kEqual_StencilFunc, | 684                                              kEqual_StencilFunc, | 
| 685                                              0xffff, | 685                                              0xffff, | 
| 686                                              0x0000, | 686                                              0x0000, | 
| 687                                              0xffff); | 687                                              0xffff); | 
| 688                 backgroundPipelineBuilder.setStencil(kDrawOutsideElement); | 688                 backgroundPipelineBuilder.setStencil(kDrawOutsideElement); | 
| 689 | 689 | 
| 690                 // The color passed in here does not matter since the coverageSe
      tOpXP won't read it. | 690                 // The color passed in here does not matter since the coverageSe
      tOpXP won't read it. | 
| 691                 fClipTarget->drawNonAARect(backgroundPipelineBuilder, GrColor_WH
      ITE, translate, | 691                 fDrawTarget->drawNonAARect(backgroundPipelineBuilder, GrColor_WH
      ITE, translate, | 
| 692                                            clipSpaceIBounds); | 692                                            clipSpaceIBounds); | 
| 693             } | 693             } | 
| 694         } else { | 694         } else { | 
| 695             GrPipelineBuilder pipelineBuilder; | 695             GrPipelineBuilder pipelineBuilder; | 
| 696 | 696 | 
| 697             // all the remaining ops can just be directly draw into the accumula
      tion buffer | 697             // all the remaining ops can just be directly draw into the accumula
      tion buffer | 
| 698             set_coverage_drawing_xpf(op, false, &pipelineBuilder); | 698             set_coverage_drawing_xpf(op, false, &pipelineBuilder); | 
| 699             // The color passed in here does not matter since the coverageSetOpX
      P won't read it. | 699             // The color passed in here does not matter since the coverageSetOpX
      P won't read it. | 
| 700             this->drawElement(&pipelineBuilder, translate, result, element); | 700             this->drawElement(&pipelineBuilder, translate, result, element); | 
| 701         } | 701         } | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 734 | 734 | 
| 735         // We set the current clip to the bounds so that our recursive draws are
       scissored to them. | 735         // We set the current clip to the bounds so that our recursive draws are
       scissored to them. | 
| 736         SkIRect stencilSpaceIBounds(clipSpaceIBounds); | 736         SkIRect stencilSpaceIBounds(clipSpaceIBounds); | 
| 737         stencilSpaceIBounds.offset(clipSpaceToStencilOffset); | 737         stencilSpaceIBounds.offset(clipSpaceToStencilOffset); | 
| 738         GrClip clip(stencilSpaceIBounds); | 738         GrClip clip(stencilSpaceIBounds); | 
| 739 | 739 | 
| 740         int clipBit = stencilAttachment->bits(); | 740         int clipBit = stencilAttachment->bits(); | 
| 741         SkASSERT((clipBit <= 16) && "Ganesh only handles 16b or smaller stencil 
      buffers"); | 741         SkASSERT((clipBit <= 16) && "Ganesh only handles 16b or smaller stencil 
      buffers"); | 
| 742         clipBit = (1 << (clipBit-1)); | 742         clipBit = (1 << (clipBit-1)); | 
| 743 | 743 | 
| 744         fClipTarget->clearStencilClip(stencilSpaceIBounds, | 744         fDrawTarget->cmmAccess().clearStencilClip(stencilSpaceIBounds, | 
| 745                                       GrReducedClip::kAllIn_InitialState == init
      ialState, | 745             GrReducedClip::kAllIn_InitialState == initialState, rt); | 
| 746                                       rt); |  | 
| 747 | 746 | 
| 748         // walk through each clip element and perform its set op | 747         // walk through each clip element and perform its set op | 
| 749         // with the existing clip. | 748         // with the existing clip. | 
| 750         for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.ge
      t(); iter.next()) { | 749         for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.ge
      t(); iter.next()) { | 
| 751             const Element* element = iter.get(); | 750             const Element* element = iter.get(); | 
| 752 | 751 | 
| 753             GrPipelineBuilder pipelineBuilder; | 752             GrPipelineBuilder pipelineBuilder; | 
| 754             pipelineBuilder.setClip(clip); | 753             pipelineBuilder.setClip(clip); | 
| 755             pipelineBuilder.setRenderTarget(rt); | 754             pipelineBuilder.setRenderTarget(rt); | 
| 756 | 755 | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 776             SkPath clipPath; | 775             SkPath clipPath; | 
| 777             if (Element::kRect_Type == element->getType()) { | 776             if (Element::kRect_Type == element->getType()) { | 
| 778                 stencilSupport = GrPathRenderer::kNoRestriction_StencilSupport; | 777                 stencilSupport = GrPathRenderer::kNoRestriction_StencilSupport; | 
| 779                 fillInverted = false; | 778                 fillInverted = false; | 
| 780             } else { | 779             } else { | 
| 781                 element->asPath(&clipPath); | 780                 element->asPath(&clipPath); | 
| 782                 fillInverted = clipPath.isInverseFillType(); | 781                 fillInverted = clipPath.isInverseFillType(); | 
| 783                 if (fillInverted) { | 782                 if (fillInverted) { | 
| 784                     clipPath.toggleInverseFillType(); | 783                     clipPath.toggleInverseFillType(); | 
| 785                 } | 784                 } | 
| 786                 pr = this->getContext()->getPathRenderer(fClipTarget, | 785                 pr = this->getContext()->getPathRenderer(fDrawTarget, | 
| 787                                                          &pipelineBuilder, | 786                                                          &pipelineBuilder, | 
| 788                                                          viewMatrix, | 787                                                          viewMatrix, | 
| 789                                                          clipPath, | 788                                                          clipPath, | 
| 790                                                          stroke, | 789                                                          stroke, | 
| 791                                                          false, | 790                                                          false, | 
| 792                                                          GrPathRendererChain::kS
      tencilOnly_DrawType, | 791                                                          GrPathRendererChain::kS
      tencilOnly_DrawType, | 
| 793                                                          &stencilSupport); | 792                                                          &stencilSupport); | 
| 794                 if (nullptr == pr) { | 793                 if (nullptr == pr) { | 
| 795                     return false; | 794                     return false; | 
| 796                 } | 795                 } | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 818                                              kIncClamp_StencilOp, | 817                                              kIncClamp_StencilOp, | 
| 819                                              kIncClamp_StencilOp, | 818                                              kIncClamp_StencilOp, | 
| 820                                              kAlways_StencilFunc, | 819                                              kAlways_StencilFunc, | 
| 821                                              0xffff, | 820                                              0xffff, | 
| 822                                              0x0000, | 821                                              0x0000, | 
| 823                                              0xffff); | 822                                              0xffff); | 
| 824                 if (Element::kRect_Type == element->getType()) { | 823                 if (Element::kRect_Type == element->getType()) { | 
| 825                     *pipelineBuilder.stencil() = gDrawToStencil; | 824                     *pipelineBuilder.stencil() = gDrawToStencil; | 
| 826 | 825 | 
| 827                     // We need this AGP until everything is in GrBatch | 826                     // We need this AGP until everything is in GrBatch | 
| 828                     fClipTarget->drawNonAARect(pipelineBuilder, | 827                     fDrawTarget->drawNonAARect(pipelineBuilder, | 
| 829                                                GrColor_WHITE, | 828                                                GrColor_WHITE, | 
| 830                                                viewMatrix, | 829                                                viewMatrix, | 
| 831                                                element->getRect()); | 830                                                element->getRect()); | 
| 832                 } else { | 831                 } else { | 
| 833                     if (!clipPath.isEmpty()) { | 832                     if (!clipPath.isEmpty()) { | 
| 834                         if (canRenderDirectToStencil) { | 833                         if (canRenderDirectToStencil) { | 
| 835                             *pipelineBuilder.stencil() = gDrawToStencil; | 834                             *pipelineBuilder.stencil() = gDrawToStencil; | 
| 836 | 835 | 
| 837                             GrPathRenderer::DrawPathArgs args; | 836                             GrPathRenderer::DrawPathArgs args; | 
| 838                             args.fTarget = fClipTarget; | 837                             args.fTarget = fDrawTarget; | 
| 839                             args.fResourceProvider = this->getContext()->resourc
      eProvider(); | 838                             args.fResourceProvider = this->getContext()->resourc
      eProvider(); | 
| 840                             args.fPipelineBuilder = &pipelineBuilder; | 839                             args.fPipelineBuilder = &pipelineBuilder; | 
| 841                             args.fColor = GrColor_WHITE; | 840                             args.fColor = GrColor_WHITE; | 
| 842                             args.fViewMatrix = &viewMatrix; | 841                             args.fViewMatrix = &viewMatrix; | 
| 843                             args.fPath = &clipPath; | 842                             args.fPath = &clipPath; | 
| 844                             args.fStroke = &stroke; | 843                             args.fStroke = &stroke; | 
| 845                             args.fAntiAlias = false; | 844                             args.fAntiAlias = false; | 
| 846                             pr->drawPath(args); | 845                             pr->drawPath(args); | 
| 847                         } else { | 846                         } else { | 
| 848                             GrPathRenderer::StencilPathArgs args; | 847                             GrPathRenderer::StencilPathArgs args; | 
| 849                             args.fTarget = fClipTarget; | 848                             args.fTarget = fDrawTarget; | 
| 850                             args.fResourceProvider = this->getContext()->resourc
      eProvider(); | 849                             args.fResourceProvider = this->getContext()->resourc
      eProvider(); | 
| 851                             args.fPipelineBuilder = &pipelineBuilder; | 850                             args.fPipelineBuilder = &pipelineBuilder; | 
| 852                             args.fViewMatrix = &viewMatrix; | 851                             args.fViewMatrix = &viewMatrix; | 
| 853                             args.fPath = &clipPath; | 852                             args.fPath = &clipPath; | 
| 854                             args.fStroke = &stroke; | 853                             args.fStroke = &stroke; | 
| 855                             pr->stencilPath(args); | 854                             pr->stencilPath(args); | 
| 856                         } | 855                         } | 
| 857                     } | 856                     } | 
| 858                 } | 857                 } | 
| 859             } | 858             } | 
| 860 | 859 | 
| 861             // now we modify the clip bit by rendering either the clip | 860             // now we modify the clip bit by rendering either the clip | 
| 862             // element directly or a bounding rect of the entire clip. | 861             // element directly or a bounding rect of the entire clip. | 
| 863             fClipMode = kModifyClip_StencilClipMode; | 862             fClipMode = kModifyClip_StencilClipMode; | 
| 864             for (int p = 0; p < passes; ++p) { | 863             for (int p = 0; p < passes; ++p) { | 
| 865                 *pipelineBuilder.stencil() = stencilSettings[p]; | 864                 *pipelineBuilder.stencil() = stencilSettings[p]; | 
| 866 | 865 | 
| 867                 if (canDrawDirectToClip) { | 866                 if (canDrawDirectToClip) { | 
| 868                     if (Element::kRect_Type == element->getType()) { | 867                     if (Element::kRect_Type == element->getType()) { | 
| 869                         // We need this AGP until everything is in GrBatch | 868                         // We need this AGP until everything is in GrBatch | 
| 870                         fClipTarget->drawNonAARect(pipelineBuilder, | 869                         fDrawTarget->drawNonAARect(pipelineBuilder, | 
| 871                                                    GrColor_WHITE, | 870                                                    GrColor_WHITE, | 
| 872                                                    viewMatrix, | 871                                                    viewMatrix, | 
| 873                                                    element->getRect()); | 872                                                    element->getRect()); | 
| 874                     } else { | 873                     } else { | 
| 875                         GrPathRenderer::DrawPathArgs args; | 874                         GrPathRenderer::DrawPathArgs args; | 
| 876                         args.fTarget = fClipTarget; | 875                         args.fTarget = fDrawTarget; | 
| 877                         args.fResourceProvider = this->getContext()->resourcePro
      vider(); | 876                         args.fResourceProvider = this->getContext()->resourcePro
      vider(); | 
| 878                         args.fPipelineBuilder = &pipelineBuilder; | 877                         args.fPipelineBuilder = &pipelineBuilder; | 
| 879                         args.fColor = GrColor_WHITE; | 878                         args.fColor = GrColor_WHITE; | 
| 880                         args.fViewMatrix = &viewMatrix; | 879                         args.fViewMatrix = &viewMatrix; | 
| 881                         args.fPath = &clipPath; | 880                         args.fPath = &clipPath; | 
| 882                         args.fStroke = &stroke; | 881                         args.fStroke = &stroke; | 
| 883                         args.fAntiAlias = false; | 882                         args.fAntiAlias = false; | 
| 884                         pr->drawPath(args); | 883                         pr->drawPath(args); | 
| 885                     } | 884                     } | 
| 886                 } else { | 885                 } else { | 
| 887                     // The view matrix is setup to do clip space -> stencil spac
      e translation, so | 886                     // The view matrix is setup to do clip space -> stencil spac
      e translation, so | 
| 888                     // draw rect in clip space. | 887                     // draw rect in clip space. | 
| 889                     fClipTarget->drawNonAARect(pipelineBuilder, | 888                     fDrawTarget->drawNonAARect(pipelineBuilder, | 
| 890                                                GrColor_WHITE, | 889                                                GrColor_WHITE, | 
| 891                                                viewMatrix, | 890                                                viewMatrix, | 
| 892                                                SkRect::Make(clipSpaceIBounds)); | 891                                                SkRect::Make(clipSpaceIBounds)); | 
| 893                 } | 892                 } | 
| 894             } | 893             } | 
| 895         } | 894         } | 
| 896     } | 895     } | 
| 897     // set this last because recursive draws may overwrite it back to kNone. | 896     // set this last because recursive draws may overwrite it back to kNone. | 
| 898     SkASSERT(kNone_ClipMaskType == fCurrClipMaskType); | 897     SkASSERT(kNone_ClipMaskType == fCurrClipMaskType); | 
| 899     fCurrClipMaskType = kStencil_ClipMaskType; | 898     fCurrClipMaskType = kStencil_ClipMaskType; | 
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 976         settings = pipelineBuilder.getStencil(); | 975         settings = pipelineBuilder.getStencil(); | 
| 977     } | 976     } | 
| 978 | 977 | 
| 979     int stencilBits = 0; | 978     int stencilBits = 0; | 
| 980     GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); | 979     GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); | 
| 981     GrStencilAttachment* stencilAttachment = rt->renderTargetPriv().attachStenci
      lAttachment(); | 980     GrStencilAttachment* stencilAttachment = rt->renderTargetPriv().attachStenci
      lAttachment(); | 
| 982     if (stencilAttachment) { | 981     if (stencilAttachment) { | 
| 983         stencilBits = stencilAttachment->bits(); | 982         stencilBits = stencilAttachment->bits(); | 
| 984     } | 983     } | 
| 985 | 984 | 
| 986     SkASSERT(fClipTarget->caps()->stencilWrapOpsSupport() || !settings.usesWrapO
      p()); | 985     SkASSERT(fDrawTarget->caps()->stencilWrapOpsSupport() || !settings.usesWrapO
      p()); | 
| 987     SkASSERT(fClipTarget->caps()->twoSidedStencilSupport() || !settings.isTwoSid
      ed()); | 986     SkASSERT(fDrawTarget->caps()->twoSidedStencilSupport() || !settings.isTwoSid
      ed()); | 
| 988     this->adjustStencilParams(&settings, fClipMode, stencilBits); | 987     this->adjustStencilParams(&settings, fClipMode, stencilBits); | 
| 989     ars->set(&pipelineBuilder); | 988     ars->set(&pipelineBuilder); | 
| 990     ars->setStencil(settings); | 989     ars->setStencil(settings); | 
| 991 } | 990 } | 
| 992 | 991 | 
| 993 void GrClipMaskManager::adjustStencilParams(GrStencilSettings* settings, | 992 void GrClipMaskManager::adjustStencilParams(GrStencilSettings* settings, | 
| 994                                             StencilClipMode mode, | 993                                             StencilClipMode mode, | 
| 995                                             int stencilBitCnt) { | 994                                             int stencilBitCnt) { | 
| 996     SkASSERT(stencilBitCnt > 0); | 995     SkASSERT(stencilBitCnt > 0); | 
| 997 | 996 | 
| 998     if (kModifyClip_StencilClipMode == mode) { | 997     if (kModifyClip_StencilClipMode == mode) { | 
| 999         // We assume that this clip manager itself is drawing to the GrGpu and | 998         // We assume that this clip manager itself is drawing to the GrGpu and | 
| 1000         // has already setup the correct values. | 999         // has already setup the correct values. | 
| 1001         return; | 1000         return; | 
| 1002     } | 1001     } | 
| 1003 | 1002 | 
| 1004     unsigned int clipBit = (1 << (stencilBitCnt - 1)); | 1003     unsigned int clipBit = (1 << (stencilBitCnt - 1)); | 
| 1005     unsigned int userBits = clipBit - 1; | 1004     unsigned int userBits = clipBit - 1; | 
| 1006 | 1005 | 
| 1007     GrStencilSettings::Face face = GrStencilSettings::kFront_Face; | 1006     GrStencilSettings::Face face = GrStencilSettings::kFront_Face; | 
| 1008     bool twoSided = fClipTarget->caps()->twoSidedStencilSupport(); | 1007     bool twoSided = fDrawTarget->caps()->twoSidedStencilSupport(); | 
| 1009 | 1008 | 
| 1010     bool finished = false; | 1009     bool finished = false; | 
| 1011     while (!finished) { | 1010     while (!finished) { | 
| 1012         GrStencilFunc func = settings->func(face); | 1011         GrStencilFunc func = settings->func(face); | 
| 1013         uint16_t writeMask = settings->writeMask(face); | 1012         uint16_t writeMask = settings->writeMask(face); | 
| 1014         uint16_t funcMask = settings->funcMask(face); | 1013         uint16_t funcMask = settings->funcMask(face); | 
| 1015         uint16_t funcRef = settings->funcRef(face); | 1014         uint16_t funcRef = settings->funcRef(face); | 
| 1016 | 1015 | 
| 1017         SkASSERT((unsigned) func < kStencilFuncCount); | 1016         SkASSERT((unsigned) func < kStencilFuncCount); | 
| 1018 | 1017 | 
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1148     fAACache.purgeResources(); | 1147     fAACache.purgeResources(); | 
| 1149 } | 1148 } | 
| 1150 | 1149 | 
| 1151 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
      ilAttachment, | 1150 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
      ilAttachment, | 
| 1152                                                 GrStencilSettings* settings) { | 1151                                                 GrStencilSettings* settings) { | 
| 1153     if (stencilAttachment) { | 1152     if (stencilAttachment) { | 
| 1154         int stencilBits = stencilAttachment->bits(); | 1153         int stencilBits = stencilAttachment->bits(); | 
| 1155         this->adjustStencilParams(settings, fClipMode, stencilBits); | 1154         this->adjustStencilParams(settings, fClipMode, stencilBits); | 
| 1156     } | 1155     } | 
| 1157 } | 1156 } | 
| OLD | NEW | 
|---|