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), fDrawFace(kBoth_DrawFace) {
20     SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
21 }
22 
GrPipelineBuilder(const GrPaint & paint,GrRenderTarget * rt,const GrClip & clip)23 GrPipelineBuilder::GrPipelineBuilder(const GrPaint& paint, GrRenderTarget* rt, const GrClip& clip) {
24     SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
25 
26     for (int i = 0; i < paint.numColorFragmentProcessors(); ++i) {
27         fColorFragmentProcessors.push_back(SkRef(paint.getColorFragmentProcessor(i)));
28     }
29 
30     for (int i = 0; i < paint.numCoverageFragmentProcessors(); ++i) {
31         fCoverageFragmentProcessors.push_back(SkRef(paint.getCoverageFragmentProcessor(i)));
32     }
33 
34     fXPFactory.reset(SkSafeRef(paint.getXPFactory()));
35 
36     this->setRenderTarget(rt);
37 
38     // These have no equivalent in GrPaint, set them to defaults
39     fDrawFace = kBoth_DrawFace;
40     fStencilSettings.setDisabled();
41     fFlags = 0;
42 
43     fClip = clip;
44 
45     this->setState(GrPipelineBuilder::kHWAntialias_Flag,
46                    rt->isUnifiedMultisampled() && paint.isAntiAlias());
47 }
48 
49 //////////////////////////////////////////////////////////////////////////////s
50 
willXPNeedDstTexture(const GrCaps & caps,const GrPipelineOptimizations & optimizations) const51 bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps,
52                                              const GrPipelineOptimizations& optimizations) const {
53     if (this->getXPFactory()) {
54         return this->getXPFactory()->willNeedDstTexture(caps, optimizations,
55                                                         this->hasMixedSamples());
56     }
57     return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, optimizations,
58                                                             this->hasMixedSamples());
59 }
60 
set(const GrPipelineBuilder * pipelineBuilder)61 void GrPipelineBuilder::AutoRestoreFragmentProcessorState::set(
62                                                          const GrPipelineBuilder* pipelineBuilder) {
63     if (fPipelineBuilder) {
64         int m = fPipelineBuilder->numColorFragmentProcessors() - fColorEffectCnt;
65         SkASSERT(m >= 0);
66         for (int i = 0; i < m; ++i) {
67             fPipelineBuilder->fColorFragmentProcessors.fromBack(i)->unref();
68         }
69         fPipelineBuilder->fColorFragmentProcessors.pop_back_n(m);
70 
71         int n = fPipelineBuilder->numCoverageFragmentProcessors() - fCoverageEffectCnt;
72         SkASSERT(n >= 0);
73         for (int i = 0; i < n; ++i) {
74             fPipelineBuilder->fCoverageFragmentProcessors.fromBack(i)->unref();
75         }
76         fPipelineBuilder->fCoverageFragmentProcessors.pop_back_n(n);
77         SkDEBUGCODE(--fPipelineBuilder->fBlockEffectRemovalCnt;)
78     }
79     fPipelineBuilder = const_cast<GrPipelineBuilder*>(pipelineBuilder);
80     if (nullptr != pipelineBuilder) {
81         fColorEffectCnt = pipelineBuilder->numColorFragmentProcessors();
82         fCoverageEffectCnt = pipelineBuilder->numCoverageFragmentProcessors();
83         SkDEBUGCODE(++pipelineBuilder->fBlockEffectRemovalCnt;)
84     }
85 }
86 
87 ////////////////////////////////////////////////////////////////////////////////
88 
~GrPipelineBuilder()89 GrPipelineBuilder::~GrPipelineBuilder() {
90     SkASSERT(0 == fBlockEffectRemovalCnt);
91     for (int i = 0; i < fColorFragmentProcessors.count(); ++i) {
92         fColorFragmentProcessors[i]->unref();
93     }
94     for (int i = 0; i < fCoverageFragmentProcessors.count(); ++i) {
95         fCoverageFragmentProcessors[i]->unref();
96     }
97 }
98