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

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

Issue 1490283004: Create GLSLUniformHandler class for gpu backend (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: clean up public api of uniformhandler Created 5 years 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
« no previous file with comments | « src/effects/gradients/SkSweepGradient.cpp ('k') | src/gpu/GrDefaultGeoProcFactory.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "GrCoordTransform.h"
15 #include "GrInvariantOutput.h"
14 #include "GrPaint.h" 16 #include "GrPaint.h"
15 #include "glsl/GrGLSLFragmentShaderBuilder.h" 17 #include "glsl/GrGLSLFragmentShaderBuilder.h"
16 #include "glsl/GrGLSLProgramBuilder.h"
17 #include "glsl/GrGLSLProgramDataManager.h" 18 #include "glsl/GrGLSLProgramDataManager.h"
19 #include "glsl/GrGLSLUniformHandler.h"
18 // For brevity 20 // For brevity
19 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; 21 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle;
20 22
21 static const SkScalar kErrorTol = 0.00001f; 23 static const SkScalar kErrorTol = 0.00001f;
22 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol; 24 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol;
23 25
24 /** 26 /**
25 * We have three general cases for 2pt conical gradients. First we always assume that 27 * We have three general cases for 2pt conical gradients. First we always assume that
26 * the start radius <= end radius. Our first case (kInside_) is when the start c ircle 28 * the start radius <= end radius. Our first case (kInside_) is when the start c ircle
27 * is completely enclosed by the end circle. The second case (kOutside_) is the case 29 * is completely enclosed by the end circle. The second case (kOutside_) is the case
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 } 218 }
217 219
218 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrProcessor&) 220 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrProcessor&)
219 : fVSVaryingName(nullptr) 221 : fVSVaryingName(nullptr)
220 , fFSVaryingName(nullptr) 222 , fFSVaryingName(nullptr)
221 , fCachedRadius(-SK_ScalarMax) 223 , fCachedRadius(-SK_ScalarMax)
222 , fCachedDiffRadius(-SK_ScalarMax) {} 224 , fCachedDiffRadius(-SK_ScalarMax) {}
223 225
224 void GLEdge2PtConicalEffect::emitCode(EmitArgs& args) { 226 void GLEdge2PtConicalEffect::emitCode(EmitArgs& args) {
225 const Edge2PtConicalEffect& ge = args.fFp.cast<Edge2PtConicalEffect>(); 227 const Edge2PtConicalEffect& ge = args.fFp.cast<Edge2PtConicalEffect>();
226 this->emitUniforms(args.fBuilder, ge); 228 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
227 fParamUni = args.fBuilder->addUniformArray(GrGLSLProgramBuilder::kFragment_V isibility, 229 this->emitUniforms(uniformHandler, ge);
228 kFloat_GrSLType, kDefault_GrSLPrecision , 230 fParamUni = uniformHandler->addUniformArray(GrGLSLUniformHandler::kFragment_ Visibility,
229 "Conical2FSParams", 3); 231 kFloat_GrSLType, kDefault_GrSLPr ecision,
232 "Conical2FSParams", 3);
230 233
231 SkString cName("c"); 234 SkString cName("c");
232 SkString tName("t"); 235 SkString tName("t");
233 SkString p0; // start radius 236 SkString p0; // start radius
234 SkString p1; // start radius squared 237 SkString p1; // start radius squared
235 SkString p2; // difference in radii (r1 - r0) 238 SkString p2; // difference in radii (r1 - r0)
236 239
237 args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); 240 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(0, &p0);
238 args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); 241 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(1, &p1);
239 args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(2, &p2); 242 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(2, &p2);
240 243
241 // We interpolate the linear component in coords[1]. 244 // We interpolate the linear component in coords[1].
242 SkASSERT(args.fCoords[0].getType() == args.fCoords[1].getType()); 245 SkASSERT(args.fCoords[0].getType() == args.fCoords[1].getType());
243 const char* coords2D; 246 const char* coords2D;
244 SkString bVar; 247 SkString bVar;
245 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; 248 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
246 if (kVec3f_GrSLType == args.fCoords[0].getType()) { 249 if (kVec3f_GrSLType == args.fCoords[0].getType()) {
247 fragBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x / %s.z);\n", 250 fragBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x / %s.z);\n",
248 args.fCoords[0].c_str(), args.fCoords[0].c_str(), 251 args.fCoords[0].c_str(), args.fCoords[0].c_str(),
249 args.fCoords[1].c_str(), args.fCoords[1].c_str()) ; 252 args.fCoords[1].c_str(), args.fCoords[1].c_str()) ;
(...skipping 13 matching lines...) Expand all
263 cName.c_str(), coords2D, coords2D, p1.c_str()); 266 cName.c_str(), coords2D, coords2D, p1.c_str());
264 267
265 // linear case: t = -c/b 268 // linear case: t = -c/b
266 fragBuilder->codeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(), 269 fragBuilder->codeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(),
267 cName.c_str(), bVar.c_str()); 270 cName.c_str(), bVar.c_str());
268 271
269 // if r(t) > 0, then t will be the x coordinate 272 // if r(t) > 0, then t will be the x coordinate
270 fragBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(), 273 fragBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(),
271 p2.c_str(), p0.c_str()); 274 p2.c_str(), p0.c_str());
272 fragBuilder->codeAppend("\t"); 275 fragBuilder->codeAppend("\t");
273 this->emitColor(args.fBuilder, 276 this->emitColor(fragBuilder,
274 fragBuilder, 277 uniformHandler,
275 args.fGLSLCaps, 278 args.fGLSLCaps,
276 ge, 279 ge,
277 tName.c_str(), 280 tName.c_str(),
278 args.fOutputColor, 281 args.fOutputColor,
279 args.fInputColor, 282 args.fInputColor,
280 args.fSamplers); 283 args.fSamplers);
281 fragBuilder->codeAppend("\t}\n"); 284 fragBuilder->codeAppend("\t}\n");
282 } 285 }
283 286
284 void GLEdge2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman, 287 void GLEdge2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman,
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrProcessor & processor) 501 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrProcessor & processor)
499 : fVSVaryingName(nullptr) 502 : fVSVaryingName(nullptr)
500 , fFSVaryingName(nullptr) 503 , fFSVaryingName(nullptr)
501 , fCachedFocal(SK_ScalarMax) { 504 , fCachedFocal(SK_ScalarMax) {
502 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon icalEffect>(); 505 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon icalEffect>();
503 fIsFlipped = data.isFlipped(); 506 fIsFlipped = data.isFlipped();
504 } 507 }
505 508
506 void GLFocalOutside2PtConicalEffect::emitCode(EmitArgs& args) { 509 void GLFocalOutside2PtConicalEffect::emitCode(EmitArgs& args) {
507 const FocalOutside2PtConicalEffect& ge = args.fFp.cast<FocalOutside2PtConica lEffect>(); 510 const FocalOutside2PtConicalEffect& ge = args.fFp.cast<FocalOutside2PtConica lEffect>();
508 this->emitUniforms(args.fBuilder, ge); 511 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
509 fParamUni = args.fBuilder->addUniformArray(GrGLSLProgramBuilder::kFragment_V isibility, 512 this->emitUniforms(uniformHandler, ge);
510 kFloat_GrSLType, kDefault_GrSLPrecision , 513 fParamUni = uniformHandler->addUniformArray(GrGLSLUniformHandler::kFragment_ Visibility,
511 "Conical2FSParams", 2); 514 kFloat_GrSLType, kDefault_GrSLPr ecision,
515 "Conical2FSParams", 2);
512 SkString tName("t"); 516 SkString tName("t");
513 SkString p0; // focalX 517 SkString p0; // focalX
514 SkString p1; // 1 - focalX * focalX 518 SkString p1; // 1 - focalX * focalX
515 519
516 args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); 520 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(0, &p0);
517 args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); 521 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(1, &p1);
518 522
519 // if we have a vec3 from being in perspective, convert it to a vec2 first 523 // if we have a vec3 from being in perspective, convert it to a vec2 first
520 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; 524 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
521 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); 525 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0);
522 const char* coords2D = coords2DString.c_str(); 526 const char* coords2D = coords2DString.c_str();
523 527
524 // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2) 528 // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2)
525 529
526 // output will default to transparent black (we simply won't write anything 530 // output will default to transparent black (we simply won't write anything
527 // else to it if invalid, instead of discarding or returning prematurely) 531 // else to it if invalid, instead of discarding or returning prematurely)
528 fragBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColo r); 532 fragBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColo r);
529 533
530 fragBuilder->codeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D); 534 fragBuilder->codeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D);
531 fragBuilder->codeAppendf("\tfloat ys = %s.y * %s.y;\n", coords2D, coords2D); 535 fragBuilder->codeAppendf("\tfloat ys = %s.y * %s.y;\n", coords2D, coords2D);
532 fragBuilder->codeAppendf("\tfloat d = xs + %s * ys;\n", p1.c_str()); 536 fragBuilder->codeAppendf("\tfloat d = xs + %s * ys;\n", p1.c_str());
533 537
534 // Must check to see if we flipped the circle order (to make sure start radi us < end radius) 538 // Must check to see if we flipped the circle order (to make sure start radi us < end radius)
535 // If so we must also flip sign on sqrt 539 // If so we must also flip sign on sqrt
536 if (!fIsFlipped) { 540 if (!fIsFlipped) {
537 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + sqrt(d);\n", tName.c _str(), 541 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + sqrt(d);\n", tName.c _str(),
538 coords2D, p0.c_str()); 542 coords2D, p0.c_str());
539 } else { 543 } else {
540 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s - sqrt(d);\n", tName.c _str(), 544 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s - sqrt(d);\n", tName.c _str(),
541 coords2D, p0.c_str()); 545 coords2D, p0.c_str());
542 } 546 }
543 547
544 fragBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str()); 548 fragBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str());
545 fragBuilder->codeAppend("\t\t"); 549 fragBuilder->codeAppend("\t\t");
546 this->emitColor(args.fBuilder, 550 this->emitColor(fragBuilder,
547 fragBuilder, 551 uniformHandler,
548 args.fGLSLCaps, 552 args.fGLSLCaps,
549 ge, 553 ge,
550 tName.c_str(), 554 tName.c_str(),
551 args.fOutputColor, 555 args.fOutputColor,
552 args.fInputColor, 556 args.fInputColor,
553 args.fSamplers); 557 args.fSamplers);
554 fragBuilder->codeAppend("\t}\n"); 558 fragBuilder->codeAppend("\t}\n");
555 } 559 }
556 560
557 void GLFocalOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p dman, 561 void GLFocalOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p dman,
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 return fp; 711 return fp;
708 } 712 }
709 713
710 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrProcessor&) 714 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrProcessor&)
711 : fVSVaryingName(nullptr) 715 : fVSVaryingName(nullptr)
712 , fFSVaryingName(nullptr) 716 , fFSVaryingName(nullptr)
713 , fCachedFocal(SK_ScalarMax) {} 717 , fCachedFocal(SK_ScalarMax) {}
714 718
715 void GLFocalInside2PtConicalEffect::emitCode(EmitArgs& args) { 719 void GLFocalInside2PtConicalEffect::emitCode(EmitArgs& args) {
716 const FocalInside2PtConicalEffect& ge = args.fFp.cast<FocalInside2PtConicalE ffect>(); 720 const FocalInside2PtConicalEffect& ge = args.fFp.cast<FocalInside2PtConicalE ffect>();
717 this->emitUniforms(args.fBuilder, ge); 721 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
718 fFocalUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibi lity, 722 this->emitUniforms(uniformHandler, ge);
719 kFloat_GrSLType, kDefault_GrSLPrecisio n, 723 fFocalUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visib ility,
720 "Conical2FSParams"); 724 kFloat_GrSLType, kDefault_GrSLPrecisi on,
725 "Conical2FSParams");
721 SkString tName("t"); 726 SkString tName("t");
722 727
723 // this is the distance along x-axis from the end center to focal point in 728 // this is the distance along x-axis from the end center to focal point in
724 // transformed coordinates 729 // transformed coordinates
725 GrGLSLShaderVar focal = args.fBuilder->getUniformVariable(fFocalUni); 730 GrGLSLShaderVar focal = uniformHandler->getUniformVariable(fFocalUni);
726 731
727 // if we have a vec3 from being in perspective, convert it to a vec2 first 732 // if we have a vec3 from being in perspective, convert it to a vec2 first
728 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; 733 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
729 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); 734 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0);
730 const char* coords2D = coords2DString.c_str(); 735 const char* coords2D = coords2DString.c_str();
731 736
732 // t = p.x * focalX + length(p) 737 // t = p.x * focalX + length(p)
733 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_ str(), 738 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_ str(),
734 coords2D, focal.c_str(), coords2D); 739 coords2D, focal.c_str(), coords2D);
735 740
736 this->emitColor(args.fBuilder, 741 this->emitColor(fragBuilder,
737 fragBuilder, 742 uniformHandler,
738 args.fGLSLCaps, 743 args.fGLSLCaps,
739 ge, 744 ge,
740 tName.c_str(), 745 tName.c_str(),
741 args.fOutputColor, 746 args.fOutputColor,
742 args.fInputColor, 747 args.fInputColor,
743 args.fSamplers); 748 args.fSamplers);
744 } 749 }
745 750
746 void GLFocalInside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pd man, 751 void GLFocalInside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pd man,
747 const GrProcessor& processor) { 752 const GrProcessor& processor) {
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
958 : fVSVaryingName(nullptr) 963 : fVSVaryingName(nullptr)
959 , fFSVaryingName(nullptr) 964 , fFSVaryingName(nullptr)
960 , fCachedCenterX(SK_ScalarMax) 965 , fCachedCenterX(SK_ScalarMax)
961 , fCachedCenterY(SK_ScalarMax) 966 , fCachedCenterY(SK_ScalarMax)
962 , fCachedA(SK_ScalarMax) 967 , fCachedA(SK_ScalarMax)
963 , fCachedB(SK_ScalarMax) 968 , fCachedB(SK_ScalarMax)
964 , fCachedC(SK_ScalarMax) {} 969 , fCachedC(SK_ScalarMax) {}
965 970
966 void GLCircleInside2PtConicalEffect::emitCode(EmitArgs& args) { 971 void GLCircleInside2PtConicalEffect::emitCode(EmitArgs& args) {
967 const CircleInside2PtConicalEffect& ge = args.fFp.cast<CircleInside2PtConica lEffect>(); 972 const CircleInside2PtConicalEffect& ge = args.fFp.cast<CircleInside2PtConica lEffect>();
968 this->emitUniforms(args.fBuilder, ge); 973 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
969 fCenterUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visib ility, 974 this->emitUniforms(uniformHandler, ge);
970 kVec2f_GrSLType, kDefault_GrSLPrecisi on, 975 fCenterUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visi bility,
971 "Conical2FSCenter"); 976 kVec2f_GrSLType, kDefault_GrSLPrecis ion,
972 fParamUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibi lity, 977 "Conical2FSCenter");
973 kVec3f_GrSLType, kDefault_GrSLPrecisio n, 978 fParamUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visib ility,
974 "Conical2FSParams"); 979 kVec3f_GrSLType, kDefault_GrSLPrecisi on,
980 "Conical2FSParams");
975 SkString tName("t"); 981 SkString tName("t");
976 982
977 GrGLSLShaderVar center = args.fBuilder->getUniformVariable(fCenterUni); 983 GrGLSLShaderVar center = uniformHandler->getUniformVariable(fCenterUni);
978 // params.x = A 984 // params.x = A
979 // params.y = B 985 // params.y = B
980 // params.z = C 986 // params.z = C
981 GrGLSLShaderVar params = args.fBuilder->getUniformVariable(fParamUni); 987 GrGLSLShaderVar params = uniformHandler->getUniformVariable(fParamUni);
982 988
983 // if we have a vec3 from being in perspective, convert it to a vec2 first 989 // if we have a vec3 from being in perspective, convert it to a vec2 first
984 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; 990 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
985 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); 991 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0);
986 const char* coords2D = coords2DString.c_str(); 992 const char* coords2D = coords2DString.c_str();
987 993
988 // p = coords2D 994 // p = coords2D
989 // e = center end 995 // e = center end
990 // r = radius end 996 // r = radius end
991 // A = dot(e, e) - r^2 + 2 * r - 1 997 // A = dot(e, e) - r^2 + 2 * r - 1
992 // B = (r -1) / A 998 // B = (r -1) / A
993 // C = 1 / A 999 // C = 1 / A
994 // d = dot(e, p) + B 1000 // d = dot(e, p) + B
995 // t = d +/- sqrt(d^2 - A * dot(p, p) + C) 1001 // t = d +/- sqrt(d^2 - A * dot(p, p) + C)
996 fragBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords 2D); 1002 fragBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords 2D);
997 fragBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cen ter.c_str(), 1003 fragBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cen ter.c_str(),
998 params.c_str()); 1004 params.c_str());
999 fragBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z) ;\n", 1005 fragBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z) ;\n",
1000 tName.c_str(), params.c_str(), params.c_str()); 1006 tName.c_str(), params.c_str(), params.c_str());
1001 1007
1002 this->emitColor(args.fBuilder, 1008 this->emitColor(fragBuilder,
1003 fragBuilder, 1009 uniformHandler,
1004 args.fGLSLCaps, 1010 args.fGLSLCaps,
1005 ge, 1011 ge,
1006 tName.c_str(), 1012 tName.c_str(),
1007 args.fOutputColor, 1013 args.fOutputColor,
1008 args.fInputColor, 1014 args.fInputColor,
1009 args.fSamplers); 1015 args.fSamplers);
1010 } 1016 }
1011 1017
1012 void GLCircleInside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p dman, 1018 void GLCircleInside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p dman,
1013 const GrProcessor& processor) { 1019 const GrProcessor& processor) {
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
1194 , fCachedA(SK_ScalarMax) 1200 , fCachedA(SK_ScalarMax)
1195 , fCachedB(SK_ScalarMax) 1201 , fCachedB(SK_ScalarMax)
1196 , fCachedC(SK_ScalarMax) 1202 , fCachedC(SK_ScalarMax)
1197 , fCachedTLimit(SK_ScalarMax) { 1203 , fCachedTLimit(SK_ScalarMax) {
1198 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC onicalEffect>(); 1204 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC onicalEffect>();
1199 fIsFlipped = data.isFlipped(); 1205 fIsFlipped = data.isFlipped();
1200 } 1206 }
1201 1207
1202 void GLCircleOutside2PtConicalEffect::emitCode(EmitArgs& args) { 1208 void GLCircleOutside2PtConicalEffect::emitCode(EmitArgs& args) {
1203 const CircleOutside2PtConicalEffect& ge = args.fFp.cast<CircleOutside2PtConi calEffect>(); 1209 const CircleOutside2PtConicalEffect& ge = args.fFp.cast<CircleOutside2PtConi calEffect>();
1204 this->emitUniforms(args.fBuilder, ge); 1210 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
1205 fCenterUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visib ility, 1211 this->emitUniforms(uniformHandler, ge);
1206 kVec2f_GrSLType, kDefault_GrSLPrecisi on, 1212 fCenterUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visi bility,
1207 "Conical2FSCenter"); 1213 kVec2f_GrSLType, kDefault_GrSLPrecis ion,
1208 fParamUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibi lity, 1214 "Conical2FSCenter");
1209 kVec4f_GrSLType, kDefault_GrSLPrecisio n, 1215 fParamUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visib ility,
1210 "Conical2FSParams"); 1216 kVec4f_GrSLType, kDefault_GrSLPrecisi on,
1217 "Conical2FSParams");
1211 SkString tName("t"); 1218 SkString tName("t");
1212 1219
1213 GrGLSLShaderVar center = args.fBuilder->getUniformVariable(fCenterUni); 1220 GrGLSLShaderVar center = uniformHandler->getUniformVariable(fCenterUni);
1214 // params.x = A 1221 // params.x = A
1215 // params.y = B 1222 // params.y = B
1216 // params.z = C 1223 // params.z = C
1217 GrGLSLShaderVar params = args.fBuilder->getUniformVariable(fParamUni); 1224 GrGLSLShaderVar params = uniformHandler->getUniformVariable(fParamUni);
1218 1225
1219 // if we have a vec3 from being in perspective, convert it to a vec2 first 1226 // if we have a vec3 from being in perspective, convert it to a vec2 first
1220 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; 1227 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
1221 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); 1228 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0);
1222 const char* coords2D = coords2DString.c_str(); 1229 const char* coords2D = coords2DString.c_str();
1223 1230
1224 // output will default to transparent black (we simply won't write anything 1231 // output will default to transparent black (we simply won't write anything
1225 // else to it if invalid, instead of discarding or returning prematurely) 1232 // else to it if invalid, instead of discarding or returning prematurely)
1226 fragBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColo r); 1233 fragBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColo r);
1227 1234
(...skipping 13 matching lines...) Expand all
1241 params.c_str()); 1248 params.c_str());
1242 1249
1243 // Must check to see if we flipped the circle order (to make sure start radi us < end radius) 1250 // Must check to see if we flipped the circle order (to make sure start radi us < end radius)
1244 // If so we must also flip sign on sqrt 1251 // If so we must also flip sign on sqrt
1245 if (!fIsFlipped) { 1252 if (!fIsFlipped) {
1246 fragBuilder->codeAppendf("\tfloat %s = d + sqrt(deter);\n", tName.c_str( )); 1253 fragBuilder->codeAppendf("\tfloat %s = d + sqrt(deter);\n", tName.c_str( ));
1247 } else { 1254 } else {
1248 fragBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str( )); 1255 fragBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str( ));
1249 } 1256 }
1250 1257
1251 fragBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_st r(), params.c_str()); 1258 fragBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n",
1259 tName.c_str(), params.c_str());
1252 fragBuilder->codeAppend("\t\t"); 1260 fragBuilder->codeAppend("\t\t");
1253 this->emitColor(args.fBuilder, 1261 this->emitColor(fragBuilder,
1254 fragBuilder, 1262 uniformHandler,
1255 args.fGLSLCaps, 1263 args.fGLSLCaps,
1256 ge, 1264 ge,
1257 tName.c_str(), 1265 tName.c_str(),
1258 args.fOutputColor, 1266 args.fOutputColor,
1259 args.fInputColor, 1267 args.fInputColor,
1260 args.fSamplers); 1268 args.fSamplers);
1261 fragBuilder->codeAppend("\t}\n"); 1269 fragBuilder->codeAppend("\t}\n");
1262 } 1270 }
1263 1271
1264 void GLCircleOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman, 1272 void GLCircleOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman,
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1334 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o); 1342 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o);
1335 } else if (type == kEdge_ConicalType) { 1343 } else if (type == kEdge_ConicalType) {
1336 set_matrix_edge_conical(shader, &matrix); 1344 set_matrix_edge_conical(shader, &matrix);
1337 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); 1345 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm);
1338 } else { 1346 } else {
1339 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo); 1347 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo);
1340 } 1348 }
1341 } 1349 }
1342 1350
1343 #endif 1351 #endif
OLDNEW
« no previous file with comments | « src/effects/gradients/SkSweepGradient.cpp ('k') | src/gpu/GrDefaultGeoProcFactory.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698