Index: src/gpu/GrPipeline.cpp |
diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp |
index 073349be1ed900062964098d85773e416eedd75b..f8e750d340d897dbecbececbe058095ab6a6dacb 100644 |
--- a/src/gpu/GrPipeline.cpp |
+++ b/src/gpu/GrPipeline.cpp |
@@ -21,10 +21,17 @@ GrPipeline* GrPipeline::CreateAt(void* memory, const CreateArgs& args, |
const GrPipelineBuilder& builder = *args.fPipelineBuilder; |
// Create XferProcessor from DS's XPFactory |
- SkAutoTUnref<GrXferProcessor> xferProcessor( |
- builder.getXPFactory()->createXferProcessor(args.fColorPOI, args.fCoveragePOI, |
- builder.hasMixedSamples(), &args.fDstTexture, |
- *args.fCaps)); |
+ const GrXPFactory* xpFactory = builder.getXPFactory(); |
+ GrXferProcessor* xferProcessor; |
bsalomon
2015/11/23 20:19:52
Why not
SkAutoTUnref xferProcessor;
if (xpFactory
egdaniel
2015/11/23 20:49:04
Done.
|
+ if (xpFactory) { |
+ xferProcessor = xpFactory->createXferProcessor(args.fColorPOI, args.fCoveragePOI, |
+ builder.hasMixedSamples(), &args.fDstTexture, |
+ *args.fCaps); |
+ } else { |
+ xferProcessor = GrCreateSrcOverXferProcessor(*args.fCaps, args.fColorPOI, args.fCoveragePOI, |
+ builder.hasMixedSamples(), &args.fDstTexture); |
+ } |
+ |
if (!xferProcessor) { |
return nullptr; |
} |
@@ -46,6 +53,7 @@ GrPipeline* GrPipeline::CreateAt(void* memory, const CreateArgs& args, |
// so we must check the draw type. In cases where we will skip drawing we simply return a |
// null GrPipeline. |
if (GrXferProcessor::kSkipDraw_OptFlag & optFlags) { |
+ xferProcessor->unref(); |
return nullptr; |
} |
@@ -55,7 +63,7 @@ GrPipeline* GrPipeline::CreateAt(void* memory, const CreateArgs& args, |
} |
GrPipeline* pipeline = new (memory) GrPipeline; |
- pipeline->fXferProcessor.reset(xferProcessor.get()); |
+ pipeline->fXferProcessor.reset(xferProcessor); |
pipeline->fRenderTarget.reset(builder.fRenderTarget.get()); |
SkASSERT(pipeline->fRenderTarget); |
@@ -123,11 +131,19 @@ GrPipeline* GrPipeline::CreateAt(void* memory, const CreateArgs& args, |
} |
GrXPFactory::InvariantBlendedColor blendedColor; |
- builder.fXPFactory->getInvariantBlendedColor(args.fColorPOI, &blendedColor); |
+ if (xpFactory) { |
+ xpFactory->getInvariantBlendedColor(args.fColorPOI, &blendedColor); |
+ } else { |
+ GrSrcOverInvariantBlendedColor(args.fColorPOI.color(), |
+ args.fColorPOI.validFlags(), |
+ args.fColorPOI.isOpaque(), |
+ &blendedColor); |
+ } |
if (blendedColor.fWillBlendWithDst) { |
opts->fFlags |= GrPipelineOptimizations::kWillColorBlendWithDst_Flag; |
} |
+ xferProcessor->unref(); |
return pipeline; |
} |