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)