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