blob: 05eff6b3d44112c10301265ae4b2693f774c4a28 [file] [log] [blame]
tomhudson@google.comd0c1a062012-07-12 17:23:52 +00001/*
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 "effects/GrSingleTextureEffect.h"
bsalomon@google.comd698f772012-10-25 13:22:00 +00009#include "gl/GrGLEffect.h"
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000010#include "gl/GrGLEffectMatrix.h"
tomhudson@google.comaa72eab2012-07-19 18:01:07 +000011#include "gl/GrGLSL.h"
12#include "gl/GrGLTexture.h"
bsalomon@google.com2eaaefd2012-10-29 19:51:22 +000013#include "GrTBackendEffectFactory.h"
tomhudson@google.comd0c1a062012-07-12 17:23:52 +000014#include "GrTexture.h"
15
bsalomon@google.com22a800a2012-10-26 19:16:46 +000016class GrGLSingleTextureEffect : public GrGLEffect {
tomhudson@google.comaa72eab2012-07-19 18:01:07 +000017public:
bsalomon@google.com396e61f2012-10-25 19:00:29 +000018 GrGLSingleTextureEffect(const GrBackendEffectFactory& factory, const GrEffect&)
bsalomon@google.comdbe49f72012-11-05 16:36:02 +000019 : INHERITED (factory) {}
tomhudson@google.comaa72eab2012-07-19 18:01:07 +000020
bsalomon@google.com22a800a2012-10-26 19:16:46 +000021 virtual void emitCode(GrGLShaderBuilder* builder,
bsalomon@google.com2eaaefd2012-10-29 19:51:22 +000022 const GrEffectStage&,
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000023 EffectKey key,
bsalomon@google.com22a800a2012-10-26 19:16:46 +000024 const char* vertexCoords,
25 const char* outputColor,
26 const char* inputColor,
27 const TextureSamplerArray& samplers) SK_OVERRIDE {
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000028 const char* coordName;
29 GrSLType coordType = fEffectMatrix.emitCode(builder, key, vertexCoords, &coordName);
bsalomon@google.com868a8e72012-08-30 19:11:34 +000030 builder->fFSCode.appendf("\t%s = ", outputColor);
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000031 builder->appendTextureLookupAndModulate(&builder->fFSCode,
32 inputColor,
33 samplers[0],
34 coordName,
35 coordType);
bsalomon@google.com868a8e72012-08-30 19:11:34 +000036 builder->fFSCode.append(";\n");
tomhudson@google.comaa72eab2012-07-19 18:01:07 +000037 }
38
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000039 static inline EffectKey GenKey(const GrEffectStage& stage, const GrGLCaps&) {
40 const GrSingleTextureEffect& ste =
41 static_cast<const GrSingleTextureEffect&>(*stage.getEffect());
42 return GrGLEffectMatrix::GenKey(ste.getMatrix(),
43 stage.getCoordChangeMatrix(),
44 ste.texture(0));
45 }
46
47 virtual void setData(const GrGLUniformManager& uman, const GrEffectStage& stage) SK_OVERRIDE {
48 const GrSingleTextureEffect& ste =
49 static_cast<const GrSingleTextureEffect&>(*stage.getEffect());
50 fEffectMatrix.setData(uman, ste.getMatrix(), stage.getCoordChangeMatrix(), ste.texture(0));
51 }
tomhudson@google.comaa72eab2012-07-19 18:01:07 +000052
53private:
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000054 GrGLEffectMatrix fEffectMatrix;
bsalomon@google.com22a800a2012-10-26 19:16:46 +000055 typedef GrGLEffect INHERITED;
tomhudson@google.comaa72eab2012-07-19 18:01:07 +000056};
57
58///////////////////////////////////////////////////////////////////////////////
59
tomhudson@google.comd0c1a062012-07-12 17:23:52 +000060GrSingleTextureEffect::GrSingleTextureEffect(GrTexture* texture)
bsalomon@google.come6e62d12012-10-04 14:38:48 +000061 : INHERITED(1)
62 , fTextureAccess(texture) {
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000063 fMatrix.reset();
tomhudson@google.comd0c1a062012-07-12 17:23:52 +000064}
65
bsalomon@google.com1ce49fc2012-09-18 14:14:49 +000066GrSingleTextureEffect::GrSingleTextureEffect(GrTexture* texture, bool bilerp)
bsalomon@google.come6e62d12012-10-04 14:38:48 +000067 : INHERITED(1)
68 , fTextureAccess(texture, bilerp) {
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000069 fMatrix.reset();
bsalomon@google.com1ce49fc2012-09-18 14:14:49 +000070}
71
72GrSingleTextureEffect::GrSingleTextureEffect(GrTexture* texture, const GrTextureParams& params)
bsalomon@google.come6e62d12012-10-04 14:38:48 +000073 : INHERITED(1)
74 , fTextureAccess(texture, params) {
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000075 fMatrix.reset();
76}
77
bsalomon@google.comb9086a02012-11-01 18:02:54 +000078GrSingleTextureEffect::GrSingleTextureEffect(GrTexture* texture, const SkMatrix& m)
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000079 : INHERITED(1)
80 , fTextureAccess(texture)
81 , fMatrix(m) {
82}
83
bsalomon@google.comb9086a02012-11-01 18:02:54 +000084GrSingleTextureEffect::GrSingleTextureEffect(GrTexture* texture, const SkMatrix& m, bool bilerp)
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000085 : INHERITED(1)
86 , fTextureAccess(texture, bilerp)
87 , fMatrix(m) {
88}
89
90GrSingleTextureEffect::GrSingleTextureEffect(GrTexture* texture,
bsalomon@google.comb9086a02012-11-01 18:02:54 +000091 const SkMatrix& m,
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000092 const GrTextureParams& params)
93 : INHERITED(1)
94 , fTextureAccess(texture, params)
95 , fMatrix(m) {
bsalomon@google.com1ce49fc2012-09-18 14:14:49 +000096}
97
tomhudson@google.comd0c1a062012-07-12 17:23:52 +000098GrSingleTextureEffect::~GrSingleTextureEffect() {
tomhudson@google.comd0c1a062012-07-12 17:23:52 +000099}
100
bsalomon@google.com6d003d12012-09-11 15:45:20 +0000101const GrTextureAccess& GrSingleTextureEffect::textureAccess(int index) const {
tomhudson@google.comd0c1a062012-07-12 17:23:52 +0000102 GrAssert(0 == index);
bsalomon@google.com6d003d12012-09-11 15:45:20 +0000103 return fTextureAccess;
tomhudson@google.comd0c1a062012-07-12 17:23:52 +0000104}
105
bsalomon@google.com396e61f2012-10-25 19:00:29 +0000106const GrBackendEffectFactory& GrSingleTextureEffect::getFactory() const {
107 return GrTBackendEffectFactory<GrSingleTextureEffect>::getInstance();
tomhudson@google.comaa72eab2012-07-19 18:01:07 +0000108}
bsalomon@google.com0a7672f2012-08-03 18:12:20 +0000109
110///////////////////////////////////////////////////////////////////////////////
111
bsalomon@google.comf271cc72012-10-24 19:35:13 +0000112GR_DEFINE_EFFECT_TEST(GrSingleTextureEffect);
bsalomon@google.com0a7672f2012-08-03 18:12:20 +0000113
bsalomon@google.coma469c282012-10-24 18:28:34 +0000114GrEffect* GrSingleTextureEffect::TestCreate(SkRandom* random,
115 GrContext* context,
116 GrTexture* textures[]) {
bsalomon@google.com6f261be2012-10-24 19:07:10 +0000117 int texIdx = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx :
118 GrEffectUnitTest::kAlphaTextureIdx;
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +0000119 const SkMatrix& matrix = GrEffectUnitTest::TestMatrix(random);
120 return SkNEW_ARGS(GrSingleTextureEffect, (textures[texIdx], matrix));
bsalomon@google.com0a7672f2012-08-03 18:12:20 +0000121}