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

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

Issue 1151693005: Remove uniform view matrix from GrGLPrimitiveProcessor base class (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: more Created 5 years, 7 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/effects/GrBezierEffect.cpp ('k') | src/gpu/gl/GrGLGeometryProcessor.h » ('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 "GrDistanceFieldGeoProc.h" 8 #include "GrDistanceFieldGeoProc.h"
9 #include "GrFontAtlasSizes.h" 9 #include "GrFontAtlasSizes.h"
10 #include "GrInvariantOutput.h" 10 #include "GrInvariantOutput.h"
11 #include "GrTexture.h" 11 #include "GrTexture.h"
12 12
13 #include "SkDistanceFieldGen.h" 13 #include "SkDistanceFieldGen.h"
14 14
15 #include "gl/GrGLProcessor.h" 15 #include "gl/GrGLProcessor.h"
16 #include "gl/GrGLSL.h" 16 #include "gl/GrGLSL.h"
17 #include "gl/GrGLTexture.h" 17 #include "gl/GrGLTexture.h"
18 #include "gl/GrGLGeometryProcessor.h" 18 #include "gl/GrGLGeometryProcessor.h"
19 #include "gl/builders/GrGLProgramBuilder.h" 19 #include "gl/builders/GrGLProgramBuilder.h"
20 20
21 // Assuming a radius of a little less than the diagonal of the fragment 21 // Assuming a radius of a little less than the diagonal of the fragment
22 #define SK_DistanceFieldAAFactor "0.65" 22 #define SK_DistanceFieldAAFactor "0.65"
23 23
24 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { 24 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor {
25 public: 25 public:
26 GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&, 26 GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&,
27 const GrBatchTracker&) 27 const GrBatchTracker&)
28 : fColor(GrColor_ILLEGAL) 28 : fViewMatrix(SkMatrix::InvalidMatrix())
29 , fColor(GrColor_ILLEGAL)
29 #ifdef SK_GAMMA_APPLY_TO_A8 30 #ifdef SK_GAMMA_APPLY_TO_A8
30 , fDistanceAdjust(-1.0f) 31 , fDistanceAdjust(-1.0f)
31 #endif 32 #endif
32 {} 33 {}
33 34
34 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 35 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
35 const GrDistanceFieldA8TextGeoProc& dfTexEffect = 36 const GrDistanceFieldA8TextGeoProc& dfTexEffect =
36 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); 37 args.fGP.cast<GrDistanceFieldA8TextGeoProc>();
37 GrGLGPBuilder* pb = args.fPB; 38 GrGLGPBuilder* pb = args.fPB;
38 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 39 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
(...skipping 17 matching lines...) Expand all
56 // Setup pass through color 57 // Setup pass through color
57 if (!dfTexEffect.colorIgnored()) { 58 if (!dfTexEffect.colorIgnored()) {
58 if (dfTexEffect.hasVertexColor()) { 59 if (dfTexEffect.hasVertexColor()) {
59 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor); 60 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor);
60 } else { 61 } else {
61 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 62 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
62 } 63 }
63 } 64 }
64 65
65 // Setup position 66 // Setup position
66 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix()); 67 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(),
68 &fViewMatrixUniform);
67 69
68 // emit transforms 70 // emit transforms
69 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, 71 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName,
70 args.fTransformsIn, args.fTransformsOut); 72 args.fTransformsIn, args.fTransformsOut);
71 73
72 // add varyings 74 // add varyings
73 GrGLVertToFrag recipScale(kFloat_GrSLType); 75 GrGLVertToFrag recipScale(kFloat_GrSLType);
74 GrGLVertToFrag st(kVec2f_GrSLType); 76 GrGLVertToFrag st(kVec2f_GrSLType);
75 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag); 77 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan ceFieldEffectFlag);
76 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); 78 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 const GrPrimitiveProcessor& proc, 143 const GrPrimitiveProcessor& proc,
142 const GrBatchTracker& bt) override { 144 const GrBatchTracker& bt) override {
143 #ifdef SK_GAMMA_APPLY_TO_A8 145 #ifdef SK_GAMMA_APPLY_TO_A8
144 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi eldA8TextGeoProc>(); 146 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi eldA8TextGeoProc>();
145 float distanceAdjust = dfTexEffect.getDistanceAdjust(); 147 float distanceAdjust = dfTexEffect.getDistanceAdjust();
146 if (distanceAdjust != fDistanceAdjust) { 148 if (distanceAdjust != fDistanceAdjust) {
147 pdman.set1f(fDistanceAdjustUni, distanceAdjust); 149 pdman.set1f(fDistanceAdjustUni, distanceAdjust);
148 fDistanceAdjust = distanceAdjust; 150 fDistanceAdjust = distanceAdjust;
149 } 151 }
150 #endif 152 #endif
153 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8 TextGeoProc>();
151 154
152 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8 TextGeoProc>(); 155 if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8g p.viewMatrix())) {
153 this->setUniformViewMatrix(pdman, dfa8gp.viewMatrix()); 156 fViewMatrix = dfa8gp.viewMatrix();
157 GrGLfloat viewMatrix[3 * 3];
158 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
159 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
160 }
154 161
155 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { 162 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) {
156 GrGLfloat c[4]; 163 GrGLfloat c[4];
157 GrColorToRGBAFloat(dfa8gp.color(), c); 164 GrColorToRGBAFloat(dfa8gp.color(), c);
158 pdman.set4fv(fColorUniform, 1, c); 165 pdman.set4fv(fColorUniform, 1, c);
159 fColor = dfa8gp.color(); 166 fColor = dfa8gp.color();
160 } 167 }
161 } 168 }
162 169
163 static inline void GenKey(const GrGeometryProcessor& gp, 170 static inline void GenKey(const GrGeometryProcessor& gp,
164 const GrBatchTracker& bt, 171 const GrBatchTracker& bt,
165 const GrGLSLCaps&, 172 const GrGLSLCaps&,
166 GrProcessorKeyBuilder* b) { 173 GrProcessorKeyBuilder* b) {
167 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel dA8TextGeoProc>(); 174 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel dA8TextGeoProc>();
168 uint32_t key = dfTexEffect.getFlags(); 175 uint32_t key = dfTexEffect.getFlags();
169 key |= dfTexEffect.hasVertexColor() << 16; 176 key |= dfTexEffect.hasVertexColor() << 16;
170 key |= dfTexEffect.colorIgnored() << 17; 177 key |= dfTexEffect.colorIgnored() << 17;
171 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; 178 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
172 b->add32(key); 179 b->add32(key);
173 } 180 }
174 181
175 private: 182 private:
183 SkMatrix fViewMatrix;
176 GrColor fColor; 184 GrColor fColor;
177 UniformHandle fColorUniform; 185 UniformHandle fColorUniform;
186 UniformHandle fViewMatrixUniform;
178 #ifdef SK_GAMMA_APPLY_TO_A8 187 #ifdef SK_GAMMA_APPLY_TO_A8
179 float fDistanceAdjust; 188 float fDistanceAdjust;
180 UniformHandle fDistanceAdjustUni; 189 UniformHandle fDistanceAdjustUni;
181 #endif 190 #endif
182 191
183 typedef GrGLGeometryProcessor INHERITED; 192 typedef GrGLGeometryProcessor INHERITED;
184 }; 193 };
185 194
186 /////////////////////////////////////////////////////////////////////////////// 195 ///////////////////////////////////////////////////////////////////////////////
187 196
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 kSimilarity_DistanceFieldEff ectFlag : 0, 268 kSimilarity_DistanceFieldEff ectFlag : 0,
260 random->nextBool()); 269 random->nextBool());
261 } 270 }
262 271
263 /////////////////////////////////////////////////////////////////////////////// 272 ///////////////////////////////////////////////////////////////////////////////
264 273
265 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { 274 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor {
266 public: 275 public:
267 GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&, 276 GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&,
268 const GrBatchTracker&) 277 const GrBatchTracker&)
269 : fColor(GrColor_ILLEGAL), fTextureSize(SkISize::Make(-1, -1)) {} 278 : fViewMatrix(SkMatrix::InvalidMatrix())
279 , fColor(GrColor_ILLEGAL)
280 , fTextureSize(SkISize::Make(-1, -1)) {}
270 281
271 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 282 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
272 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance FieldPathGeoProc>(); 283 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance FieldPathGeoProc>();
273 284
274 GrGLGPBuilder* pb = args.fPB; 285 GrGLGPBuilder* pb = args.fPB;
275 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 286 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
276 SkAssertResult(fsBuilder->enableFeature( 287 SkAssertResult(fsBuilder->enableFeature(
277 GrGLFragmentShaderBuilder::kStandardDerivat ives_GLSLFeature)); 288 GrGLFragmentShaderBuilder::kStandardDerivat ives_GLSLFeature));
278 289
279 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 290 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
280 291
281 // emit attributes 292 // emit attributes
282 vsBuilder->emitAttributes(dfTexEffect); 293 vsBuilder->emitAttributes(dfTexEffect);
283 294
284 GrGLVertToFrag v(kVec2f_GrSLType); 295 GrGLVertToFrag v(kVec2f_GrSLType);
285 args.fPB->addVarying("TextureCoords", &v, kHigh_GrSLPrecision); 296 args.fPB->addVarying("TextureCoords", &v, kHigh_GrSLPrecision);
286 297
287 // setup pass through color 298 // setup pass through color
288 if (!dfTexEffect.colorIgnored()) { 299 if (!dfTexEffect.colorIgnored()) {
289 if (dfTexEffect.hasVertexColor()) { 300 if (dfTexEffect.hasVertexColor()) {
290 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor); 301 pb->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputC olor);
291 } else { 302 } else {
292 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 303 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
293 } 304 }
294 } 305 }
295 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord s()->fName); 306 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord s()->fName);
296 307
297 // Setup position 308 // Setup position
298 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix()); 309 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(),
310 &fViewMatrixUniform);
299 311
300 // emit transforms 312 // emit transforms
301 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, 313 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName,
302 args.fTransformsIn, args.fTransformsOut); 314 args.fTransformsIn, args.fTransformsOut);
303 315
304 const char* textureSizeUniName = NULL; 316 const char* textureSizeUniName = NULL;
305 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis ibility, 317 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis ibility,
306 kVec2f_GrSLType, kDefault_GrSLPrec ision, 318 kVec2f_GrSLType, kDefault_GrSLPrec ision,
307 "TextureSize", &textureSizeUniName ); 319 "TextureSize", &textureSizeUniName );
308 320
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 GrTexture* texture = proc.texture(0); 377 GrTexture* texture = proc.texture(0);
366 if (texture->width() != fTextureSize.width() || 378 if (texture->width() != fTextureSize.width() ||
367 texture->height() != fTextureSize.height()) { 379 texture->height() != fTextureSize.height()) {
368 fTextureSize = SkISize::Make(texture->width(), texture->height()); 380 fTextureSize = SkISize::Make(texture->width(), texture->height());
369 pdman.set2f(fTextureSizeUni, 381 pdman.set2f(fTextureSizeUni,
370 SkIntToScalar(fTextureSize.width()), 382 SkIntToScalar(fTextureSize.width()),
371 SkIntToScalar(fTextureSize.height())); 383 SkIntToScalar(fTextureSize.height()));
372 } 384 }
373 385
374 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG eoProc>(); 386 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG eoProc>();
375 this->setUniformViewMatrix(pdman, dfpgp.viewMatrix()); 387
388 if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp. viewMatrix())) {
389 fViewMatrix = dfpgp.viewMatrix();
390 GrGLfloat viewMatrix[3 * 3];
391 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
392 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
393 }
376 394
377 if (dfpgp.color() != fColor) { 395 if (dfpgp.color() != fColor) {
378 GrGLfloat c[4]; 396 GrGLfloat c[4];
379 GrColorToRGBAFloat(dfpgp.color(), c); 397 GrColorToRGBAFloat(dfpgp.color(), c);
380 pdman.set4fv(fColorUniform, 1, c); 398 pdman.set4fv(fColorUniform, 1, c);
381 fColor = dfpgp.color(); 399 fColor = dfpgp.color();
382 } 400 }
383 } 401 }
384 402
385 static inline void GenKey(const GrGeometryProcessor& gp, 403 static inline void GenKey(const GrGeometryProcessor& gp,
386 const GrBatchTracker& bt, 404 const GrBatchTracker& bt,
387 const GrGLSLCaps&, 405 const GrGLSLCaps&,
388 GrProcessorKeyBuilder* b) { 406 GrProcessorKeyBuilder* b) {
389 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP athGeoProc>(); 407 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP athGeoProc>();
390 408
391 uint32_t key = dfTexEffect.getFlags(); 409 uint32_t key = dfTexEffect.getFlags();
392 key |= dfTexEffect.colorIgnored() << 16; 410 key |= dfTexEffect.colorIgnored() << 16;
393 key |= dfTexEffect.hasVertexColor() << 17; 411 key |= dfTexEffect.hasVertexColor() << 17;
394 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; 412 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
395 b->add32(key); 413 b->add32(key);
396 } 414 }
397 415
398 private: 416 private:
399 UniformHandle fColorUniform; 417 UniformHandle fColorUniform;
400 UniformHandle fTextureSizeUni; 418 UniformHandle fTextureSizeUni;
419 UniformHandle fViewMatrixUniform;
420 SkMatrix fViewMatrix;
401 GrColor fColor; 421 GrColor fColor;
402 SkISize fTextureSize; 422 SkISize fTextureSize;
403 423
404 typedef GrGLGeometryProcessor INHERITED; 424 typedef GrGLGeometryProcessor INHERITED;
405 }; 425 };
406 426
407 /////////////////////////////////////////////////////////////////////////////// 427 ///////////////////////////////////////////////////////////////////////////////
408 428
409 GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( 429 GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc(
410 GrColor color, 430 GrColor color,
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 random->nextBool() ? 491 random->nextBool() ?
472 kSimilarity_DistanceFieldE ffectFlag : 0, 492 kSimilarity_DistanceFieldE ffectFlag : 0,
473 random->nextBool()); 493 random->nextBool());
474 } 494 }
475 495
476 /////////////////////////////////////////////////////////////////////////////// 496 ///////////////////////////////////////////////////////////////////////////////
477 497
478 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { 498 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor {
479 public: 499 public:
480 GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTra cker&) 500 GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTra cker&)
481 : fColor(GrColor_ILLEGAL) { 501 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {
482 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1. 0f, 1.0f, 1.0f); 502 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1. 0f, 1.0f, 1.0f);
483 } 503 }
484 504
485 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 505 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
486 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = 506 const GrDistanceFieldLCDTextGeoProc& dfTexEffect =
487 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); 507 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>();
488 GrGLGPBuilder* pb = args.fPB; 508 GrGLGPBuilder* pb = args.fPB;
489 509
490 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 510 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
491 511
492 // emit attributes 512 // emit attributes
493 vsBuilder->emitAttributes(dfTexEffect); 513 vsBuilder->emitAttributes(dfTexEffect);
494 514
495 // setup pass through color 515 // setup pass through color
496 if (!dfTexEffect.colorIgnored()) { 516 if (!dfTexEffect.colorIgnored()) {
497 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 517 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
498 } 518 }
499 519
500 // Setup position 520 // Setup position
501 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix()); 521 this->setupPosition(pb, gpArgs, dfTexEffect.inPosition()->fName, dfTexEf fect.viewMatrix(),
522 &fViewMatrixUniform);
502 523
503 // emit transforms 524 // emit transforms
504 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName, 525 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit ion()->fName,
505 args.fTransformsIn, args.fTransformsOut); 526 args.fTransformsIn, args.fTransformsOut);
506 527
507 // set up varyings 528 // set up varyings
508 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di stanceFieldEffectMask); 529 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di stanceFieldEffectMask);
509 GrGLVertToFrag recipScale(kFloat_GrSLType); 530 GrGLVertToFrag recipScale(kFloat_GrSLType);
510 GrGLVertToFrag st(kVec2f_GrSLType); 531 GrGLVertToFrag st(kVec2f_GrSLType);
511 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); 532 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth), distance), 1.0);"); 633 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth), distance), 1.0);");
613 634
614 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); 635 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
615 } 636 }
616 637
617 virtual void setData(const GrGLProgramDataManager& pdman, 638 virtual void setData(const GrGLProgramDataManager& pdman,
618 const GrPrimitiveProcessor& processor, 639 const GrPrimitiveProcessor& processor,
619 const GrBatchTracker& bt) override { 640 const GrBatchTracker& bt) override {
620 SkASSERT(fDistanceAdjustUni.isValid()); 641 SkASSERT(fDistanceAdjustUni.isValid());
621 642
622 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = 643 const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFi eldLCDTextGeoProc>();
623 processor.cast<GrDistanceFieldLCDTextGeoProc>(); 644 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdju st();
624 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dfTexEffect.getDistan ceAdjust();
625 if (wa != fDistanceAdjust) { 645 if (wa != fDistanceAdjust) {
626 pdman.set3f(fDistanceAdjustUni, 646 pdman.set3f(fDistanceAdjustUni,
627 wa.fR, 647 wa.fR,
628 wa.fG, 648 wa.fG,
629 wa.fB); 649 wa.fB);
630 fDistanceAdjust = wa; 650 fDistanceAdjust = wa;
631 } 651 }
632 652
633 this->setUniformViewMatrix(pdman, dfTexEffect.viewMatrix()); 653 if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd. viewMatrix())) {
654 fViewMatrix = dflcd.viewMatrix();
655 GrGLfloat viewMatrix[3 * 3];
656 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
657 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
658 }
634 659
635 if (dfTexEffect.color() != fColor) { 660 if (dflcd.color() != fColor) {
636 GrGLfloat c[4]; 661 GrGLfloat c[4];
637 GrColorToRGBAFloat(dfTexEffect.color(), c); 662 GrColorToRGBAFloat(dflcd.color(), c);
638 pdman.set4fv(fColorUniform, 1, c); 663 pdman.set4fv(fColorUniform, 1, c);
639 fColor = dfTexEffect.color(); 664 fColor = dflcd.color();
640 } 665 }
641 } 666 }
642 667
643 static inline void GenKey(const GrGeometryProcessor& gp, 668 static inline void GenKey(const GrGeometryProcessor& gp,
644 const GrBatchTracker& bt, 669 const GrBatchTracker& bt,
645 const GrGLSLCaps&, 670 const GrGLSLCaps&,
646 GrProcessorKeyBuilder* b) { 671 GrProcessorKeyBuilder* b) {
647 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie ldLCDTextGeoProc>(); 672 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie ldLCDTextGeoProc>();
648 673
649 uint32_t key = dfTexEffect.getFlags(); 674 uint32_t key = dfTexEffect.getFlags();
650 key |= dfTexEffect.colorIgnored() << 16; 675 key |= dfTexEffect.colorIgnored() << 16;
651 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; 676 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
652 b->add32(key); 677 b->add32(key);
653 } 678 }
654 679
655 private: 680 private:
681 SkMatrix fViewMatrix;
656 GrColor fColor; 682 GrColor fColor;
683 UniformHandle fViewMatrixUniform;
657 UniformHandle fColorUniform; 684 UniformHandle fColorUniform;
658 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; 685 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust;
659 UniformHandle fDistanceAdjustUni; 686 UniformHandle fDistanceAdjustUni;
660 687
661 typedef GrGLGeometryProcessor INHERITED; 688 typedef GrGLGeometryProcessor INHERITED;
662 }; 689 };
663 690
664 /////////////////////////////////////////////////////////////////////////////// 691 ///////////////////////////////////////////////////////////////////////////////
665 692
666 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( 693 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc(
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; 747 uint32_t flags = kUseLCD_DistanceFieldEffectFlag;
721 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; 748 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0;
722 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; 749 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0;
723 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(random), 750 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(random),
724 GrTest::TestMatrix(random), 751 GrTest::TestMatrix(random),
725 textures[texIdx], params, 752 textures[texIdx], params,
726 wa, 753 wa,
727 flags, 754 flags,
728 random->nextBool()); 755 random->nextBool());
729 } 756 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrBezierEffect.cpp ('k') | src/gpu/gl/GrGLGeometryProcessor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698