GrSimpleTextureEffect.cpp revision e0e385c1d4171e065348ba17c546b3463a0bd651
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2012 Google Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "GrSimpleTextureEffect.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gl/GrGLEffect.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gl/GrGLEffectMatrix.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gl/GrGLSL.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gl/GrGLTexture.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "GrTBackendEffectFactory.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "GrTexture.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GrGLSimpleTextureEffect : public GrGLEffect {
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)public:
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GrGLSimpleTextureEffect(const GrBackendEffectFactory& factory, const GrEffectRef&)
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : INHERITED (factory) {}
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void emitCode(GrGLShaderBuilder* builder,
220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                          const GrEffectStage&,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          EffectKey key,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* vertexCoords,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* outputColor,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* inputColor,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const TextureSamplerArray& samplers) SK_OVERRIDE {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const char* coordName;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GrSLType coordType = fEffectMatrix.emitCode(builder, key, vertexCoords, &coordName);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        builder->fsCodeAppendf("\t%s = ", outputColor);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        builder->appendTextureLookupAndModulate(GrGLShaderBuilder::kFragment_ShaderType,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                inputColor,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                samplers[0],
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                coordName,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                coordType);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        builder->fsCodeAppend(";\n");
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static inline EffectKey GenKey(const GrEffectStage& stage, const GrGLCaps&) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const GrSimpleTextureEffect& ste = GetEffectFromStage<GrSimpleTextureEffect>(stage);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return GrGLEffectMatrix::GenKey(ste.getMatrix(),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        stage.getCoordChangeMatrix(),
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                        ste.texture(0));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void setData(const GrGLUniformManager& uman, const GrEffectStage& stage) SK_OVERRIDE {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const GrSimpleTextureEffect& ste = GetEffectFromStage<GrSimpleTextureEffect>(stage);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fEffectMatrix.setData(uman, ste.getMatrix(), stage.getCoordChangeMatrix(), ste.texture(0));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GrGLEffectMatrix fEffectMatrix;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef GrGLEffect INHERITED;
540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)};
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void GrSimpleTextureEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const {
590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    this->updateConstantColorComponentsForModulation(color, validFlags);
600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)const GrBackendEffectFactory& GrSimpleTextureEffect::getFactory() const {
630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return GrTBackendEffectFactory<GrSimpleTextureEffect>::getInstance();
640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)GR_DEFINE_EFFECT_TEST(GrSimpleTextureEffect);
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)GrEffectRef* GrSimpleTextureEffect::TestCreate(SkMWCRandom* random,
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               GrContext*,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               GrTexture* textures[]) {
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int texIdx = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx :
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      GrEffectUnitTest::kAlphaTextureIdx;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SkMatrix& matrix = GrEffectUnitTest::TestMatrix(random);
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return GrSimpleTextureEffect::Create(textures[texIdx], matrix);
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)