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

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

Issue 1332923003: Remove batchtracker (Closed) Base URL: https://skia.googlesource.com/skia.git@latecreatepathprocessor
Patch Set: tweaks Created 5 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/effects/GrDistanceFieldGeoProc.h ('k') | src/gpu/gl/GrGLGpu.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 "GrInvariantOutput.h" 9 #include "GrInvariantOutput.h"
10 #include "GrTexture.h" 10 #include "GrTexture.h"
11 11
12 #include "SkDistanceFieldGen.h" 12 #include "SkDistanceFieldGen.h"
13 13
14 #include "gl/GrGLFragmentProcessor.h" 14 #include "gl/GrGLFragmentProcessor.h"
15 #include "gl/GrGLTexture.h" 15 #include "gl/GrGLTexture.h"
16 #include "gl/GrGLGeometryProcessor.h" 16 #include "gl/GrGLGeometryProcessor.h"
17 #include "gl/builders/GrGLProgramBuilder.h" 17 #include "gl/builders/GrGLProgramBuilder.h"
18 18
19 // Assuming a radius of a little less than the diagonal of the fragment 19 // Assuming a radius of a little less than the diagonal of the fragment
20 #define SK_DistanceFieldAAFactor "0.65" 20 #define SK_DistanceFieldAAFactor "0.65"
21 21
22 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { 22 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor {
23 public: 23 public:
24 GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&, 24 GrGLDistanceFieldA8TextGeoProc()
25 const GrBatchTracker&)
26 : fViewMatrix(SkMatrix::InvalidMatrix()) 25 : fViewMatrix(SkMatrix::InvalidMatrix())
27 , fColor(GrColor_ILLEGAL) 26 , fColor(GrColor_ILLEGAL)
28 #ifdef SK_GAMMA_APPLY_TO_A8 27 #ifdef SK_GAMMA_APPLY_TO_A8
29 , fDistanceAdjust(-1.0f) 28 , fDistanceAdjust(-1.0f)
30 #endif 29 #endif
31 {} 30 {}
32 31
33 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 32 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
34 const GrDistanceFieldA8TextGeoProc& dfTexEffect = 33 const GrDistanceFieldA8TextGeoProc& dfTexEffect =
35 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); 34 args.fGP.cast<GrDistanceFieldA8TextGeoProc>();
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra d.y*Jdy.y);"); 136 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra d.y*Jdy.y);");
138 137
139 // this gives us a smooth step across approximately one fragment 138 // this gives us a smooth step across approximately one fragment
140 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length (grad);"); 139 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length (grad);");
141 } 140 }
142 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc e);"); 141 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc e);");
143 142
144 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); 143 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
145 } 144 }
146 145
147 virtual void setData(const GrGLProgramDataManager& pdman, 146 void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor & proc) override {
148 const GrPrimitiveProcessor& proc,
149 const GrBatchTracker& bt) override {
150 #ifdef SK_GAMMA_APPLY_TO_A8 147 #ifdef SK_GAMMA_APPLY_TO_A8
151 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi eldA8TextGeoProc>(); 148 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi eldA8TextGeoProc>();
152 float distanceAdjust = dfTexEffect.getDistanceAdjust(); 149 float distanceAdjust = dfTexEffect.getDistanceAdjust();
153 if (distanceAdjust != fDistanceAdjust) { 150 if (distanceAdjust != fDistanceAdjust) {
154 pdman.set1f(fDistanceAdjustUni, distanceAdjust); 151 pdman.set1f(fDistanceAdjustUni, distanceAdjust);
155 fDistanceAdjust = distanceAdjust; 152 fDistanceAdjust = distanceAdjust;
156 } 153 }
157 #endif 154 #endif
158 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8 TextGeoProc>(); 155 const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8 TextGeoProc>();
159 156
160 if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8g p.viewMatrix())) { 157 if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8g p.viewMatrix())) {
161 fViewMatrix = dfa8gp.viewMatrix(); 158 fViewMatrix = dfa8gp.viewMatrix();
162 GrGLfloat viewMatrix[3 * 3]; 159 GrGLfloat viewMatrix[3 * 3];
163 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); 160 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
164 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 161 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
165 } 162 }
166 163
167 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) { 164 if (dfa8gp.color() != fColor && !dfa8gp.hasVertexColor()) {
168 GrGLfloat c[4]; 165 GrGLfloat c[4];
169 GrColorToRGBAFloat(dfa8gp.color(), c); 166 GrColorToRGBAFloat(dfa8gp.color(), c);
170 pdman.set4fv(fColorUniform, 1, c); 167 pdman.set4fv(fColorUniform, 1, c);
171 fColor = dfa8gp.color(); 168 fColor = dfa8gp.color();
172 } 169 }
173 } 170 }
174 171
175 static inline void GenKey(const GrGeometryProcessor& gp, 172 static inline void GenKey(const GrGeometryProcessor& gp,
176 const GrBatchTracker& bt,
177 const GrGLSLCaps&, 173 const GrGLSLCaps&,
178 GrProcessorKeyBuilder* b) { 174 GrProcessorKeyBuilder* b) {
179 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel dA8TextGeoProc>(); 175 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel dA8TextGeoProc>();
180 uint32_t key = dfTexEffect.getFlags(); 176 uint32_t key = dfTexEffect.getFlags();
181 key |= dfTexEffect.hasVertexColor() << 16; 177 key |= dfTexEffect.hasVertexColor() << 16;
182 key |= dfTexEffect.colorIgnored() << 17; 178 key |= dfTexEffect.colorIgnored() << 17;
183 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; 179 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
184 b->add32(key); 180 b->add32(key);
185 181
186 // Currently we hardcode numbers to convert atlas coordinates to normali zed floating point 182 // Currently we hardcode numbers to convert atlas coordinates to normali zed floating point
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType, 225 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType,
230 kHigh_GrSLPrecision)); 226 kHigh_GrSLPrecision));
231 if (flags & kColorAttr_DistanceFieldEffectFlag) { 227 if (flags & kColorAttr_DistanceFieldEffectFlag) {
232 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA ttribType)); 228 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA ttribType));
233 } 229 }
234 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", 230 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
235 kVec2s_GrVertexAttribT ype)); 231 kVec2s_GrVertexAttribT ype));
236 this->addTextureAccess(&fTextureAccess); 232 this->addTextureAccess(&fTextureAccess);
237 } 233 }
238 234
239 void GrDistanceFieldA8TextGeoProc::getGLProcessorKey(const GrBatchTracker& bt, 235 void GrDistanceFieldA8TextGeoProc::getGLProcessorKey(const GrGLSLCaps& caps,
240 const GrGLSLCaps& caps,
241 GrProcessorKeyBuilder* b) c onst { 236 GrProcessorKeyBuilder* b) c onst {
242 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, bt, caps, b); 237 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, caps, b);
243 } 238 }
244 239
245 GrGLPrimitiveProcessor* 240 GrGLPrimitiveProcessor* GrDistanceFieldA8TextGeoProc::createGLInstance(const GrG LSLCaps&) const {
246 GrDistanceFieldA8TextGeoProc::createGLInstance(const GrBatchTracker& bt, 241 return new GrGLDistanceFieldA8TextGeoProc();
247 const GrGLSLCaps&) const {
248 return new GrGLDistanceFieldA8TextGeoProc(*this, bt);
249 } 242 }
250 243
251 /////////////////////////////////////////////////////////////////////////////// 244 ///////////////////////////////////////////////////////////////////////////////
252 245
253 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldA8TextGeoProc); 246 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldA8TextGeoProc);
254 247
255 const GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT estData* d) { 248 const GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT estData* d) {
256 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : 249 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
257 GrProcessorUnitTest::kAlphaTextureIdx; 250 GrProcessorUnitTest::kAlphaTextureIdx;
258 static const SkShader::TileMode kTileModes[] = { 251 static const SkShader::TileMode kTileModes[] = {
(...skipping 16 matching lines...) Expand all
275 #endif 268 #endif
276 d->fRandom->nextBool() ? 269 d->fRandom->nextBool() ?
277 kSimilarity_DistanceFieldEff ectFlag : 0, 270 kSimilarity_DistanceFieldEff ectFlag : 0,
278 d->fRandom->nextBool()); 271 d->fRandom->nextBool());
279 } 272 }
280 273
281 /////////////////////////////////////////////////////////////////////////////// 274 ///////////////////////////////////////////////////////////////////////////////
282 275
283 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { 276 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor {
284 public: 277 public:
285 GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&, 278 GrGLDistanceFieldPathGeoProc()
286 const GrBatchTracker&)
287 : fViewMatrix(SkMatrix::InvalidMatrix()) 279 : fViewMatrix(SkMatrix::InvalidMatrix())
288 , fColor(GrColor_ILLEGAL) 280 , fColor(GrColor_ILLEGAL)
289 , fTextureSize(SkISize::Make(-1, -1)) {} 281 , fTextureSize(SkISize::Make(-1, -1)) {}
290 282
291 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 283 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
292 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance FieldPathGeoProc>(); 284 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance FieldPathGeoProc>();
293 285
294 GrGLGPBuilder* pb = args.fPB; 286 GrGLGPBuilder* pb = args.fPB;
295 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 287 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
296 SkAssertResult(fsBuilder->enableFeature( 288 SkAssertResult(fsBuilder->enableFeature(
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra d.y*Jdy.y);"); 363 fsBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_gra d.y*Jdy.y);");
372 364
373 // this gives us a smooth step across approximately one fragment 365 // this gives us a smooth step across approximately one fragment
374 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length (grad);"); 366 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length (grad);");
375 } 367 }
376 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc e);"); 368 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc e);");
377 369
378 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); 370 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
379 } 371 }
380 372
381 virtual void setData(const GrGLProgramDataManager& pdman, 373 void setData(const GrGLProgramDataManager& pdman, const GrPrimitiveProcessor & proc) override {
382 const GrPrimitiveProcessor& proc,
383 const GrBatchTracker& bt) override {
384 SkASSERT(fTextureSizeUni.isValid()); 374 SkASSERT(fTextureSizeUni.isValid());
385 375
386 GrTexture* texture = proc.texture(0); 376 GrTexture* texture = proc.texture(0);
387 if (texture->width() != fTextureSize.width() || 377 if (texture->width() != fTextureSize.width() ||
388 texture->height() != fTextureSize.height()) { 378 texture->height() != fTextureSize.height()) {
389 fTextureSize = SkISize::Make(texture->width(), texture->height()); 379 fTextureSize = SkISize::Make(texture->width(), texture->height());
390 pdman.set2f(fTextureSizeUni, 380 pdman.set2f(fTextureSizeUni,
391 SkIntToScalar(fTextureSize.width()), 381 SkIntToScalar(fTextureSize.width()),
392 SkIntToScalar(fTextureSize.height())); 382 SkIntToScalar(fTextureSize.height()));
393 } 383 }
394 384
395 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG eoProc>(); 385 const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathG eoProc>();
396 386
397 if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp. viewMatrix())) { 387 if (!dfpgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfpgp. viewMatrix())) {
398 fViewMatrix = dfpgp.viewMatrix(); 388 fViewMatrix = dfpgp.viewMatrix();
399 GrGLfloat viewMatrix[3 * 3]; 389 GrGLfloat viewMatrix[3 * 3];
400 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); 390 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
401 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 391 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
402 } 392 }
403 393
404 if (dfpgp.color() != fColor) { 394 if (dfpgp.color() != fColor) {
405 GrGLfloat c[4]; 395 GrGLfloat c[4];
406 GrColorToRGBAFloat(dfpgp.color(), c); 396 GrColorToRGBAFloat(dfpgp.color(), c);
407 pdman.set4fv(fColorUniform, 1, c); 397 pdman.set4fv(fColorUniform, 1, c);
408 fColor = dfpgp.color(); 398 fColor = dfpgp.color();
409 } 399 }
410 } 400 }
411 401
412 static inline void GenKey(const GrGeometryProcessor& gp, 402 static inline void GenKey(const GrGeometryProcessor& gp,
413 const GrBatchTracker& bt,
414 const GrGLSLCaps&, 403 const GrGLSLCaps&,
415 GrProcessorKeyBuilder* b) { 404 GrProcessorKeyBuilder* b) {
416 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP athGeoProc>(); 405 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP athGeoProc>();
417 406
418 uint32_t key = dfTexEffect.getFlags(); 407 uint32_t key = dfTexEffect.getFlags();
419 key |= dfTexEffect.colorIgnored() << 16; 408 key |= dfTexEffect.colorIgnored() << 16;
420 key |= dfTexEffect.hasVertexColor() << 17; 409 key |= dfTexEffect.hasVertexColor() << 17;
421 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; 410 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
422 b->add32(key); 411 b->add32(key);
423 } 412 }
(...skipping 29 matching lines...) Expand all
453 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType, 442 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType,
454 kHigh_GrSLPrecision)); 443 kHigh_GrSLPrecision));
455 if (flags & kColorAttr_DistanceFieldEffectFlag) { 444 if (flags & kColorAttr_DistanceFieldEffectFlag) {
456 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA ttribType)); 445 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA ttribType));
457 } 446 }
458 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", 447 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
459 kVec2f_GrVertexAttribTyp e)); 448 kVec2f_GrVertexAttribTyp e));
460 this->addTextureAccess(&fTextureAccess); 449 this->addTextureAccess(&fTextureAccess);
461 } 450 }
462 451
463 void GrDistanceFieldPathGeoProc::getGLProcessorKey(const GrBatchTracker& bt, 452 void GrDistanceFieldPathGeoProc::getGLProcessorKey(const GrGLSLCaps& caps,
464 const GrGLSLCaps& caps,
465 GrProcessorKeyBuilder* b) con st { 453 GrProcessorKeyBuilder* b) con st {
466 GrGLDistanceFieldPathGeoProc::GenKey(*this, bt, caps, b); 454 GrGLDistanceFieldPathGeoProc::GenKey(*this, caps, b);
467 } 455 }
468 456
469 GrGLPrimitiveProcessor* 457 GrGLPrimitiveProcessor* GrDistanceFieldPathGeoProc::createGLInstance(const GrGLS LCaps&) const {
470 GrDistanceFieldPathGeoProc::createGLInstance(const GrBatchTracker& bt, const GrG LSLCaps&) const { 458 return new GrGLDistanceFieldPathGeoProc();
471 return new GrGLDistanceFieldPathGeoProc(*this, bt);
472 } 459 }
473 460
474 /////////////////////////////////////////////////////////////////////////////// 461 ///////////////////////////////////////////////////////////////////////////////
475 462
476 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc); 463 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc);
477 464
478 const GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes tData* d) { 465 const GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes tData* d) {
479 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx 466 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
480 : GrProcessorUnitTest::kAlphaTextureIdx; 467 : GrProcessorUnitTest::kAlphaTextureIdx;
481 static const SkShader::TileMode kTileModes[] = { 468 static const SkShader::TileMode kTileModes[] = {
(...skipping 14 matching lines...) Expand all
496 params, 483 params,
497 d->fRandom->nextBool() ? 484 d->fRandom->nextBool() ?
498 kSimilarity_DistanceFieldE ffectFlag : 0, 485 kSimilarity_DistanceFieldE ffectFlag : 0,
499 d->fRandom->nextBool()); 486 d->fRandom->nextBool());
500 } 487 }
501 488
502 /////////////////////////////////////////////////////////////////////////////// 489 ///////////////////////////////////////////////////////////////////////////////
503 490
504 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { 491 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor {
505 public: 492 public:
506 GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTra cker&) 493 GrGLDistanceFieldLCDTextGeoProc()
507 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { 494 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {
508 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1. 0f, 1.0f, 1.0f); 495 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1. 0f, 1.0f, 1.0f);
509 } 496 }
510 497
511 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 498 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
512 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = 499 const GrDistanceFieldLCDTextGeoProc& dfTexEffect =
513 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); 500 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>();
514 GrGLGPBuilder* pb = args.fPB; 501 GrGLGPBuilder* pb = args.fPB;
515 502
516 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 503 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 // this gives us a smooth step across approximately one fragment 630 // this gives us a smooth step across approximately one fragment
644 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length (grad);"); 631 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length (grad);");
645 } 632 }
646 633
647 fsBuilder->codeAppend( 634 fsBuilder->codeAppend(
648 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth), distance), 1.0);"); 635 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth), distance), 1.0);");
649 636
650 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); 637 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
651 } 638 }
652 639
653 virtual void setData(const GrGLProgramDataManager& pdman, 640 void setData(const GrGLProgramDataManager& pdman,
654 const GrPrimitiveProcessor& processor, 641 const GrPrimitiveProcessor& processor) override {
655 const GrBatchTracker& bt) override {
656 SkASSERT(fDistanceAdjustUni.isValid()); 642 SkASSERT(fDistanceAdjustUni.isValid());
657 643
658 const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFi eldLCDTextGeoProc>(); 644 const GrDistanceFieldLCDTextGeoProc& dflcd = processor.cast<GrDistanceFi eldLCDTextGeoProc>();
659 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdju st(); 645 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dflcd.getDistanceAdju st();
660 if (wa != fDistanceAdjust) { 646 if (wa != fDistanceAdjust) {
661 pdman.set3f(fDistanceAdjustUni, 647 pdman.set3f(fDistanceAdjustUni,
662 wa.fR, 648 wa.fR,
663 wa.fG, 649 wa.fG,
664 wa.fB); 650 wa.fB);
665 fDistanceAdjust = wa; 651 fDistanceAdjust = wa;
666 } 652 }
667 653
668 if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd. viewMatrix())) { 654 if (!dflcd.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dflcd. viewMatrix())) {
669 fViewMatrix = dflcd.viewMatrix(); 655 fViewMatrix = dflcd.viewMatrix();
670 GrGLfloat viewMatrix[3 * 3]; 656 GrGLfloat viewMatrix[3 * 3];
671 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); 657 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
672 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 658 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
673 } 659 }
674 660
675 if (dflcd.color() != fColor) { 661 if (dflcd.color() != fColor) {
676 GrGLfloat c[4]; 662 GrGLfloat c[4];
677 GrColorToRGBAFloat(dflcd.color(), c); 663 GrColorToRGBAFloat(dflcd.color(), c);
678 pdman.set4fv(fColorUniform, 1, c); 664 pdman.set4fv(fColorUniform, 1, c);
679 fColor = dflcd.color(); 665 fColor = dflcd.color();
680 } 666 }
681 } 667 }
682 668
683 static inline void GenKey(const GrGeometryProcessor& gp, 669 static inline void GenKey(const GrGeometryProcessor& gp,
684 const GrBatchTracker& bt,
685 const GrGLSLCaps&, 670 const GrGLSLCaps&,
686 GrProcessorKeyBuilder* b) { 671 GrProcessorKeyBuilder* b) {
687 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie ldLCDTextGeoProc>(); 672 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie ldLCDTextGeoProc>();
688 673
689 uint32_t key = dfTexEffect.getFlags(); 674 uint32_t key = dfTexEffect.getFlags();
690 key |= dfTexEffect.colorIgnored() << 16; 675 key |= dfTexEffect.colorIgnored() << 16;
691 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; 676 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
692 b->add32(key); 677 b->add32(key);
693 678
694 // Currently we hardcode numbers to convert atlas coordinates to normali zed floating point 679 // Currently we hardcode numbers to convert atlas coordinates to normali zed floating point
(...skipping 30 matching lines...) Expand all
725 , fUsesLocalCoords(usesLocalCoords) { 710 , fUsesLocalCoords(usesLocalCoords) {
726 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan ceFieldEffectFlag)); 711 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan ceFieldEffectFlag));
727 this->initClassID<GrDistanceFieldLCDTextGeoProc>(); 712 this->initClassID<GrDistanceFieldLCDTextGeoProc>();
728 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType, 713 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex AttribType,
729 kHigh_GrSLPrecision)); 714 kHigh_GrSLPrecision));
730 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", 715 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
731 kVec2s_GrVertexAttribTyp e)); 716 kVec2s_GrVertexAttribTyp e));
732 this->addTextureAccess(&fTextureAccess); 717 this->addTextureAccess(&fTextureAccess);
733 } 718 }
734 719
735 void GrDistanceFieldLCDTextGeoProc::getGLProcessorKey(const GrBatchTracker& bt, 720 void GrDistanceFieldLCDTextGeoProc::getGLProcessorKey(const GrGLSLCaps& caps,
736 const GrGLSLCaps& caps,
737 GrProcessorKeyBuilder* b) const { 721 GrProcessorKeyBuilder* b) const {
738 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, bt, caps, b); 722 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, caps, b);
739 } 723 }
740 724
741 GrGLPrimitiveProcessor* 725 GrGLPrimitiveProcessor* GrDistanceFieldLCDTextGeoProc::createGLInstance(const Gr GLSLCaps&) const {
742 GrDistanceFieldLCDTextGeoProc::createGLInstance(const GrBatchTracker& bt, 726 return new GrGLDistanceFieldLCDTextGeoProc();
743 const GrGLSLCaps&) const {
744 return new GrGLDistanceFieldLCDTextGeoProc(*this, bt);
745 } 727 }
746 728
747 /////////////////////////////////////////////////////////////////////////////// 729 ///////////////////////////////////////////////////////////////////////////////
748 730
749 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc); 731 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc);
750 732
751 const GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessor TestData* d) { 733 const GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessor TestData* d) {
752 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : 734 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
753 GrProcessorUnitTest::kAlphaTextureIdx; 735 GrProcessorUnitTest::kAlphaTextureIdx;
754 static const SkShader::TileMode kTileModes[] = { 736 static const SkShader::TileMode kTileModes[] = {
(...skipping 11 matching lines...) Expand all
766 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; 748 uint32_t flags = kUseLCD_DistanceFieldEffectFlag;
767 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; 749 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0;
768 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; 750 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0;
769 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), 751 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom),
770 GrTest::TestMatrix(d->fRandom), 752 GrTest::TestMatrix(d->fRandom),
771 d->fTextures[texIdx], params, 753 d->fTextures[texIdx], params,
772 wa, 754 wa,
773 flags, 755 flags,
774 d->fRandom->nextBool()); 756 d->fRandom->nextBool());
775 } 757 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrDistanceFieldGeoProc.h ('k') | src/gpu/gl/GrGLGpu.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698