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 14 matching lines...) Expand all Loading... | |
25 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags)); | 25 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags)); |
26 } | 26 } |
27 | 27 |
28 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces sor"; } | 28 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces sor"; } |
29 | 29 |
30 const GrAttribute* inPosition() const { return fInPosition; } | 30 const GrAttribute* inPosition() const { return fInPosition; } |
31 const GrAttribute* inColor() const { return fInColor; } | 31 const GrAttribute* inColor() const { return fInColor; } |
32 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } | 32 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } |
33 const GrAttribute* inCoverage() const { return fInCoverage; } | 33 const GrAttribute* inCoverage() const { return fInCoverage; } |
34 | 34 |
35 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR IDE { | |
36 BatchTracker* local = bt->cast<BatchTracker>(); | |
37 | |
38 // We will ignore this color unless we have uniform color | |
39 local->fColor = init.fColor; | |
40 local->fOutputColor = GetColorOutputType(init, SkToBool(fInColor)); | |
41 | |
42 bool hasVertexCoverage = init.fOutputCoverage && fInCoverage && !init.fR emoveCoverageAttr; | |
43 bool covIsSolidWhite = !hasVertexCoverage && 0xffffffff == init.fCoverag e; | |
44 if (covIsSolidWhite || !init.fOutputCoverage) { | |
45 local->fOutputCoverage = kAllOnes_Output; | |
46 } else if (!hasVertexCoverage) { | |
47 local->fOutputCoverage = kUniform_Output; | |
48 local->fCoverage = init.fCoverage; | |
49 } else { | |
50 SkASSERT(fInCoverage); | |
51 local->fOutputCoverage = kAttribute_Output; | |
52 } | |
53 } | |
54 | |
55 virtual bool canBatch(const GrBatchTracker& l, const GrBatchTracker& r) cons t SK_OVERRIDE { | |
56 const BatchTracker& left = l.cast<BatchTracker>(); | |
57 const BatchTracker& right = r.cast<BatchTracker>(); | |
58 if (left.fOutputColor != right.fOutputColor) { | |
59 return false; | |
60 } | |
61 | |
62 if (kAttribute_Output != left.fOutputColor && left.fColor != right.fColo r) { | |
bsalomon
2014/12/10 18:36:20
need these comparisons for coverage too? also seem
| |
63 return false; | |
64 } | |
65 | |
66 return true; | |
67 } | |
68 | |
35 class GLProcessor : public GrGLGeometryProcessor { | 69 class GLProcessor : public GrGLGeometryProcessor { |
36 public: | 70 public: |
37 GLProcessor(const GrGeometryProcessor&, | 71 GLProcessor(const GrGeometryProcessor&, const GrBatchTracker&) {} |
38 const GrBatchTracker&) {} | |
39 | 72 |
40 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 73 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
41 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); | 74 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); |
42 GrGLVertexBuilder* vs = args.fPB->getVertexShaderBuilder(); | 75 GrGLGPBuilder* pb = args.fPB; |
76 GrGLVertexBuilder* vs = pb->getVertexShaderBuilder(); | |
77 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); | |
78 const BatchTracker& local = args.fBT.cast<BatchTracker>(); | |
43 | 79 |
44 vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->f Name); | 80 vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->f Name); |
45 | 81 |
46 // Setup pass through color | 82 // Setup pass through color |
47 if (gp.inColor()) { | 83 if (kUniform_Output == local.fOutputColor) { |
84 const char* fragColor; | |
85 fColorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Vis ibility, | |
86 kVec4f_GrSLType, | |
87 kDefault_GrSLPrecision, | |
88 "Color", | |
89 &fragColor); | |
90 fs->codeAppendf("%s = %s;", args.fOutputColor, fragColor); | |
91 } else if (kAttribute_Output == local.fOutputColor) { | |
92 SkASSERT(gp.inColor()); | |
48 args.fPB->addPassThroughAttribute(gp.inColor(), args.fOutputColo r); | 93 args.fPB->addPassThroughAttribute(gp.inColor(), args.fOutputColo r); |
94 } else { | |
95 fs->codeAppendf("%s = vec4(1);", args.fOutputColor); | |
49 } | 96 } |
50 | 97 |
51 // Setup local coords if needed | 98 // Setup local coords if needed |
52 if (gp.inLocalCoords()) { | 99 if (gp.inLocalCoords()) { |
53 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords( )->fName); | 100 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords( )->fName); |
54 } else { | 101 } else { |
55 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()-> fName); | 102 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()-> fName); |
56 } | 103 } |
57 | 104 |
58 // setup position varying | 105 // setup position varying |
59 vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), vs->uVie wM(), | 106 vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), vs->uVie wM(), |
60 gp.inPosition()->fName); | 107 gp.inPosition()->fName); |
61 | 108 |
62 // Setup coverage as pass through | 109 // Setup coverage as pass through |
63 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); | 110 if (kUniform_Output == local.fOutputCoverage) { |
64 fs->codeAppendf("float alpha = 1.0;"); | 111 const char* fragCoverage; |
65 if (gp.inCoverage()) { | 112 fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_ Visibility, |
113 kFloat_GrSLType, | |
114 kDefault_GrSLPrecision, | |
115 "Coverage", | |
116 &fragCoverage); | |
117 fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCove rage); | |
118 } else if (kAttribute_Output == local.fOutputCoverage) { | |
119 SkASSERT(gp.inCoverage()); | |
120 fs->codeAppendf("float alpha = 1.0;"); | |
66 args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); | 121 args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); |
122 fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | |
123 } else { | |
124 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); | |
67 } | 125 } |
68 fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | |
69 } | 126 } |
70 | 127 |
71 static inline void GenKey(const GrGeometryProcessor& gp, | 128 static inline void GenKey(const GrGeometryProcessor& gp, |
72 const GrBatchTracker&, | 129 const GrBatchTracker& bt, |
73 const GrGLCaps&, | 130 const GrGLCaps&, |
74 GrProcessorKeyBuilder* b) { | 131 GrProcessorKeyBuilder* b) { |
75 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); | 132 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); |
76 b->add32(def.fFlags); | 133 b->add32(def.fFlags); |
134 | |
135 const BatchTracker& local = bt.cast<BatchTracker>(); | |
136 b->add32(local.fOutputColor | local.fOutputCoverage << 16); | |
77 } | 137 } |
78 | 138 |
79 virtual void setData(const GrGLProgramDataManager&, | 139 virtual void setData(const GrGLProgramDataManager& pdman, |
80 const GrGeometryProcessor&, | 140 const GrGeometryProcessor& gp, |
81 const GrBatchTracker&) SK_OVERRIDE {} | 141 const GrBatchTracker& bt) SK_OVERRIDE { |
142 const BatchTracker& local = bt.cast<BatchTracker>(); | |
143 if (kUniform_Output == local.fOutputColor) { | |
bsalomon
2014/12/10 18:36:20
I wonder whether we should be skipping uni uploads
| |
144 GrGLfloat c[4]; | |
145 GrColorToRGBAFloat(local.fColor, c); | |
146 pdman.set4fv(fColorUniform, 1, c); | |
147 } | |
148 if (kUniform_Output == local.fOutputCoverage) { | |
149 pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(local.fCove rage)); | |
150 } | |
151 } | |
82 | 152 |
83 private: | 153 private: |
154 UniformHandle fColorUniform; | |
155 UniformHandle fCoverageUniform; | |
156 | |
84 typedef GrGLGeometryProcessor INHERITED; | 157 typedef GrGLGeometryProcessor INHERITED; |
85 }; | 158 }; |
86 | 159 |
87 virtual void getGLProcessorKey(const GrBatchTracker& bt, | 160 virtual void getGLProcessorKey(const GrBatchTracker& bt, |
88 const GrGLCaps& caps, | 161 const GrGLCaps& caps, |
89 GrProcessorKeyBuilder* b) const SK_OVERRIDE { | 162 GrProcessorKeyBuilder* b) const SK_OVERRIDE { |
90 GLProcessor::GenKey(*this, bt, caps, b); | 163 GLProcessor::GenKey(*this, bt, caps, b); |
91 } | 164 } |
92 | 165 |
93 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE { | 166 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE { |
(...skipping 20 matching lines...) Expand all Loading... | |
114 if (hasLocalCoord) { | 187 if (hasLocalCoord) { |
115 fInLocalCoords = &this->addVertexAttrib(GrAttribute("inLocalCoord", | 188 fInLocalCoords = &this->addVertexAttrib(GrAttribute("inLocalCoord", |
116 kVec2f_GrVertexA ttribType)); | 189 kVec2f_GrVertexA ttribType)); |
117 this->setHasLocalCoords(); | 190 this->setHasLocalCoords(); |
118 } | 191 } |
119 if (hasCoverage) { | 192 if (hasCoverage) { |
120 fInCoverage = &this->addVertexAttrib(GrAttribute("inCoverage", | 193 fInCoverage = &this->addVertexAttrib(GrAttribute("inCoverage", |
121 kFloat_GrVertexAttr ibType)); | 194 kFloat_GrVertexAttr ibType)); |
122 this->setHasVertexCoverage(); | 195 this->setHasVertexCoverage(); |
123 } | 196 } |
197 fNewStyle = true; | |
124 } | 198 } |
125 | 199 |
126 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { | 200 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { |
127 const DefaultGeoProc& gp = other.cast<DefaultGeoProc>(); | 201 const DefaultGeoProc& gp = other.cast<DefaultGeoProc>(); |
128 return gp.fFlags == this->fFlags; | 202 return gp.fFlags == this->fFlags; |
129 } | 203 } |
130 | 204 |
131 virtual void onGetOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRI DE { | 205 virtual void onGetOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRI DE { |
132 if (fInCoverage) { | 206 if (fInCoverage) { |
133 out->setUnknownSingleComponent(); | 207 out->setUnknownSingleComponent(); |
134 } else { | 208 } else { |
135 // uniform coverage | 209 // uniform coverage |
136 out->setKnownSingleComponent(this->coverage()); | 210 out->setKnownSingleComponent(this->coverage()); |
137 } | 211 } |
138 } | 212 } |
139 | 213 |
214 struct BatchTracker { | |
215 Output fOutputColor; | |
bsalomon
2014/12/10 18:36:20
The names of these vars and enum don't seem right
| |
216 Output fOutputCoverage; | |
217 GrColor fColor; | |
218 GrColor fCoverage; | |
219 }; | |
220 | |
140 const GrAttribute* fInPosition; | 221 const GrAttribute* fInPosition; |
141 const GrAttribute* fInColor; | 222 const GrAttribute* fInColor; |
142 const GrAttribute* fInLocalCoords; | 223 const GrAttribute* fInLocalCoords; |
143 const GrAttribute* fInCoverage; | 224 const GrAttribute* fInCoverage; |
144 uint32_t fFlags; | 225 uint32_t fFlags; |
145 | 226 |
146 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 227 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
147 | 228 |
148 typedef GrGeometryProcessor INHERITED; | 229 typedef GrGeometryProcessor INHERITED; |
149 }; | 230 }; |
(...skipping 15 matching lines...) Expand all Loading... | |
165 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; | 246 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; |
166 } | 247 } |
167 | 248 |
168 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random ), flags); | 249 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random ), flags); |
169 } | 250 } |
170 | 251 |
171 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color, uint32 _t gpTypeFlags, | 252 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color, uint32 _t gpTypeFlags, |
172 uint8_t coverage) { | 253 uint8_t coverage) { |
173 return DefaultGeoProc::Create(color, coverage, gpTypeFlags); | 254 return DefaultGeoProc::Create(color, coverage, gpTypeFlags); |
174 } | 255 } |
OLD | NEW |