blob: c93db90a91b1107c8af35ba6b7042b34f648070c [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
egdaniel309e3462014-12-09 10:35:58 -08008#include "GrBitmapTextGeoProc.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
egdaniel309e3462014-12-09 10:35:58 -080017class GrGLBitmapTextGeoProc : public GrGLGeometryProcessor {
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000018public:
egdaniel309e3462014-12-09 10:35:58 -080019 GrGLBitmapTextGeoProc(const GrGeometryProcessor&, const GrBatchTracker&) {}
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000020
joshualittc369e7c2014-10-22 10:56:26 -070021 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
egdaniel309e3462014-12-09 10:35:58 -080022 const GrBitmapTextGeoProc& cte = args.fGP.cast<GrBitmapTextGeoProc>();
joshualitt2dd1ae02014-12-03 06:24:10 -080023
24 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000025
joshualitt74077b92014-10-24 11:26:03 -070026 GrGLVertToFrag v(kVec2f_GrSLType);
27 args.fPB->addVarying("TextureCoords", &v);
joshualitt2dd1ae02014-12-03 06:24:10 -080028 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), cte.inTextureCoords()->fName);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000029
joshualitt2dd1ae02014-12-03 06:24:10 -080030 if (cte.inColor()) {
31 args.fPB->addPassThroughAttribute(cte.inColor(), args.fOutputColor);
32 }
33
34 // setup output coords
35 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), cte.inPosition()->fName);
36 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), cte.inPosition()->fName);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000037
joshualitt4973d9d2014-11-08 09:24:25 -080038 // setup position varying
39 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(),
joshualitt2dd1ae02014-12-03 06:24:10 -080040 vsBuilder->uViewM(), cte.inPosition()->fName);
joshualitt4973d9d2014-11-08 09:24:25 -080041
joshualittc369e7c2014-10-22 10:56:26 -070042 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
joshualitt2dd1ae02014-12-03 06:24:10 -080043 fsBuilder->codeAppendf("%s = ", args.fOutputCoverage);
44 fsBuilder->appendTextureLookup(args.fSamplers[0], v.fsIn(), kVec2f_GrSLType);
joshualitt74077b92014-10-24 11:26:03 -070045 fsBuilder->codeAppend(";");
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000046 }
47
joshualittb0a8a372014-09-23 09:50:21 -070048 virtual void setData(const GrGLProgramDataManager&,
joshualitt87f48d92014-12-04 10:41:40 -080049 const GrGeometryProcessor&,
50 const GrBatchTracker&) SK_OVERRIDE {}
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000051
joshualitt87f48d92014-12-04 10:41:40 -080052 static inline void GenKey(const GrGeometryProcessor& proc,
53 const GrBatchTracker&,
54 const GrGLCaps&,
joshualitt2dd1ae02014-12-03 06:24:10 -080055 GrProcessorKeyBuilder* b) {
egdaniel309e3462014-12-09 10:35:58 -080056 const GrBitmapTextGeoProc& gp = proc.cast<GrBitmapTextGeoProc>();
joshualitt2dd1ae02014-12-03 06:24:10 -080057
58 b->add32(SkToBool(gp.inColor()));
59 }
60
61
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000062private:
joshualitt249af152014-09-15 11:41:13 -070063 typedef GrGLGeometryProcessor INHERITED;
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000064};
65
66///////////////////////////////////////////////////////////////////////////////
67
joshualitt2e3b3e32014-12-09 13:31:14 -080068GrBitmapTextGeoProc::GrBitmapTextGeoProc(GrColor color, GrTexture* texture,
joshualitt56995b52014-12-11 15:44:02 -080069 const GrTextureParams& params, bool useColorAttrib,
70 bool opaqueVertexColors)
71 : INHERITED(color, opaqueVertexColors), fTextureAccess(texture, params), fInColor(NULL) {
egdaniel309e3462014-12-09 10:35:58 -080072 this->initClassID<GrBitmapTextGeoProc>();
joshualitt2dd1ae02014-12-03 06:24:10 -080073 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
egdaniel309e3462014-12-09 10:35:58 -080074 if (useColorAttrib) {
joshualitt2dd1ae02014-12-03 06:24:10 -080075 fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVertexAttribType));
76 this->setHasVertexColor();
77 }
78 fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords",
79 kVec2f_GrVertexAttribType));
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000080 this->addTextureAccess(&fTextureAccess);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000081}
82
egdaniel309e3462014-12-09 10:35:58 -080083bool GrBitmapTextGeoProc::onIsEqual(const GrGeometryProcessor& other) const {
84 const GrBitmapTextGeoProc& gp = other.cast<GrBitmapTextGeoProc>();
joshualitt2dd1ae02014-12-03 06:24:10 -080085 return SkToBool(this->inColor()) == SkToBool(gp.inColor());
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000086}
87
joshualitt56995b52014-12-11 15:44:02 -080088void GrBitmapTextGeoProc::onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const {
egdanielf8449ba2014-11-25 10:24:56 -080089 if (GrPixelConfigIsAlphaOnly(this->texture(0)->config())) {
joshualitt56995b52014-12-11 15:44:02 -080090 out->setUnknownSingleComponent();
egdanielf8449ba2014-11-25 10:24:56 -080091 } else if (GrPixelConfigIsOpaque(this->texture(0)->config())) {
joshualitt56995b52014-12-11 15:44:02 -080092 out->setUnknownOpaqueFourComponents();
93 out->setUsingLCDCoverage();
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000094 } else {
joshualitt56995b52014-12-11 15:44:02 -080095 out->setUnknownFourComponents();
96 out->setUsingLCDCoverage();
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000097 }
98}
99
egdaniel309e3462014-12-09 10:35:58 -0800100void GrBitmapTextGeoProc::getGLProcessorKey(const GrBatchTracker& bt,
101 const GrGLCaps& caps,
102 GrProcessorKeyBuilder* b) const {
103 GrGLBitmapTextGeoProc::GenKey(*this, bt, caps, b);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000104}
105
joshualitteb2a6762014-12-04 11:35:33 -0800106GrGLGeometryProcessor*
egdaniel309e3462014-12-09 10:35:58 -0800107GrBitmapTextGeoProc::createGLInstance(const GrBatchTracker& bt) const {
108 return SkNEW_ARGS(GrGLBitmapTextGeoProc, (*this, bt));
joshualitteb2a6762014-12-04 11:35:33 -0800109}
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000110///////////////////////////////////////////////////////////////////////////////
111
egdaniel309e3462014-12-09 10:35:58 -0800112GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrBitmapTextGeoProc);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000113
egdaniel309e3462014-12-09 10:35:58 -0800114GrGeometryProcessor* GrBitmapTextGeoProc::TestCreate(SkRandom* random,
115 GrContext*,
116 const GrDrawTargetCaps&,
117 GrTexture* textures[]) {
joshualittb0a8a372014-09-23 09:50:21 -0700118 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
joshualitt2e3b3e32014-12-09 13:31:14 -0800132 return GrBitmapTextGeoProc::Create(GrRandomColor(random), textures[texIdx], params,
joshualitt56995b52014-12-11 15:44:02 -0800133 random->nextBool(), random->nextBool());
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000134}