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 "gl/builders/GrGLProgramBuilder.h"
      9 #include "GrSimpleTextureEffect.h"
     10 #include "gl/GrGLProcessor.h"
     11 #include "gl/GrGLSL.h"
     12 #include "gl/GrGLTexture.h"
     13 #include "GrTBackendProcessorFactory.h"
     14 #include "GrTexture.h"
     15 
     16 class GrGLSimpleTextureEffect : public GrGLFragmentProcessor {
     17 public:
     18     GrGLSimpleTextureEffect(const GrBackendProcessorFactory& factory, const GrProcessor&)
     19         : INHERITED (factory) {
     20     }
     21 
     22     virtual void emitCode(GrGLProgramBuilder* builder,
     23                           const GrFragmentProcessor& fp,
     24                           const GrProcessorKey& key,
     25                           const char* outputColor,
     26                           const char* inputColor,
     27                           const TransformedCoordsArray& coords,
     28                           const TextureSamplerArray& samplers) SK_OVERRIDE {
     29         GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
     30         fsBuilder->codeAppendf("\t%s = ", outputColor);
     31         fsBuilder->appendTextureLookupAndModulate(inputColor,
     32                                                   samplers[0],
     33                                                   coords[0].c_str(),
     34                                                   coords[0].getType());
     35         fsBuilder->codeAppend(";\n");
     36     }
     37 
     38 private:
     39     typedef GrGLFragmentProcessor INHERITED;
     40 };
     41 
     42 ///////////////////////////////////////////////////////////////////////////////
     43 
     44 void GrSimpleTextureEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const {
     45     this->updateConstantColorComponentsForModulation(color, validFlags);
     46 }
     47 
     48 const GrBackendFragmentProcessorFactory& GrSimpleTextureEffect::getFactory() const {
     49     return GrTBackendFragmentProcessorFactory<GrSimpleTextureEffect>::getInstance();
     50 }
     51 
     52 ///////////////////////////////////////////////////////////////////////////////
     53 
     54 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSimpleTextureEffect);
     55 
     56 GrFragmentProcessor* GrSimpleTextureEffect::TestCreate(SkRandom* random,
     57                                                        GrContext*,
     58                                                        const GrDrawTargetCaps&,
     59                                                        GrTexture* textures[]) {
     60     int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
     61                                       GrProcessorUnitTest::kAlphaTextureIdx;
     62     static const SkShader::TileMode kTileModes[] = {
     63         SkShader::kClamp_TileMode,
     64         SkShader::kRepeat_TileMode,
     65         SkShader::kMirror_TileMode,
     66     };
     67     SkShader::TileMode tileModes[] = {
     68         kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
     69         kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
     70     };
     71     GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBilerp_FilterMode :
     72                                                            GrTextureParams::kNone_FilterMode);
     73 
     74     static const GrCoordSet kCoordSets[] = {
     75         kLocal_GrCoordSet,
     76         kPosition_GrCoordSet
     77     };
     78     GrCoordSet coordSet = kCoordSets[random->nextULessThan(SK_ARRAY_COUNT(kCoordSets))];
     79 
     80     const SkMatrix& matrix = GrProcessorUnitTest::TestMatrix(random);
     81     return GrSimpleTextureEffect::Create(textures[texIdx], matrix, coordSet);
     82 }
     83