OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrDefaultGeoProcFactory.h" | 8 #include "GrDefaultGeoProcFactory.h" |
9 | 9 |
10 #include "GrDrawState.h" | 10 #include "GrDrawState.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags, opaqueV
ertexColors)); | 26 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags, opaqueV
ertexColors)); |
27 } | 27 } |
28 | 28 |
29 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces
sor"; } | 29 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces
sor"; } |
30 | 30 |
31 const GrAttribute* inPosition() const { return fInPosition; } | 31 const GrAttribute* inPosition() const { return fInPosition; } |
32 const GrAttribute* inColor() const { return fInColor; } | 32 const GrAttribute* inColor() const { return fInColor; } |
33 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } | 33 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } |
34 const GrAttribute* inCoverage() const { return fInCoverage; } | 34 const GrAttribute* inCoverage() const { return fInCoverage; } |
35 | 35 |
| 36 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR
IDE { |
| 37 BatchTracker* local = bt->cast<BatchTracker>(); |
| 38 |
| 39 // We will ignore this color unless we have uniform color |
| 40 local->fColor = init.fColor; |
| 41 local->fInputColorType = GetColorInputType(init, SkToBool(fInColor)); |
| 42 |
| 43 bool hasVertexCoverage = init.fOutputCoverage && fInCoverage && !init.fR
emoveCoverageAttr; |
| 44 bool covIsSolidWhite = !hasVertexCoverage && 0xffffffff == init.fCoverag
e; |
| 45 if (covIsSolidWhite || !init.fOutputCoverage) { |
| 46 local->fInputCoverageType = kAllOnes_GPInput; |
| 47 } else if (!hasVertexCoverage) { |
| 48 local->fInputCoverageType = kUniform_GPInput; |
| 49 local->fCoverage = init.fCoverage; |
| 50 } else { |
| 51 SkASSERT(fInCoverage); |
| 52 local->fInputCoverageType = kAttribute_GPInput; |
| 53 } |
| 54 } |
| 55 |
| 56 bool onCanBatch(const GrBatchTracker& l, const GrBatchTracker& r) const SK_O
VERRIDE { |
| 57 const BatchTracker& left = l.cast<BatchTracker>(); |
| 58 const BatchTracker& right = r.cast<BatchTracker>(); |
| 59 return CanCombineOutput(left.fInputColorType, left.fColor, |
| 60 right.fInputColorType, right.fColor) && |
| 61 CanCombineOutput(left.fInputCoverageType, left.fCoverage, |
| 62 right.fInputCoverageType, right.fCoverage); |
| 63 } |
| 64 |
36 class GLProcessor : public GrGLGeometryProcessor { | 65 class GLProcessor : public GrGLGeometryProcessor { |
37 public: | 66 public: |
38 GLProcessor(const GrGeometryProcessor&, | 67 GLProcessor(const GrGeometryProcessor&, const GrBatchTracker&) {} |
39 const GrBatchTracker&) {} | |
40 | 68 |
41 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 69 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
42 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); | 70 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); |
43 GrGLVertexBuilder* vs = args.fPB->getVertexShaderBuilder(); | 71 GrGLGPBuilder* pb = args.fPB; |
| 72 GrGLVertexBuilder* vs = pb->getVertexShaderBuilder(); |
| 73 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); |
| 74 const BatchTracker& local = args.fBT.cast<BatchTracker>(); |
44 | 75 |
45 vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->f
Name); | 76 vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->f
Name); |
46 | 77 |
47 // Setup pass through color | 78 // Setup pass through color |
48 if (gp.inColor()) { | 79 this->setupColor(pb, local.fInputColorType, args.fOutputColor, gp.in
Color(), |
49 args.fPB->addPassThroughAttribute(gp.inColor(), args.fOutputColo
r); | 80 &fColorUniform); |
50 } | |
51 | 81 |
52 // Setup local coords if needed | 82 // Setup local coords if needed |
53 if (gp.inLocalCoords()) { | 83 if (gp.inLocalCoords()) { |
54 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords(
)->fName); | 84 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords(
)->fName); |
55 } else { | 85 } else { |
56 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()->
fName); | 86 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()->
fName); |
57 } | 87 } |
58 | 88 |
59 // setup position varying | 89 // setup position varying |
60 vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), vs->uVie
wM(), | 90 vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), vs->uVie
wM(), |
61 gp.inPosition()->fName); | 91 gp.inPosition()->fName); |
62 | 92 |
63 // Setup coverage as pass through | 93 // Setup coverage as pass through |
64 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); | 94 if (kUniform_GPInput == local.fInputCoverageType) { |
65 fs->codeAppendf("float alpha = 1.0;"); | 95 const char* fragCoverage; |
66 if (gp.inCoverage()) { | 96 fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_
Visibility, |
| 97 kFloat_GrSLType, |
| 98 kDefault_GrSLPrecision, |
| 99 "Coverage", |
| 100 &fragCoverage); |
| 101 fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCove
rage); |
| 102 } else if (kAttribute_GPInput == local.fInputCoverageType) { |
| 103 SkASSERT(gp.inCoverage()); |
| 104 fs->codeAppendf("float alpha = 1.0;"); |
67 args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); | 105 args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); |
| 106 fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
| 107 } else { |
| 108 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); |
68 } | 109 } |
69 fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | |
70 } | 110 } |
71 | 111 |
72 static inline void GenKey(const GrGeometryProcessor& gp, | 112 static inline void GenKey(const GrGeometryProcessor& gp, |
73 const GrBatchTracker&, | 113 const GrBatchTracker& bt, |
74 const GrGLCaps&, | 114 const GrGLCaps&, |
75 GrProcessorKeyBuilder* b) { | 115 GrProcessorKeyBuilder* b) { |
76 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); | 116 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); |
77 b->add32(def.fFlags); | 117 b->add32(def.fFlags); |
| 118 |
| 119 const BatchTracker& local = bt.cast<BatchTracker>(); |
| 120 b->add32(local.fInputColorType | local.fInputCoverageType << 16); |
78 } | 121 } |
79 | 122 |
80 virtual void setData(const GrGLProgramDataManager&, | 123 virtual void setData(const GrGLProgramDataManager& pdman, |
81 const GrGeometryProcessor&, | 124 const GrGeometryProcessor& gp, |
82 const GrBatchTracker&) SK_OVERRIDE {} | 125 const GrBatchTracker& bt) SK_OVERRIDE { |
| 126 const BatchTracker& local = bt.cast<BatchTracker>(); |
| 127 this->setUniformColorIfRequired(pdman, local.fInputColorType, local.
fColor, |
| 128 fColorUniform); |
| 129 if (kUniform_GPInput == local.fInputCoverageType) { |
| 130 pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(local.fCove
rage)); |
| 131 } |
| 132 } |
83 | 133 |
84 private: | 134 private: |
| 135 UniformHandle fColorUniform; |
| 136 UniformHandle fCoverageUniform; |
| 137 |
85 typedef GrGLGeometryProcessor INHERITED; | 138 typedef GrGLGeometryProcessor INHERITED; |
86 }; | 139 }; |
87 | 140 |
88 virtual void getGLProcessorKey(const GrBatchTracker& bt, | 141 virtual void getGLProcessorKey(const GrBatchTracker& bt, |
89 const GrGLCaps& caps, | 142 const GrGLCaps& caps, |
90 GrProcessorKeyBuilder* b) const SK_OVERRIDE { | 143 GrProcessorKeyBuilder* b) const SK_OVERRIDE { |
91 GLProcessor::GenKey(*this, bt, caps, b); | 144 GLProcessor::GenKey(*this, bt, caps, b); |
92 } | 145 } |
93 | 146 |
94 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { | 147 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 | 184 |
132 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const
SK_OVERRIDE { | 185 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const
SK_OVERRIDE { |
133 if (fInCoverage) { | 186 if (fInCoverage) { |
134 out->setUnknownSingleComponent(); | 187 out->setUnknownSingleComponent(); |
135 } else { | 188 } else { |
136 // uniform coverage | 189 // uniform coverage |
137 out->setKnownSingleComponent(this->coverage()); | 190 out->setKnownSingleComponent(this->coverage()); |
138 } | 191 } |
139 } | 192 } |
140 | 193 |
| 194 struct BatchTracker { |
| 195 GPInput fInputColorType; |
| 196 GPInput fInputCoverageType; |
| 197 GrColor fColor; |
| 198 GrColor fCoverage; |
| 199 }; |
| 200 |
141 const GrAttribute* fInPosition; | 201 const GrAttribute* fInPosition; |
142 const GrAttribute* fInColor; | 202 const GrAttribute* fInColor; |
143 const GrAttribute* fInLocalCoords; | 203 const GrAttribute* fInLocalCoords; |
144 const GrAttribute* fInCoverage; | 204 const GrAttribute* fInCoverage; |
145 uint32_t fFlags; | 205 uint32_t fFlags; |
146 | 206 |
147 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 207 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
148 | 208 |
149 typedef GrGeometryProcessor INHERITED; | 209 typedef GrGeometryProcessor INHERITED; |
150 }; | 210 }; |
(...skipping 18 matching lines...) Expand all Loading... |
169 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random
), | 229 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random
), |
170 random->nextBool(), flags); | 230 random->nextBool(), flags); |
171 } | 231 } |
172 | 232 |
173 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color, | 233 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color, |
174 uint32_t gpTypeFlags, | 234 uint32_t gpTypeFlags, |
175 bool opaqueVertexColo
rs, | 235 bool opaqueVertexColo
rs, |
176 uint8_t coverage) { | 236 uint8_t coverage) { |
177 return DefaultGeoProc::Create(color, coverage, gpTypeFlags, opaqueVertexColo
rs); | 237 return DefaultGeoProc::Create(color, coverage, gpTypeFlags, opaqueVertexColo
rs); |
178 } | 238 } |
OLD | NEW |