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