| Index: src/gpu/GrPipeline.cpp
|
| diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp
|
| index 8d384ef9f10230fcff8718770940a1246b598ce1..761a876a1bf2e36432b8551abb3fdfccaf296a9a 100644
|
| --- a/src/gpu/GrPipeline.cpp
|
| +++ b/src/gpu/GrPipeline.cpp
|
| @@ -20,9 +20,35 @@ GrPipeline* GrPipeline::CreateAt(void* memory, const CreateArgs& args,
|
| GrXPOverridesForBatch* overrides) {
|
| const GrPipelineBuilder& builder = *args.fPipelineBuilder;
|
|
|
| + GrPipeline* pipeline = new (memory) GrPipeline;
|
| + pipeline->fRenderTarget.reset(builder.fRenderTarget.get());
|
| + SkASSERT(pipeline->fRenderTarget);
|
| + pipeline->fScissorState = *args.fScissor;
|
| + if (builder.hasUserStencilSettings() || args.fHasStencilClip) {
|
| + SkASSERT(args.fNumStencilBits);
|
| + pipeline->fStencilSettings.reset(*builder.getUserStencil(), args.fHasStencilClip,
|
| + args.fNumStencilBits);
|
| + SkASSERT(!pipeline->fStencilSettings.usesWrapOp() || args.fCaps->stencilWrapOpsSupport());
|
| + }
|
| + pipeline->fDrawFace = builder.getDrawFace();
|
| +
|
| + pipeline->fFlags = 0;
|
| + if (builder.isHWAntialias()) {
|
| + pipeline->fFlags |= kHWAA_Flag;
|
| + }
|
| + if (builder.snapVerticesToPixelCenters()) {
|
| + pipeline->fFlags |= kSnapVertices_Flag;
|
| + }
|
| + if (builder.getDisableOutputConversionToSRGB()) {
|
| + pipeline->fFlags |= kDisableOutputConversionToSRGB_Flag;
|
| + }
|
| + if (builder.getAllowSRGBInputs()) {
|
| + pipeline->fFlags |= kAllowSRGBInputs_Flag;
|
| + }
|
| +
|
| // Create XferProcessor from DS's XPFactory
|
| bool hasMixedSamples = builder.getRenderTarget()->hasMixedSamples() &&
|
| - (builder.isHWAntialias() || !builder.getStencil().isDisabled());
|
| + (builder.isHWAntialias() || !pipeline->fStencilSettings.isDisabled());
|
| const GrXPFactory* xpFactory = builder.getXPFactory();
|
| SkAutoTUnref<GrXferProcessor> xferProcessor;
|
| if (xpFactory) {
|
| @@ -31,6 +57,7 @@ GrPipeline* GrPipeline::CreateAt(void* memory, const CreateArgs& args,
|
| &args.fDstTexture,
|
| *args.fCaps));
|
| if (!xferProcessor) {
|
| + pipeline->~GrPipeline();
|
| return nullptr;
|
| }
|
| } else {
|
| @@ -51,7 +78,7 @@ GrPipeline* GrPipeline::CreateAt(void* memory, const CreateArgs& args,
|
| const GrXferProcessor* xpForOpts = xferProcessor ? xferProcessor.get() :
|
| &GrPorterDuffXPFactory::SimpleSrcOverXP();
|
| optFlags = xpForOpts->getOptimizations(args.fOpts,
|
| - builder.getStencil().doesWrite(),
|
| + pipeline->fStencilSettings.doesWrite(),
|
| &overrideColor,
|
| *args.fCaps);
|
|
|
| @@ -59,6 +86,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) {
|
| + pipeline->~GrPipeline();
|
| return nullptr;
|
| }
|
|
|
| @@ -67,29 +95,8 @@ GrPipeline* GrPipeline::CreateAt(void* memory, const CreateArgs& args,
|
| overrideColor = GrColor_ILLEGAL;
|
| }
|
|
|
| - GrPipeline* pipeline = new (memory) GrPipeline;
|
| pipeline->fXferProcessor.reset(xferProcessor);
|
|
|
| - pipeline->fRenderTarget.reset(builder.fRenderTarget.get());
|
| - SkASSERT(pipeline->fRenderTarget);
|
| - pipeline->fScissorState = *args.fScissor;
|
| - pipeline->fStencilSettings = builder.getStencil();
|
| - pipeline->fDrawFace = builder.getDrawFace();
|
| -
|
| - pipeline->fFlags = 0;
|
| - if (builder.isHWAntialias()) {
|
| - pipeline->fFlags |= kHWAA_Flag;
|
| - }
|
| - if (builder.snapVerticesToPixelCenters()) {
|
| - pipeline->fFlags |= kSnapVertices_Flag;
|
| - }
|
| - if (builder.getDisableOutputConversionToSRGB()) {
|
| - pipeline->fFlags |= kDisableOutputConversionToSRGB_Flag;
|
| - }
|
| - if (builder.getAllowSRGBInputs()) {
|
| - pipeline->fFlags |= kAllowSRGBInputs_Flag;
|
| - }
|
| -
|
| int firstColorProcessorIdx = args.fOpts.fColorPOI.firstEffectiveProcessorIndex();
|
|
|
| // TODO: Once we can handle single or four channel input into coverage GrFragmentProcessors
|
|
|