Index: src/gpu/effects/GrBitmapTextGeoProc.cpp |
diff --git a/src/gpu/effects/GrBitmapTextGeoProc.cpp b/src/gpu/effects/GrBitmapTextGeoProc.cpp |
index c93db90a91b1107c8af35ba6b7042b34f648070c..1b393f32a37a063f565b5dcf015c700e427a5402 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 When we have deferred geometry we can fix this |
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); |