Chromium Code Reviews| Index: src/gpu/effects/GrBitmapTextGeoProc.cpp |
| diff --git a/src/gpu/effects/GrBitmapTextGeoProc.cpp b/src/gpu/effects/GrBitmapTextGeoProc.cpp |
| index c93db90a91b1107c8af35ba6b7042b34f648070c..506bc52644a6e4f70447ec56fcfd5d99323aac24 100644 |
| --- a/src/gpu/effects/GrBitmapTextGeoProc.cpp |
| +++ b/src/gpu/effects/GrBitmapTextGeoProc.cpp |
| @@ -14,22 +14,30 @@ |
| #include "gl/GrGLGeometryProcessor.h" |
| #include "gl/builders/GrGLProgramBuilder.h" |
| +struct BitmapTextBatchTracker { |
| + GrGPInput fInputColorType; |
| + GrColor fColor; |
| +}; |
| + |
| class GrGLBitmapTextGeoProc : public GrGLGeometryProcessor { |
| public: |
| - GrGLBitmapTextGeoProc(const GrGeometryProcessor&, const GrBatchTracker&) {} |
| + GrGLBitmapTextGeoProc(const GrGeometryProcessor&, const GrBatchTracker&) |
| + : fColor(GrColor_ILLEGAL) {} |
| virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
| const GrBitmapTextGeoProc& cte = args.fGP.cast<GrBitmapTextGeoProc>(); |
| + const BitmapTextBatchTracker& local = args.fBT.cast<BitmapTextBatchTracker>(); |
| - GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| + GrGLGPBuilder* pb = args.fPB; |
| + GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder(); |
| GrGLVertToFrag v(kVec2f_GrSLType); |
| - args.fPB->addVarying("TextureCoords", &v); |
| + pb->addVarying("TextureCoords", &v); |
| vsBuilder->codeAppendf("%s = %s;", v.vsOut(), cte.inTextureCoords()->fName); |
| - if (cte.inColor()) { |
| - args.fPB->addPassThroughAttribute(cte.inColor(), args.fOutputColor); |
| - } |
| + // Setup pass through color |
| + this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, cte.inColor(), |
| + &fColorUniform); |
| // setup output coords |
| vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), cte.inPosition()->fName); |
| @@ -39,27 +47,41 @@ public: |
| vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), |
| vsBuilder->uViewM(), cte.inPosition()->fName); |
| - GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| + GrGLGPFragmentBuilder* fsBuilder = pb->getFragmentShaderBuilder(); |
| fsBuilder->codeAppendf("%s = ", args.fOutputCoverage); |
| fsBuilder->appendTextureLookup(args.fSamplers[0], v.fsIn(), kVec2f_GrSLType); |
| fsBuilder->codeAppend(";"); |
| } |
| - virtual void setData(const GrGLProgramDataManager&, |
| - const GrGeometryProcessor&, |
| - const GrBatchTracker&) SK_OVERRIDE {} |
| + virtual void setData(const GrGLProgramDataManager& pdman, |
| + const GrPrimitiveProcessor& gp, |
| + const GrBatchTracker& bt) SK_OVERRIDE { |
| + const BitmapTextBatchTracker& local = bt.cast<BitmapTextBatchTracker>(); |
| + if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
| + GrGLfloat c[4]; |
| + GrColorToRGBAFloat(local.fColor, c); |
| + pdman.set4fv(fColorUniform, 1, c); |
| + fColor = local.fColor; |
| + } |
| + } |
| static inline void GenKey(const GrGeometryProcessor& proc, |
| - const GrBatchTracker&, |
| + const GrBatchTracker& bt, |
| const GrGLCaps&, |
| GrProcessorKeyBuilder* b) { |
| + const BitmapTextBatchTracker& local = bt.cast<BitmapTextBatchTracker>(); |
| + // We have to put the optional vertex attribute as part of the key. See the comment |
| + // on addVertexAttrib. |
| + // TODO fix this |
|
bsalomon
2014/12/15 20:45:17
TODO: This requirement goes away with deferred geo
|
| const GrBitmapTextGeoProc& gp = proc.cast<GrBitmapTextGeoProc>(); |
| - |
| b->add32(SkToBool(gp.inColor())); |
| + b->add32(local.fInputColorType); |
| } |
| - |
| private: |
| + GrColor fColor; |
| + UniformHandle fColorUniform; |
| + |
| typedef GrGLGeometryProcessor INHERITED; |
| }; |
| @@ -107,6 +129,20 @@ GrGLGeometryProcessor* |
| GrBitmapTextGeoProc::createGLInstance(const GrBatchTracker& bt) const { |
| return SkNEW_ARGS(GrGLBitmapTextGeoProc, (*this, bt)); |
| } |
| + |
| +void GrBitmapTextGeoProc::initBatchTracker(GrBatchTracker* bt, const InitBT& init) const { |
| + BitmapTextBatchTracker* local = bt->cast<BitmapTextBatchTracker>(); |
| + local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, |
| + SkToBool(fInColor)); |
| +} |
| + |
| +bool GrBitmapTextGeoProc::onCanMakeEqual(const GrBatchTracker& m, const GrBatchTracker& t) const { |
| + const BitmapTextBatchTracker& mine = m.cast<BitmapTextBatchTracker>(); |
| + const BitmapTextBatchTracker& theirs = t.cast<BitmapTextBatchTracker>(); |
| + return CanCombineOutput(mine.fInputColorType, mine.fColor, |
| + theirs.fInputColorType, theirs.fColor); |
| +} |
| + |
| /////////////////////////////////////////////////////////////////////////////// |
| GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrBitmapTextGeoProc); |