| 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 |