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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 const char* name() const SK_OVERRIDE { return "CircleEdge"; } | 76 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 : fColor(GrColor_ILLEGAL) {} |
85 | 85 |
86 void onEmitCode(EmitArgs& args) SK_OVERRIDE { | 86 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) SK_OVERRIDE{ |
87 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); | 87 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); |
88 GrGLGPBuilder* pb = args.fPB; | 88 GrGLGPBuilder* pb = args.fPB; |
89 const BatchTracker& local = args.fBT.cast<BatchTracker>(); | 89 const BatchTracker& local = args.fBT.cast<BatchTracker>(); |
90 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 90 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
91 | 91 |
92 // emit attributes | 92 // emit attributes |
93 vsBuilder->emitAttributes(ce); | 93 vsBuilder->emitAttributes(ce); |
94 | 94 |
95 GrGLVertToFrag v(kVec4f_GrSLType); | 95 GrGLVertToFrag v(kVec4f_GrSLType); |
96 args.fPB->addVarying("CircleEdge", &v); | 96 args.fPB->addVarying("CircleEdge", &v); |
97 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa
me); | 97 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa
me); |
98 | 98 |
99 // Setup pass through color | 99 // Setup pass through color |
100 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, | 100 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, |
101 &fColorUniform); | 101 &fColorUniform); |
102 | 102 |
103 // setup uniform viewMatrix | 103 // setup uniform viewMatrix |
104 this->addUniformViewMatrix(pb); | 104 this->addUniformViewMatrix(pb); |
105 | 105 |
106 // Setup position | 106 // Setup position |
107 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", this->position(),
this->uViewM(), | 107 SetupPosition(vsBuilder, gpArgs, ce.inPosition()->fName, |
108 ce.inPosition()->fName); | 108 ce.viewMatrix(), this->uViewM()); |
109 | 109 |
110 // emit transforms | 110 // emit transforms |
111 this->emitTransforms(args.fPB, this->position(), ce.inPosition()->f
Name, | 111 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ce.inPosition()
->fName, |
112 ce.localMatrix(), args.fTransformsIn, args.fTra
nsformsOut);; | 112 ce.localMatrix(), args.fTransformsIn, args.fTra
nsformsOut);; |
113 | 113 |
114 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 114 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
115 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); | 115 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); |
116 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d), 0.
0, 1.0);", v.fsIn()); | 116 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d), 0.
0, 1.0);", v.fsIn()); |
117 if (ce.isStroked()) { | 117 if (ce.isStroked()) { |
118 fsBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %s.
w), 0.0, 1.0);", | 118 fsBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %s.
w), 0.0, 1.0);", |
119 v.fsIn(), v.fsIn()); | 119 v.fsIn(), v.fsIn()); |
120 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); | 120 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); |
121 } | 121 } |
122 | 122 |
123 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 123 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
124 } | 124 } |
125 | 125 |
126 static void GenKey(const GrGeometryProcessor& processor, | 126 static void GenKey(const GrGeometryProcessor& gp, |
127 const GrBatchTracker& bt, | 127 const GrBatchTracker& bt, |
128 const GrGLCaps&, | 128 const GrGLCaps&, |
129 GrProcessorKeyBuilder* b) { | 129 GrProcessorKeyBuilder* b) { |
130 const BatchTracker& local = bt.cast<BatchTracker>(); | 130 const BatchTracker& local = bt.cast<BatchTracker>(); |
131 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe
ct>(); | 131 const CircleEdgeEffect& circleEffect = gp.cast<CircleEdgeEffect>(); |
132 uint16_t key = circleEffect.isStroked() ? 0x1 : 0x0; | 132 uint16_t key = circleEffect.isStroked() ? 0x1 : 0x0; |
133 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspect
ive() ? 0x2 : 0x0; | 133 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ?
0x2 : 0x0; |
| 134 key |= ComputePosKey(gp.viewMatrix()) << 2; |
134 b->add32(key << 16 | local.fInputColorType); | 135 b->add32(key << 16 | local.fInputColorType); |
135 } | 136 } |
136 | 137 |
137 virtual void setData(const GrGLProgramDataManager& pdman, | 138 virtual void setData(const GrGLProgramDataManager& pdman, |
138 const GrPrimitiveProcessor& gp, | 139 const GrPrimitiveProcessor& gp, |
139 const GrBatchTracker& bt) SK_OVERRIDE { | 140 const GrBatchTracker& bt) SK_OVERRIDE { |
140 this->setUniformViewMatrix(pdman, gp.viewMatrix()); | 141 this->setUniformViewMatrix(pdman, gp.viewMatrix()); |
141 | 142 |
142 const BatchTracker& local = bt.cast<BatchTracker>(); | 143 const BatchTracker& local = bt.cast<BatchTracker>(); |
143 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { | 144 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 const Attribute* inEllipseRadii() const { return fInEllipseRadii; } | 253 const Attribute* inEllipseRadii() const { return fInEllipseRadii; } |
253 | 254 |
254 inline bool isStroked() const { return fStroke; } | 255 inline bool isStroked() const { return fStroke; } |
255 | 256 |
256 class GLProcessor : public GrGLGeometryProcessor { | 257 class GLProcessor : public GrGLGeometryProcessor { |
257 public: | 258 public: |
258 GLProcessor(const GrGeometryProcessor&, | 259 GLProcessor(const GrGeometryProcessor&, |
259 const GrBatchTracker&) | 260 const GrBatchTracker&) |
260 : fColor(GrColor_ILLEGAL) {} | 261 : fColor(GrColor_ILLEGAL) {} |
261 | 262 |
262 void onEmitCode(EmitArgs& args) SK_OVERRIDE { | 263 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) SK_OVERRIDE{ |
263 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); | 264 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); |
264 GrGLGPBuilder* pb = args.fPB; | 265 GrGLGPBuilder* pb = args.fPB; |
265 const BatchTracker& local = args.fBT.cast<BatchTracker>(); | 266 const BatchTracker& local = args.fBT.cast<BatchTracker>(); |
266 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 267 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
267 | 268 |
268 // emit attributes | 269 // emit attributes |
269 vsBuilder->emitAttributes(ee); | 270 vsBuilder->emitAttributes(ee); |
270 | 271 |
271 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType); | 272 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType); |
272 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); | 273 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); |
273 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), | 274 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), |
274 ee.inEllipseOffset()->fName); | 275 ee.inEllipseOffset()->fName); |
275 | 276 |
276 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType); | 277 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType); |
277 args.fPB->addVarying("EllipseRadii", &ellipseRadii); | 278 args.fPB->addVarying("EllipseRadii", &ellipseRadii); |
278 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), | 279 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), |
279 ee.inEllipseRadii()->fName); | 280 ee.inEllipseRadii()->fName); |
280 | 281 |
281 // Setup pass through color | 282 // Setup pass through color |
282 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, | 283 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, |
283 &fColorUniform); | 284 &fColorUniform); |
284 | 285 |
285 // setup uniform viewMatrix | 286 // setup uniform viewMatrix |
286 this->addUniformViewMatrix(pb); | 287 this->addUniformViewMatrix(pb); |
287 | 288 |
288 // Setup position | 289 // Setup position |
289 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", this->position(), t
his->uViewM(), | 290 SetupPosition(vsBuilder, gpArgs, ee.inPosition()->fName, |
290 ee.inPosition()->fName); | 291 ee.viewMatrix(), this->uViewM()); |
291 | 292 |
292 // emit transforms | 293 // emit transforms |
293 this->emitTransforms(args.fPB, this->position(), ee.inPosition()->fN
ame, | 294 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition()
->fName, |
294 ee.localMatrix(), args.fTransformsIn, args.fTra
nsformsOut); | 295 ee.localMatrix(), args.fTransformsIn, args.fTra
nsformsOut); |
295 | 296 |
296 // for outer curve | 297 // for outer curve |
297 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 298 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
298 fsBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOffse
ts.fsIn(), | 299 fsBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOffse
ts.fsIn(), |
299 ellipseRadii.fsIn()); | 300 ellipseRadii.fsIn()); |
300 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); | 301 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); |
301 fsBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", ellips
eRadii.fsIn()); | 302 fsBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", ellips
eRadii.fsIn()); |
302 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); | 303 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); |
303 | 304 |
304 // avoid calling inversesqrt on zero. | 305 // avoid calling inversesqrt on zero. |
305 fsBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); | 306 fsBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); |
306 fsBuilder->codeAppend("float invlen = inversesqrt(grad_dot);"); | 307 fsBuilder->codeAppend("float invlen = inversesqrt(grad_dot);"); |
307 fsBuilder->codeAppend("float edgeAlpha = clamp(0.5-test*invlen, 0.0,
1.0);"); | 308 fsBuilder->codeAppend("float edgeAlpha = clamp(0.5-test*invlen, 0.0,
1.0);"); |
308 | 309 |
309 // for inner curve | 310 // for inner curve |
310 if (ee.isStroked()) { | 311 if (ee.isStroked()) { |
311 fsBuilder->codeAppendf("scaledOffset = %s*%s.zw;", | 312 fsBuilder->codeAppendf("scaledOffset = %s*%s.zw;", |
312 ellipseOffsets.fsIn(), ellipseRadii.fsIn(
)); | 313 ellipseOffsets.fsIn(), ellipseRadii.fsIn(
)); |
313 fsBuilder->codeAppend("test = dot(scaledOffset, scaledOffset) -
1.0;"); | 314 fsBuilder->codeAppend("test = dot(scaledOffset, scaledOffset) -
1.0;"); |
314 fsBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;", | 315 fsBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;", |
315 ellipseRadii.fsIn()); | 316 ellipseRadii.fsIn()); |
316 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); | 317 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); |
317 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); | 318 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); |
318 } | 319 } |
319 | 320 |
320 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 321 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
321 } | 322 } |
322 | 323 |
323 static void GenKey(const GrGeometryProcessor& processor, | 324 static void GenKey(const GrGeometryProcessor& gp, |
324 const GrBatchTracker& bt, | 325 const GrBatchTracker& bt, |
325 const GrGLCaps&, | 326 const GrGLCaps&, |
326 GrProcessorKeyBuilder* b) { | 327 GrProcessorKeyBuilder* b) { |
327 const BatchTracker& local = bt.cast<BatchTracker>(); | 328 const BatchTracker& local = bt.cast<BatchTracker>(); |
328 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE
ffect>(); | 329 const EllipseEdgeEffect& ellipseEffect = gp.cast<EllipseEdgeEffect>(
); |
329 uint16_t key = ellipseEffect.isStroked() ? 0x1 : 0x0; | 330 uint16_t key = ellipseEffect.isStroked() ? 0x1 : 0x0; |
330 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspect
ive() ? 0x2 : 0x0; | 331 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ?
0x2 : 0x0; |
| 332 key |= ComputePosKey(gp.viewMatrix()) << 2; |
331 b->add32(key << 16 | local.fInputColorType); | 333 b->add32(key << 16 | local.fInputColorType); |
332 } | 334 } |
333 | 335 |
334 virtual void setData(const GrGLProgramDataManager& pdman, | 336 virtual void setData(const GrGLProgramDataManager& pdman, |
335 const GrPrimitiveProcessor& gp, | 337 const GrPrimitiveProcessor& gp, |
336 const GrBatchTracker& bt) SK_OVERRIDE { | 338 const GrBatchTracker& bt) SK_OVERRIDE { |
337 this->setUniformViewMatrix(pdman, gp.viewMatrix()); | 339 this->setUniformViewMatrix(pdman, gp.viewMatrix()); |
338 | 340 |
339 const BatchTracker& local = bt.cast<BatchTracker>(); | 341 const BatchTracker& local = bt.cast<BatchTracker>(); |
340 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { | 342 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 const Attribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } | 458 const Attribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } |
457 | 459 |
458 inline Mode getMode() const { return fMode; } | 460 inline Mode getMode() const { return fMode; } |
459 | 461 |
460 class GLProcessor : public GrGLGeometryProcessor { | 462 class GLProcessor : public GrGLGeometryProcessor { |
461 public: | 463 public: |
462 GLProcessor(const GrGeometryProcessor&, | 464 GLProcessor(const GrGeometryProcessor&, |
463 const GrBatchTracker&) | 465 const GrBatchTracker&) |
464 : fColor(GrColor_ILLEGAL) {} | 466 : fColor(GrColor_ILLEGAL) {} |
465 | 467 |
466 void onEmitCode(EmitArgs& args) SK_OVERRIDE { | 468 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) SK_OVERRIDE{ |
467 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; | 469 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; |
468 GrGLGPBuilder* pb = args.fPB; | 470 GrGLGPBuilder* pb = args.fPB; |
469 const BatchTracker& local = args.fBT.cast<BatchTracker>(); | 471 const BatchTracker& local = args.fBT.cast<BatchTracker>(); |
470 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 472 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
471 | 473 |
472 // emit attributes | 474 // emit attributes |
473 vsBuilder->emitAttributes(ee); | 475 vsBuilder->emitAttributes(ee); |
474 | 476 |
475 GrGLVertToFrag offsets0(kVec2f_GrSLType); | 477 GrGLVertToFrag offsets0(kVec2f_GrSLType); |
476 args.fPB->addVarying("EllipseOffsets0", &offsets0); | 478 args.fPB->addVarying("EllipseOffsets0", &offsets0); |
477 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), | 479 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), |
478 ee.inEllipseOffsets0()->fName); | 480 ee.inEllipseOffsets0()->fName); |
479 | 481 |
480 GrGLVertToFrag offsets1(kVec2f_GrSLType); | 482 GrGLVertToFrag offsets1(kVec2f_GrSLType); |
481 args.fPB->addVarying("EllipseOffsets1", &offsets1); | 483 args.fPB->addVarying("EllipseOffsets1", &offsets1); |
482 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), | 484 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), |
483 ee.inEllipseOffsets1()->fName); | 485 ee.inEllipseOffsets1()->fName); |
484 | 486 |
485 // Setup pass through color | 487 // Setup pass through color |
486 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, | 488 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, |
487 &fColorUniform); | 489 &fColorUniform); |
488 | 490 |
489 // setup uniform viewMatrix | 491 // setup uniform viewMatrix |
490 this->addUniformViewMatrix(pb); | 492 this->addUniformViewMatrix(pb); |
491 | 493 |
492 // Setup position | 494 // Setup position |
493 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", this->position(), t
his->uViewM(), | 495 SetupPosition(vsBuilder, gpArgs, ee.inPosition()->fName, |
494 ee.inPosition()->fName); | 496 ee.viewMatrix(), this->uViewM()); |
495 | 497 |
496 // emit transforms | 498 // emit transforms |
497 this->emitTransforms(args.fPB, this->position(), ee.inPosition()->fN
ame, | 499 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition()
->fName, |
498 ee.localMatrix(), args.fTransformsIn, args.fTra
nsformsOut); | 500 ee.localMatrix(), args.fTransformsIn, args.fTra
nsformsOut); |
499 | 501 |
500 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 502 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
501 SkAssertResult(fsBuilder->enableFeature( | 503 SkAssertResult(fsBuilder->enableFeature( |
502 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 504 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); |
503 // for outer curve | 505 // for outer curve |
504 fsBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn()
); | 506 fsBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn()
); |
505 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); | 507 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); |
506 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); | 508 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); |
507 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); | 509 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); |
(...skipping 23 matching lines...) Expand all Loading... |
531 " 2.0*%s.x*duvdy.x + 2.0*%s.y*
duvdy.y);", | 533 " 2.0*%s.x*duvdy.x + 2.0*%s.y*
duvdy.y);", |
532 offsets1.fsIn(), offsets1.fsIn(), offsets
1.fsIn(), | 534 offsets1.fsIn(), offsets1.fsIn(), offsets
1.fsIn(), |
533 offsets1.fsIn()); | 535 offsets1.fsIn()); |
534 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); | 536 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); |
535 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); | 537 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); |
536 } | 538 } |
537 | 539 |
538 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 540 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
539 } | 541 } |
540 | 542 |
541 static void GenKey(const GrGeometryProcessor& processor, | 543 static void GenKey(const GrGeometryProcessor& gp, |
542 const GrBatchTracker& bt, | 544 const GrBatchTracker& bt, |
543 const GrGLCaps&, | 545 const GrGLCaps&, |
544 GrProcessorKeyBuilder* b) { | 546 GrProcessorKeyBuilder* b) { |
545 const BatchTracker& local = bt.cast<BatchTracker>(); | 547 const BatchTracker& local = bt.cast<BatchTracker>(); |
546 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE
dgeEffect>(); | 548 const DIEllipseEdgeEffect& ellipseEffect = gp.cast<DIEllipseEdgeEffe
ct>(); |
547 uint16_t key = ellipseEffect.getMode(); | 549 uint16_t key = ellipseEffect.getMode(); |
548 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspect
ive() ? 0x1 << 8 : | 550 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ?
0x1 << 8 : 0x0; |
549
0x0; | 551 key |= ComputePosKey(gp.viewMatrix()) << 9; |
550 b->add32(key << 16 | local.fInputColorType); | 552 b->add32(key << 16 | local.fInputColorType); |
551 } | 553 } |
552 | 554 |
553 virtual void setData(const GrGLProgramDataManager& pdman, | 555 virtual void setData(const GrGLProgramDataManager& pdman, |
554 const GrPrimitiveProcessor& gp, | 556 const GrPrimitiveProcessor& gp, |
555 const GrBatchTracker& bt) SK_OVERRIDE { | 557 const GrBatchTracker& bt) SK_OVERRIDE { |
556 this->setUniformViewMatrix(pdman, gp.viewMatrix()); | 558 this->setUniformViewMatrix(pdman, gp.viewMatrix()); |
557 | 559 |
558 const BatchTracker& local = bt.cast<BatchTracker>(); | 560 const BatchTracker& local = bt.cast<BatchTracker>(); |
559 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { | 561 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { |
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1410 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : | 1412 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : |
1411 SK_ARRAY_COUNT(gRRectIndices); | 1413 SK_ARRAY_COUNT(gRRectIndices); |
1412 target->setIndexSourceToBuffer(indexBuffer); | 1414 target->setIndexSourceToBuffer(indexBuffer); |
1413 target->drawIndexedInstances(drawState, effect, kTriangles_GrPrimitiveTy
pe, 1, 16, indexCnt, | 1415 target->drawIndexedInstances(drawState, effect, kTriangles_GrPrimitiveTy
pe, 1, 16, indexCnt, |
1414 &bounds); | 1416 &bounds); |
1415 } | 1417 } |
1416 | 1418 |
1417 target->resetIndexSource(); | 1419 target->resetIndexSource(); |
1418 return true; | 1420 return true; |
1419 } | 1421 } |
OLD | NEW |