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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa
me); | 95 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa
me); |
96 | 96 |
97 // Setup pass through color | 97 // Setup pass through color |
98 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, | 98 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, |
99 &fColorUniform); | 99 &fColorUniform); |
100 | 100 |
101 // setup coord outputs | 101 // setup coord outputs |
102 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ce.i
nPosition()->fName); | 102 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ce.i
nPosition()->fName); |
103 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ce.inPo
sition()->fName); | 103 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ce.inPo
sition()->fName); |
104 | 104 |
| 105 // setup uniform viewMatrix |
| 106 this->setupUniformViewMatrix(pb); |
| 107 |
105 // setup position varying | 108 // setup position varying |
106 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), | 109 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), |
107 vsBuilder->uViewM(), ce.inPosition()->fName); | 110 this->uViewM(), ce.inPosition()->fName); |
108 | 111 |
109 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 112 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
110 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); | 113 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); |
111 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d), 0.
0, 1.0);", v.fsIn()); | 114 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d), 0.
0, 1.0);", v.fsIn()); |
112 if (ce.isStroked()) { | 115 if (ce.isStroked()) { |
113 fsBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %s.
w), 0.0, 1.0);", | 116 fsBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %s.
w), 0.0, 1.0);", |
114 v.fsIn(), v.fsIn()); | 117 v.fsIn(), v.fsIn()); |
115 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); | 118 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); |
116 } | 119 } |
117 | 120 |
118 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 121 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
119 } | 122 } |
120 | 123 |
121 static void GenKey(const GrGeometryProcessor& processor, | 124 static void GenKey(const GrGeometryProcessor& processor, |
122 const GrBatchTracker& bt, | 125 const GrBatchTracker& bt, |
123 const GrGLCaps&, | 126 const GrGLCaps&, |
124 GrProcessorKeyBuilder* b) { | 127 GrProcessorKeyBuilder* b) { |
125 const BatchTracker& local = bt.cast<BatchTracker>(); | 128 const BatchTracker& local = bt.cast<BatchTracker>(); |
126 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe
ct>(); | 129 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe
ct>(); |
127 uint16_t key = circleEffect.isStroked() ? 0x1 : 0x0; | 130 uint16_t key = circleEffect.isStroked() ? 0x1 : 0x0; |
128 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspect
ive() ? 0x2 : 0x0; | 131 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspect
ive() ? 0x2 : 0x0; |
129 b->add32(key << 16 | local.fInputColorType); | 132 b->add32(key << 16 | local.fInputColorType); |
130 } | 133 } |
131 | 134 |
132 virtual void setData(const GrGLProgramDataManager& pdman, | 135 virtual void setData(const GrGLProgramDataManager& pdman, |
133 const GrPrimitiveProcessor& gp, | 136 const GrPrimitiveProcessor& gp, |
134 const GrBatchTracker& bt) SK_OVERRIDE { | 137 const GrBatchTracker& bt) SK_OVERRIDE { |
| 138 this->setUniformViewMatrix(pdman, gp.viewMatrix()); |
| 139 |
135 const BatchTracker& local = bt.cast<BatchTracker>(); | 140 const BatchTracker& local = bt.cast<BatchTracker>(); |
136 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { | 141 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { |
137 GrGLfloat c[4]; | 142 GrGLfloat c[4]; |
138 GrColorToRGBAFloat(local.fColor, c); | 143 GrColorToRGBAFloat(local.fColor, c); |
139 pdman.set4fv(fColorUniform, 1, c); | 144 pdman.set4fv(fColorUniform, 1, c); |
140 fColor = local.fColor; | 145 fColor = local.fColor; |
141 } | 146 } |
142 } | 147 } |
143 | 148 |
144 private: | 149 private: |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 ee.inEllipseRadii()->fName); | 276 ee.inEllipseRadii()->fName); |
272 | 277 |
273 // Setup pass through color | 278 // Setup pass through color |
274 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, | 279 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, |
275 &fColorUniform); | 280 &fColorUniform); |
276 | 281 |
277 // setup coord outputs | 282 // setup coord outputs |
278 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i
nPosition()->fName); | 283 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i
nPosition()->fName); |
279 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo
sition()->fName); | 284 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo
sition()->fName); |
280 | 285 |
| 286 // setup uniform viewMatrix |
| 287 this->setupUniformViewMatrix(pb); |
| 288 |
281 // setup position varying | 289 // setup position varying |
282 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), | 290 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), |
283 vsBuilder->uViewM(), ee.inPosition()->fName); | 291 this->uViewM(), ee.inPosition()->fName); |
284 | 292 |
285 // for outer curve | 293 // for outer curve |
286 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 294 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
287 fsBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOffse
ts.fsIn(), | 295 fsBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOffse
ts.fsIn(), |
288 ellipseRadii.fsIn()); | 296 ellipseRadii.fsIn()); |
289 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); | 297 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); |
290 fsBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", ellips
eRadii.fsIn()); | 298 fsBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", ellips
eRadii.fsIn()); |
291 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); | 299 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); |
292 | 300 |
293 // avoid calling inversesqrt on zero. | 301 // avoid calling inversesqrt on zero. |
(...skipping 22 matching lines...) Expand all Loading... |
316 const BatchTracker& local = bt.cast<BatchTracker>(); | 324 const BatchTracker& local = bt.cast<BatchTracker>(); |
317 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE
ffect>(); | 325 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE
ffect>(); |
318 uint16_t key = ellipseEffect.isStroked() ? 0x1 : 0x0; | 326 uint16_t key = ellipseEffect.isStroked() ? 0x1 : 0x0; |
319 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspect
ive() ? 0x2 : 0x0; | 327 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspect
ive() ? 0x2 : 0x0; |
320 b->add32(key << 16 | local.fInputColorType); | 328 b->add32(key << 16 | local.fInputColorType); |
321 } | 329 } |
322 | 330 |
323 virtual void setData(const GrGLProgramDataManager& pdman, | 331 virtual void setData(const GrGLProgramDataManager& pdman, |
324 const GrPrimitiveProcessor& gp, | 332 const GrPrimitiveProcessor& gp, |
325 const GrBatchTracker& bt) SK_OVERRIDE { | 333 const GrBatchTracker& bt) SK_OVERRIDE { |
| 334 this->setUniformViewMatrix(pdman, gp.viewMatrix()); |
| 335 |
326 const BatchTracker& local = bt.cast<BatchTracker>(); | 336 const BatchTracker& local = bt.cast<BatchTracker>(); |
327 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { | 337 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { |
328 GrGLfloat c[4]; | 338 GrGLfloat c[4]; |
329 GrColorToRGBAFloat(local.fColor, c); | 339 GrColorToRGBAFloat(local.fColor, c); |
330 pdman.set4fv(fColorUniform, 1, c); | 340 pdman.set4fv(fColorUniform, 1, c); |
331 fColor = local.fColor; | 341 fColor = local.fColor; |
332 } | 342 } |
333 } | 343 } |
334 | 344 |
335 private: | 345 private: |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 ee.inEllipseOffsets1()->fName); | 478 ee.inEllipseOffsets1()->fName); |
469 | 479 |
470 // Setup pass through color | 480 // Setup pass through color |
471 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, | 481 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC
olor, NULL, |
472 &fColorUniform); | 482 &fColorUniform); |
473 | 483 |
474 // setup coord outputs | 484 // setup coord outputs |
475 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i
nPosition()->fName); | 485 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i
nPosition()->fName); |
476 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo
sition()->fName); | 486 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo
sition()->fName); |
477 | 487 |
| 488 // setup uniform viewMatrix |
| 489 this->setupUniformViewMatrix(pb); |
| 490 |
478 // setup position varying | 491 // setup position varying |
479 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), | 492 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi
on(), |
480 vsBuilder->uViewM(), ee.inPosition()->fName); | 493 this->uViewM(), ee.inPosition()->fName); |
481 | 494 |
482 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); | 495 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde
r(); |
483 SkAssertResult(fsBuilder->enableFeature( | 496 SkAssertResult(fsBuilder->enableFeature( |
484 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); | 497 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)
); |
485 // for outer curve | 498 // for outer curve |
486 fsBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn()
); | 499 fsBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn()
); |
487 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); | 500 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset)
- 1.0;"); |
488 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); | 501 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); |
489 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); | 502 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); |
490 fsBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y
*duvdx.y," | 503 fsBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y
*duvdx.y," |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE
dgeEffect>(); | 541 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE
dgeEffect>(); |
529 uint16_t key = ellipseEffect.getMode(); | 542 uint16_t key = ellipseEffect.getMode(); |
530 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspect
ive() ? 0x1 << 8 : | 543 key |= local.fUsesLocalCoords && processor.localMatrix().hasPerspect
ive() ? 0x1 << 8 : |
531
0x0; | 544
0x0; |
532 b->add32(key << 16 | local.fInputColorType); | 545 b->add32(key << 16 | local.fInputColorType); |
533 } | 546 } |
534 | 547 |
535 virtual void setData(const GrGLProgramDataManager& pdman, | 548 virtual void setData(const GrGLProgramDataManager& pdman, |
536 const GrPrimitiveProcessor& gp, | 549 const GrPrimitiveProcessor& gp, |
537 const GrBatchTracker& bt) SK_OVERRIDE { | 550 const GrBatchTracker& bt) SK_OVERRIDE { |
| 551 this->setUniformViewMatrix(pdman, gp.viewMatrix()); |
| 552 |
538 const BatchTracker& local = bt.cast<BatchTracker>(); | 553 const BatchTracker& local = bt.cast<BatchTracker>(); |
539 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { | 554 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { |
540 GrGLfloat c[4]; | 555 GrGLfloat c[4]; |
541 GrColorToRGBAFloat(local.fColor, c); | 556 GrColorToRGBAFloat(local.fColor, c); |
542 pdman.set4fv(fColorUniform, 1, c); | 557 pdman.set4fv(fColorUniform, 1, c); |
543 fColor = local.fColor; | 558 fColor = local.fColor; |
544 } | 559 } |
545 } | 560 } |
546 | 561 |
547 private: | 562 private: |
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1392 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : | 1407 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : |
1393 SK_ARRAY_COUNT(gRRectIndices); | 1408 SK_ARRAY_COUNT(gRRectIndices); |
1394 target->setIndexSourceToBuffer(indexBuffer); | 1409 target->setIndexSourceToBuffer(indexBuffer); |
1395 target->drawIndexedInstances(drawState, effect, kTriangles_GrPrimitiveTy
pe, 1, 16, indexCnt, | 1410 target->drawIndexedInstances(drawState, effect, kTriangles_GrPrimitiveTy
pe, 1, 16, indexCnt, |
1396 &bounds); | 1411 &bounds); |
1397 } | 1412 } |
1398 | 1413 |
1399 target->resetIndexSource(); | 1414 target->resetIndexSource(); |
1400 return true; | 1415 return true; |
1401 } | 1416 } |
OLD | NEW |