| Index: src/gpu/effects/GrTextureDomainEffect.cpp
|
| ===================================================================
|
| --- src/gpu/effects/GrTextureDomainEffect.cpp (revision 8241)
|
| +++ src/gpu/effects/GrTextureDomainEffect.cpp (working copy)
|
| @@ -14,19 +14,18 @@
|
|
|
| class GrGLTextureDomainEffect : public GrGLEffect {
|
| public:
|
| - GrGLTextureDomainEffect(const GrBackendEffectFactory&, const GrEffectRef&);
|
| + GrGLTextureDomainEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
|
|
|
| virtual void emitCode(GrGLShaderBuilder*,
|
| - const GrEffectStage&,
|
| + const GrDrawEffect&,
|
| EffectKey,
|
| - const char* vertexCoords,
|
| const char* outputColor,
|
| const char* inputColor,
|
| const TextureSamplerArray&) SK_OVERRIDE;
|
|
|
| - virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVERRIDE;
|
| + virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE;
|
|
|
| - static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&);
|
| + static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
|
|
|
| private:
|
| GrGLUniformManager::UniformHandle fNameUni;
|
| @@ -37,27 +36,27 @@
|
| };
|
|
|
| GrGLTextureDomainEffect::GrGLTextureDomainEffect(const GrBackendEffectFactory& factory,
|
| - const GrEffectRef&)
|
| + const GrDrawEffect& drawEffect)
|
| : INHERITED(factory)
|
| - , fNameUni(GrGLUniformManager::kInvalidUniformHandle) {
|
| + , fNameUni(GrGLUniformManager::kInvalidUniformHandle)
|
| + , fEffectMatrix(drawEffect.castEffect<GrTextureDomainEffect>().coordsType()) {
|
| fPrevDomain[0] = SK_FloatNaN;
|
| }
|
|
|
| void GrGLTextureDomainEffect::emitCode(GrGLShaderBuilder* builder,
|
| - const GrEffectStage& stage,
|
| + const GrDrawEffect& drawEffect,
|
| EffectKey key,
|
| - const char* vertexCoords,
|
| const char* outputColor,
|
| const char* inputColor,
|
| const TextureSamplerArray& samplers) {
|
| - const GrTextureDomainEffect& effect = GetEffectFromStage<GrTextureDomainEffect>(stage);
|
| + const GrTextureDomainEffect& texDom = drawEffect.castEffect<GrTextureDomainEffect>();
|
|
|
| const char* coords;
|
| - fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords);
|
| + fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords);
|
| const char* domain;
|
| fNameUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
|
| kVec4f_GrSLType, "TexDom", &domain);
|
| - if (GrTextureDomainEffect::kClamp_WrapMode == effect.wrapMode()) {
|
| + if (GrTextureDomainEffect::kClamp_WrapMode == texDom.wrapMode()) {
|
|
|
| builder->fsCodeAppendf("\tvec2 clampCoord = clamp(%s, %s.xy, %s.zw);\n",
|
| coords, domain, domain);
|
| @@ -69,7 +68,7 @@
|
| "clampCoord");
|
| builder->fsCodeAppend(";\n");
|
| } else {
|
| - GrAssert(GrTextureDomainEffect::kDecal_WrapMode == effect.wrapMode());
|
| + GrAssert(GrTextureDomainEffect::kDecal_WrapMode == texDom.wrapMode());
|
|
|
| if (kImagination_GrGLVendor == builder->ctxInfo().vendor()) {
|
| // On the NexusS and GalaxyNexus, the other path (with the 'any'
|
| @@ -106,9 +105,10 @@
|
| }
|
| }
|
|
|
| -void GrGLTextureDomainEffect::setData(const GrGLUniformManager& uman, const GrEffectStage& stage) {
|
| - const GrTextureDomainEffect& effect = GetEffectFromStage<GrTextureDomainEffect>(stage);
|
| - const GrRect& domain = effect.domain();
|
| +void GrGLTextureDomainEffect::setData(const GrGLUniformManager& uman,
|
| + const GrDrawEffect& drawEffect) {
|
| + const GrTextureDomainEffect& texDom = drawEffect.castEffect<GrTextureDomainEffect>();
|
| + const GrRect& domain = texDom.domain();
|
|
|
| float values[4] = {
|
| SkScalarToFloat(domain.left()),
|
| @@ -117,7 +117,7 @@
|
| SkScalarToFloat(domain.bottom())
|
| };
|
| // vertical flip if necessary
|
| - if (kBottomLeft_GrSurfaceOrigin == effect.texture(0)->origin()) {
|
| + if (kBottomLeft_GrSurfaceOrigin == texDom.texture(0)->origin()) {
|
| values[1] = 1.0f - values[1];
|
| values[3] = 1.0f - values[3];
|
| // The top and bottom were just flipped, so correct the ordering
|
| @@ -128,18 +128,20 @@
|
| uman.set4fv(fNameUni, 0, 1, values);
|
| }
|
| fEffectMatrix.setData(uman,
|
| - effect.getMatrix(),
|
| - stage.getCoordChangeMatrix(),
|
| - effect.texture(0));
|
| + texDom.getMatrix(),
|
| + drawEffect,
|
| + texDom.texture(0));
|
| }
|
|
|
| -GrGLEffect::EffectKey GrGLTextureDomainEffect::GenKey(const GrEffectStage& stage, const GrGLCaps&) {
|
| - const GrTextureDomainEffect& effect = GetEffectFromStage<GrTextureDomainEffect>(stage);
|
| - EffectKey key = effect.wrapMode();
|
| +GrGLEffect::EffectKey GrGLTextureDomainEffect::GenKey(const GrDrawEffect& drawEffect,
|
| + const GrGLCaps&) {
|
| + const GrTextureDomainEffect& texDom = drawEffect.castEffect<GrTextureDomainEffect>();
|
| + EffectKey key = texDom.wrapMode();
|
| key <<= GrGLEffectMatrix::kKeyBits;
|
| - EffectKey matrixKey = GrGLEffectMatrix::GenKey(effect.getMatrix(),
|
| - stage.getCoordChangeMatrix(),
|
| - effect.texture(0));
|
| + EffectKey matrixKey = GrGLEffectMatrix::GenKey(texDom.getMatrix(),
|
| + drawEffect,
|
| + texDom.coordsType(),
|
| + texDom.texture(0));
|
| return key | matrixKey;
|
| }
|
|
|
| @@ -150,7 +152,8 @@
|
| const SkMatrix& matrix,
|
| const GrRect& domain,
|
| WrapMode wrapMode,
|
| - bool bilerp) {
|
| + bool bilerp,
|
| + CoordsType coordsType) {
|
| static const SkRect kFullRect = {0, 0, SK_Scalar1, SK_Scalar1};
|
| if (kClamp_WrapMode == wrapMode && domain.contains(kFullRect)) {
|
| return GrSimpleTextureEffect::Create(texture, matrix, bilerp);
|
| @@ -172,7 +175,8 @@
|
| matrix,
|
| clippedDomain,
|
| wrapMode,
|
| - bilerp)));
|
| + bilerp,
|
| + coordsType)));
|
| return CreateEffectRef(effect);
|
|
|
| }
|
| @@ -182,8 +186,9 @@
|
| const SkMatrix& matrix,
|
| const GrRect& domain,
|
| WrapMode wrapMode,
|
| - bool bilerp)
|
| - : GrSingleTextureEffect(texture, matrix, bilerp)
|
| + bool bilerp,
|
| + CoordsType coordsType)
|
| + : GrSingleTextureEffect(texture, matrix, bilerp, coordsType)
|
| , fWrapMode(wrapMode)
|
| , fTextureDomain(domain) {
|
| }
|
| @@ -198,7 +203,8 @@
|
|
|
| bool GrTextureDomainEffect::onIsEqual(const GrEffect& sBase) const {
|
| const GrTextureDomainEffect& s = CastEffect<GrTextureDomainEffect>(sBase);
|
| - return this->hasSameTextureParamsAndMatrix(s) && this->fTextureDomain == s.fTextureDomain;
|
| + return this->hasSameTextureParamsMatrixAndCoordsType(s) &&
|
| + this->fTextureDomain == s.fTextureDomain;
|
| }
|
|
|
| void GrTextureDomainEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const {
|
| @@ -225,5 +231,12 @@
|
| domain.fBottom = random->nextRangeScalar(domain.fTop, SK_Scalar1);
|
| WrapMode wrapMode = random->nextBool() ? kClamp_WrapMode : kDecal_WrapMode;
|
| const SkMatrix& matrix = GrEffectUnitTest::TestMatrix(random);
|
| - return GrTextureDomainEffect::Create(textures[texIdx], matrix, domain, wrapMode);
|
| + bool bilerp = random->nextBool();
|
| + CoordsType coords = random->nextBool() ? kLocal_CoordsType : kPosition_CoordsType;
|
| + return GrTextureDomainEffect::Create(textures[texIdx],
|
| + matrix,
|
| + domain,
|
| + wrapMode,
|
| + bilerp,
|
| + coords);
|
| }
|
|
|