blob: f85a927abab2eb6baf4b939022481511afd0c47b [file] [log] [blame]
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +00001/*
2 * Copyright 2013 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 "GrCustomCoordsTextureEffect.h"
9#include "gl/GrGLEffect.h"
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000010#include "gl/GrGLSL.h"
11#include "gl/GrGLTexture.h"
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000012#include "gl/GrGLVertexEffect.h"
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000013#include "GrTBackendEffectFactory.h"
14#include "GrTexture.h"
15
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000016class GrGLCustomCoordsTextureEffect : public GrGLVertexEffect {
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000017public:
18 GrGLCustomCoordsTextureEffect(const GrBackendEffectFactory& factory, const GrDrawEffect& drawEffect)
19 : INHERITED (factory) {}
20
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000021 virtual void emitCode(GrGLFullShaderBuilder* builder,
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000022 const GrDrawEffect& drawEffect,
23 EffectKey key,
24 const char* outputColor,
25 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +000026 const TransformedCoordsArray&,
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000027 const TextureSamplerArray& samplers) SK_OVERRIDE {
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000028 SkASSERT(1 == drawEffect.castEffect<GrCustomCoordsTextureEffect>().numVertexAttribs());
29
30 SkString fsCoordName;
31 const char* vsVaryingName;
32 const char* fsVaryingNamePtr;
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000033 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsVaryingName, &fsVaryingNamePtr);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000034 fsCoordName = fsVaryingNamePtr;
35
36 const char* attrName =
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000037 builder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0])->c_str();
38 builder->vsCodeAppendf("\t%s = %s;\n", vsVaryingName, attrName);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000039
40 builder->fsCodeAppendf("\t%s = ", outputColor);
41 builder->fsAppendTextureLookupAndModulate(inputColor,
42 samplers[0],
43 fsCoordName.c_str(),
44 kVec2f_GrSLType);
45 builder->fsCodeAppend(";\n");
46 }
47
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000048 virtual void setData(const GrGLUniformManager& uman,
49 const GrDrawEffect& drawEffect) SK_OVERRIDE {}
50
51private:
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000052 typedef GrGLVertexEffect INHERITED;
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000053};
54
55///////////////////////////////////////////////////////////////////////////////
56
57GrCustomCoordsTextureEffect::GrCustomCoordsTextureEffect(GrTexture* texture,
58 const GrTextureParams& params)
59 : fTextureAccess(texture, params) {
60 this->addTextureAccess(&fTextureAccess);
61 this->addVertexAttrib(kVec2f_GrSLType);
62}
63
64bool GrCustomCoordsTextureEffect::onIsEqual(const GrEffect& other) const {
65 const GrCustomCoordsTextureEffect& cte = CastEffect<GrCustomCoordsTextureEffect>(other);
66 return fTextureAccess == cte.fTextureAccess;
67}
68
69void GrCustomCoordsTextureEffect::getConstantColorComponents(GrColor* color,
70 uint32_t* validFlags) const {
71 if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color) &&
72 GrPixelConfigIsOpaque(this->texture(0)->config())) {
73 *validFlags = kA_GrColorComponentFlag;
74 } else {
75 *validFlags = 0;
76 }
77}
78
79const GrBackendEffectFactory& GrCustomCoordsTextureEffect::getFactory() const {
80 return GrTBackendEffectFactory<GrCustomCoordsTextureEffect>::getInstance();
81}
82
83///////////////////////////////////////////////////////////////////////////////
84
85GR_DEFINE_EFFECT_TEST(GrCustomCoordsTextureEffect);
86
87GrEffectRef* GrCustomCoordsTextureEffect::TestCreate(SkRandom* random,
88 GrContext*,
89 const GrDrawTargetCaps&,
90 GrTexture* textures[]) {
91 int texIdx = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx :
92 GrEffectUnitTest::kAlphaTextureIdx;
93 static const SkShader::TileMode kTileModes[] = {
94 SkShader::kClamp_TileMode,
95 SkShader::kRepeat_TileMode,
96 SkShader::kMirror_TileMode,
97 };
98 SkShader::TileMode tileModes[] = {
99 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
100 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
101 };
102 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBilerp_FilterMode :
103 GrTextureParams::kNone_FilterMode);
104
105 return GrCustomCoordsTextureEffect::Create(textures[texIdx], params);
106}