OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "GrOvalRenderer.h" | 8 #include "GrOvalRenderer.h" |
9 | 9 |
10 #include "GrProcessor.h" | 10 #include "GrProcessor.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 const GrAttribute* inCircleEdge() const { return fInCircleEdge; } | 73 const GrAttribute* inCircleEdge() const { return fInCircleEdge; } |
74 virtual ~CircleEdgeEffect() {} | 74 virtual ~CircleEdgeEffect() {} |
75 | 75 |
76 virtual const char* name() const SK_OVERRIDE { return "CircleEdge"; } | 76 virtual const char* name() const SK_OVERRIDE { return "CircleEdge"; } |
77 | 77 |
78 inline bool isStroked() const { return fStroke; } | 78 inline bool isStroked() const { return fStroke; } |
79 | 79 |
80 class GLProcessor : public GrGLGeometryProcessor { | 80 class GLProcessor : public GrGLGeometryProcessor { |
81 public: | 81 public: |
82 GLProcessor(const GrGeometryProcessor&, | 82 GLProcessor(const GrGeometryProcessor&, |
83 const GrBatchTracker&) {} | 83 const GrBatchTracker&) |
| 84 : fColor(GrColor_ILLEGAL) {} |
84 | 85 |
85 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 86 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
86 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); | 87 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); |
| 88 GrGLGPBuilder* pb = args.fPB; |
| 89 const BatchTracker& local = args.fBT.cast<BatchTracker>(); |
87 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 90 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
88 | 91 |
89 GrGLVertToFrag v(kVec4f_GrSLType); | 92 GrGLVertToFrag v(kVec4f_GrSLType); |
90 args.fPB->addVarying("CircleEdge", &v); | 93 args.fPB->addVarying("CircleEdge", &v); |
91 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa
me); | 94 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa
me); |
92 | 95 |
| 96 // Setup pass through color |
| 97 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, |
| 98 &fColorUniform); |
| 99 |
93 // setup coord outputs | 100 // setup coord outputs |
94 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ce.i
nPosition()->fName); | 101 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ce.i
nPosition()->fName); |
95 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ce.inPo
sition()->fName); | 102 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ce.inPo
sition()->fName); |
96 | 103 |
97 // setup position varying | 104 // setup position varying |
98 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), | 105 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), |
99 vsBuilder->uViewM(), ce.inPosition()->fName); | 106 vsBuilder->uViewM(), ce.inPosition()->fName); |
100 | 107 |
101 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 108 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
102 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); | 109 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); |
103 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d), 0.
0, 1.0);", v.fsIn()); | 110 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d), 0.
0, 1.0);", v.fsIn()); |
104 if (ce.isStroked()) { | 111 if (ce.isStroked()) { |
105 fsBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %s.
w), 0.0, 1.0);", | 112 fsBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %s.
w), 0.0, 1.0);", |
106 v.fsIn(), v.fsIn()); | 113 v.fsIn(), v.fsIn()); |
107 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); | 114 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); |
108 } | 115 } |
109 | 116 |
110 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 117 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
111 } | 118 } |
112 | 119 |
113 static void GenKey(const GrGeometryProcessor& processor, | 120 static void GenKey(const GrGeometryProcessor& processor, |
114 const GrBatchTracker&, | 121 const GrBatchTracker& bt, |
115 const GrGLCaps&, | 122 const GrGLCaps&, |
116 GrProcessorKeyBuilder* b) { | 123 GrProcessorKeyBuilder* b) { |
| 124 const BatchTracker& local = bt.cast<BatchTracker>(); |
117 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe
ct>(); | 125 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe
ct>(); |
118 b->add32(circleEffect.isStroked()); | 126 b->add32(circleEffect.isStroked() << 16 | local.fInputColorType); |
119 } | 127 } |
120 | 128 |
121 virtual void setData(const GrGLProgramDataManager&, | 129 virtual void setData(const GrGLProgramDataManager& pdman, |
122 const GrGeometryProcessor&, | 130 const GrPrimitiveProcessor& gp, |
123 const GrBatchTracker&) SK_OVERRIDE {} | 131 const GrBatchTracker& bt) SK_OVERRIDE { |
| 132 const BatchTracker& local = bt.cast<BatchTracker>(); |
| 133 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { |
| 134 GrGLfloat c[4]; |
| 135 GrColorToRGBAFloat(local.fColor, c); |
| 136 pdman.set4fv(fColorUniform, 1, c); |
| 137 fColor = local.fColor; |
| 138 } |
| 139 } |
124 | 140 |
125 private: | 141 private: |
| 142 GrColor fColor; |
| 143 UniformHandle fColorUniform; |
126 typedef GrGLGeometryProcessor INHERITED; | 144 typedef GrGLGeometryProcessor INHERITED; |
127 }; | 145 }; |
128 | 146 |
129 virtual void getGLProcessorKey(const GrBatchTracker& bt, | 147 virtual void getGLProcessorKey(const GrBatchTracker& bt, |
130 const GrGLCaps& caps, | 148 const GrGLCaps& caps, |
131 GrProcessorKeyBuilder* b) const SK_OVERRIDE { | 149 GrProcessorKeyBuilder* b) const SK_OVERRIDE { |
132 GLProcessor::GenKey(*this, bt, caps, b); | 150 GLProcessor::GenKey(*this, bt, caps, b); |
133 } | 151 } |
134 | 152 |
135 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { | 153 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { |
136 return SkNEW_ARGS(GLProcessor, (*this, bt)); | 154 return SkNEW_ARGS(GLProcessor, (*this, bt)); |
137 } | 155 } |
138 | 156 |
| 157 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR
IDE { |
| 158 BatchTracker* local = bt->cast<BatchTracker>(); |
| 159 local->fInputColorType = GetColorInputType(&local->fColor, this->color()
, init, false); |
| 160 |
| 161 } |
| 162 |
| 163 bool onCanMakeEqual(const GrBatchTracker& m, const GrBatchTracker& t) const
SK_OVERRIDE { |
| 164 const BatchTracker& mine = m.cast<BatchTracker>(); |
| 165 const BatchTracker& theirs = t.cast<BatchTracker>(); |
| 166 return CanCombineOutput(mine.fInputColorType, mine.fColor, |
| 167 theirs.fInputColorType, theirs.fColor); |
| 168 } |
| 169 |
139 private: | 170 private: |
140 CircleEdgeEffect(GrColor color, bool stroke) : INHERITED(color) { | 171 CircleEdgeEffect(GrColor color, bool stroke) : INHERITED(color) { |
141 this->initClassID<CircleEdgeEffect>(); | 172 this->initClassID<CircleEdgeEffect>(); |
142 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); | 173 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); |
143 fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge", | 174 fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge", |
144 kVec4f_GrVertexAttrib
Type)); | 175 kVec4f_GrVertexAttrib
Type)); |
145 fStroke = stroke; | 176 fStroke = stroke; |
146 } | 177 } |
147 | 178 |
148 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { | 179 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { |
149 const CircleEdgeEffect& cee = other.cast<CircleEdgeEffect>(); | 180 const CircleEdgeEffect& cee = other.cast<CircleEdgeEffect>(); |
150 return cee.fStroke == fStroke; | 181 return cee.fStroke == fStroke; |
151 } | 182 } |
152 | 183 |
153 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const
SK_OVERRIDE { | 184 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const
SK_OVERRIDE { |
154 out->setUnknownSingleComponent(); | 185 out->setUnknownSingleComponent(); |
155 } | 186 } |
156 | 187 |
| 188 struct BatchTracker { |
| 189 GrGPInput fInputColorType; |
| 190 GrColor fColor; |
| 191 }; |
| 192 |
157 const GrAttribute* fInPosition; | 193 const GrAttribute* fInPosition; |
158 const GrAttribute* fInCircleEdge; | 194 const GrAttribute* fInCircleEdge; |
159 bool fStroke; | 195 bool fStroke; |
160 | 196 |
161 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 197 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
162 | 198 |
163 typedef GrGeometryProcessor INHERITED; | 199 typedef GrGeometryProcessor INHERITED; |
164 }; | 200 }; |
165 | 201 |
166 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(CircleEdgeEffect); | 202 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(CircleEdgeEffect); |
(...skipping 27 matching lines...) Expand all Loading... |
194 | 230 |
195 const GrAttribute* inPosition() const { return fInPosition; } | 231 const GrAttribute* inPosition() const { return fInPosition; } |
196 const GrAttribute* inEllipseOffset() const { return fInEllipseOffset; } | 232 const GrAttribute* inEllipseOffset() const { return fInEllipseOffset; } |
197 const GrAttribute* inEllipseRadii() const { return fInEllipseRadii; } | 233 const GrAttribute* inEllipseRadii() const { return fInEllipseRadii; } |
198 | 234 |
199 inline bool isStroked() const { return fStroke; } | 235 inline bool isStroked() const { return fStroke; } |
200 | 236 |
201 class GLProcessor : public GrGLGeometryProcessor { | 237 class GLProcessor : public GrGLGeometryProcessor { |
202 public: | 238 public: |
203 GLProcessor(const GrGeometryProcessor&, | 239 GLProcessor(const GrGeometryProcessor&, |
204 const GrBatchTracker&) {} | 240 const GrBatchTracker&) |
| 241 : fColor(GrColor_ILLEGAL) {} |
205 | 242 |
206 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 243 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
207 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); | 244 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); |
208 | 245 GrGLGPBuilder* pb = args.fPB; |
| 246 const BatchTracker& local = args.fBT.cast<BatchTracker>(); |
209 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 247 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
210 | 248 |
211 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType); | 249 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType); |
212 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); | 250 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); |
213 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), | 251 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), |
214 ee.inEllipseOffset()->fName); | 252 ee.inEllipseOffset()->fName); |
215 | 253 |
216 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType); | 254 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType); |
217 args.fPB->addVarying("EllipseRadii", &ellipseRadii); | 255 args.fPB->addVarying("EllipseRadii", &ellipseRadii); |
218 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), | 256 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), |
219 ee.inEllipseRadii()->fName); | 257 ee.inEllipseRadii()->fName); |
220 | 258 |
| 259 // Setup pass through color |
| 260 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, |
| 261 &fColorUniform); |
| 262 |
221 // setup coord outputs | 263 // setup coord outputs |
222 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i
nPosition()->fName); | 264 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i
nPosition()->fName); |
223 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo
sition()->fName); | 265 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo
sition()->fName); |
224 | 266 |
225 // setup position varying | 267 // setup position varying |
226 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), | 268 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), |
227 vsBuilder->uViewM(), ee.inPosition()->fName); | 269 vsBuilder->uViewM(), ee.inPosition()->fName); |
228 | 270 |
229 // for outer curve | 271 // for outer curve |
230 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 272 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
(...skipping 16 matching lines...) Expand all Loading... |
247 fsBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;", | 289 fsBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;", |
248 ellipseRadii.fsIn()); | 290 ellipseRadii.fsIn()); |
249 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); | 291 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); |
250 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); | 292 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); |
251 } | 293 } |
252 | 294 |
253 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 295 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
254 } | 296 } |
255 | 297 |
256 static void GenKey(const GrGeometryProcessor& processor, | 298 static void GenKey(const GrGeometryProcessor& processor, |
257 const GrBatchTracker&, | 299 const GrBatchTracker& bt, |
258 const GrGLCaps&, | 300 const GrGLCaps&, |
259 GrProcessorKeyBuilder* b) { | 301 GrProcessorKeyBuilder* b) { |
| 302 const BatchTracker& local = bt.cast<BatchTracker>(); |
260 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE
ffect>(); | 303 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE
ffect>(); |
261 b->add32(ellipseEffect.isStroked()); | 304 b->add32(ellipseEffect.isStroked() << 16 | local.fInputColorType); |
262 } | 305 } |
263 | 306 |
264 virtual void setData(const GrGLProgramDataManager&, | 307 virtual void setData(const GrGLProgramDataManager& pdman, |
265 const GrGeometryProcessor&, | 308 const GrPrimitiveProcessor& gp, |
266 const GrBatchTracker&) SK_OVERRIDE { | 309 const GrBatchTracker& bt) SK_OVERRIDE { |
| 310 const BatchTracker& local = bt.cast<BatchTracker>(); |
| 311 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { |
| 312 GrGLfloat c[4]; |
| 313 GrColorToRGBAFloat(local.fColor, c); |
| 314 pdman.set4fv(fColorUniform, 1, c); |
| 315 fColor = local.fColor; |
| 316 } |
267 } | 317 } |
268 | 318 |
269 private: | 319 private: |
| 320 GrColor fColor; |
| 321 UniformHandle fColorUniform; |
| 322 |
270 typedef GrGLGeometryProcessor INHERITED; | 323 typedef GrGLGeometryProcessor INHERITED; |
271 }; | 324 }; |
272 | 325 |
273 virtual void getGLProcessorKey(const GrBatchTracker& bt, | 326 virtual void getGLProcessorKey(const GrBatchTracker& bt, |
274 const GrGLCaps& caps, | 327 const GrGLCaps& caps, |
275 GrProcessorKeyBuilder* b) const SK_OVERRIDE { | 328 GrProcessorKeyBuilder* b) const SK_OVERRIDE { |
276 GLProcessor::GenKey(*this, bt, caps, b); | 329 GLProcessor::GenKey(*this, bt, caps, b); |
277 } | 330 } |
278 | 331 |
279 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { | 332 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { |
280 return SkNEW_ARGS(GLProcessor, (*this, bt)); | 333 return SkNEW_ARGS(GLProcessor, (*this, bt)); |
281 } | 334 } |
282 | 335 |
| 336 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR
IDE { |
| 337 BatchTracker* local = bt->cast<BatchTracker>(); |
| 338 local->fInputColorType = GetColorInputType(&local->fColor, this->color()
, init, false); |
| 339 } |
| 340 |
| 341 bool onCanMakeEqual(const GrBatchTracker& m, const GrBatchTracker& t) const
SK_OVERRIDE { |
| 342 const BatchTracker& mine = m.cast<BatchTracker>(); |
| 343 const BatchTracker& theirs = t.cast<BatchTracker>(); |
| 344 return CanCombineOutput(mine.fInputColorType, mine.fColor, |
| 345 theirs.fInputColorType, theirs.fColor); |
| 346 } |
| 347 |
283 private: | 348 private: |
284 EllipseEdgeEffect(GrColor color, bool stroke) : INHERITED(color) { | 349 EllipseEdgeEffect(GrColor color, bool stroke) : INHERITED(color) { |
285 this->initClassID<EllipseEdgeEffect>(); | 350 this->initClassID<EllipseEdgeEffect>(); |
286 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); | 351 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); |
287 fInEllipseOffset = &this->addVertexAttrib(GrAttribute("inEllipseOffset", | 352 fInEllipseOffset = &this->addVertexAttrib(GrAttribute("inEllipseOffset", |
288 kVec2f_GrVertexAtt
ribType)); | 353 kVec2f_GrVertexAtt
ribType)); |
289 fInEllipseRadii = &this->addVertexAttrib(GrAttribute("inEllipseRadii", | 354 fInEllipseRadii = &this->addVertexAttrib(GrAttribute("inEllipseRadii", |
290 kVec4f_GrVertexAttr
ibType)); | 355 kVec4f_GrVertexAttr
ibType)); |
291 fStroke = stroke; | 356 fStroke = stroke; |
292 } | 357 } |
293 | 358 |
294 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { | 359 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { |
295 const EllipseEdgeEffect& eee = other.cast<EllipseEdgeEffect>(); | 360 const EllipseEdgeEffect& eee = other.cast<EllipseEdgeEffect>(); |
296 return eee.fStroke == fStroke; | 361 return eee.fStroke == fStroke; |
297 } | 362 } |
298 | 363 |
299 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const
SK_OVERRIDE { | 364 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const
SK_OVERRIDE { |
300 out->setUnknownSingleComponent(); | 365 out->setUnknownSingleComponent(); |
301 } | 366 } |
302 | 367 |
| 368 struct BatchTracker { |
| 369 GrGPInput fInputColorType; |
| 370 GrColor fColor; |
| 371 }; |
| 372 |
303 const GrAttribute* fInPosition; | 373 const GrAttribute* fInPosition; |
304 const GrAttribute* fInEllipseOffset; | 374 const GrAttribute* fInEllipseOffset; |
305 const GrAttribute* fInEllipseRadii; | 375 const GrAttribute* fInEllipseRadii; |
306 bool fStroke; | 376 bool fStroke; |
307 | 377 |
308 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 378 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
309 | 379 |
310 typedef GrGeometryProcessor INHERITED; | 380 typedef GrGeometryProcessor INHERITED; |
311 }; | 381 }; |
312 | 382 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 | 414 |
345 const GrAttribute* inPosition() const { return fInPosition; } | 415 const GrAttribute* inPosition() const { return fInPosition; } |
346 const GrAttribute* inEllipseOffsets0() const { return fInEllipseOffsets0; } | 416 const GrAttribute* inEllipseOffsets0() const { return fInEllipseOffsets0; } |
347 const GrAttribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } | 417 const GrAttribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } |
348 | 418 |
349 inline Mode getMode() const { return fMode; } | 419 inline Mode getMode() const { return fMode; } |
350 | 420 |
351 class GLProcessor : public GrGLGeometryProcessor { | 421 class GLProcessor : public GrGLGeometryProcessor { |
352 public: | 422 public: |
353 GLProcessor(const GrGeometryProcessor&, | 423 GLProcessor(const GrGeometryProcessor&, |
354 const GrBatchTracker&) {} | 424 const GrBatchTracker&) |
| 425 : fColor(GrColor_ILLEGAL) {} |
355 | 426 |
356 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 427 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
357 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; | 428 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; |
358 | 429 GrGLGPBuilder* pb = args.fPB; |
| 430 const BatchTracker& local = args.fBT.cast<BatchTracker>(); |
359 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 431 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
360 | 432 |
361 GrGLVertToFrag offsets0(kVec2f_GrSLType); | 433 GrGLVertToFrag offsets0(kVec2f_GrSLType); |
362 args.fPB->addVarying("EllipseOffsets0", &offsets0); | 434 args.fPB->addVarying("EllipseOffsets0", &offsets0); |
363 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), | 435 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), |
364 ee.inEllipseOffsets0()->fName); | 436 ee.inEllipseOffsets0()->fName); |
365 | 437 |
366 GrGLVertToFrag offsets1(kVec2f_GrSLType); | 438 GrGLVertToFrag offsets1(kVec2f_GrSLType); |
367 args.fPB->addVarying("EllipseOffsets1", &offsets1); | 439 args.fPB->addVarying("EllipseOffsets1", &offsets1); |
368 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), | 440 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), |
369 ee.inEllipseOffsets1()->fName); | 441 ee.inEllipseOffsets1()->fName); |
370 | 442 |
| 443 // Setup pass through color |
| 444 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, |
| 445 &fColorUniform); |
| 446 |
371 // setup coord outputs | 447 // setup coord outputs |
372 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i
nPosition()->fName); | 448 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i
nPosition()->fName); |
373 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo
sition()->fName); | 449 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo
sition()->fName); |
374 | 450 |
375 // setup position varying | 451 // setup position varying |
376 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), | 452 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), |
377 vsBuilder->uViewM(), ee.inPosition()->fName); | 453 vsBuilder->uViewM(), ee.inPosition()->fName); |
378 | 454 |
379 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 455 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
380 SkAssertResult(fsBuilder->enableFeature( | 456 SkAssertResult(fsBuilder->enableFeature( |
(...skipping 30 matching lines...) Expand all Loading... |
411 offsets1.fsIn(), offsets1.fsIn(), offsets
1.fsIn(), | 487 offsets1.fsIn(), offsets1.fsIn(), offsets
1.fsIn(), |
412 offsets1.fsIn()); | 488 offsets1.fsIn()); |
413 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); | 489 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); |
414 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); | 490 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); |
415 } | 491 } |
416 | 492 |
417 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 493 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
418 } | 494 } |
419 | 495 |
420 static void GenKey(const GrGeometryProcessor& processor, | 496 static void GenKey(const GrGeometryProcessor& processor, |
421 const GrBatchTracker&, | 497 const GrBatchTracker& bt, |
422 const GrGLCaps&, | 498 const GrGLCaps&, |
423 GrProcessorKeyBuilder* b) { | 499 GrProcessorKeyBuilder* b) { |
| 500 const BatchTracker& local = bt.cast<BatchTracker>(); |
424 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE
dgeEffect>(); | 501 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE
dgeEffect>(); |
425 | 502 b->add32(ellipseEffect.getMode() << 16 | local.fInputColorType); |
426 b->add32(ellipseEffect.getMode()); | |
427 } | 503 } |
428 | 504 |
429 virtual void setData(const GrGLProgramDataManager&, | 505 virtual void setData(const GrGLProgramDataManager& pdman, |
430 const GrGeometryProcessor&, | 506 const GrPrimitiveProcessor& gp, |
431 const GrBatchTracker&) SK_OVERRIDE { | 507 const GrBatchTracker& bt) SK_OVERRIDE { |
| 508 const BatchTracker& local = bt.cast<BatchTracker>(); |
| 509 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { |
| 510 GrGLfloat c[4]; |
| 511 GrColorToRGBAFloat(local.fColor, c); |
| 512 pdman.set4fv(fColorUniform, 1, c); |
| 513 fColor = local.fColor; |
| 514 } |
432 } | 515 } |
433 | 516 |
434 private: | 517 private: |
| 518 GrColor fColor; |
| 519 UniformHandle fColorUniform; |
| 520 |
435 typedef GrGLGeometryProcessor INHERITED; | 521 typedef GrGLGeometryProcessor INHERITED; |
436 }; | 522 }; |
437 | 523 |
438 virtual void getGLProcessorKey(const GrBatchTracker& bt, | 524 virtual void getGLProcessorKey(const GrBatchTracker& bt, |
439 const GrGLCaps& caps, | 525 const GrGLCaps& caps, |
440 GrProcessorKeyBuilder* b) const SK_OVERRIDE { | 526 GrProcessorKeyBuilder* b) const SK_OVERRIDE { |
441 GLProcessor::GenKey(*this, bt, caps, b); | 527 GLProcessor::GenKey(*this, bt, caps, b); |
442 } | 528 } |
443 | 529 |
444 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { | 530 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { |
445 return SkNEW_ARGS(GLProcessor, (*this, bt)); | 531 return SkNEW_ARGS(GLProcessor, (*this, bt)); |
446 } | 532 } |
447 | 533 |
| 534 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR
IDE { |
| 535 BatchTracker* local = bt->cast<BatchTracker>(); |
| 536 local->fInputColorType = GetColorInputType(&local->fColor, this->color()
, init, false); |
| 537 } |
| 538 |
| 539 bool onCanMakeEqual(const GrBatchTracker& m, const GrBatchTracker& t) const
SK_OVERRIDE { |
| 540 const BatchTracker& mine = m.cast<BatchTracker>(); |
| 541 const BatchTracker& theirs = t.cast<BatchTracker>(); |
| 542 return CanCombineOutput(mine.fInputColorType, mine.fColor, |
| 543 theirs.fInputColorType, theirs.fColor); |
| 544 } |
| 545 |
448 private: | 546 private: |
449 DIEllipseEdgeEffect(GrColor color, Mode mode) : INHERITED(color) { | 547 DIEllipseEdgeEffect(GrColor color, Mode mode) : INHERITED(color) { |
450 this->initClassID<DIEllipseEdgeEffect>(); | 548 this->initClassID<DIEllipseEdgeEffect>(); |
451 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); | 549 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); |
452 fInEllipseOffsets0 = &this->addVertexAttrib(GrAttribute("inEllipseOffset
s0", | 550 fInEllipseOffsets0 = &this->addVertexAttrib(GrAttribute("inEllipseOffset
s0", |
453 kVec2f_GrVertexA
ttribType)); | 551 kVec2f_GrVertexA
ttribType)); |
454 fInEllipseOffsets1 = &this->addVertexAttrib(GrAttribute("inEllipseOffset
s1", | 552 fInEllipseOffsets1 = &this->addVertexAttrib(GrAttribute("inEllipseOffset
s1", |
455 kVec2f_GrVertexA
ttribType)); | 553 kVec2f_GrVertexA
ttribType)); |
456 fMode = mode; | 554 fMode = mode; |
457 } | 555 } |
458 | 556 |
459 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { | 557 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { |
460 const DIEllipseEdgeEffect& eee = other.cast<DIEllipseEdgeEffect>(); | 558 const DIEllipseEdgeEffect& eee = other.cast<DIEllipseEdgeEffect>(); |
461 return eee.fMode == fMode; | 559 return eee.fMode == fMode; |
462 } | 560 } |
463 | 561 |
464 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const
SK_OVERRIDE { | 562 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const
SK_OVERRIDE { |
465 out->setUnknownSingleComponent(); | 563 out->setUnknownSingleComponent(); |
466 } | 564 } |
467 | 565 |
| 566 struct BatchTracker { |
| 567 GrGPInput fInputColorType; |
| 568 GrColor fColor; |
| 569 }; |
| 570 |
468 const GrAttribute* fInPosition; | 571 const GrAttribute* fInPosition; |
469 const GrAttribute* fInEllipseOffsets0; | 572 const GrAttribute* fInEllipseOffsets0; |
470 const GrAttribute* fInEllipseOffsets1; | 573 const GrAttribute* fInEllipseOffsets1; |
471 Mode fMode; | 574 Mode fMode; |
472 | 575 |
473 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 576 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
474 | 577 |
475 typedef GrGeometryProcessor INHERITED; | 578 typedef GrGeometryProcessor INHERITED; |
476 }; | 579 }; |
477 | 580 |
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1246 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : | 1349 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : |
1247 SK_ARRAY_COUNT(gRRectIndices); | 1350 SK_ARRAY_COUNT(gRRectIndices); |
1248 target->setIndexSourceToBuffer(indexBuffer); | 1351 target->setIndexSourceToBuffer(indexBuffer); |
1249 target->drawIndexedInstances(drawState, effect, kTriangles_GrPrimitiveTy
pe, 1, 16, indexCnt, | 1352 target->drawIndexedInstances(drawState, effect, kTriangles_GrPrimitiveTy
pe, 1, 16, indexCnt, |
1250 &bounds); | 1353 &bounds); |
1251 } | 1354 } |
1252 | 1355 |
1253 target->resetIndexSource(); | 1356 target->resetIndexSource(); |
1254 return true; | 1357 return true; |
1255 } | 1358 } |
OLD | NEW |