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

Side by Side Diff: src/effects/SkDisplacementMapEffect.cpp

Issue 491673002: Initial refactor of shaderbuilder (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 4 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/effects/SkColorMatrixFilter.cpp ('k') | src/effects/SkLightingImageFilter.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 "SkDisplacementMapEffect.h" 8 #include "SkDisplacementMapEffect.h"
9 #include "SkReadBuffer.h" 9 #include "SkReadBuffer.h"
10 #include "SkWriteBuffer.h" 10 #include "SkWriteBuffer.h"
11 #include "SkUnPreMultiply.h" 11 #include "SkUnPreMultiply.h"
12 #include "SkColorPriv.h" 12 #include "SkColorPriv.h"
13 #if SK_SUPPORT_GPU 13 #if SK_SUPPORT_GPU
14 #include "GrContext.h" 14 #include "GrContext.h"
15 #include "GrCoordTransform.h" 15 #include "GrCoordTransform.h"
16 #include "gl/GrGLEffect.h" 16 #include "gl/GrGLEffect.h"
17 #include "gl/GrGLShaderBuilder.h" 17 #include "gl/builders/GrGLProgramBuilder.h"
18 #include "GrTBackendEffectFactory.h" 18 #include "GrTBackendEffectFactory.h"
19 #endif 19 #endif
20 20
21 namespace { 21 namespace {
22 22
23 #define kChannelSelectorKeyBits 3; // Max value is 4, so 3 bits are required at most 23 #define kChannelSelectorKeyBits 3; // Max value is 4, so 3 bits are required at most
24 24
25 template<SkDisplacementMapEffect::ChannelSelectorType type> 25 template<SkDisplacementMapEffect::ChannelSelectorType type>
26 uint32_t getValue(SkColor, const SkUnPreMultiply::Scale*) { 26 uint32_t getValue(SkColor, const SkUnPreMultiply::Scale*) {
27 SkDEBUGFAIL("Unknown channel selector"); 27 SkDEBUGFAIL("Unknown channel selector");
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 295
296 /////////////////////////////////////////////////////////////////////////////// 296 ///////////////////////////////////////////////////////////////////////////////
297 297
298 #if SK_SUPPORT_GPU 298 #if SK_SUPPORT_GPU
299 class GrGLDisplacementMapEffect : public GrGLEffect { 299 class GrGLDisplacementMapEffect : public GrGLEffect {
300 public: 300 public:
301 GrGLDisplacementMapEffect(const GrBackendEffectFactory& factory, 301 GrGLDisplacementMapEffect(const GrBackendEffectFactory& factory,
302 const GrDrawEffect& drawEffect); 302 const GrDrawEffect& drawEffect);
303 virtual ~GrGLDisplacementMapEffect(); 303 virtual ~GrGLDisplacementMapEffect();
304 304
305 virtual void emitCode(GrGLShaderBuilder*, 305 virtual void emitCode(GrGLProgramBuilder*,
306 const GrDrawEffect&, 306 const GrDrawEffect&,
307 const GrEffectKey&, 307 const GrEffectKey&,
308 const char* outputColor, 308 const char* outputColor,
309 const char* inputColor, 309 const char* inputColor,
310 const TransformedCoordsArray&, 310 const TransformedCoordsArray&,
311 const TextureSamplerArray&) SK_OVERRIDE; 311 const TextureSamplerArray&) SK_OVERRIDE;
312 312
313 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyB uilder*); 313 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyB uilder*);
314 314
315 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 315 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE;
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrBackendEffectFactor y& factory, 533 GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrBackendEffectFactor y& factory,
534 const GrDrawEffect& drawEff ect) 534 const GrDrawEffect& drawEff ect)
535 : INHERITED(factory) 535 : INHERITED(factory)
536 , fXChannelSelector(drawEffect.castEffect<GrDisplacementMapEffect>().xChanne lSelector()) 536 , fXChannelSelector(drawEffect.castEffect<GrDisplacementMapEffect>().xChanne lSelector())
537 , fYChannelSelector(drawEffect.castEffect<GrDisplacementMapEffect>().yChanne lSelector()) { 537 , fYChannelSelector(drawEffect.castEffect<GrDisplacementMapEffect>().yChanne lSelector()) {
538 } 538 }
539 539
540 GrGLDisplacementMapEffect::~GrGLDisplacementMapEffect() { 540 GrGLDisplacementMapEffect::~GrGLDisplacementMapEffect() {
541 } 541 }
542 542
543 void GrGLDisplacementMapEffect::emitCode(GrGLShaderBuilder* builder, 543 void GrGLDisplacementMapEffect::emitCode(GrGLProgramBuilder* builder,
544 const GrDrawEffect&, 544 const GrDrawEffect&,
545 const GrEffectKey& key, 545 const GrEffectKey& key,
546 const char* outputColor, 546 const char* outputColor,
547 const char* inputColor, 547 const char* inputColor,
548 const TransformedCoordsArray& coords, 548 const TransformedCoordsArray& coords,
549 const TextureSamplerArray& samplers) { 549 const TextureSamplerArray& samplers) {
550 sk_ignore_unused_variable(inputColor); 550 sk_ignore_unused_variable(inputColor);
551 551
552 fScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, 552 fScaleUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility,
553 kVec2f_GrSLType, "Scale"); 553 kVec2f_GrSLType, "Scale");
554 const char* scaleUni = builder->getUniformCStr(fScaleUni); 554 const char* scaleUni = builder->getUniformCStr(fScaleUni);
555 const char* dColor = "dColor"; 555 const char* dColor = "dColor";
556 const char* cCoords = "cCoords"; 556 const char* cCoords = "cCoords";
557 const char* outOfBounds = "outOfBounds"; 557 const char* outOfBounds = "outOfBounds";
558 const char* nearZero = "1e-6"; // Since 6.10352e−5 is the smallest half floa t, use 558 const char* nearZero = "1e-6"; // Since 6.10352e−5 is the smallest half floa t, use
559 // a number smaller than that to approximate 0, but 559 // a number smaller than that to approximate 0, but
560 // leave room for 32-bit float GPU rounding e rrors. 560 // leave room for 32-bit float GPU rounding e rrors.
561 561
562 builder->fsCodeAppendf("\t\tvec4 %s = ", dColor); 562 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
563 builder->fsAppendTextureLookup(samplers[0], coords[0].c_str(), coords[0].typ e()); 563 fsBuilder->codeAppendf("\t\tvec4 %s = ", dColor);
564 builder->fsCodeAppend(";\n"); 564 fsBuilder->appendTextureLookup(samplers[0], coords[0].c_str(), coords[0].typ e());
565 fsBuilder->codeAppend(";\n");
565 566
566 // Unpremultiply the displacement 567 // Unpremultiply the displacement
567 builder->fsCodeAppendf("\t\t%s.rgb = (%s.a < %s) ? vec3(0.0) : clamp(%s.rgb / %s.a, 0.0, 1.0);", 568 fsBuilder->codeAppendf("\t\t%s.rgb = (%s.a < %s) ? vec3(0.0) : clamp(%s.rgb / %s.a, 0.0, 1.0);",
568 dColor, dColor, nearZero, dColor, dColor); 569 dColor, dColor, nearZero, dColor, dColor);
569 570
570 builder->fsCodeAppendf("\t\tvec2 %s = %s + %s*(%s.", 571 fsBuilder->codeAppendf("\t\tvec2 %s = %s + %s*(%s.",
571 cCoords, coords[1].c_str(), scaleUni, dColor); 572 cCoords, coords[1].c_str(), scaleUni, dColor);
572 573
573 switch (fXChannelSelector) { 574 switch (fXChannelSelector) {
574 case SkDisplacementMapEffect::kR_ChannelSelectorType: 575 case SkDisplacementMapEffect::kR_ChannelSelectorType:
575 builder->fsCodeAppend("r"); 576 fsBuilder->codeAppend("r");
576 break; 577 break;
577 case SkDisplacementMapEffect::kG_ChannelSelectorType: 578 case SkDisplacementMapEffect::kG_ChannelSelectorType:
578 builder->fsCodeAppend("g"); 579 fsBuilder->codeAppend("g");
579 break; 580 break;
580 case SkDisplacementMapEffect::kB_ChannelSelectorType: 581 case SkDisplacementMapEffect::kB_ChannelSelectorType:
581 builder->fsCodeAppend("b"); 582 fsBuilder->codeAppend("b");
582 break; 583 break;
583 case SkDisplacementMapEffect::kA_ChannelSelectorType: 584 case SkDisplacementMapEffect::kA_ChannelSelectorType:
584 builder->fsCodeAppend("a"); 585 fsBuilder->codeAppend("a");
585 break; 586 break;
586 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: 587 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType:
587 default: 588 default:
588 SkDEBUGFAIL("Unknown X channel selector"); 589 SkDEBUGFAIL("Unknown X channel selector");
589 } 590 }
590 591
591 switch (fYChannelSelector) { 592 switch (fYChannelSelector) {
592 case SkDisplacementMapEffect::kR_ChannelSelectorType: 593 case SkDisplacementMapEffect::kR_ChannelSelectorType:
593 builder->fsCodeAppend("r"); 594 fsBuilder->codeAppend("r");
594 break; 595 break;
595 case SkDisplacementMapEffect::kG_ChannelSelectorType: 596 case SkDisplacementMapEffect::kG_ChannelSelectorType:
596 builder->fsCodeAppend("g"); 597 fsBuilder->codeAppend("g");
597 break; 598 break;
598 case SkDisplacementMapEffect::kB_ChannelSelectorType: 599 case SkDisplacementMapEffect::kB_ChannelSelectorType:
599 builder->fsCodeAppend("b"); 600 fsBuilder->codeAppend("b");
600 break; 601 break;
601 case SkDisplacementMapEffect::kA_ChannelSelectorType: 602 case SkDisplacementMapEffect::kA_ChannelSelectorType:
602 builder->fsCodeAppend("a"); 603 fsBuilder->codeAppend("a");
603 break; 604 break;
604 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: 605 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType:
605 default: 606 default:
606 SkDEBUGFAIL("Unknown Y channel selector"); 607 SkDEBUGFAIL("Unknown Y channel selector");
607 } 608 }
608 builder->fsCodeAppend("-vec2(0.5));\t\t"); 609 fsBuilder->codeAppend("-vec2(0.5));\t\t");
609 610
610 // FIXME : This can be achieved with a "clamp to border" texture repeat mode and 611 // FIXME : This can be achieved with a "clamp to border" texture repeat mode and
611 // a 0 border color instead of computing if cCoords is out of bounds here. 612 // a 0 border color instead of computing if cCoords is out of bounds here.
612 builder->fsCodeAppendf( 613 fsBuilder->codeAppendf(
613 "bool %s = (%s.x < 0.0) || (%s.y < 0.0) || (%s.x > 1.0) || (%s.y > 1.0); \t\t", 614 "bool %s = (%s.x < 0.0) || (%s.y < 0.0) || (%s.x > 1.0) || (%s.y > 1.0); \t\t",
614 outOfBounds, cCoords, cCoords, cCoords, cCoords); 615 outOfBounds, cCoords, cCoords, cCoords, cCoords);
615 builder->fsCodeAppendf("%s = %s ? vec4(0.0) : ", outputColor, outOfBounds); 616 fsBuilder->codeAppendf("%s = %s ? vec4(0.0) : ", outputColor, outOfBounds);
616 builder->fsAppendTextureLookup(samplers[1], cCoords, coords[1].type()); 617 fsBuilder->appendTextureLookup(samplers[1], cCoords, coords[1].type());
617 builder->fsCodeAppend(";\n"); 618 fsBuilder->codeAppend(";\n");
618 } 619 }
619 620
620 void GrGLDisplacementMapEffect::setData(const GrGLProgramDataManager& pdman, 621 void GrGLDisplacementMapEffect::setData(const GrGLProgramDataManager& pdman,
621 const GrDrawEffect& drawEffect) { 622 const GrDrawEffect& drawEffect) {
622 const GrDisplacementMapEffect& displacementMap = 623 const GrDisplacementMapEffect& displacementMap =
623 drawEffect.castEffect<GrDisplacementMapEffect>(); 624 drawEffect.castEffect<GrDisplacementMapEffect>();
624 GrTexture* colorTex = displacementMap.texture(1); 625 GrTexture* colorTex = displacementMap.texture(1);
625 SkScalar scaleX = SkScalarDiv(displacementMap.scale().fX, SkIntToScalar(colo rTex->width())); 626 SkScalar scaleX = SkScalarDiv(displacementMap.scale().fX, SkIntToScalar(colo rTex->width()));
626 SkScalar scaleY = SkScalarDiv(displacementMap.scale().fY, SkIntToScalar(colo rTex->height())); 627 SkScalar scaleY = SkScalarDiv(displacementMap.scale().fY, SkIntToScalar(colo rTex->height()));
627 pdman.set2f(fScaleUni, SkScalarToFloat(scaleX), 628 pdman.set2f(fScaleUni, SkScalarToFloat(scaleX),
628 colorTex->origin() == kTopLeft_GrSurfaceOrigin ? 629 colorTex->origin() == kTopLeft_GrSurfaceOrigin ?
629 SkScalarToFloat(scaleY) : SkScalarToFloat(-scaleY)); 630 SkScalarToFloat(scaleY) : SkScalarToFloat(-scaleY));
630 } 631 }
631 632
632 void GrGLDisplacementMapEffect::GenKey(const GrDrawEffect& drawEffect, 633 void GrGLDisplacementMapEffect::GenKey(const GrDrawEffect& drawEffect,
633 const GrGLCaps&, GrEffectKeyBuilder* b) { 634 const GrGLCaps&, GrEffectKeyBuilder* b) {
634 const GrDisplacementMapEffect& displacementMap = 635 const GrDisplacementMapEffect& displacementMap =
635 drawEffect.castEffect<GrDisplacementMapEffect>(); 636 drawEffect.castEffect<GrDisplacementMapEffect>();
636 637
637 uint32_t xKey = displacementMap.xChannelSelector(); 638 uint32_t xKey = displacementMap.xChannelSelector();
638 uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBit s; 639 uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBit s;
639 640
640 b->add32(xKey | yKey); 641 b->add32(xKey | yKey);
641 } 642 }
642 #endif 643 #endif
OLDNEW
« no previous file with comments | « src/effects/SkColorMatrixFilter.cpp ('k') | src/effects/SkLightingImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698