GrCustomCoordsTextureEffect.cpp revision 0a657bbc2c6fc9daf699942e023050536d5ec95f
105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* 205436638acc7c010349a69c3395f1a57c642dc62Ying Wang * Copyright 2013 Google Inc. 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang * 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang * Use of this source code is governed by a BSD-style license that can be 505436638acc7c010349a69c3395f1a57c642dc62Ying Wang * found in the LICENSE file. 605436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "GrCustomCoordsTextureEffect.h" 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "gl/GrGLEffect.h" 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "gl/GrGLSL.h" 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "gl/GrGLTexture.h" 1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "gl/GrGLVertexEffect.h" 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "GrTBackendEffectFactory.h" 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "GrTexture.h" 1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass GrGLCustomCoordsTextureEffect : public GrGLVertexEffect { 1705436638acc7c010349a69c3395f1a57c642dc62Ying Wangpublic: 1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang GrGLCustomCoordsTextureEffect(const GrBackendEffectFactory& factory, const GrDrawEffect& drawEffect) 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang : INHERITED (factory) {} 2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang virtual void emitCode(GrGLFullShaderBuilder* builder, 2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang const GrDrawEffect& drawEffect, 2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang EffectKey key, 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char* outputColor, 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char* inputColor, 2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang const TransformedCoordsArray&, 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang const TextureSamplerArray& samplers) SK_OVERRIDE { 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang SkASSERT(1 == drawEffect.castEffect<GrCustomCoordsTextureEffect>().numVertexAttribs()); 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang SkString fsCoordName; 3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char* vsVaryingName; 3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char* fsVaryingNamePtr; 3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsVaryingName, &fsVaryingNamePtr); 3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang fsCoordName = fsVaryingNamePtr; 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char* attrName = 3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang builder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0])->c_str(); 3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang builder->vsCodeAppendf("\t%s = %s;\n", vsVaryingName, attrName); 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang builder->fsCodeAppendf("\t%s = ", outputColor); 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang builder->fsAppendTextureLookupAndModulate(inputColor, 4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang samplers[0], 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang fsCoordName.c_str(), 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang kVec2f_GrSLType); 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang builder->fsCodeAppend(";\n"); 4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang virtual void setData(const GrGLUniformManager& uman, 4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang const GrDrawEffect& drawEffect) SK_OVERRIDE {} 5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 5105436638acc7c010349a69c3395f1a57c642dc62Ying Wangprivate: 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang typedef GrGLVertexEffect INHERITED; 53}; 54 55/////////////////////////////////////////////////////////////////////////////// 56 57GrCustomCoordsTextureEffect::GrCustomCoordsTextureEffect(GrTexture* texture, 58 const GrTextureParams& params) 59 : fTextureAccess(texture, params) { 60 this->addTextureAccess(&fTextureAccess); 61 this->addVertexAttrib(kVec2f_GrSLType); 62} 63 64bool GrCustomCoordsTextureEffect::onIsEqual(const GrEffect& other) const { 65 const GrCustomCoordsTextureEffect& cte = CastEffect<GrCustomCoordsTextureEffect>(other); 66 return fTextureAccess == cte.fTextureAccess; 67} 68 69void GrCustomCoordsTextureEffect::getConstantColorComponents(GrColor* color, 70 uint32_t* validFlags) const { 71 if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color) && 72 GrPixelConfigIsOpaque(this->texture(0)->config())) { 73 *validFlags = kA_GrColorComponentFlag; 74 } else { 75 *validFlags = 0; 76 } 77} 78 79const GrBackendEffectFactory& GrCustomCoordsTextureEffect::getFactory() const { 80 return GrTBackendEffectFactory<GrCustomCoordsTextureEffect>::getInstance(); 81} 82 83/////////////////////////////////////////////////////////////////////////////// 84 85GR_DEFINE_EFFECT_TEST(GrCustomCoordsTextureEffect); 86 87GrEffectRef* GrCustomCoordsTextureEffect::TestCreate(SkRandom* random, 88 GrContext*, 89 const GrDrawTargetCaps&, 90 GrTexture* textures[]) { 91 int texIdx = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx : 92 GrEffectUnitTest::kAlphaTextureIdx; 93 static const SkShader::TileMode kTileModes[] = { 94 SkShader::kClamp_TileMode, 95 SkShader::kRepeat_TileMode, 96 SkShader::kMirror_TileMode, 97 }; 98 SkShader::TileMode tileModes[] = { 99 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 100 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 101 }; 102 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBilerp_FilterMode : 103 GrTextureParams::kNone_FilterMode); 104 105 return GrCustomCoordsTextureEffect::Create(textures[texIdx], params); 106} 107