10a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger/*
20a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * Copyright 2013 Google Inc.
30a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger *
40a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
50a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * found in the LICENSE file.
60a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger */
70a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
80a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "GrCustomCoordsTextureEffect.h"
90a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gl/GrGLEffect.h"
100a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gl/GrGLSL.h"
110a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gl/GrGLTexture.h"
120a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gl/GrGLVertexEffect.h"
130a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "GrTBackendEffectFactory.h"
140a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "GrTexture.h"
150a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
160a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerclass GrGLCustomCoordsTextureEffect : public GrGLVertexEffect {
170a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerpublic:
180a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    GrGLCustomCoordsTextureEffect(const GrBackendEffectFactory& factory, const GrDrawEffect& drawEffect)
190a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        : INHERITED (factory) {}
200a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
210a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    virtual void emitCode(GrGLFullShaderBuilder* builder,
220a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                          const GrDrawEffect& drawEffect,
230a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                          EffectKey key,
240a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                          const char* outputColor,
250a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                          const char* inputColor,
260a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                          const TransformedCoordsArray&,
270a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                          const TextureSamplerArray& samplers) SK_OVERRIDE {
280a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkASSERT(1 == drawEffect.castEffect<GrCustomCoordsTextureEffect>().numVertexAttribs());
290a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
300a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkString fsCoordName;
310a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        const char* vsVaryingName;
320a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        const char* fsVaryingNamePtr;
330a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsVaryingName, &fsVaryingNamePtr);
340a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        fsCoordName = fsVaryingNamePtr;
350a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        const char* attrName =
370a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            builder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0])->c_str();
380a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        builder->vsCodeAppendf("\t%s = %s;\n", vsVaryingName, attrName);
390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
400a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        builder->fsCodeAppendf("\t%s = ", outputColor);
410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        builder->fsAppendTextureLookupAndModulate(inputColor,
420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                                  samplers[0],
430a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                                  fsCoordName.c_str(),
440a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                                  kVec2f_GrSLType);
450a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        builder->fsCodeAppend(";\n");
460a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    }
470a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
480a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    virtual void setData(const GrGLUniformManager& uman,
490a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                         const GrDrawEffect& drawEffect) SK_OVERRIDE {}
500a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
510a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerprivate:
520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    typedef GrGLVertexEffect INHERITED;
530a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger};
540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
550a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
560a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
570a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerGrCustomCoordsTextureEffect::GrCustomCoordsTextureEffect(GrTexture* texture,
580a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                                         const GrTextureParams& params)
590a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    : fTextureAccess(texture, params) {
600a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    this->addTextureAccess(&fTextureAccess);
610a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    this->addVertexAttrib(kVec2f_GrSLType);
620a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger}
630a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
640a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerbool GrCustomCoordsTextureEffect::onIsEqual(const GrEffect& other) const {
650a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    const GrCustomCoordsTextureEffect& cte = CastEffect<GrCustomCoordsTextureEffect>(other);
660a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    return fTextureAccess == cte.fTextureAccess;
670a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger}
680a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
690a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergervoid GrCustomCoordsTextureEffect::getConstantColorComponents(GrColor* color,
700a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                                             uint32_t* validFlags) const {
710a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color) &&
720a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        GrPixelConfigIsOpaque(this->texture(0)->config())) {
730a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        *validFlags = kA_GrColorComponentFlag;
740a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    } else {
750a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        *validFlags = 0;
760a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    }
770a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger}
780a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
790a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerconst GrBackendEffectFactory& GrCustomCoordsTextureEffect::getFactory() const {
800a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    return GrTBackendEffectFactory<GrCustomCoordsTextureEffect>::getInstance();
810a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger}
820a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
830a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
840a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
850a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerGR_DEFINE_EFFECT_TEST(GrCustomCoordsTextureEffect);
860a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
870a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerGrEffectRef* GrCustomCoordsTextureEffect::TestCreate(SkRandom* random,
880a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                                     GrContext*,
890a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                                     const GrDrawTargetCaps&,
900a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                                     GrTexture* textures[]) {
910a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    int texIdx = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx :
920a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                      GrEffectUnitTest::kAlphaTextureIdx;
930a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static const SkShader::TileMode kTileModes[] = {
940a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkShader::kClamp_TileMode,
950a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkShader::kRepeat_TileMode,
960a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkShader::kMirror_TileMode,
970a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    };
980a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    SkShader::TileMode tileModes[] = {
990a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
1000a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
1010a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    };
1020a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBilerp_FilterMode :
1030a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                                           GrTextureParams::kNone_FilterMode);
1040a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1050a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    return GrCustomCoordsTextureEffect::Create(textures[texIdx], params);
1060a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger}
107