blob: 6eaaf306cba65cd5b8a7ba415b47f5555c97ca6f [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
egdaniel309e3462014-12-09 10:35:58 -080068GrBitmapTextGeoProc::GrBitmapTextGeoProc(GrTexture* texture, const GrTextureParams& params,
69 bool useColorAttrib)
joshualitt2dd1ae02014-12-03 06:24:10 -080070 : fTextureAccess(texture, params), fInColor(NULL) {
egdaniel309e3462014-12-09 10:35:58 -080071 this->initClassID<GrBitmapTextGeoProc>();
joshualitt2dd1ae02014-12-03 06:24:10 -080072 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
egdaniel309e3462014-12-09 10:35:58 -080073 if (useColorAttrib) {
joshualitt2dd1ae02014-12-03 06:24:10 -080074 fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVertexAttribType));
75 this->setHasVertexColor();
76 }
77 fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords",
78 kVec2f_GrVertexAttribType));
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000079 this->addTextureAccess(&fTextureAccess);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000080}
81
egdaniel309e3462014-12-09 10:35:58 -080082bool GrBitmapTextGeoProc::onIsEqual(const GrGeometryProcessor& other) const {
83 const GrBitmapTextGeoProc& gp = other.cast<GrBitmapTextGeoProc>();
joshualitt2dd1ae02014-12-03 06:24:10 -080084 return SkToBool(this->inColor()) == SkToBool(gp.inColor());
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000085}
86
egdaniel309e3462014-12-09 10:35:58 -080087void GrBitmapTextGeoProc::onComputeInvariantOutput(GrInvariantOutput* inout) const {
egdanielf8449ba2014-11-25 10:24:56 -080088 if (GrPixelConfigIsAlphaOnly(this->texture(0)->config())) {
89 inout->mulByUnknownAlpha();
90 } else if (GrPixelConfigIsOpaque(this->texture(0)->config())) {
egdanielccb2e382014-10-13 12:53:46 -070091 inout->mulByUnknownOpaqueColor();
egdaniel309e3462014-12-09 10:35:58 -080092 inout->setUsingLCDCoverage();
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000093 } else {
egdanielccb2e382014-10-13 12:53:46 -070094 inout->mulByUnknownColor();
egdaniel309e3462014-12-09 10:35:58 -080095 inout->setUsingLCDCoverage();
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +000096 }
97}
98
egdaniel309e3462014-12-09 10:35:58 -080099void GrBitmapTextGeoProc::getGLProcessorKey(const GrBatchTracker& bt,
100 const GrGLCaps& caps,
101 GrProcessorKeyBuilder* b) const {
102 GrGLBitmapTextGeoProc::GenKey(*this, bt, caps, b);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000103}
104
joshualitteb2a6762014-12-04 11:35:33 -0800105GrGLGeometryProcessor*
egdaniel309e3462014-12-09 10:35:58 -0800106GrBitmapTextGeoProc::createGLInstance(const GrBatchTracker& bt) const {
107 return SkNEW_ARGS(GrGLBitmapTextGeoProc, (*this, bt));
joshualitteb2a6762014-12-04 11:35:33 -0800108}
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000109///////////////////////////////////////////////////////////////////////////////
110
egdaniel309e3462014-12-09 10:35:58 -0800111GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrBitmapTextGeoProc);
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000112
egdaniel309e3462014-12-09 10:35:58 -0800113GrGeometryProcessor* GrBitmapTextGeoProc::TestCreate(SkRandom* random,
114 GrContext*,
115 const GrDrawTargetCaps&,
116 GrTexture* textures[]) {
joshualittb0a8a372014-09-23 09:50:21 -0700117 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
118 GrProcessorUnitTest::kAlphaTextureIdx;
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000119 static const SkShader::TileMode kTileModes[] = {
120 SkShader::kClamp_TileMode,
121 SkShader::kRepeat_TileMode,
122 SkShader::kMirror_TileMode,
123 };
124 SkShader::TileMode tileModes[] = {
125 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
126 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
127 };
128 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBilerp_FilterMode :
129 GrTextureParams::kNone_FilterMode);
130
egdaniel309e3462014-12-09 10:35:58 -0800131 return GrBitmapTextGeoProc::Create(textures[texIdx], params, random->nextBool());
commit-bot@chromium.org76eaf742013-09-30 18:41:38 +0000132}