1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "GrSimpleTextureEffect.h" 9 #include "GrInvariantOutput.h" 10 #include "GrTexture.h" 11 #include "gl/GrGLCaps.h" 12 #include "gl/GrGLProcessor.h" 13 #include "gl/GrGLSL.h" 14 #include "gl/GrGLTexture.h" 15 #include "gl/builders/GrGLProgramBuilder.h" 16 17 class GrGLSimpleTextureEffect : public GrGLFragmentProcessor { 18 public: 19 GrGLSimpleTextureEffect(const GrProcessor&) {} 20 21 virtual void emitCode(GrGLFPBuilder* builder, 22 const GrFragmentProcessor& fp, 23 const char* outputColor, 24 const char* inputColor, 25 const TransformedCoordsArray& coords, 26 const TextureSamplerArray& samplers) override { 27 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 28 fsBuilder->codeAppendf("\t%s = ", outputColor); 29 fsBuilder->appendTextureLookupAndModulate(inputColor, 30 samplers[0], 31 coords[0].c_str(), 32 coords[0].getType()); 33 fsBuilder->codeAppend(";\n"); 34 } 35 36 private: 37 typedef GrGLFragmentProcessor INHERITED; 38 }; 39 40 /////////////////////////////////////////////////////////////////////////////// 41 42 void GrSimpleTextureEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const { 43 this->updateInvariantOutputForModulation(inout); 44 } 45 46 void GrSimpleTextureEffect::getGLProcessorKey(const GrGLSLCaps& caps, 47 GrProcessorKeyBuilder* b) const { 48 GrGLSimpleTextureEffect::GenKey(*this, caps, b); 49 } 50 51 GrGLFragmentProcessor* GrSimpleTextureEffect::createGLInstance() const { 52 return SkNEW_ARGS(GrGLSimpleTextureEffect, (*this)); 53 } 54 55 /////////////////////////////////////////////////////////////////////////////// 56 57 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSimpleTextureEffect); 58 59 GrFragmentProcessor* GrSimpleTextureEffect::TestCreate(SkRandom* random, 60 GrContext*, 61 const GrDrawTargetCaps&, 62 GrTexture* textures[]) { 63 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : 64 GrProcessorUnitTest::kAlphaTextureIdx; 65 static const SkShader::TileMode kTileModes[] = { 66 SkShader::kClamp_TileMode, 67 SkShader::kRepeat_TileMode, 68 SkShader::kMirror_TileMode, 69 }; 70 SkShader::TileMode tileModes[] = { 71 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 72 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 73 }; 74 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBilerp_FilterMode : 75 GrTextureParams::kNone_FilterMode); 76 77 static const GrCoordSet kCoordSets[] = { 78 kLocal_GrCoordSet, 79 kDevice_GrCoordSet 80 }; 81 GrCoordSet coordSet = kCoordSets[random->nextULessThan(SK_ARRAY_COUNT(kCoordSets))]; 82 83 const SkMatrix& matrix = GrTest::TestMatrix(random); 84 return GrSimpleTextureEffect::Create(textures[texIdx], matrix, coordSet); 85 } 86