| Index: src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| diff --git a/src/gpu/effects/GrDistanceFieldTextureEffect.cpp b/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| index 66d06b6f704e6ab9e986718ab3493442659e0935..13cdba534b3e8fa562b30d1d4472db5873d91115 100755
|
| --- a/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| +++ b/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| @@ -18,6 +18,11 @@
|
| // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/2
|
| #define SK_DistanceFieldAAFactor "0.7071"
|
|
|
| +struct DistanceFieldBatchTracker {
|
| + GPInput fInputColorType;
|
| + GrColor fColor;
|
| +};
|
| +
|
| class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor {
|
| public:
|
| GrGLDistanceFieldTextureEffect(const GrGeometryProcessor&,
|
| @@ -31,7 +36,8 @@ public:
|
| virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
|
| const GrDistanceFieldTextureEffect& dfTexEffect =
|
| args.fGP.cast<GrDistanceFieldTextureEffect>();
|
| -
|
| + const DistanceFieldBatchTracker& local = args.fBT.cast<DistanceFieldBatchTracker>();
|
| + GrGLGPBuilder* pb = args.fPB;
|
| GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
|
| SkAssertResult(fsBuilder->enableFeature(
|
| GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
|
| @@ -41,10 +47,9 @@ public:
|
| args.fPB->addVarying("TextureCoords", &v);
|
| vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoords()->fName);
|
|
|
| - // setup color attribute
|
| - if(dfTexEffect.inColor()) {
|
| - args.fPB->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor);
|
| - }
|
| + // Setup pass through color
|
| + this->setupColor(pb, local.fInputColorType, args.fOutputColor, dfTexEffect.inColor(),
|
| + &fColorUniform);
|
|
|
| // setup position varying
|
| vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(),
|
| @@ -122,7 +127,7 @@ public:
|
|
|
| virtual void setData(const GrGLProgramDataManager& pdman,
|
| const GrGeometryProcessor& proc,
|
| - const GrBatchTracker&) SK_OVERRIDE {
|
| + const GrBatchTracker& bt) SK_OVERRIDE {
|
| SkASSERT(fTextureSizeUni.isValid());
|
|
|
| GrTexture* texture = proc.texture(0);
|
| @@ -142,23 +147,28 @@ public:
|
| fLuminance = luminance;
|
| }
|
| #endif
|
| +
|
| + const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTracker>();
|
| + this->setUniformColorIfRequired(pdman, local.fInputColorType, local.fColor, fColorUniform);
|
| }
|
|
|
| static inline void GenKey(const GrGeometryProcessor& processor,
|
| - const GrBatchTracker&,
|
| + const GrBatchTracker& bt,
|
| const GrGLCaps&,
|
| GrProcessorKeyBuilder* b) {
|
| const GrDistanceFieldTextureEffect& dfTexEffect =
|
| processor.cast<GrDistanceFieldTextureEffect>();
|
| -
|
| + const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTracker>();
|
| b->add32(dfTexEffect.getFlags());
|
| + b->add32(local.fInputColorType);
|
| }
|
|
|
| private:
|
| - GrGLProgramDataManager::UniformHandle fTextureSizeUni;
|
| - SkISize fTextureSize;
|
| - GrGLProgramDataManager::UniformHandle fLuminanceUni;
|
| - float fLuminance;
|
| + UniformHandle fColorUniform;
|
| + UniformHandle fTextureSizeUni;
|
| + SkISize fTextureSize;
|
| + UniformHandle fLuminanceUni;
|
| + float fLuminance;
|
|
|
| typedef GrGLGeometryProcessor INHERITED;
|
| };
|
| @@ -221,6 +231,20 @@ GrDistanceFieldTextureEffect::createGLInstance(const GrBatchTracker& bt) const {
|
| return SkNEW_ARGS(GrGLDistanceFieldTextureEffect, (*this, bt));
|
| }
|
|
|
| +void GrDistanceFieldTextureEffect::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const {
|
| + DistanceFieldBatchTracker* local = bt->cast<DistanceFieldBatchTracker>();
|
| + local->fColor = init.fColor;
|
| + local->fInputColorType = GetColorInputType(init, SkToBool(fInColor));
|
| +}
|
| +
|
| +bool GrDistanceFieldTextureEffect::onCanBatch(const GrBatchTracker& l,
|
| + const GrBatchTracker& r) const {
|
| + const DistanceFieldBatchTracker& left = l.cast<DistanceFieldBatchTracker>();
|
| + const DistanceFieldBatchTracker& right = r.cast<DistanceFieldBatchTracker>();
|
| + return CanCombineOutput(left.fInputColorType, left.fColor,
|
| + right.fInputColorType, right.fColor);
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldTextureEffect);
|
| @@ -263,6 +287,11 @@ GrGeometryProcessor* GrDistanceFieldTextureEffect::TestCreate(SkRandom* random,
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| +struct DistanceFieldNoGammaBatchTracker {
|
| + GPInput fInputColorType;
|
| + GrColor fColor;
|
| +};
|
| +
|
| class GrGLDistanceFieldNoGammaTextureEffect : public GrGLGeometryProcessor {
|
| public:
|
| GrGLDistanceFieldNoGammaTextureEffect(const GrGeometryProcessor&,
|
| @@ -273,6 +302,9 @@ public:
|
| const GrDistanceFieldNoGammaTextureEffect& dfTexEffect =
|
| args.fGP.cast<GrDistanceFieldNoGammaTextureEffect>();
|
|
|
| + const DistanceFieldNoGammaBatchTracker& local =
|
| + args.fBT.cast<DistanceFieldNoGammaBatchTracker>();
|
| + GrGLGPBuilder* pb = args.fPB;
|
| GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
|
| SkAssertResult(fsBuilder->enableFeature(
|
| GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
|
| @@ -281,10 +313,9 @@ public:
|
| GrGLVertToFrag v(kVec2f_GrSLType);
|
| args.fPB->addVarying("TextureCoords", &v);
|
|
|
| - // setup color attribute
|
| - if(dfTexEffect.inColor()) {
|
| - args.fPB->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor);
|
| - }
|
| + // setup pass through color
|
| + this->setupColor(pb, local.fInputColorType, args.fOutputColor, dfTexEffect.inColor(),
|
| + &fColorUniform);
|
|
|
| vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoords()->fName);
|
|
|
| @@ -349,7 +380,7 @@ public:
|
|
|
| virtual void setData(const GrGLProgramDataManager& pdman,
|
| const GrGeometryProcessor& proc,
|
| - const GrBatchTracker&) SK_OVERRIDE {
|
| + const GrBatchTracker& bt) SK_OVERRIDE {
|
| SkASSERT(fTextureSizeUni.isValid());
|
|
|
| GrTexture* texture = proc.texture(0);
|
| @@ -360,21 +391,27 @@ public:
|
| SkIntToScalar(fTextureSize.width()),
|
| SkIntToScalar(fTextureSize.height()));
|
| }
|
| +
|
| + const DistanceFieldNoGammaBatchTracker& local = bt.cast<DistanceFieldNoGammaBatchTracker>();
|
| + this->setUniformColorIfRequired(pdman, local.fInputColorType, local.fColor, fColorUniform);
|
| }
|
|
|
| static inline void GenKey(const GrGeometryProcessor& proc,
|
| - const GrBatchTracker&,
|
| + const GrBatchTracker& bt,
|
| const GrGLCaps&,
|
| GrProcessorKeyBuilder* b) {
|
| const GrDistanceFieldNoGammaTextureEffect& dfTexEffect =
|
| proc.cast<GrDistanceFieldNoGammaTextureEffect>();
|
|
|
| + const DistanceFieldNoGammaBatchTracker& local = bt.cast<DistanceFieldNoGammaBatchTracker>();
|
| b->add32(dfTexEffect.getFlags());
|
| + b->add32(local.fInputColorType);
|
| }
|
|
|
| private:
|
| - GrGLProgramDataManager::UniformHandle fTextureSizeUni;
|
| - SkISize fTextureSize;
|
| + UniformHandle fColorUniform;
|
| + UniformHandle fTextureSizeUni;
|
| + SkISize fTextureSize;
|
|
|
| typedef GrGLGeometryProcessor INHERITED;
|
| };
|
| @@ -424,6 +461,21 @@ GrDistanceFieldNoGammaTextureEffect::createGLInstance(const GrBatchTracker& bt)
|
| return SkNEW_ARGS(GrGLDistanceFieldNoGammaTextureEffect, (*this, bt));
|
| }
|
|
|
| +void GrDistanceFieldNoGammaTextureEffect::initBatchTracker(GrBatchTracker* bt,
|
| + const InitBT& init) const {
|
| + DistanceFieldNoGammaBatchTracker* local = bt->cast<DistanceFieldNoGammaBatchTracker>();
|
| + local->fColor = init.fColor;
|
| + local->fInputColorType = GetColorInputType(init, SkToBool(fInColor));
|
| +}
|
| +
|
| +bool GrDistanceFieldNoGammaTextureEffect::onCanBatch(const GrBatchTracker& l,
|
| + const GrBatchTracker& r) const {
|
| + const DistanceFieldNoGammaBatchTracker& left = l.cast<DistanceFieldNoGammaBatchTracker>();
|
| + const DistanceFieldNoGammaBatchTracker& right = r.cast<DistanceFieldNoGammaBatchTracker>();
|
| + return CanCombineOutput(left.fInputColorType, left.fColor,
|
| + right.fInputColorType, right.fColor);
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldNoGammaTextureEffect);
|
| @@ -453,6 +505,11 @@ GrGeometryProcessor* GrDistanceFieldNoGammaTextureEffect::TestCreate(SkRandom* r
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| +struct DistanceFieldLCDBatchTracker {
|
| + GPInput fInputColorType;
|
| + GrColor fColor;
|
| +};
|
| +
|
| class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor {
|
| public:
|
| GrGLDistanceFieldLCDTextureEffect(const GrGeometryProcessor&,
|
| @@ -463,12 +520,17 @@ public:
|
| virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
|
| const GrDistanceFieldLCDTextureEffect& dfTexEffect =
|
| args.fGP.cast<GrDistanceFieldLCDTextureEffect>();
|
| + const DistanceFieldLCDBatchTracker& local = args.fBT.cast<DistanceFieldLCDBatchTracker>();
|
| + GrGLGPBuilder* pb = args.fPB;
|
|
|
| GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
|
| GrGLVertToFrag v(kVec2f_GrSLType);
|
| args.fPB->addVarying("TextureCoords", &v);
|
| vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoords()->fName);
|
|
|
| + // setup pass through color
|
| + this->setupColor(pb, local.fInputColorType, args.fOutputColor, NULL, &fColorUniform);
|
| +
|
| // setup coord outputs
|
| vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(),
|
| dfTexEffect.inPosition()->fName);
|
| @@ -589,7 +651,7 @@ public:
|
|
|
| virtual void setData(const GrGLProgramDataManager& pdman,
|
| const GrGeometryProcessor& processor,
|
| - const GrBatchTracker&) SK_OVERRIDE {
|
| + const GrBatchTracker& bt) SK_OVERRIDE {
|
| SkASSERT(fTextureSizeUni.isValid());
|
| SkASSERT(fTextColorUni.isValid());
|
|
|
| @@ -618,23 +680,29 @@ public:
|
| GrColorUnpackB(textColor) * ONE_OVER_255);
|
| fTextColor = textColor;
|
| }
|
| +
|
| + const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatchTracker>();
|
| + this->setUniformColorIfRequired(pdman, local.fInputColorType, local.fColor, fColorUniform);
|
| }
|
|
|
| static inline void GenKey(const GrGeometryProcessor& processor,
|
| - const GrBatchTracker&,
|
| + const GrBatchTracker& bt,
|
| const GrGLCaps&,
|
| GrProcessorKeyBuilder* b) {
|
| const GrDistanceFieldLCDTextureEffect& dfTexEffect =
|
| processor.cast<GrDistanceFieldLCDTextureEffect>();
|
|
|
| + const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatchTracker>();
|
| b->add32(dfTexEffect.getFlags());
|
| + b->add32(local.fInputColorType);
|
| }
|
|
|
| private:
|
| - GrGLProgramDataManager::UniformHandle fTextureSizeUni;
|
| - SkISize fTextureSize;
|
| - GrGLProgramDataManager::UniformHandle fTextColorUni;
|
| - SkColor fTextColor;
|
| + UniformHandle fColorUniform;
|
| + UniformHandle fTextureSizeUni;
|
| + SkISize fTextureSize;
|
| + UniformHandle fTextColorUni;
|
| + SkColor fTextColor;
|
|
|
| typedef GrGLGeometryProcessor INHERITED;
|
| };
|
| @@ -683,6 +751,21 @@ GrDistanceFieldLCDTextureEffect::createGLInstance(const GrBatchTracker& bt) cons
|
| return SkNEW_ARGS(GrGLDistanceFieldLCDTextureEffect, (*this, bt));
|
| }
|
|
|
| +void GrDistanceFieldLCDTextureEffect::initBatchTracker(GrBatchTracker* bt,
|
| + const InitBT& init) const {
|
| + DistanceFieldLCDBatchTracker* local = bt->cast<DistanceFieldLCDBatchTracker>();
|
| + local->fColor = init.fColor;
|
| + local->fInputColorType = GetColorInputType(init, false);
|
| +}
|
| +
|
| +bool GrDistanceFieldLCDTextureEffect::onCanBatch(const GrBatchTracker& l,
|
| + const GrBatchTracker& r) const {
|
| + const DistanceFieldLCDBatchTracker& left = l.cast<DistanceFieldLCDBatchTracker>();
|
| + const DistanceFieldLCDBatchTracker& right = r.cast<DistanceFieldLCDBatchTracker>();
|
| + return CanCombineOutput(left.fInputColorType, left.fColor,
|
| + right.fInputColorType, right.fColor);
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextureEffect);
|
|
|