Chromium Code Reviews| 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; |
| } |