Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(625)

Side by Side Diff: src/gpu/GrOvalRenderer.cpp

Issue 854013002: Refactor position computation to enable device space "nudge" (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Update to ToT Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698