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

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

Issue 1745613002: Switch float arrays to vecs for conical gradients (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 9 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
« no previous file with comments | « no previous file | no next file » | 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
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrProcessor&) 220 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrProcessor&)
221 : fVSVaryingName(nullptr) 221 : fVSVaryingName(nullptr)
222 , fFSVaryingName(nullptr) 222 , fFSVaryingName(nullptr)
223 , fCachedRadius(-SK_ScalarMax) 223 , fCachedRadius(-SK_ScalarMax)
224 , fCachedDiffRadius(-SK_ScalarMax) {} 224 , fCachedDiffRadius(-SK_ScalarMax) {}
225 225
226 void GLEdge2PtConicalEffect::emitCode(EmitArgs& args) { 226 void GLEdge2PtConicalEffect::emitCode(EmitArgs& args) {
227 const Edge2PtConicalEffect& ge = args.fFp.cast<Edge2PtConicalEffect>(); 227 const Edge2PtConicalEffect& ge = args.fFp.cast<Edge2PtConicalEffect>();
228 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; 228 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
229 this->emitUniforms(uniformHandler, ge); 229 this->emitUniforms(uniformHandler, ge);
230 fParamUni = uniformHandler->addUniformArray(kFragment_GrShaderFlag, 230 fParamUni = uniformHandler->addUniform(kFragment_GrShaderFlag,
231 kFloat_GrSLType, kDefault_GrSLPr ecision, 231 kVec3f_GrSLType, kDefault_GrSLPrecisi on,
232 "Conical2FSParams", 3); 232 "Conical2FSParams");
233 233
234 SkString cName("c"); 234 SkString cName("c");
235 SkString tName("t"); 235 SkString tName("t");
236 SkString p0; // start radius 236 SkString p0; // start radius
237 SkString p1; // start radius squared 237 SkString p1; // start radius squared
238 SkString p2; // difference in radii (r1 - r0) 238 SkString p2; // difference in radii (r1 - r0)
239 239
240 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); 240
241 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); 241 p0.appendf("%s.x", uniformHandler->getUniformVariable(fParamUni).getName().c _str());
242 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(2, &p2); 242 p1.appendf("%s.y", uniformHandler->getUniformVariable(fParamUni).getName().c _str());
243 p2.appendf("%s.z", uniformHandler->getUniformVariable(fParamUni).getName().c _str());
243 244
244 // We interpolate the linear component in coords[1]. 245 // We interpolate the linear component in coords[1].
245 SkASSERT(args.fCoords[0].getType() == args.fCoords[1].getType()); 246 SkASSERT(args.fCoords[0].getType() == args.fCoords[1].getType());
246 const char* coords2D; 247 const char* coords2D;
247 SkString bVar; 248 SkString bVar;
248 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; 249 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
249 if (kVec3f_GrSLType == args.fCoords[0].getType()) { 250 if (kVec3f_GrSLType == args.fCoords[0].getType()) {
250 fragBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x / %s.z);\n", 251 fragBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x / %s.z);\n",
251 args.fCoords[0].c_str(), args.fCoords[0].c_str(), 252 args.fCoords[0].c_str(), args.fCoords[0].c_str(),
252 args.fCoords[1].c_str(), args.fCoords[1].c_str()) ; 253 args.fCoords[1].c_str(), args.fCoords[1].c_str()) ;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 void GLEdge2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman, 288 void GLEdge2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman,
288 const GrProcessor& processor) { 289 const GrProcessor& processor) {
289 INHERITED::onSetData(pdman, processor); 290 INHERITED::onSetData(pdman, processor);
290 const Edge2PtConicalEffect& data = processor.cast<Edge2PtConicalEffect>(); 291 const Edge2PtConicalEffect& data = processor.cast<Edge2PtConicalEffect>();
291 SkScalar radius0 = data.radius(); 292 SkScalar radius0 = data.radius();
292 SkScalar diffRadius = data.diffRadius(); 293 SkScalar diffRadius = data.diffRadius();
293 294
294 if (fCachedRadius != radius0 || 295 if (fCachedRadius != radius0 ||
295 fCachedDiffRadius != diffRadius) { 296 fCachedDiffRadius != diffRadius) {
296 297
297 float values[3] = { 298 pdman.set3f(fParamUni, SkScalarToFloat(radius0),
298 SkScalarToFloat(radius0), 299 SkScalarToFloat(SkScalarMul(radius0, radius0)), SkScalarToFl oat(diffRadius));
299 SkScalarToFloat(SkScalarMul(radius0, radius0)),
300 SkScalarToFloat(diffRadius)
301 };
302
303 pdman.set1fv(fParamUni, 3, values);
304 fCachedRadius = radius0; 300 fCachedRadius = radius0;
305 fCachedDiffRadius = diffRadius; 301 fCachedDiffRadius = diffRadius;
306 } 302 }
307 } 303 }
308 304
309 void GLEdge2PtConicalEffect::GenKey(const GrProcessor& processor, 305 void GLEdge2PtConicalEffect::GenKey(const GrProcessor& processor,
310 const GrGLSLCaps&, GrProcessorKeyBuilder* b) { 306 const GrGLSLCaps&, GrProcessorKeyBuilder* b) {
311 b->add32(GenBaseGradientKey(processor)); 307 b->add32(GenBaseGradientKey(processor));
312 } 308 }
313 309
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 , fFSVaryingName(nullptr) 499 , fFSVaryingName(nullptr)
504 , fCachedFocal(SK_ScalarMax) { 500 , fCachedFocal(SK_ScalarMax) {
505 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon icalEffect>(); 501 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon icalEffect>();
506 fIsFlipped = data.isFlipped(); 502 fIsFlipped = data.isFlipped();
507 } 503 }
508 504
509 void GLFocalOutside2PtConicalEffect::emitCode(EmitArgs& args) { 505 void GLFocalOutside2PtConicalEffect::emitCode(EmitArgs& args) {
510 const FocalOutside2PtConicalEffect& ge = args.fFp.cast<FocalOutside2PtConica lEffect>(); 506 const FocalOutside2PtConicalEffect& ge = args.fFp.cast<FocalOutside2PtConica lEffect>();
511 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; 507 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
512 this->emitUniforms(uniformHandler, ge); 508 this->emitUniforms(uniformHandler, ge);
513 fParamUni = uniformHandler->addUniformArray(kFragment_GrShaderFlag, 509 fParamUni = uniformHandler->addUniform(kFragment_GrShaderFlag,
514 kFloat_GrSLType, kDefault_GrSLPr ecision, 510 kVec2f_GrSLType, kDefault_GrSLPrecisi on,
515 "Conical2FSParams", 2); 511 "Conical2FSParams");
516 SkString tName("t"); 512 SkString tName("t");
517 SkString p0; // focalX 513 SkString p0; // focalX
518 SkString p1; // 1 - focalX * focalX 514 SkString p1; // 1 - focalX * focalX
519 515
520 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); 516 p0.appendf("%s.x", uniformHandler->getUniformVariable(fParamUni).getName().c _str());
521 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); 517 p1.appendf("%s.y", uniformHandler->getUniformVariable(fParamUni).getName().c _str());
522 518
523 // if we have a vec3 from being in perspective, convert it to a vec2 first 519 // if we have a vec3 from being in perspective, convert it to a vec2 first
524 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; 520 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
525 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); 521 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0);
526 const char* coords2D = coords2DString.c_str(); 522 const char* coords2D = coords2DString.c_str();
527 523
528 // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2) 524 // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2)
529 525
530 // output will default to transparent black (we simply won't write anything 526 // output will default to transparent black (we simply won't write anything
531 // else to it if invalid, instead of discarding or returning prematurely) 527 // else to it if invalid, instead of discarding or returning prematurely)
(...skipping 29 matching lines...) Expand all
561 void GLFocalOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p dman, 557 void GLFocalOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p dman,
562 const GrProcessor& processor) { 558 const GrProcessor& processor) {
563 INHERITED::onSetData(pdman, processor); 559 INHERITED::onSetData(pdman, processor);
564 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon icalEffect>(); 560 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon icalEffect>();
565 SkASSERT(data.isFlipped() == fIsFlipped); 561 SkASSERT(data.isFlipped() == fIsFlipped);
566 SkScalar focal = data.focal(); 562 SkScalar focal = data.focal();
567 563
568 if (fCachedFocal != focal) { 564 if (fCachedFocal != focal) {
569 SkScalar oneMinus2F = 1.f - SkScalarMul(focal, focal); 565 SkScalar oneMinus2F = 1.f - SkScalarMul(focal, focal);
570 566
571 float values[2] = { 567 pdman.set2f(fParamUni, SkScalarToFloat(focal), SkScalarToFloat(oneMinus2 F));
572 SkScalarToFloat(focal),
573 SkScalarToFloat(oneMinus2F),
574 };
575
576 pdman.set1fv(fParamUni, 2, values);
577 fCachedFocal = focal; 568 fCachedFocal = focal;
578 } 569 }
579 } 570 }
580 571
581 void GLFocalOutside2PtConicalEffect::GenKey(const GrProcessor& processor, 572 void GLFocalOutside2PtConicalEffect::GenKey(const GrProcessor& processor,
582 const GrGLSLCaps&, GrProcessorKeyBui lder* b) { 573 const GrGLSLCaps&, GrProcessorKeyBui lder* b) {
583 uint32_t* key = b->add32n(2); 574 uint32_t* key = b->add32n(2);
584 key[0] = GenBaseGradientKey(processor); 575 key[0] = GenBaseGradientKey(processor);
585 key[1] = processor.cast<FocalOutside2PtConicalEffect>().isFlipped(); 576 key[1] = processor.cast<FocalOutside2PtConicalEffect>().isFlipped();
586 } 577 }
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after
1342 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o); 1333 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o);
1343 } else if (type == kEdge_ConicalType) { 1334 } else if (type == kEdge_ConicalType) {
1344 set_matrix_edge_conical(shader, &matrix); 1335 set_matrix_edge_conical(shader, &matrix);
1345 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); 1336 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm);
1346 } else { 1337 } else {
1347 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo); 1338 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo);
1348 } 1339 }
1349 } 1340 }
1350 1341
1351 #endif 1342 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698