GrSimpleTextureEffect.cpp revision 67e7cde5c5e59a8f1de7ee28276b8193ecb2bc7f
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 "gl/GrGLEffect.h"
10#include "gl/GrGLEffectMatrix.h"
11#include "gl/GrGLSL.h"
12#include "gl/GrGLTexture.h"
13#include "GrTBackendEffectFactory.h"
14#include "GrTexture.h"
15
16class GrGLSimpleTextureEffect : public GrGLEffect {
17public:
18    GrGLSimpleTextureEffect(const GrBackendEffectFactory& factory, const GrEffectRef&)
19    : INHERITED (factory) {}
20
21    virtual void emitCode(GrGLShaderBuilder* builder,
22                          const GrEffectStage&,
23                          EffectKey key,
24                          const char* vertexCoords,
25                          const char* outputColor,
26                          const char* inputColor,
27                          const TextureSamplerArray& samplers) SK_OVERRIDE {
28        const char* coordName;
29        GrSLType coordType = fEffectMatrix.emitCode(builder, key, vertexCoords, &coordName);
30        builder->fsCodeAppendf("\t%s = ", outputColor);
31        builder->appendTextureLookupAndModulate(GrGLShaderBuilder::kFragment_ShaderType,
32                                                inputColor,
33                                                samplers[0],
34                                                coordName,
35                                                coordType);
36        builder->fsCodeAppend(";\n");
37    }
38
39    static inline EffectKey GenKey(const GrEffectStage& stage, const GrGLCaps&) {
40        const GrSimpleTextureEffect& ste = GetEffectFromStage<GrSimpleTextureEffect>(stage);
41        return GrGLEffectMatrix::GenKey(ste.getMatrix(),
42                                        stage.getCoordChangeMatrix(),
43                                        ste.texture(0));
44    }
45
46    virtual void setData(const GrGLUniformManager& uman, const GrEffectStage& stage) SK_OVERRIDE {
47        const GrSimpleTextureEffect& ste = GetEffectFromStage<GrSimpleTextureEffect>(stage);
48        fEffectMatrix.setData(uman, ste.getMatrix(), stage.getCoordChangeMatrix(), ste.texture(0));
49    }
50
51private:
52    GrGLEffectMatrix fEffectMatrix;
53    typedef GrGLEffect INHERITED;
54};
55
56///////////////////////////////////////////////////////////////////////////////
57
58void GrSimpleTextureEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const {
59    this->updateConstantColorComponentsForModulation(color, validFlags);
60}
61
62const GrBackendEffectFactory& GrSimpleTextureEffect::getFactory() const {
63    return GrTBackendEffectFactory<GrSimpleTextureEffect>::getInstance();
64}
65
66///////////////////////////////////////////////////////////////////////////////
67
68GR_DEFINE_EFFECT_TEST(GrSimpleTextureEffect);
69
70GrEffectRef* GrSimpleTextureEffect::TestCreate(SkMWCRandom* random,
71                                               GrContext*,
72                                               GrTexture* textures[]) {
73    int texIdx = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx :
74                                      GrEffectUnitTest::kAlphaTextureIdx;
75    const SkMatrix& matrix = GrEffectUnitTest::TestMatrix(random);
76    return GrSimpleTextureEffect::Create(textures[texIdx], matrix);
77}
78