Index: src/gpu/GrClipMaskManager.cpp |
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp |
index 4aaf57add6c545054dc2c321613e0f625e6453e4..81b6fe861435138cc34267d53626bd8cca56c691 100644 |
--- a/src/gpu/GrClipMaskManager.cpp |
+++ b/src/gpu/GrClipMaskManager.cpp |
@@ -31,7 +31,8 @@ typedef SkClipStack::Element Element; |
//////////////////////////////////////////////////////////////////////////////// |
// set up the draw state to enable the aa clipping mask. Besides setting up the |
// stage matrix this also alters the vertex layout |
-static const GrFragmentProcessor* create_fp_for_mask(GrTexture* result, const SkIRect &devBound) { |
+static sk_sp<const GrFragmentProcessor> create_fp_for_mask(GrTexture* result, |
+ const SkIRect &devBound) { |
SkMatrix mat; |
// We use device coords to compute the texture coordinates. We set our matrix to be a |
// translation to the devBound, and then a scaling matrix to normalized coords. |
@@ -40,12 +41,13 @@ static const GrFragmentProcessor* create_fp_for_mask(GrTexture* result, const Sk |
SkIntToScalar(-devBound.fTop)); |
SkIRect domainTexels = SkIRect::MakeWH(devBound.width(), devBound.height()); |
- return GrTextureDomainEffect::Create(result, |
+ return sk_sp<const GrFragmentProcessor>(GrTextureDomainEffect::Create( |
+ result, |
mat, |
GrTextureDomain::MakeTexelDomain(result, domainTexels), |
GrTextureDomain::kDecal_Mode, |
GrTextureParams::kNone_FilterMode, |
- kDevice_GrCoordSet); |
+ kDevice_GrCoordSet)); |
} |
static void draw_non_aa_rect(GrDrawTarget* drawTarget, |
@@ -186,7 +188,7 @@ bool GrClipMaskManager::getAnalyticClipProcessor(const GrReducedClip::ElementLis |
bool abortIfAA, |
SkVector& clipToRTOffset, |
const SkRect* drawBounds, |
- const GrFragmentProcessor** resultFP) { |
+ sk_sp<const GrFragmentProcessor>* resultFP) { |
SkRect boundsInClipSpace; |
if (drawBounds) { |
boundsInClipSpace = *drawBounds; |
@@ -271,7 +273,7 @@ bool GrClipMaskManager::getAnalyticClipProcessor(const GrReducedClip::ElementLis |
*resultFP = nullptr; |
if (!failed && fpCnt) { |
- *resultFP = GrFragmentProcessor::RunInSeries(fps, fpCnt); |
+ resultFP->reset(GrFragmentProcessor::RunInSeries(fps, fpCnt)); |
} |
for (int i = 0; i < fpCnt; ++i) { |
fps[i]->unref(); |
@@ -352,7 +354,7 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, |
disallowAnalyticAA = pipelineBuilder.isHWAntialias() || |
pipelineBuilder.hasUserStencilSettings(); |
} |
- const GrFragmentProcessor* clipFP = nullptr; |
+ sk_sp<const GrFragmentProcessor> clipFP; |
if (elements.isEmpty() || |
(requiresAA && |
this->getAnalyticClipProcessor(elements, disallowAnalyticAA, clipToRTOffset, devBounds, |
@@ -361,9 +363,10 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, |
scissorSpaceIBounds.offset(-clip.origin()); |
if (nullptr == devBounds || |
!SkRect::Make(scissorSpaceIBounds).contains(*devBounds)) { |
- out->fScissorState.set(scissorSpaceIBounds); |
+ out->makeScissoredFPBased(clipFP, scissorSpaceIBounds); |
+ return true; |
} |
- out->fClipCoverageFP.reset(clipFP); |
+ out->makeFPBased(clipFP); |
return true; |
} |
} |
@@ -403,7 +406,7 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, |
// clipSpace bounds. We determine the mask's position WRT to the render target here. |
SkIRect rtSpaceMaskBounds = clipSpaceIBounds; |
rtSpaceMaskBounds.offset(-clip.origin()); |
- out->fClipCoverageFP.reset(create_fp_for_mask(result.get(), rtSpaceMaskBounds)); |
+ out->makeFPBased(create_fp_for_mask(result.get(), rtSpaceMaskBounds)); |
return true; |
} |
// if alpha clip mask creation fails fall through to the non-AA code paths |
@@ -423,8 +426,7 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, |
// use both stencil and scissor test to the bounds for the final draw. |
SkIRect scissorSpaceIBounds(clipSpaceIBounds); |
scissorSpaceIBounds.offset(clipSpaceToStencilSpaceOffset); |
- out->fScissorState.set(scissorSpaceIBounds); |
- out->fHasStencilClip = true; |
+ out->makeScissoredStencil(true, scissorSpaceIBounds); |
return true; |
} |