Home | History | Annotate | Download | only in effects
      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