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

Side by Side Diff: src/gpu/effects/GrBezierEffect.cpp

Issue 2339203002: Stop flattening GrCoordTransforms in parent GrFragmentProcessors. (Closed)
Patch Set: Fix issue of taking ref to a temporary Created 4 years, 3 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 | « src/gpu/batches/GrPLSPathRenderer.cpp ('k') | src/gpu/effects/GrBitmapTextGeoProc.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 * 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 "GrBezierEffect.h" 8 #include "GrBezierEffect.h"
9 9
10 #include "glsl/GrGLSLFragmentShaderBuilder.h" 10 #include "glsl/GrGLSLFragmentShaderBuilder.h"
11 #include "glsl/GrGLSLGeometryProcessor.h" 11 #include "glsl/GrGLSLGeometryProcessor.h"
12 #include "glsl/GrGLSLProgramDataManager.h" 12 #include "glsl/GrGLSLProgramDataManager.h"
13 #include "glsl/GrGLSLUniformHandler.h" 13 #include "glsl/GrGLSLUniformHandler.h"
14 #include "glsl/GrGLSLUtil.h" 14 #include "glsl/GrGLSLUtil.h"
15 #include "glsl/GrGLSLVarying.h" 15 #include "glsl/GrGLSLVarying.h"
16 #include "glsl/GrGLSLVertexShaderBuilder.h" 16 #include "glsl/GrGLSLVertexShaderBuilder.h"
17 17
18 class GrGLConicEffect : public GrGLSLGeometryProcessor { 18 class GrGLConicEffect : public GrGLSLGeometryProcessor {
19 public: 19 public:
20 GrGLConicEffect(const GrGeometryProcessor&); 20 GrGLConicEffect(const GrGeometryProcessor&);
21 21
22 void onEmitCode(EmitArgs&, GrGPArgs*) override; 22 void onEmitCode(EmitArgs&, GrGPArgs*) override;
23 23
24 static inline void GenKey(const GrGeometryProcessor&, 24 static inline void GenKey(const GrGeometryProcessor&,
25 const GrGLSLCaps&, 25 const GrGLSLCaps&,
26 GrProcessorKeyBuilder*); 26 GrProcessorKeyBuilder*);
27 27
28 void setData(const GrGLSLProgramDataManager& pdman, 28 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess or& primProc,
29 const GrPrimitiveProcessor& primProc) override { 29 FPCoordTransformIter&& transformIter) override {
30 const GrConicEffect& ce = primProc.cast<GrConicEffect>(); 30 const GrConicEffect& ce = primProc.cast<GrConicEffect>();
31 31
32 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMa trix())) { 32 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMa trix())) {
33 fViewMatrix = ce.viewMatrix(); 33 fViewMatrix = ce.viewMatrix();
34 float viewMatrix[3 * 3]; 34 float viewMatrix[3 * 3];
35 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); 35 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
36 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 36 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
37 } 37 }
38 38
39 if (ce.color() != fColor) { 39 if (ce.color() != fColor) {
40 float c[4]; 40 float c[4];
41 GrColorToRGBAFloat(ce.color(), c); 41 GrColorToRGBAFloat(ce.color(), c);
42 pdman.set4fv(fColorUniform, 1, c); 42 pdman.set4fv(fColorUniform, 1, c);
43 fColor = ce.color(); 43 fColor = ce.color();
44 } 44 }
45 45
46 if (ce.coverageScale() != 0xff && ce.coverageScale() != fCoverageScale) { 46 if (ce.coverageScale() != 0xff && ce.coverageScale() != fCoverageScale) {
47 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(ce.coverag eScale())); 47 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(ce.coverag eScale()));
48 fCoverageScale = ce.coverageScale(); 48 fCoverageScale = ce.coverageScale();
49 } 49 }
50 } 50 this->setTransformDataHelper(ce.localMatrix(), pdman, &transformIter);
51
52 void setTransformData(const GrPrimitiveProcessor& primProc,
53 const GrGLSLProgramDataManager& pdman,
54 int index,
55 const SkTArray<const GrCoordTransform*, true>& transfo rms) override {
56 this->setTransformDataHelper(primProc.cast<GrConicEffect>().localMatrix( ), pdman, index,
57 transforms);
58 } 51 }
59 52
60 private: 53 private:
61 SkMatrix fViewMatrix; 54 SkMatrix fViewMatrix;
62 GrColor fColor; 55 GrColor fColor;
63 uint8_t fCoverageScale; 56 uint8_t fCoverageScale;
64 GrPrimitiveEdgeType fEdgeType; 57 GrPrimitiveEdgeType fEdgeType;
65 UniformHandle fColorUniform; 58 UniformHandle fColorUniform;
66 UniformHandle fCoverageScaleUniform; 59 UniformHandle fCoverageScaleUniform;
67 UniformHandle fViewMatrixUniform; 60 UniformHandle fViewMatrixUniform;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 gp.viewMatrix(), 95 gp.viewMatrix(),
103 &fViewMatrixUniform); 96 &fViewMatrixUniform);
104 97
105 // emit transforms with position 98 // emit transforms with position
106 this->emitTransforms(vertBuilder, 99 this->emitTransforms(vertBuilder,
107 varyingHandler, 100 varyingHandler,
108 uniformHandler, 101 uniformHandler,
109 gpArgs->fPositionVar, 102 gpArgs->fPositionVar,
110 gp.inPosition()->fName, 103 gp.inPosition()->fName,
111 gp.localMatrix(), 104 gp.localMatrix(),
112 args.fTransformsIn, 105 args.fFPCoordTransformHandler);
113 args.fTransformsOut);
114 106
115 // TODO: this precision check should actually be a check on the number of bi ts 107 // TODO: this precision check should actually be a check on the number of bi ts
116 // high and medium provide and the selection of the lowest level that suffic es. 108 // high and medium provide and the selection of the lowest level that suffic es.
117 // Additionally we should assert that the upstream code only lets us get her e if 109 // Additionally we should assert that the upstream code only lets us get her e if
118 // either high or medium provides the required number of bits. 110 // either high or medium provides the required number of bits.
119 GrSLPrecision precision = kHigh_GrSLPrecision; 111 GrSLPrecision precision = kHigh_GrSLPrecision;
120 const GrShaderCaps::PrecisionInfo& highP = args.fGLSLCaps->getFloatShaderPre cisionInfo( 112 const GrShaderCaps::PrecisionInfo& highP = args.fGLSLCaps->getFloatShaderPre cisionInfo(
121 kFragment_GrShaderT ype, 113 kFragment_GrShaderT ype,
122 kHigh_GrSLPrecision ); 114 kHigh_GrSLPrecision );
123 if (!highP.supported()) { 115 if (!highP.supported()) {
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 class GrGLQuadEffect : public GrGLSLGeometryProcessor { 284 class GrGLQuadEffect : public GrGLSLGeometryProcessor {
293 public: 285 public:
294 GrGLQuadEffect(const GrGeometryProcessor&); 286 GrGLQuadEffect(const GrGeometryProcessor&);
295 287
296 void onEmitCode(EmitArgs&, GrGPArgs*) override; 288 void onEmitCode(EmitArgs&, GrGPArgs*) override;
297 289
298 static inline void GenKey(const GrGeometryProcessor&, 290 static inline void GenKey(const GrGeometryProcessor&,
299 const GrGLSLCaps&, 291 const GrGLSLCaps&,
300 GrProcessorKeyBuilder*); 292 GrProcessorKeyBuilder*);
301 293
302 void setData(const GrGLSLProgramDataManager& pdman, 294 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess or& primProc,
303 const GrPrimitiveProcessor& primProc) override { 295 FPCoordTransformIter&& transformIter) override {
304 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>(); 296 const GrQuadEffect& qe = primProc.cast<GrQuadEffect>();
305 297
306 if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMa trix())) { 298 if (!qe.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(qe.viewMa trix())) {
307 fViewMatrix = qe.viewMatrix(); 299 fViewMatrix = qe.viewMatrix();
308 float viewMatrix[3 * 3]; 300 float viewMatrix[3 * 3];
309 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); 301 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
310 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 302 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
311 } 303 }
312 304
313 if (qe.color() != fColor) { 305 if (qe.color() != fColor) {
314 float c[4]; 306 float c[4];
315 GrColorToRGBAFloat(qe.color(), c); 307 GrColorToRGBAFloat(qe.color(), c);
316 pdman.set4fv(fColorUniform, 1, c); 308 pdman.set4fv(fColorUniform, 1, c);
317 fColor = qe.color(); 309 fColor = qe.color();
318 } 310 }
319 311
320 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) { 312 if (qe.coverageScale() != 0xff && qe.coverageScale() != fCoverageScale) {
321 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverag eScale())); 313 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(qe.coverag eScale()));
322 fCoverageScale = qe.coverageScale(); 314 fCoverageScale = qe.coverageScale();
323 } 315 }
324 } 316 this->setTransformDataHelper(qe.localMatrix(), pdman, &transformIter);
325
326 void setTransformData(const GrPrimitiveProcessor& primProc,
327 const GrGLSLProgramDataManager& pdman,
328 int index,
329 const SkTArray<const GrCoordTransform*, true>& transfo rms) override {
330 this->setTransformDataHelper(primProc.cast<GrQuadEffect>().localMatrix() , pdman, index,
331 transforms);
332 } 317 }
333 318
334 private: 319 private:
335 SkMatrix fViewMatrix; 320 SkMatrix fViewMatrix;
336 GrColor fColor; 321 GrColor fColor;
337 uint8_t fCoverageScale; 322 uint8_t fCoverageScale;
338 GrPrimitiveEdgeType fEdgeType; 323 GrPrimitiveEdgeType fEdgeType;
339 UniformHandle fColorUniform; 324 UniformHandle fColorUniform;
340 UniformHandle fCoverageScaleUniform; 325 UniformHandle fCoverageScaleUniform;
341 UniformHandle fViewMatrixUniform; 326 UniformHandle fViewMatrixUniform;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 gp.viewMatrix(), 361 gp.viewMatrix(),
377 &fViewMatrixUniform); 362 &fViewMatrixUniform);
378 363
379 // emit transforms with position 364 // emit transforms with position
380 this->emitTransforms(vertBuilder, 365 this->emitTransforms(vertBuilder,
381 varyingHandler, 366 varyingHandler,
382 uniformHandler, 367 uniformHandler,
383 gpArgs->fPositionVar, 368 gpArgs->fPositionVar,
384 gp.inPosition()->fName, 369 gp.inPosition()->fName,
385 gp.localMatrix(), 370 gp.localMatrix(),
386 args.fTransformsIn, 371 args.fFPCoordTransformHandler);
387 args.fTransformsOut);
388 372
389 fragBuilder->codeAppendf("float edgeAlpha;"); 373 fragBuilder->codeAppendf("float edgeAlpha;");
390 374
391 switch (fEdgeType) { 375 switch (fEdgeType) {
392 case kHairlineAA_GrProcessorEdgeType: { 376 case kHairlineAA_GrProcessorEdgeType: {
393 SkAssertResult(fragBuilder->enableFeature( 377 SkAssertResult(fragBuilder->enableFeature(
394 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e)); 378 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e));
395 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); 379 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn());
396 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); 380 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn());
397 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvd x.y," 381 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvd x.y,"
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 class GrGLCubicEffect : public GrGLSLGeometryProcessor { 493 class GrGLCubicEffect : public GrGLSLGeometryProcessor {
510 public: 494 public:
511 GrGLCubicEffect(const GrGeometryProcessor&); 495 GrGLCubicEffect(const GrGeometryProcessor&);
512 496
513 void onEmitCode(EmitArgs&, GrGPArgs*) override; 497 void onEmitCode(EmitArgs&, GrGPArgs*) override;
514 498
515 static inline void GenKey(const GrGeometryProcessor&, 499 static inline void GenKey(const GrGeometryProcessor&,
516 const GrGLSLCaps&, 500 const GrGLSLCaps&,
517 GrProcessorKeyBuilder*); 501 GrProcessorKeyBuilder*);
518 502
519 void setData(const GrGLSLProgramDataManager& pdman, 503 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess or& primProc,
520 const GrPrimitiveProcessor& primProc) override { 504 FPCoordTransformIter&& transformIter) override {
521 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>(); 505 const GrCubicEffect& ce = primProc.cast<GrCubicEffect>();
522 506
523 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMa trix())) { 507 if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMa trix())) {
524 fViewMatrix = ce.viewMatrix(); 508 fViewMatrix = ce.viewMatrix();
525 float viewMatrix[3 * 3]; 509 float viewMatrix[3 * 3];
526 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); 510 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
527 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 511 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
528 } 512 }
529 513
530 if (ce.color() != fColor) { 514 if (ce.color() != fColor) {
531 float c[4]; 515 float c[4];
532 GrColorToRGBAFloat(ce.color(), c); 516 GrColorToRGBAFloat(ce.color(), c);
533 pdman.set4fv(fColorUniform, 1, c); 517 pdman.set4fv(fColorUniform, 1, c);
534 fColor = ce.color(); 518 fColor = ce.color();
535 } 519 }
520 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter);
536 } 521 }
537 522
538 private: 523 private:
539 SkMatrix fViewMatrix; 524 SkMatrix fViewMatrix;
540 GrColor fColor; 525 GrColor fColor;
541 GrPrimitiveEdgeType fEdgeType; 526 GrPrimitiveEdgeType fEdgeType;
542 UniformHandle fColorUniform; 527 UniformHandle fColorUniform;
543 UniformHandle fViewMatrixUniform; 528 UniformHandle fViewMatrixUniform;
544 529
545 typedef GrGLSLGeometryProcessor INHERITED; 530 typedef GrGLSLGeometryProcessor INHERITED;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 gp.inPosition()->fName, 562 gp.inPosition()->fName,
578 gp.viewMatrix(), 563 gp.viewMatrix(),
579 &fViewMatrixUniform); 564 &fViewMatrixUniform);
580 565
581 // emit transforms with position 566 // emit transforms with position
582 this->emitTransforms(vertBuilder, 567 this->emitTransforms(vertBuilder,
583 varyingHandler, 568 varyingHandler,
584 uniformHandler, 569 uniformHandler,
585 gpArgs->fPositionVar, 570 gpArgs->fPositionVar,
586 gp.inPosition()->fName, 571 gp.inPosition()->fName,
587 args.fTransformsIn, 572 args.fFPCoordTransformHandler);
588 args.fTransformsOut);
589 573
590 574
591 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi on); 575 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi on);
592 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); 576 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
593 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); 577 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision);
594 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); 578 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
595 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision); 579 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
596 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision); 580 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
597 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision); 581 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
598 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision); 582 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 sk_sp<GrGeometryProcessor> gp; 703 sk_sp<GrGeometryProcessor> gp;
720 do { 704 do {
721 GrPrimitiveEdgeType edgeType = 705 GrPrimitiveEdgeType edgeType =
722 static_cast<GrPrimitiveEdgeType>( 706 static_cast<GrPrimitiveEdgeType>(
723 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); 707 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt));
724 gp = GrCubicEffect::Make(GrRandomColor(d->fRandom), 708 gp = GrCubicEffect::Make(GrRandomColor(d->fRandom),
725 GrTest::TestMatrix(d->fRandom), edgeType, *d->f Caps); 709 GrTest::TestMatrix(d->fRandom), edgeType, *d->f Caps);
726 } while (nullptr == gp); 710 } while (nullptr == gp);
727 return gp; 711 return gp;
728 } 712 }
OLDNEW
« no previous file with comments | « src/gpu/batches/GrPLSPathRenderer.cpp ('k') | src/gpu/effects/GrBitmapTextGeoProc.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698