1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "GrPipelineBuilder.h"
9 
10 #include "GrBlend.h"
11 #include "GrPaint.h"
12 #include "GrPipeline.h"
13 #include "GrProcOptInfo.h"
14 #include "GrXferProcessor.h"
15 #include "batches/GrBatch.h"
16 #include "effects/GrPorterDuffXferProcessor.h"
17 
GrPipelineBuilder()18 GrPipelineBuilder::GrPipelineBuilder()
19     : fFlags(0x0)
20     , fUserStencilSettings(&GrUserStencilSettings::kUnused)
21     , fDrawFace(GrDrawFace::kBoth) {
22     SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
23 }
24 
GrPipelineBuilder(const GrPaint & paint,bool useHWAA)25 GrPipelineBuilder::GrPipelineBuilder(const GrPaint& paint, bool useHWAA)
26     : GrPipelineBuilder() {
27     SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
28 
29     for (int i = 0; i < paint.numColorFragmentProcessors(); ++i) {
30         fColorFragmentProcessors.emplace_back(SkRef(paint.getColorFragmentProcessor(i)));
31     }
32 
33     for (int i = 0; i < paint.numCoverageFragmentProcessors(); ++i) {
34         fCoverageFragmentProcessors.emplace_back(SkRef(paint.getCoverageFragmentProcessor(i)));
35     }
36 
37     fXPFactory.reset(SkSafeRef(paint.getXPFactory()));
38 
39     this->setState(GrPipelineBuilder::kHWAntialias_Flag, useHWAA);
40     this->setState(GrPipelineBuilder::kDisableOutputConversionToSRGB_Flag,
41                    paint.getDisableOutputConversionToSRGB());
42     this->setState(GrPipelineBuilder::kAllowSRGBInputs_Flag,
43                    paint.getAllowSRGBInputs());
44     this->setState(GrPipelineBuilder::kUsesDistanceVectorField_Flag,
45                    paint.usesDistanceVectorField());
46 }
47 
48 //////////////////////////////////////////////////////////////////////////////s
49 
willXPNeedDstTexture(const GrCaps & caps,const GrPipelineOptimizations & optimizations) const50 bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps,
51                                              const GrPipelineOptimizations& optimizations) const {
52     if (this->getXPFactory()) {
53         return this->getXPFactory()->willNeedDstTexture(caps, optimizations);
54     }
55     return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, optimizations);
56 }
57 
set(const GrPipelineBuilder * pipelineBuilder)58 void GrPipelineBuilder::AutoRestoreFragmentProcessorState::set(
59                                                          const GrPipelineBuilder* pipelineBuilder) {
60     if (fPipelineBuilder) {
61         int m = fPipelineBuilder->numColorFragmentProcessors() - fColorEffectCnt;
62         SkASSERT(m >= 0);
63         fPipelineBuilder->fColorFragmentProcessors.pop_back_n(m);
64 
65         int n = fPipelineBuilder->numCoverageFragmentProcessors() - fCoverageEffectCnt;
66         SkASSERT(n >= 0);
67         fPipelineBuilder->fCoverageFragmentProcessors.pop_back_n(n);
68 
69         SkDEBUGCODE(--fPipelineBuilder->fBlockEffectRemovalCnt;)
70     }
71     fPipelineBuilder = const_cast<GrPipelineBuilder*>(pipelineBuilder);
72     if (nullptr != pipelineBuilder) {
73         fColorEffectCnt = pipelineBuilder->numColorFragmentProcessors();
74         fCoverageEffectCnt = pipelineBuilder->numCoverageFragmentProcessors();
75         SkDEBUGCODE(++pipelineBuilder->fBlockEffectRemovalCnt;)
76     }
77 }
78 
79 ////////////////////////////////////////////////////////////////////////////////
80 
~GrPipelineBuilder()81 GrPipelineBuilder::~GrPipelineBuilder() {
82     SkASSERT(0 == fBlockEffectRemovalCnt);
83 }
84