blob: a132e86cf9e3e1104e5c868c6ad5dc4f04ab61bb [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"
egdaniel605dd0f2014-11-12 08:35:25 -08009#include "GrInvariantOutput.h"
joshualitteb2a6762014-12-04 11:35:33 -080010#include "GrTexture.h"
joshualittb0a8a372014-09-23 09:50:21 -070011#include "gl/GrGLProcessor.h"
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000012#include "gl/GrGLSL.h"
13#include "gl/GrGLTexture.h"
joshualitt249af152014-09-15 11:41:13 -070014#include "gl/GrGLGeometryProcessor.h"
joshualitteb2a6762014-12-04 11:35:33 -080015#include "gl/builders/GrGLProgramBuilder.h"
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000016
joshualitt249af152014-09-15 11:41:13 -070017class GrGLCustomCoordsTextureEffect : public GrGLGeometryProcessor {
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000018public:
joshualitteb2a6762014-12-04 11:35:33 -080019 GrGLCustomCoordsTextureEffect(const GrGeometryProcessor&,
20 const GrBatchTracker&) {}
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000021
joshualittc369e7c2014-10-22 10:56:26 -070022 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
joshualitt2dd1ae02014-12-03 06:24:10 -080023 const GrCustomCoordsTextureEffect& cte =
joshualittc369e7c2014-10-22 10:56:26 -070024 args.fGP.cast<GrCustomCoordsTextureEffect>();
joshualitt2dd1ae02014-12-03 06:24:10 -080025
26 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000027
joshualitt74077b92014-10-24 11:26:03 -070028 GrGLVertToFrag v(kVec2f_GrSLType);
29 args.fPB->addVarying("TextureCoords", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -080030 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), cte.inTextureCoords()->fName);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000031
joshualitt2dd1ae02014-12-03 06:24:10 -080032 if (cte.inColor()) {
33 args.fPB->addPassThroughAttribute(cte.inColor(), args.fOutputColor);
34 }
35
36 // setup output coords
37 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), cte.inPosition()->fName);
38 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), cte.inPosition()->fName);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000039
joshualitt4973d9d2014-11-08 09:24:25 -080040 // setup position varying
41 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(),
joshualitt2dd1ae02014-12-03 06:24:10 -080042 vsBuilder->uViewM(), cte.inPosition()->fName);
joshualitt4973d9d2014-11-08 09:24:25 -080043
joshualittc369e7c2014-10-22 10:56:26 -070044 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
joshualitt2dd1ae02014-12-03 06:24:10 -080045 fsBuilder->codeAppendf("%s = ", args.fOutputCoverage);
46 fsBuilder->appendTextureLookup(args.fSamplers[0], v.fsIn(), kVec2f_GrSLType);
joshualitt74077b92014-10-24 11:26:03 -070047 fsBuilder->codeAppend(";");
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000048 }
49
joshualittb0a8a372014-09-23 09:50:21 -070050 virtual void setData(const GrGLProgramDataManager&,
joshualitt87f48d92014-12-04 10:41:40 -080051 const GrGeometryProcessor&,
52 const GrBatchTracker&) SK_OVERRIDE {}
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000053
joshualitt87f48d92014-12-04 10:41:40 -080054 static inline void GenKey(const GrGeometryProcessor& proc,
55 const GrBatchTracker&,
56 const GrGLCaps&,
joshualitt2dd1ae02014-12-03 06:24:10 -080057 GrProcessorKeyBuilder* b) {
58 const GrCustomCoordsTextureEffect& gp = proc.cast<GrCustomCoordsTextureEffect>();
59
60 b->add32(SkToBool(gp.inColor()));
61 }
62
63
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000064private:
joshualitt249af152014-09-15 11:41:13 -070065 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000066};
67
68///////////////////////////////////////////////////////////////////////////////
69
70GrCustomCoordsTextureEffect::GrCustomCoordsTextureEffect(GrTexture* texture,
joshualitt2dd1ae02014-12-03 06:24:10 -080071 const GrTextureParams& params,
72 bool hasColor)
73 : fTextureAccess(texture, params), fInColor(NULL) {
joshualitteb2a6762014-12-04 11:35:33 -080074 this->initClassID<GrCustomCoordsTextureEffect>();
joshualitt2dd1ae02014-12-03 06:24:10 -080075 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
76 if (hasColor) {
77 fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVertexAttribType));
78 this->setHasVertexColor();
79 }
80 fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords",
81 kVec2f_GrVertexAttribType));
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000082 this->addTextureAccess(&fTextureAccess);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000083}
84
bsalomon0e08fc12014-10-15 08:19:04 -070085bool GrCustomCoordsTextureEffect::onIsEqual(const GrGeometryProcessor& other) const {
joshualitt2dd1ae02014-12-03 06:24:10 -080086 const GrCustomCoordsTextureEffect& gp = other.cast<GrCustomCoordsTextureEffect>();
87 return SkToBool(this->inColor()) == SkToBool(gp.inColor());
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000088}
89
egdaniel605dd0f2014-11-12 08:35:25 -080090void GrCustomCoordsTextureEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
egdanielf8449ba2014-11-25 10:24:56 -080091 if (GrPixelConfigIsAlphaOnly(this->texture(0)->config())) {
92 inout->mulByUnknownAlpha();
93 } else if (GrPixelConfigIsOpaque(this->texture(0)->config())) {
egdanielccb2e382014-10-13 12:53:46 -070094 inout->mulByUnknownOpaqueColor();
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000095 } else {
egdanielccb2e382014-10-13 12:53:46 -070096 inout->mulByUnknownColor();
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000097 }
98}
99
joshualitteb2a6762014-12-04 11:35:33 -0800100void GrCustomCoordsTextureEffect::getGLProcessorKey(const GrBatchTracker& bt,
101 const GrGLCaps& caps,
102 GrProcessorKeyBuilder* b) const {
103 GrGLCustomCoordsTextureEffect::GenKey(*this, bt, caps, b);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000104}
105
joshualitteb2a6762014-12-04 11:35:33 -0800106GrGLGeometryProcessor*
107GrCustomCoordsTextureEffect::createGLInstance(const GrBatchTracker& bt) const {
108 return SkNEW_ARGS(GrGLCustomCoordsTextureEffect, (*this, bt));
109}
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000110///////////////////////////////////////////////////////////////////////////////
111
joshualittb0a8a372014-09-23 09:50:21 -0700112GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCustomCoordsTextureEffect);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000113
joshualittb0a8a372014-09-23 09:50:21 -0700114GrGeometryProcessor* GrCustomCoordsTextureEffect::TestCreate(SkRandom* random,
115 GrContext*,
116 const GrDrawTargetCaps&,
117 GrTexture* textures[]) {
118 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
119 GrProcessorUnitTest::kAlphaTextureIdx;
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000120 static const SkShader::TileMode kTileModes[] = {
121 SkShader::kClamp_TileMode,
122 SkShader::kRepeat_TileMode,
123 SkShader::kMirror_TileMode,
124 };
125 SkShader::TileMode tileModes[] = {
126 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
127 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
128 };
129 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBilerp_FilterMode :
130 GrTextureParams::kNone_FilterMode);
131
joshualitt2dd1ae02014-12-03 06:24:10 -0800132 return GrCustomCoordsTextureEffect::Create(textures[texIdx], params, random->nextBool());
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000133}