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