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 "gl/builders/GrGLProgramBuilder.h" | 10 #include "gl/builders/GrGLProgramBuilder.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 } | 84 } |
85 | 85 |
86 virtual ~CircleEdgeEffect() {} | 86 virtual ~CircleEdgeEffect() {} |
87 | 87 |
88 static const char* Name() { return "CircleEdge"; } | 88 static const char* Name() { return "CircleEdge"; } |
89 | 89 |
90 inline bool isStroked() const { return fStroke; } | 90 inline bool isStroked() const { return fStroke; } |
91 | 91 |
92 class GLProcessor : public GrGLGeometryProcessor { | 92 class GLProcessor : public GrGLGeometryProcessor { |
93 public: | 93 public: |
94 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&
) | 94 GLProcessor(const GrBackendProcessorFactory& factory, |
| 95 const GrGeometryProcessor&, |
| 96 const GrBatchTracker&) |
95 : INHERITED (factory) {} | 97 : INHERITED (factory) {} |
96 | 98 |
97 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 99 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
98 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); | 100 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); |
99 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 101 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
100 | 102 |
101 GrGLVertToFrag v(kVec4f_GrSLType); | 103 GrGLVertToFrag v(kVec4f_GrSLType); |
102 args.fPB->addVarying("CircleEdge", &v); | 104 args.fPB->addVarying("CircleEdge", &v); |
103 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa
me); | 105 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa
me); |
104 | 106 |
(...skipping 10 matching lines...) Expand all Loading... |
115 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z - d, 0.0, 1.0);
", v.fsIn()); | 117 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z - d, 0.0, 1.0);
", v.fsIn()); |
116 if (ce.isStroked()) { | 118 if (ce.isStroked()) { |
117 fsBuilder->codeAppendf("float innerAlpha = clamp(d - %s.w, 0.0,
1.0);", | 119 fsBuilder->codeAppendf("float innerAlpha = clamp(d - %s.w, 0.0,
1.0);", |
118 v.fsIn()); | 120 v.fsIn()); |
119 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); | 121 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); |
120 } | 122 } |
121 | 123 |
122 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 124 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
123 } | 125 } |
124 | 126 |
125 static void GenKey(const GrProcessor& processor, const GrGLCaps&, | 127 static void GenKey(const GrGeometryProcessor& processor, |
| 128 const GrBatchTracker&, |
| 129 const GrGLCaps&, |
126 GrProcessorKeyBuilder* b) { | 130 GrProcessorKeyBuilder* b) { |
127 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe
ct>(); | 131 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe
ct>(); |
128 b->add32(circleEffect.isStroked()); | 132 b->add32(circleEffect.isStroked()); |
129 } | 133 } |
130 | 134 |
131 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&)
SK_OVERRIDE {} | 135 virtual void setData(const GrGLProgramDataManager&, |
| 136 const GrGeometryProcessor&, |
| 137 const GrBatchTracker&) SK_OVERRIDE {} |
132 | 138 |
133 private: | 139 private: |
134 typedef GrGLGeometryProcessor INHERITED; | 140 typedef GrGLGeometryProcessor INHERITED; |
135 }; | 141 }; |
136 | 142 |
137 | 143 |
138 private: | 144 private: |
139 CircleEdgeEffect(bool stroke) { | 145 CircleEdgeEffect(bool stroke) { |
140 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); | 146 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); |
141 fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge", | 147 fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge", |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 | 211 |
206 | 212 |
207 const GrAttribute* inPosition() const { return fInPosition; } | 213 const GrAttribute* inPosition() const { return fInPosition; } |
208 const GrAttribute* inEllipseOffset() const { return fInEllipseOffset; } | 214 const GrAttribute* inEllipseOffset() const { return fInEllipseOffset; } |
209 const GrAttribute* inEllipseRadii() const { return fInEllipseRadii; } | 215 const GrAttribute* inEllipseRadii() const { return fInEllipseRadii; } |
210 | 216 |
211 inline bool isStroked() const { return fStroke; } | 217 inline bool isStroked() const { return fStroke; } |
212 | 218 |
213 class GLProcessor : public GrGLGeometryProcessor { | 219 class GLProcessor : public GrGLGeometryProcessor { |
214 public: | 220 public: |
215 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&
) | 221 GLProcessor(const GrBackendProcessorFactory& factory, |
| 222 const GrGeometryProcessor&, |
| 223 const GrBatchTracker&) |
216 : INHERITED (factory) {} | 224 : INHERITED (factory) {} |
217 | 225 |
218 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 226 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
219 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); | 227 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); |
220 | 228 |
221 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 229 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
222 | 230 |
223 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType); | 231 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType); |
224 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); | 232 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); |
225 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), | 233 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 fsBuilder->codeAppend("test = dot(scaledOffset, scaledOffset) -
1.0;"); | 266 fsBuilder->codeAppend("test = dot(scaledOffset, scaledOffset) -
1.0;"); |
259 fsBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;", | 267 fsBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;", |
260 ellipseRadii.fsIn()); | 268 ellipseRadii.fsIn()); |
261 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); | 269 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); |
262 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); | 270 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); |
263 } | 271 } |
264 | 272 |
265 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 273 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
266 } | 274 } |
267 | 275 |
268 static void GenKey(const GrProcessor& processor, const GrGLCaps&, | 276 static void GenKey(const GrGeometryProcessor& processor, |
| 277 const GrBatchTracker&, |
| 278 const GrGLCaps&, |
269 GrProcessorKeyBuilder* b) { | 279 GrProcessorKeyBuilder* b) { |
270 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE
ffect>(); | 280 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE
ffect>(); |
271 b->add32(ellipseEffect.isStroked()); | 281 b->add32(ellipseEffect.isStroked()); |
272 } | 282 } |
273 | 283 |
274 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&)
SK_OVERRIDE { | 284 virtual void setData(const GrGLProgramDataManager&, |
| 285 const GrGeometryProcessor&, |
| 286 const GrBatchTracker&) SK_OVERRIDE { |
275 } | 287 } |
276 | 288 |
277 private: | 289 private: |
278 typedef GrGLGeometryProcessor INHERITED; | 290 typedef GrGLGeometryProcessor INHERITED; |
279 }; | 291 }; |
280 | 292 |
281 private: | 293 private: |
282 EllipseEdgeEffect(bool stroke) { | 294 EllipseEdgeEffect(bool stroke) { |
283 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); | 295 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); |
284 fInEllipseOffset = &this->addVertexAttrib(GrAttribute("inEllipseOffset", | 296 fInEllipseOffset = &this->addVertexAttrib(GrAttribute("inEllipseOffset", |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 static const char* Name() { return "DIEllipseEdge"; } | 369 static const char* Name() { return "DIEllipseEdge"; } |
358 | 370 |
359 const GrAttribute* inPosition() const { return fInPosition; } | 371 const GrAttribute* inPosition() const { return fInPosition; } |
360 const GrAttribute* inEllipseOffsets0() const { return fInEllipseOffsets0; } | 372 const GrAttribute* inEllipseOffsets0() const { return fInEllipseOffsets0; } |
361 const GrAttribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } | 373 const GrAttribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } |
362 | 374 |
363 inline Mode getMode() const { return fMode; } | 375 inline Mode getMode() const { return fMode; } |
364 | 376 |
365 class GLProcessor : public GrGLGeometryProcessor { | 377 class GLProcessor : public GrGLGeometryProcessor { |
366 public: | 378 public: |
367 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&
) | 379 GLProcessor(const GrBackendProcessorFactory& factory, |
| 380 const GrGeometryProcessor&, |
| 381 const GrBatchTracker&) |
368 : INHERITED (factory) {} | 382 : INHERITED (factory) {} |
369 | 383 |
370 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 384 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
371 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; | 385 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; |
372 | 386 |
373 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 387 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
374 | 388 |
375 GrGLVertToFrag offsets0(kVec2f_GrSLType); | 389 GrGLVertToFrag offsets0(kVec2f_GrSLType); |
376 args.fPB->addVarying("EllipseOffsets0", &offsets0); | 390 args.fPB->addVarying("EllipseOffsets0", &offsets0); |
377 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), | 391 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 " 2.0*%s.x*duvdy.x + 2.0*%s.y*
duvdy.y);", | 438 " 2.0*%s.x*duvdy.x + 2.0*%s.y*
duvdy.y);", |
425 offsets1.fsIn(), offsets1.fsIn(), offsets
1.fsIn(), | 439 offsets1.fsIn(), offsets1.fsIn(), offsets
1.fsIn(), |
426 offsets1.fsIn()); | 440 offsets1.fsIn()); |
427 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); | 441 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); |
428 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); | 442 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); |
429 } | 443 } |
430 | 444 |
431 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 445 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
432 } | 446 } |
433 | 447 |
434 static void GenKey(const GrProcessor& processor, const GrGLCaps&, | 448 static void GenKey(const GrGeometryProcessor& processor, |
| 449 const GrBatchTracker&, |
| 450 const GrGLCaps&, |
435 GrProcessorKeyBuilder* b) { | 451 GrProcessorKeyBuilder* b) { |
436 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE
dgeEffect>(); | 452 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE
dgeEffect>(); |
437 | 453 |
438 b->add32(ellipseEffect.getMode()); | 454 b->add32(ellipseEffect.getMode()); |
439 } | 455 } |
440 | 456 |
441 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&)
SK_OVERRIDE { | 457 virtual void setData(const GrGLProgramDataManager&, |
| 458 const GrGeometryProcessor&, |
| 459 const GrBatchTracker&) SK_OVERRIDE { |
442 } | 460 } |
443 | 461 |
444 private: | 462 private: |
445 typedef GrGLGeometryProcessor INHERITED; | 463 typedef GrGLGeometryProcessor INHERITED; |
446 }; | 464 }; |
447 | 465 |
448 private: | 466 private: |
449 DIEllipseEdgeEffect(Mode mode) { | 467 DIEllipseEdgeEffect(Mode mode) { |
450 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); | 468 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); |
451 fInEllipseOffsets0 = &this->addVertexAttrib(GrAttribute("inEllipseOffset
s0", | 469 fInEllipseOffsets0 = &this->addVertexAttrib(GrAttribute("inEllipseOffset
s0", |
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1244 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : | 1262 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : |
1245 SK_ARRAY_COUNT(gRRectIndices); | 1263 SK_ARRAY_COUNT(gRRectIndices); |
1246 target->setIndexSourceToBuffer(indexBuffer); | 1264 target->setIndexSourceToBuffer(indexBuffer); |
1247 target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 1
6, indexCnt, | 1265 target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 1
6, indexCnt, |
1248 &bounds); | 1266 &bounds); |
1249 } | 1267 } |
1250 | 1268 |
1251 target->resetIndexSource(); | 1269 target->resetIndexSource(); |
1252 return true; | 1270 return true; |
1253 } | 1271 } |
OLD | NEW |