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 "glsl/GrGLSLFragmentProcessor.h"
     12 #include "glsl/GrGLSLFragmentShaderBuilder.h"
     13 
     14 class GrGLSimpleTextureEffect : public GrGLSLFragmentProcessor {
     15 public:
     16     void emitCode(EmitArgs& args) override {
     17         GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
     18         fragBuilder->codeAppendf("%s = ", args.fOutputColor);
     19         fragBuilder->appendTextureLookupAndModulate(args.fInputColor,
     20                                                   args.fSamplers[0],
     21                                                   args.fCoords[0].c_str(),
     22                                                   args.fCoords[0].getType());
     23         fragBuilder->codeAppend(";");
     24     }
     25 
     26 private:
     27     typedef GrGLSLFragmentProcessor INHERITED;
     28 };
     29 
     30 ///////////////////////////////////////////////////////////////////////////////
     31 
     32 void GrSimpleTextureEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     33     this->updateInvariantOutputForModulation(inout);
     34 }
     35 
     36 void GrSimpleTextureEffect::onGetGLSLProcessorKey(const GrGLSLCaps& caps,
     37                                                   GrProcessorKeyBuilder* b) const {
     38     GrGLSimpleTextureEffect::GenKey(*this, caps, b);
     39 }
     40 
     41 GrGLSLFragmentProcessor* GrSimpleTextureEffect::onCreateGLSLInstance() const  {
     42     return new GrGLSimpleTextureEffect;
     43 }
     44 
     45 ///////////////////////////////////////////////////////////////////////////////
     46 
     47 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSimpleTextureEffect);
     48 
     49 const GrFragmentProcessor* GrSimpleTextureEffect::TestCreate(GrProcessorTestData* d) {
     50     int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
     51                                           GrProcessorUnitTest::kAlphaTextureIdx;
     52     static const SkShader::TileMode kTileModes[] = {
     53         SkShader::kClamp_TileMode,
     54         SkShader::kRepeat_TileMode,
     55         SkShader::kMirror_TileMode,
     56     };
     57     SkShader::TileMode tileModes[] = {
     58         kTileModes[d->fRandom->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
     59         kTileModes[d->fRandom->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
     60     };
     61     GrTextureParams params(tileModes, d->fRandom->nextBool() ? GrTextureParams::kBilerp_FilterMode :
     62                                                                GrTextureParams::kNone_FilterMode);
     63 
     64     static const GrCoordSet kCoordSets[] = {
     65         kLocal_GrCoordSet,
     66         kDevice_GrCoordSet
     67     };
     68     GrCoordSet coordSet = kCoordSets[d->fRandom->nextULessThan(SK_ARRAY_COUNT(kCoordSets))];
     69 
     70     const SkMatrix& matrix = GrTest::TestMatrix(d->fRandom);
     71     return GrSimpleTextureEffect::Create(d->fTextures[texIdx], matrix, coordSet);
     72 }
     73