| Index: src/gpu/effects/GrCustomCoordsTextureEffect.cpp
|
| diff --git a/src/gpu/effects/GrCustomCoordsTextureEffect.cpp b/src/gpu/effects/GrCustomCoordsTextureEffect.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a5c28c5c4d693b4298e2e06589691949a8e76468
|
| --- /dev/null
|
| +++ b/src/gpu/effects/GrCustomCoordsTextureEffect.cpp
|
| @@ -0,0 +1,111 @@
|
| +/*
|
| + * Copyright 2013 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "GrCustomCoordsTextureEffect.h"
|
| +#include "gl/GrGLEffect.h"
|
| +#include "gl/GrGLEffectMatrix.h"
|
| +#include "gl/GrGLSL.h"
|
| +#include "gl/GrGLTexture.h"
|
| +#include "GrTBackendEffectFactory.h"
|
| +#include "GrTexture.h"
|
| +
|
| +class GrGLCustomCoordsTextureEffect : public GrGLEffect {
|
| +public:
|
| + GrGLCustomCoordsTextureEffect(const GrBackendEffectFactory& factory, const GrDrawEffect& drawEffect)
|
| + : INHERITED (factory) {}
|
| +
|
| + virtual void emitCode(GrGLShaderBuilder* builder,
|
| + const GrDrawEffect& drawEffect,
|
| + EffectKey key,
|
| + const char* outputColor,
|
| + const char* inputColor,
|
| + const TextureSamplerArray& samplers) SK_OVERRIDE {
|
| + GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder->getVertexBuilder();
|
| + SkASSERT(NULL != vertexBuilder);
|
| + SkASSERT(1 == drawEffect.castEffect<GrCustomCoordsTextureEffect>().numVertexAttribs());
|
| +
|
| + SkString fsCoordName;
|
| + const char* vsVaryingName;
|
| + const char* fsVaryingNamePtr;
|
| + vertexBuilder->addVarying(kVec2f_GrSLType, "textureCoords", &vsVaryingName, &fsVaryingNamePtr);
|
| + fsCoordName = fsVaryingNamePtr;
|
| +
|
| + const char* attrName =
|
| + vertexBuilder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0])->c_str();
|
| + vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsVaryingName, attrName);
|
| +
|
| + builder->fsCodeAppendf("\t%s = ", outputColor);
|
| + builder->fsAppendTextureLookupAndModulate(inputColor,
|
| + samplers[0],
|
| + fsCoordName.c_str(),
|
| + kVec2f_GrSLType);
|
| + builder->fsCodeAppend(";\n");
|
| + }
|
| +
|
| + static inline EffectKey GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&) {
|
| + return 1 << GrGLEffectMatrix::kKeyBits;
|
| + }
|
| +
|
| + virtual void setData(const GrGLUniformManager& uman,
|
| + const GrDrawEffect& drawEffect) SK_OVERRIDE {}
|
| +
|
| +private:
|
| + typedef GrGLEffect INHERITED;
|
| +};
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +GrCustomCoordsTextureEffect::GrCustomCoordsTextureEffect(GrTexture* texture,
|
| + const GrTextureParams& params)
|
| + : fTextureAccess(texture, params) {
|
| + this->addTextureAccess(&fTextureAccess);
|
| + this->addVertexAttrib(kVec2f_GrSLType);
|
| +}
|
| +
|
| +bool GrCustomCoordsTextureEffect::onIsEqual(const GrEffect& other) const {
|
| + const GrCustomCoordsTextureEffect& cte = CastEffect<GrCustomCoordsTextureEffect>(other);
|
| + return fTextureAccess == cte.fTextureAccess;
|
| +}
|
| +
|
| +void GrCustomCoordsTextureEffect::getConstantColorComponents(GrColor* color,
|
| + uint32_t* validFlags) const {
|
| + if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color) &&
|
| + GrPixelConfigIsOpaque(this->texture(0)->config())) {
|
| + *validFlags = kA_GrColorComponentFlag;
|
| + } else {
|
| + *validFlags = 0;
|
| + }
|
| +}
|
| +
|
| +const GrBackendEffectFactory& GrCustomCoordsTextureEffect::getFactory() const {
|
| + return GrTBackendEffectFactory<GrCustomCoordsTextureEffect>::getInstance();
|
| +}
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +GR_DEFINE_EFFECT_TEST(GrCustomCoordsTextureEffect);
|
| +
|
| +GrEffectRef* GrCustomCoordsTextureEffect::TestCreate(SkRandom* random,
|
| + GrContext*,
|
| + const GrDrawTargetCaps&,
|
| + GrTexture* textures[]) {
|
| + int texIdx = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx :
|
| + GrEffectUnitTest::kAlphaTextureIdx;
|
| + static const SkShader::TileMode kTileModes[] = {
|
| + SkShader::kClamp_TileMode,
|
| + SkShader::kRepeat_TileMode,
|
| + SkShader::kMirror_TileMode,
|
| + };
|
| + SkShader::TileMode tileModes[] = {
|
| + kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
|
| + kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
|
| + };
|
| + GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBilerp_FilterMode :
|
| + GrTextureParams::kNone_FilterMode);
|
| +
|
| + return GrCustomCoordsTextureEffect::Create(textures[texIdx], params);
|
| +}
|
|
|