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); |