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:
emitCode(EmitArgs & args)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
onComputeInvariantOutput(GrInvariantOutput * inout) const32 void GrSimpleTextureEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
33 this->updateInvariantOutputForModulation(inout);
34 }
35
onGetGLSLProcessorKey(const GrGLSLCaps & caps,GrProcessorKeyBuilder * b) const36 void GrSimpleTextureEffect::onGetGLSLProcessorKey(const GrGLSLCaps& caps,
37 GrProcessorKeyBuilder* b) const {
38 GrGLSimpleTextureEffect::GenKey(*this, caps, b);
39 }
40
onCreateGLSLInstance() const41 GrGLSLFragmentProcessor* GrSimpleTextureEffect::onCreateGLSLInstance() const {
42 return new GrGLSimpleTextureEffect;
43 }
44
45 ///////////////////////////////////////////////////////////////////////////////
46
47 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSimpleTextureEffect);
48
TestCreate(GrProcessorTestData * d)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