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

Side by Side Diff: src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp

Issue 491673002: Initial refactor of shaderbuilder (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 4 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 /* 2 /*
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkTwoPointConicalGradient_gpu.h" 9 #include "SkTwoPointConicalGradient_gpu.h"
10 10
11 #include "SkTwoPointConicalGradient.h" 11 #include "SkTwoPointConicalGradient.h"
12 12
13 #if SK_SUPPORT_GPU 13 #if SK_SUPPORT_GPU
14 #include "GrTBackendEffectFactory.h" 14 #include "GrTBackendEffectFactory.h"
15 #include "gl/GrGLShaderBuilder.h" 15 #include "gl/builders/GrGLProgramBuilder.h"
16 // For brevity 16 // For brevity
17 typedef GrGLProgramDataManager::UniformHandle UniformHandle; 17 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
18 18
19 static const SkScalar kErrorTol = 0.00001f; 19 static const SkScalar kErrorTol = 0.00001f;
20 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol; 20 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol;
21 21
22 /** 22 /**
23 * We have three general cases for 2pt conical gradients. First we always assume that 23 * We have three general cases for 2pt conical gradients. First we always assume that
24 * the start radius <= end radius. Our first case (kInside_) is when the start c ircle 24 * the start radius <= end radius. Our first case (kInside_) is when the start c ircle
25 * is completely enclosed by the end circle. The second case (kOutside_) is the case 25 * is completely enclosed by the end circle. The second case (kOutside_) is the case
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 // @} 130 // @}
131 131
132 typedef GrGradientEffect INHERITED; 132 typedef GrGradientEffect INHERITED;
133 }; 133 };
134 134
135 class GLEdge2PtConicalEffect : public GrGLGradientEffect { 135 class GLEdge2PtConicalEffect : public GrGLGradientEffect {
136 public: 136 public:
137 GLEdge2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEf fect&); 137 GLEdge2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEf fect&);
138 virtual ~GLEdge2PtConicalEffect() { } 138 virtual ~GLEdge2PtConicalEffect() { }
139 139
140 virtual void emitCode(GrGLShaderBuilder*, 140 virtual void emitCode(GrGLProgramBuilder*,
141 const GrDrawEffect&, 141 const GrDrawEffect&,
142 const GrEffectKey&, 142 const GrEffectKey&,
143 const char* outputColor, 143 const char* outputColor,
144 const char* inputColor, 144 const char* inputColor,
145 const TransformedCoordsArray&, 145 const TransformedCoordsArray&,
146 const TextureSamplerArray&) SK_OVERRIDE; 146 const TextureSamplerArray&) SK_OVERRIDE;
147 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 147 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE;
148 148
149 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b); 149 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b);
150 150
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 } 210 }
211 211
212 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrBackendEffectFactory& fac tory, 212 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrBackendEffectFactory& fac tory,
213 const GrDrawEffect& drawEffect) 213 const GrDrawEffect& drawEffect)
214 : INHERITED(factory) 214 : INHERITED(factory)
215 , fVSVaryingName(NULL) 215 , fVSVaryingName(NULL)
216 , fFSVaryingName(NULL) 216 , fFSVaryingName(NULL)
217 , fCachedRadius(-SK_ScalarMax) 217 , fCachedRadius(-SK_ScalarMax)
218 , fCachedDiffRadius(-SK_ScalarMax) {} 218 , fCachedDiffRadius(-SK_ScalarMax) {}
219 219
220 void GLEdge2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, 220 void GLEdge2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
221 const GrDrawEffect&, 221 const GrDrawEffect&,
222 const GrEffectKey& key, 222 const GrEffectKey& key,
223 const char* outputColor, 223 const char* outputColor,
224 const char* inputColor, 224 const char* inputColor,
225 const TransformedCoordsArray& coords, 225 const TransformedCoordsArray& coords,
226 const TextureSamplerArray& samplers) { 226 const TextureSamplerArray& samplers) {
227 uint32_t baseKey = key.get32(0); 227 uint32_t baseKey = key.get32(0);
228 this->emitUniforms(builder, baseKey); 228 this->emitUniforms(builder, baseKey);
229 fParamUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_Visibility , 229 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit y,
230 kFloat_GrSLType, "Conical2FSParams", 3) ; 230 kFloat_GrSLType, "Conical2FSParams", 3) ;
231 231
232 SkString cName("c"); 232 SkString cName("c");
233 SkString tName("t"); 233 SkString tName("t");
234 SkString p0; // start radius 234 SkString p0; // start radius
235 SkString p1; // start radius squared 235 SkString p1; // start radius squared
236 SkString p2; // difference in radii (r1 - r0) 236 SkString p2; // difference in radii (r1 - r0)
237 237
238 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); 238 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0);
239 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); 239 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1);
240 builder->getUniformVariable(fParamUni).appendArrayAccess(2, &p2); 240 builder->getUniformVariable(fParamUni).appendArrayAccess(2, &p2);
241 241
242 // We interpolate the linear component in coords[1]. 242 // We interpolate the linear component in coords[1].
243 SkASSERT(coords[0].type() == coords[1].type()); 243 SkASSERT(coords[0].type() == coords[1].type());
244 const char* coords2D; 244 const char* coords2D;
245 SkString bVar; 245 SkString bVar;
246 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
246 if (kVec3f_GrSLType == coords[0].type()) { 247 if (kVec3f_GrSLType == coords[0].type()) {
247 builder->fsCodeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x / %s.z);\n", 248 fsBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x / %s.z);\n",
248 coords[0].c_str(), coords[0].c_str(), coords[1].c _str(), coords[1].c_str()); 249 coords[0].c_str(), coords[0].c_str(), coords[1].c _str(), coords[1].c_str());
249 coords2D = "interpolants.xy"; 250 coords2D = "interpolants.xy";
250 bVar = "interpolants.z"; 251 bVar = "interpolants.z";
251 } else { 252 } else {
252 coords2D = coords[0].c_str(); 253 coords2D = coords[0].c_str();
253 bVar.printf("%s.x", coords[1].c_str()); 254 bVar.printf("%s.x", coords[1].c_str());
254 } 255 }
255 256
256 // output will default to transparent black (we simply won't write anything 257 // output will default to transparent black (we simply won't write anything
257 // else to it if invalid, instead of discarding or returning prematurely) 258 // else to it if invalid, instead of discarding or returning prematurely)
258 builder->fsCodeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor); 259 fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor);
259 260
260 // c = (x^2)+(y^2) - params[1] 261 // c = (x^2)+(y^2) - params[1]
261 builder->fsCodeAppendf("\tfloat %s = dot(%s, %s) - %s;\n", 262 fsBuilder->codeAppendf("\tfloat %s = dot(%s, %s) - %s;\n",
262 cName.c_str(), coords2D, coords2D, p1.c_str()); 263 cName.c_str(), coords2D, coords2D, p1.c_str());
263 264
264 // linear case: t = -c/b 265 // linear case: t = -c/b
265 builder->fsCodeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(), 266 fsBuilder->codeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(),
266 cName.c_str(), bVar.c_str()); 267 cName.c_str(), bVar.c_str());
267 268
268 // if r(t) > 0, then t will be the x coordinate 269 // if r(t) > 0, then t will be the x coordinate
269 builder->fsCodeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(), 270 fsBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(),
270 p2.c_str(), p0.c_str()); 271 p2.c_str(), p0.c_str());
271 builder->fsCodeAppend("\t"); 272 fsBuilder->codeAppend("\t");
272 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 273 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
273 builder->fsCodeAppend("\t}\n"); 274 fsBuilder->codeAppend("\t}\n");
274 } 275 }
275 276
276 void GLEdge2PtConicalEffect::setData(const GrGLProgramDataManager& pdman, 277 void GLEdge2PtConicalEffect::setData(const GrGLProgramDataManager& pdman,
277 const GrDrawEffect& drawEffect) { 278 const GrDrawEffect& drawEffect) {
278 INHERITED::setData(pdman, drawEffect); 279 INHERITED::setData(pdman, drawEffect);
279 const Edge2PtConicalEffect& data = drawEffect.castEffect<Edge2PtConicalEffec t>(); 280 const Edge2PtConicalEffect& data = drawEffect.castEffect<Edge2PtConicalEffec t>();
280 SkScalar radius0 = data.radius(); 281 SkScalar radius0 = data.radius();
281 SkScalar diffRadius = data.diffRadius(); 282 SkScalar diffRadius = data.diffRadius();
282 283
283 if (fCachedRadius != radius0 || 284 if (fCachedRadius != radius0 ||
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 bool fIsFlipped; 407 bool fIsFlipped;
407 408
408 typedef GrGradientEffect INHERITED; 409 typedef GrGradientEffect INHERITED;
409 }; 410 };
410 411
411 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect { 412 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect {
412 public: 413 public:
413 GLFocalOutside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&); 414 GLFocalOutside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&);
414 virtual ~GLFocalOutside2PtConicalEffect() { } 415 virtual ~GLFocalOutside2PtConicalEffect() { }
415 416
416 virtual void emitCode(GrGLShaderBuilder*, 417 virtual void emitCode(GrGLProgramBuilder*,
417 const GrDrawEffect&, 418 const GrDrawEffect&,
418 const GrEffectKey&, 419 const GrEffectKey&,
419 const char* outputColor, 420 const char* outputColor,
420 const char* inputColor, 421 const char* inputColor,
421 const TransformedCoordsArray&, 422 const TransformedCoordsArray&,
422 const TextureSamplerArray&) SK_OVERRIDE; 423 const TextureSamplerArray&) SK_OVERRIDE;
423 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 424 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE;
424 425
425 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b); 426 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b);
426 427
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrBackendEf fectFactory& factory, 487 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrBackendEf fectFactory& factory,
487 const GrDrawEffec t& drawEffect) 488 const GrDrawEffec t& drawEffect)
488 : INHERITED(factory) 489 : INHERITED(factory)
489 , fVSVaryingName(NULL) 490 , fVSVaryingName(NULL)
490 , fFSVaryingName(NULL) 491 , fFSVaryingName(NULL)
491 , fCachedFocal(SK_ScalarMax) { 492 , fCachedFocal(SK_ScalarMax) {
492 const FocalOutside2PtConicalEffect& data = drawEffect.castEffect<FocalOutsid e2PtConicalEffect>(); 493 const FocalOutside2PtConicalEffect& data = drawEffect.castEffect<FocalOutsid e2PtConicalEffect>();
493 fIsFlipped = data.isFlipped(); 494 fIsFlipped = data.isFlipped();
494 } 495 }
495 496
496 void GLFocalOutside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, 497 void GLFocalOutside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
497 const GrDrawEffect&, 498 const GrDrawEffect&,
498 const GrEffectKey& key, 499 const GrEffectKey& key,
499 const char* outputColor, 500 const char* outputColor,
500 const char* inputColor, 501 const char* inputColor,
501 const TransformedCoordsArray& coor ds, 502 const TransformedCoordsArray& coor ds,
502 const TextureSamplerArray& sampler s) { 503 const TextureSamplerArray& sampler s) {
503 uint32_t baseKey = key.get32(0); 504 uint32_t baseKey = key.get32(0);
504 this->emitUniforms(builder, baseKey); 505 this->emitUniforms(builder, baseKey);
505 fParamUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_Visibility , 506 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit y,
506 kFloat_GrSLType, "Conical2FSParams", 2) ; 507 kFloat_GrSLType, "Conical2FSParams", 2) ;
507 SkString tName("t"); 508 SkString tName("t");
508 SkString p0; // focalX 509 SkString p0; // focalX
509 SkString p1; // 1 - focalX * focalX 510 SkString p1; // 1 - focalX * focalX
510 511
511 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); 512 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0);
512 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); 513 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1);
513 514
514 // if we have a vec3 from being in perspective, convert it to a vec2 first 515 // if we have a vec3 from being in perspective, convert it to a vec2 first
515 SkString coords2DString = builder->ensureFSCoords2D(coords, 0); 516 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
517 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0);
516 const char* coords2D = coords2DString.c_str(); 518 const char* coords2D = coords2DString.c_str();
517 519
518 // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2) 520 // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2)
519 521
520 // output will default to transparent black (we simply won't write anything 522 // output will default to transparent black (we simply won't write anything
521 // else to it if invalid, instead of discarding or returning prematurely) 523 // else to it if invalid, instead of discarding or returning prematurely)
522 builder->fsCodeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor); 524 fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor);
523 525
524 builder->fsCodeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D); 526 fsBuilder->codeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D);
525 builder->fsCodeAppendf("\tfloat ys = %s.y * %s.y;\n", coords2D, coords2D); 527 fsBuilder->codeAppendf("\tfloat ys = %s.y * %s.y;\n", coords2D, coords2D);
526 builder->fsCodeAppendf("\tfloat d = xs + %s * ys;\n", p1.c_str()); 528 fsBuilder->codeAppendf("\tfloat d = xs + %s * ys;\n", p1.c_str());
527 529
528 // Must check to see if we flipped the circle order (to make sure start radi us < end radius) 530 // Must check to see if we flipped the circle order (to make sure start radi us < end radius)
529 // If so we must also flip sign on sqrt 531 // If so we must also flip sign on sqrt
530 if (!fIsFlipped) { 532 if (!fIsFlipped) {
531 builder->fsCodeAppendf("\tfloat %s = %s.x * %s + sqrt(d);\n", tName.c_s tr(), 533 fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + sqrt(d);\n", tName.c_s tr(),
532 coords2D, p0.c_str()); 534 coords2D, p0.c_str());
533 } else { 535 } else {
534 builder->fsCodeAppendf("\tfloat %s = %s.x * %s - sqrt(d);\n", tName.c_s tr(), 536 fsBuilder->codeAppendf("\tfloat %s = %s.x * %s - sqrt(d);\n", tName.c_s tr(),
535 coords2D, p0.c_str()); 537 coords2D, p0.c_str());
536 } 538 }
537 539
538 builder->fsCodeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str()); 540 fsBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str());
539 builder->fsCodeAppend("\t\t"); 541 fsBuilder->codeAppend("\t\t");
540 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 542 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
541 builder->fsCodeAppend("\t}\n"); 543 fsBuilder->codeAppend("\t}\n");
542 } 544 }
543 545
544 void GLFocalOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman , 546 void GLFocalOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman ,
545 const GrDrawEffect& drawEffect) { 547 const GrDrawEffect& drawEffect) {
546 INHERITED::setData(pdman, drawEffect); 548 INHERITED::setData(pdman, drawEffect);
547 const FocalOutside2PtConicalEffect& data = drawEffect.castEffect<FocalOutsid e2PtConicalEffect>(); 549 const FocalOutside2PtConicalEffect& data = drawEffect.castEffect<FocalOutsid e2PtConicalEffect>();
548 SkASSERT(data.isFlipped() == fIsFlipped); 550 SkASSERT(data.isFlipped() == fIsFlipped);
549 SkScalar focal = data.focal(); 551 SkScalar focal = data.focal();
550 552
551 if (fCachedFocal != focal) { 553 if (fCachedFocal != focal) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 SkScalar fFocalX; 613 SkScalar fFocalX;
612 614
613 typedef GrGradientEffect INHERITED; 615 typedef GrGradientEffect INHERITED;
614 }; 616 };
615 617
616 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect { 618 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect {
617 public: 619 public:
618 GLFocalInside2PtConicalEffect(const GrBackendEffectFactory& factory, const G rDrawEffect&); 620 GLFocalInside2PtConicalEffect(const GrBackendEffectFactory& factory, const G rDrawEffect&);
619 virtual ~GLFocalInside2PtConicalEffect() {} 621 virtual ~GLFocalInside2PtConicalEffect() {}
620 622
621 virtual void emitCode(GrGLShaderBuilder*, 623 virtual void emitCode(GrGLProgramBuilder*,
622 const GrDrawEffect&, 624 const GrDrawEffect&,
623 const GrEffectKey&, 625 const GrEffectKey&,
624 const char* outputColor, 626 const char* outputColor,
625 const char* inputColor, 627 const char* inputColor,
626 const TransformedCoordsArray&, 628 const TransformedCoordsArray&,
627 const TextureSamplerArray&) SK_OVERRIDE; 629 const TextureSamplerArray&) SK_OVERRIDE;
628 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 630 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE;
629 631
630 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b); 632 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b);
631 633
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 return effect; 690 return effect;
689 } 691 }
690 692
691 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrBackendEffe ctFactory& factory, 693 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrBackendEffe ctFactory& factory,
692 const GrDrawEffect& drawEffect) 694 const GrDrawEffect& drawEffect)
693 : INHERITED(factory) 695 : INHERITED(factory)
694 , fVSVaryingName(NULL) 696 , fVSVaryingName(NULL)
695 , fFSVaryingName(NULL) 697 , fFSVaryingName(NULL)
696 , fCachedFocal(SK_ScalarMax) {} 698 , fCachedFocal(SK_ScalarMax) {}
697 699
698 void GLFocalInside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, 700 void GLFocalInside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
699 const GrDrawEffect&, 701 const GrDrawEffect&,
700 const GrEffectKey& key, 702 const GrEffectKey& key,
701 const char* outputColor, 703 const char* outputColor,
702 const char* inputColor, 704 const char* inputColor,
703 const TransformedCoordsArray& coord s, 705 const TransformedCoordsArray& coord s,
704 const TextureSamplerArray& samplers ) { 706 const TextureSamplerArray& samplers ) {
705 uint32_t baseKey = key.get32(0); 707 uint32_t baseKey = key.get32(0);
706 this->emitUniforms(builder, baseKey); 708 this->emitUniforms(builder, baseKey);
707 fFocalUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 709 fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
708 kFloat_GrSLType, "Conical2FSParams"); 710 kFloat_GrSLType, "Conical2FSParams");
709 SkString tName("t"); 711 SkString tName("t");
710 712
711 // this is the distance along x-axis from the end center to focal point in 713 // this is the distance along x-axis from the end center to focal point in
712 // transformed coordinates 714 // transformed coordinates
713 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni); 715 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni);
714 716
715 // if we have a vec3 from being in perspective, convert it to a vec2 first 717 // if we have a vec3 from being in perspective, convert it to a vec2 first
716 SkString coords2DString = builder->ensureFSCoords2D(coords, 0); 718 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
719 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0);
717 const char* coords2D = coords2DString.c_str(); 720 const char* coords2D = coords2DString.c_str();
718 721
719 // t = p.x * focalX + length(p) 722 // t = p.x * focalX + length(p)
720 builder->fsCodeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_st r(), 723 fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_st r(),
721 coords2D, focal.c_str(), coords2D); 724 coords2D, focal.c_str(), coords2D);
722 725
723 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 726 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
724 } 727 }
725 728
726 void GLFocalInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman, 729 void GLFocalInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman,
727 const GrDrawEffect& drawEffect) { 730 const GrDrawEffect& drawEffect) {
728 INHERITED::setData(pdman, drawEffect); 731 INHERITED::setData(pdman, drawEffect);
729 const FocalInside2PtConicalEffect& data = drawEffect.castEffect<FocalInside2 PtConicalEffect>(); 732 const FocalInside2PtConicalEffect& data = drawEffect.castEffect<FocalInside2 PtConicalEffect>();
730 SkScalar focal = data.focal(); 733 SkScalar focal = data.focal();
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 const CircleConicalInfo fInfo; 855 const CircleConicalInfo fInfo;
853 856
854 typedef GrGradientEffect INHERITED; 857 typedef GrGradientEffect INHERITED;
855 }; 858 };
856 859
857 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect { 860 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect {
858 public: 861 public:
859 GLCircleInside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&); 862 GLCircleInside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&);
860 virtual ~GLCircleInside2PtConicalEffect() {} 863 virtual ~GLCircleInside2PtConicalEffect() {}
861 864
862 virtual void emitCode(GrGLShaderBuilder*, 865 virtual void emitCode(GrGLProgramBuilder*,
863 const GrDrawEffect&, 866 const GrDrawEffect&,
864 const GrEffectKey&, 867 const GrEffectKey&,
865 const char* outputColor, 868 const char* outputColor,
866 const char* inputColor, 869 const char* inputColor,
867 const TransformedCoordsArray&, 870 const TransformedCoordsArray&,
868 const TextureSamplerArray&) SK_OVERRIDE; 871 const TextureSamplerArray&) SK_OVERRIDE;
869 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 872 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE;
870 873
871 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b); 874 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b);
872 875
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 const GrDrawEffec t& drawEffect) 940 const GrDrawEffec t& drawEffect)
938 : INHERITED(factory) 941 : INHERITED(factory)
939 , fVSVaryingName(NULL) 942 , fVSVaryingName(NULL)
940 , fFSVaryingName(NULL) 943 , fFSVaryingName(NULL)
941 , fCachedCenterX(SK_ScalarMax) 944 , fCachedCenterX(SK_ScalarMax)
942 , fCachedCenterY(SK_ScalarMax) 945 , fCachedCenterY(SK_ScalarMax)
943 , fCachedA(SK_ScalarMax) 946 , fCachedA(SK_ScalarMax)
944 , fCachedB(SK_ScalarMax) 947 , fCachedB(SK_ScalarMax)
945 , fCachedC(SK_ScalarMax) {} 948 , fCachedC(SK_ScalarMax) {}
946 949
947 void GLCircleInside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, 950 void GLCircleInside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
948 const GrDrawEffect&, 951 const GrDrawEffect&,
949 const GrEffectKey& key, 952 const GrEffectKey& key,
950 const char* outputColor, 953 const char* outputColor,
951 const char* inputColor, 954 const char* inputColor,
952 const TransformedCoordsArray& coor ds, 955 const TransformedCoordsArray& coor ds,
953 const TextureSamplerArray& sampler s) { 956 const TextureSamplerArray& sampler s) {
954 uint32_t baseKey = key.get32(0); 957 uint32_t baseKey = key.get32(0);
955 this->emitUniforms(builder, baseKey); 958 this->emitUniforms(builder, baseKey);
956 fCenterUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 959 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
957 kVec2f_GrSLType, "Conical2FSCenter"); 960 kVec2f_GrSLType, "Conical2FSCenter");
958 fParamUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 961 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
959 kVec3f_GrSLType, "Conical2FSParams"); 962 kVec3f_GrSLType, "Conical2FSParams");
960 SkString tName("t"); 963 SkString tName("t");
961 964
962 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); 965 GrGLShaderVar center = builder->getUniformVariable(fCenterUni);
963 // params.x = A 966 // params.x = A
964 // params.y = B 967 // params.y = B
965 // params.z = C 968 // params.z = C
966 GrGLShaderVar params = builder->getUniformVariable(fParamUni); 969 GrGLShaderVar params = builder->getUniformVariable(fParamUni);
967 970
968 // if we have a vec3 from being in perspective, convert it to a vec2 first 971 // if we have a vec3 from being in perspective, convert it to a vec2 first
969 SkString coords2DString = builder->ensureFSCoords2D(coords, 0); 972 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
973 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0);
970 const char* coords2D = coords2DString.c_str(); 974 const char* coords2D = coords2DString.c_str();
971 975
972 // p = coords2D 976 // p = coords2D
973 // e = center end 977 // e = center end
974 // r = radius end 978 // r = radius end
975 // A = dot(e, e) - r^2 + 2 * r - 1 979 // A = dot(e, e) - r^2 + 2 * r - 1
976 // B = (r -1) / A 980 // B = (r -1) / A
977 // C = 1 / A 981 // C = 1 / A
978 // d = dot(e, p) + B 982 // d = dot(e, p) + B
979 // t = d +/- sqrt(d^2 - A * dot(p, p) + C) 983 // t = d +/- sqrt(d^2 - A * dot(p, p) + C)
980 builder->fsCodeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D ); 984 fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D );
981 builder->fsCodeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente r.c_str(), params.c_str()); 985 fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente r.c_str(), params.c_str());
982 builder->fsCodeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\ n", 986 fsBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\ n",
983 tName.c_str(), params.c_str(), params.c_str()); 987 tName.c_str(), params.c_str(), params.c_str());
984 988
985 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 989 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
986 } 990 }
987 991
988 void GLCircleInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman , 992 void GLCircleInside2PtConicalEffect::setData(const GrGLProgramDataManager& pdman ,
989 const GrDrawEffect& drawEffect) { 993 const GrDrawEffect& drawEffect) {
990 INHERITED::setData(pdman, drawEffect); 994 INHERITED::setData(pdman, drawEffect);
991 const CircleInside2PtConicalEffect& data = drawEffect.castEffect<CircleInsid e2PtConicalEffect>(); 995 const CircleInside2PtConicalEffect& data = drawEffect.castEffect<CircleInsid e2PtConicalEffect>();
992 SkScalar centerX = data.centerX(); 996 SkScalar centerX = data.centerX();
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1078 bool fIsFlipped; 1082 bool fIsFlipped;
1079 1083
1080 typedef GrGradientEffect INHERITED; 1084 typedef GrGradientEffect INHERITED;
1081 }; 1085 };
1082 1086
1083 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect { 1087 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect {
1084 public: 1088 public:
1085 GLCircleOutside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&); 1089 GLCircleOutside2PtConicalEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&);
1086 virtual ~GLCircleOutside2PtConicalEffect() {} 1090 virtual ~GLCircleOutside2PtConicalEffect() {}
1087 1091
1088 virtual void emitCode(GrGLShaderBuilder*, 1092 virtual void emitCode(GrGLProgramBuilder*,
1089 const GrDrawEffect&, 1093 const GrDrawEffect&,
1090 const GrEffectKey&, 1094 const GrEffectKey&,
1091 const char* outputColor, 1095 const char* outputColor,
1092 const char* inputColor, 1096 const char* inputColor,
1093 const TransformedCoordsArray&, 1097 const TransformedCoordsArray&,
1094 const TextureSamplerArray&) SK_OVERRIDE; 1098 const TextureSamplerArray&) SK_OVERRIDE;
1095 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 1099 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE;
1096 1100
1097 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b); 1101 static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBui lder* b);
1098 1102
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1171 , fCachedCenterX(SK_ScalarMax) 1175 , fCachedCenterX(SK_ScalarMax)
1172 , fCachedCenterY(SK_ScalarMax) 1176 , fCachedCenterY(SK_ScalarMax)
1173 , fCachedA(SK_ScalarMax) 1177 , fCachedA(SK_ScalarMax)
1174 , fCachedB(SK_ScalarMax) 1178 , fCachedB(SK_ScalarMax)
1175 , fCachedC(SK_ScalarMax) 1179 , fCachedC(SK_ScalarMax)
1176 , fCachedTLimit(SK_ScalarMax) { 1180 , fCachedTLimit(SK_ScalarMax) {
1177 const CircleOutside2PtConicalEffect& data = drawEffect.castEffect<CircleOuts ide2PtConicalEffect>(); 1181 const CircleOutside2PtConicalEffect& data = drawEffect.castEffect<CircleOuts ide2PtConicalEffect>();
1178 fIsFlipped = data.isFlipped(); 1182 fIsFlipped = data.isFlipped();
1179 } 1183 }
1180 1184
1181 void GLCircleOutside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, 1185 void GLCircleOutside2PtConicalEffect::emitCode(GrGLProgramBuilder* builder,
1182 const GrDrawEffect&, 1186 const GrDrawEffect&,
1183 const GrEffectKey& key, 1187 const GrEffectKey& key,
1184 const char* outputColor, 1188 const char* outputColor,
1185 const char* inputColor, 1189 const char* inputColor,
1186 const TransformedCoordsArray& coo rds, 1190 const TransformedCoordsArray& coo rds,
1187 const TextureSamplerArray& sample rs) { 1191 const TextureSamplerArray& sample rs) {
1188 uint32_t baseKey = key.get32(0); 1192 uint32_t baseKey = key.get32(0);
1189 this->emitUniforms(builder, baseKey); 1193 this->emitUniforms(builder, baseKey);
1190 fCenterUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 1194 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
1191 kVec2f_GrSLType, "Conical2FSCenter"); 1195 kVec2f_GrSLType, "Conical2FSCenter");
1192 fParamUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 1196 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
1193 kVec4f_GrSLType, "Conical2FSParams"); 1197 kVec4f_GrSLType, "Conical2FSParams");
1194 SkString tName("t"); 1198 SkString tName("t");
1195 1199
1196 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); 1200 GrGLShaderVar center = builder->getUniformVariable(fCenterUni);
1197 // params.x = A 1201 // params.x = A
1198 // params.y = B 1202 // params.y = B
1199 // params.z = C 1203 // params.z = C
1200 GrGLShaderVar params = builder->getUniformVariable(fParamUni); 1204 GrGLShaderVar params = builder->getUniformVariable(fParamUni);
1201 1205
1202 // if we have a vec3 from being in perspective, convert it to a vec2 first 1206 // if we have a vec3 from being in perspective, convert it to a vec2 first
1203 SkString coords2DString = builder->ensureFSCoords2D(coords, 0); 1207 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
1208 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0);
1204 const char* coords2D = coords2DString.c_str(); 1209 const char* coords2D = coords2DString.c_str();
1205 1210
1206 // output will default to transparent black (we simply won't write anything 1211 // output will default to transparent black (we simply won't write anything
1207 // else to it if invalid, instead of discarding or returning prematurely) 1212 // else to it if invalid, instead of discarding or returning prematurely)
1208 builder->fsCodeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor); 1213 fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor);
1209 1214
1210 // p = coords2D 1215 // p = coords2D
1211 // e = center end 1216 // e = center end
1212 // r = radius end 1217 // r = radius end
1213 // A = dot(e, e) - r^2 + 2 * r - 1 1218 // A = dot(e, e) - r^2 + 2 * r - 1
1214 // B = (r -1) / A 1219 // B = (r -1) / A
1215 // C = 1 / A 1220 // C = 1 / A
1216 // d = dot(e, p) + B 1221 // d = dot(e, p) + B
1217 // t = d +/- sqrt(d^2 - A * dot(p, p) + C) 1222 // t = d +/- sqrt(d^2 - A * dot(p, p) + C)
1218 1223
1219 builder->fsCodeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D ); 1224 fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D );
1220 builder->fsCodeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente r.c_str(), params.c_str()); 1225 fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente r.c_str(), params.c_str());
1221 builder->fsCodeAppendf("\tfloat deter = d * d - %s.x * pDotp + %s.z;\n", par ams.c_str(), params.c_str()); 1226 fsBuilder->codeAppendf("\tfloat deter = d * d - %s.x * pDotp + %s.z;\n", par ams.c_str(), params.c_str());
1222 1227
1223 // Must check to see if we flipped the circle order (to make sure start radi us < end radius) 1228 // Must check to see if we flipped the circle order (to make sure start radi us < end radius)
1224 // If so we must also flip sign on sqrt 1229 // If so we must also flip sign on sqrt
1225 if (!fIsFlipped) { 1230 if (!fIsFlipped) {
1226 builder->fsCodeAppendf("\tfloat %s = d + sqrt(deter);\n", tName.c_str()) ; 1231 fsBuilder->codeAppendf("\tfloat %s = d + sqrt(deter);\n", tName.c_str()) ;
1227 } else { 1232 } else {
1228 builder->fsCodeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str()) ; 1233 fsBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str()) ;
1229 } 1234 }
1230 1235
1231 builder->fsCodeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str( ), params.c_str()); 1236 fsBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str( ), params.c_str());
1232 builder->fsCodeAppend("\t\t"); 1237 fsBuilder->codeAppend("\t\t");
1233 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers); 1238 this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, sa mplers);
1234 builder->fsCodeAppend("\t}\n"); 1239 fsBuilder->codeAppend("\t}\n");
1235 } 1240 }
1236 1241
1237 void GLCircleOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdma n, 1242 void GLCircleOutside2PtConicalEffect::setData(const GrGLProgramDataManager& pdma n,
1238 const GrDrawEffect& drawEffect) { 1243 const GrDrawEffect& drawEffect) {
1239 INHERITED::setData(pdman, drawEffect); 1244 INHERITED::setData(pdman, drawEffect);
1240 const CircleOutside2PtConicalEffect& data = drawEffect.castEffect<CircleOuts ide2PtConicalEffect>(); 1245 const CircleOutside2PtConicalEffect& data = drawEffect.castEffect<CircleOuts ide2PtConicalEffect>();
1241 SkASSERT(data.isFlipped() == fIsFlipped); 1246 SkASSERT(data.isFlipped() == fIsFlipped);
1242 SkScalar centerX = data.centerX(); 1247 SkScalar centerX = data.centerX();
1243 SkScalar centerY = data.centerY(); 1248 SkScalar centerY = data.centerY();
1244 SkScalar A = data.A(); 1249 SkScalar A = data.A();
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1307 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o); 1312 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o);
1308 } else if (type == kEdge_ConicalType) { 1313 } else if (type == kEdge_ConicalType) {
1309 set_matrix_edge_conical(shader, &matrix); 1314 set_matrix_edge_conical(shader, &matrix);
1310 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); 1315 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm);
1311 } else { 1316 } else {
1312 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo); 1317 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo);
1313 } 1318 }
1314 } 1319 }
1315 1320
1316 #endif 1321 #endif
OLDNEW
« no previous file with comments | « src/effects/gradients/SkSweepGradient.cpp ('k') | src/effects/gradients/SkTwoPointRadialGradient.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698