GrDefaultGeoProcFactory.cpp revision ee2af95db72152dfa61c841875df0594ca93437d
14973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt/*
24973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * Copyright 2014 Google Inc.
34973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt *
44973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * Use of this source code is governed by a BSD-style license that can be
54973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * found in the LICENSE file.
64973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt */
74973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
84973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt#include "GrDefaultGeoProcFactory.h"
94973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
104973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt#include "GrDrawState.h"
11605dd0fbce9dbb2a0d3313e13e161f2bd54870d7egdaniel#include "GrInvariantOutput.h"
122dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt#include "gl/GrGLGeometryProcessor.h"
132dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt#include "gl/builders/GrGLProgramBuilder.h"
144973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
154973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt/*
164973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * The default Geometry Processor simply takes position and multiplies it by the uniform view
174973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * matrix. It also leaves coverage untouched.  Behind the scenes, we may add per vertex color or
184973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * local coords.
194973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt */
202dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitttypedef GrDefaultGeoProcFactory Flag;
212dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt
224973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittclass DefaultGeoProc : public GrGeometryProcessor {
234973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittpublic:
248059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt    static GrGeometryProcessor* Create(uint32_t gpTypeFlags,
258059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       GrColor color,
268059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       const SkMatrix& viewMatrix,
278059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       const SkMatrix& localMatrix,
288059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       bool opaqueVertexColors,
298059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       uint8_t coverage) {
308059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt        return SkNEW_ARGS(DefaultGeoProc, (gpTypeFlags,
318059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                           color,
328059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                           viewMatrix,
338059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                           localMatrix,
348059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                           opaqueVertexColors,
358059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                           coverage));
364973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    }
374973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
38eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt    virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProcessor"; }
394973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
402dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    const GrAttribute* inPosition() const { return fInPosition; }
412dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    const GrAttribute* inColor() const { return fInColor; }
422dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    const GrAttribute* inLocalCoords() const { return fInLocalCoords; }
432dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    const GrAttribute* inCoverage() const { return fInCoverage; }
449b98932adaceb7ad0a617ade16616923f6bffe84joshualitt    uint8_t coverage() const { return fCoverage; }
459b98932adaceb7ad0a617ade16616923f6bffe84joshualitt
469b98932adaceb7ad0a617ade16616923f6bffe84joshualitt    void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE {
479b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        BatchTracker* local = bt->cast<BatchTracker>();
489b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init,
499b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                                                   SkToBool(fInColor));
509b98932adaceb7ad0a617ade16616923f6bffe84joshualitt
519b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        bool hasVertexCoverage = SkToBool(fInCoverage) && !init.fCoverageIgnored;
529b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        bool covIsSolidWhite = !hasVertexCoverage && 0xff == this->coverage();
539b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        if (covIsSolidWhite) {
549b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            local->fInputCoverageType = kAllOnes_GrGPInput;
559b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        } else if (!hasVertexCoverage) {
569b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            local->fInputCoverageType = kUniform_GrGPInput;
579b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            local->fCoverage = this->coverage();
589b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        } else if (hasVertexCoverage) {
599b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            SkASSERT(fInCoverage);
609b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            local->fInputCoverageType = kAttribute_GrGPInput;
619b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        } else {
629b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            local->fInputCoverageType = kIgnored_GrGPInput;
639b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        }
64290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt
65290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt        local->fUsesLocalCoords = init.fUsesLocalCoords;
669b98932adaceb7ad0a617ade16616923f6bffe84joshualitt    }
679b98932adaceb7ad0a617ade16616923f6bffe84joshualitt
68290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt    bool onCanMakeEqual(const GrBatchTracker& m,
69290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt                        const GrGeometryProcessor& that,
70290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt                        const GrBatchTracker& t) const SK_OVERRIDE {
719b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        const BatchTracker& mine = m.cast<BatchTracker>();
729b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        const BatchTracker& theirs = t.cast<BatchTracker>();
73290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt        return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords,
74290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt                                       that, theirs.fUsesLocalCoords) &&
75290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt               CanCombineOutput(mine.fInputColorType, mine.fColor,
769b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                                theirs.fInputColorType, theirs.fColor) &&
779b98932adaceb7ad0a617ade16616923f6bffe84joshualitt               CanCombineOutput(mine.fInputCoverageType, mine.fCoverage,
789b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                                theirs.fInputCoverageType, theirs.fCoverage);
799b98932adaceb7ad0a617ade16616923f6bffe84joshualitt    }
802dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt
814973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    class GLProcessor : public GrGLGeometryProcessor {
824973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    public:
839b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        GLProcessor(const GrGeometryProcessor& gp, const GrBatchTracker&)
849b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            : fColor(GrColor_ILLEGAL), fCoverage(0xff) {}
854973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
864973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt        virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
872dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>();
889b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            GrGLGPBuilder* pb = args.fPB;
899b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            GrGLVertexBuilder* vs = pb->getVertexShaderBuilder();
909b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder();
919b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            const BatchTracker& local = args.fBT.cast<BatchTracker>();
924973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
932dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->fName);
942dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt
952dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            // Setup pass through color
969b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, gp.inColor(),
979b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                                        &fColorUniform);
982dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt
992dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            // Setup local coords if needed
1002dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            if (gp.inLocalCoords()) {
1012dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt                vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords()->fName);
1022dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            } else {
1032dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt                vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()->fName);
1042dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            }
1052dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt
106ee2af95db72152dfa61c841875df0594ca93437djoshualitt            // setup uniform viewMatrix
107ee2af95db72152dfa61c841875df0594ca93437djoshualitt            this->addUniformViewMatrix(pb);
108ee2af95db72152dfa61c841875df0594ca93437djoshualitt
1094973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt            // setup position varying
110ee2af95db72152dfa61c841875df0594ca93437djoshualitt            vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), this->uViewM(),
1112dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt                            gp.inPosition()->fName);
1124973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
1132dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            // Setup coverage as pass through
1149b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            if (kUniform_GrGPInput == local.fInputCoverageType) {
1159b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                const char* fragCoverage;
1169b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
1179b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                                                  kFloat_GrSLType,
1189b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                                                  kDefault_GrSLPrecision,
1199b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                                                  "Coverage",
1209b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                                                  &fragCoverage);
1219b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage);
1229b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            } else if (kAttribute_GrGPInput == local.fInputCoverageType) {
1239b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                SkASSERT(gp.inCoverage());
1249b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                fs->codeAppendf("float alpha = 1.0;");
1252dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt                args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha");
1269b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
1279b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            } else if (kAllOnes_GrGPInput == local.fInputCoverageType) {
1289b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage);
1292dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            }
1304973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt        }
1314973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
13287f48d997ec29e5eeaa7567355775e93465dd60djoshualitt        static inline void GenKey(const GrGeometryProcessor& gp,
1339b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                                  const GrBatchTracker& bt,
13487f48d997ec29e5eeaa7567355775e93465dd60djoshualitt                                  const GrGLCaps&,
13587f48d997ec29e5eeaa7567355775e93465dd60djoshualitt                                  GrProcessorKeyBuilder* b) {
1362dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            const DefaultGeoProc& def = gp.cast<DefaultGeoProc>();
1379b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            const BatchTracker& local = bt.cast<BatchTracker>();
1388fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt            uint32_t key = def.fFlags;
1398fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt            key |= local.fInputColorType << 8 | local.fInputCoverageType << 16;
1408fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt            key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 << 24 : 0x0;
1418fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt            b->add32(key);
1422dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
1434973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
1449b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        virtual void setData(const GrGLProgramDataManager& pdman,
1459b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                             const GrPrimitiveProcessor& gp,
1469b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                             const GrBatchTracker& bt) SK_OVERRIDE {
147ee2af95db72152dfa61c841875df0594ca93437djoshualitt            this->setUniformViewMatrix(pdman, gp.viewMatrix());
148ee2af95db72152dfa61c841875df0594ca93437djoshualitt
1499b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            const BatchTracker& local = bt.cast<BatchTracker>();
1509b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
1519b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                GrGLfloat c[4];
1529b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                GrColorToRGBAFloat(local.fColor, c);
1539b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                pdman.set4fv(fColorUniform, 1, c);
1549b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                fColor = local.fColor;
1559b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            }
1569b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            if (kUniform_GrGPInput == local.fInputCoverageType && local.fCoverage != fCoverage) {
1579b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(local.fCoverage));
1589b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                fCoverage = local.fCoverage;
1599b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            }
1609b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        }
1614973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
1624973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    private:
1639b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        GrColor fColor;
1649b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        uint8_t fCoverage;
1659b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        UniformHandle fColorUniform;
1669b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        UniformHandle fCoverageUniform;
1679b98932adaceb7ad0a617ade16616923f6bffe84joshualitt
1684973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt        typedef GrGLGeometryProcessor INHERITED;
1694973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    };
1704973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
171eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt    virtual void getGLProcessorKey(const GrBatchTracker& bt,
172eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt                                   const GrGLCaps& caps,
173eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt                                   GrProcessorKeyBuilder* b) const SK_OVERRIDE {
174eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt        GLProcessor::GenKey(*this, bt, caps, b);
175eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt    }
176eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt
177eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt    virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE {
178eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt        return SkNEW_ARGS(GLProcessor, (*this, bt));
179eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt    }
180eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt
1814973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittprivate:
1828059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt    DefaultGeoProc(uint32_t gpTypeFlags,
1838059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                   GrColor color,
1848059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                   const SkMatrix& viewMatrix,
1858059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                   const SkMatrix& localMatrix,
1868059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                   bool opaqueVertexColors,
1878059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                   uint8_t coverage)
1888059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt        : INHERITED(color, viewMatrix, localMatrix, opaqueVertexColors)
1892e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt        , fInPosition(NULL)
1902dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        , fInColor(NULL)
1912dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        , fInLocalCoords(NULL)
1922dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        , fInCoverage(NULL)
1939b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        , fCoverage(coverage)
1942dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        , fFlags(gpTypeFlags) {
195eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt        this->initClassID<DefaultGeoProc>();
1962dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        bool hasColor = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kColor_GPType);
1972dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        bool hasLocalCoord = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kLocalCoord_GPType);
1982dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        bool hasCoverage = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kCoverage_GPType);
1992dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
2002dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        if (hasColor) {
2012dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVertexAttribType));
2022dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            this->setHasVertexColor();
2032dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
2042dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        if (hasLocalCoord) {
2052dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            fInLocalCoords = &this->addVertexAttrib(GrAttribute("inLocalCoord",
2062dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt                                                                kVec2f_GrVertexAttribType));
2072dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            this->setHasLocalCoords();
2082dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
2092dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        if (hasCoverage) {
2102dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            fInCoverage = &this->addVertexAttrib(GrAttribute("inCoverage",
2112dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt                                                             kFloat_GrVertexAttribType));
2122dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
2132dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    }
2144973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
2154973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE {
2162dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        const DefaultGeoProc& gp = other.cast<DefaultGeoProc>();
2172dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        return gp.fFlags == this->fFlags;
2184973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    }
2194973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
22056995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt    virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE {
2212dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        if (fInCoverage) {
22256995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt            out->setUnknownSingleComponent();
2235478d427c6e67c986a3390162c8fec77c466058ajoshualitt        } else {
22456995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt            // uniform coverage
22556995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt            out->setKnownSingleComponent(this->coverage());
2265478d427c6e67c986a3390162c8fec77c466058ajoshualitt        }
2274973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    }
2284973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
2299b98932adaceb7ad0a617ade16616923f6bffe84joshualitt    struct BatchTracker {
2309b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        GrGPInput fInputColorType;
2319b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        GrGPInput fInputCoverageType;
2329b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        GrColor  fColor;
2339b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        GrColor  fCoverage;
234290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt        bool fUsesLocalCoords;
2359b98932adaceb7ad0a617ade16616923f6bffe84joshualitt    };
2369b98932adaceb7ad0a617ade16616923f6bffe84joshualitt
2372dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    const GrAttribute* fInPosition;
2382dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    const GrAttribute* fInColor;
2392dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    const GrAttribute* fInLocalCoords;
2402dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    const GrAttribute* fInCoverage;
2419b98932adaceb7ad0a617ade16616923f6bffe84joshualitt    uint8_t fCoverage;
2422dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    uint32_t fFlags;
2434973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
2442dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
2455478d427c6e67c986a3390162c8fec77c466058ajoshualitt
2462e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt    typedef GrGeometryProcessor INHERITED;
2474973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt};
2484973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
2494973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittGR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc);
2504973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
2514973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittGrGeometryProcessor* DefaultGeoProc::TestCreate(SkRandom* random,
2524973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt                                                GrContext*,
2534973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt                                                const GrDrawTargetCaps& caps,
2544973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt                                                GrTexture*[]) {
2552dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    uint32_t flags = 0;
2562dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    if (random->nextBool()) {
2572dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        flags |= GrDefaultGeoProcFactory::kColor_GPType;
2584973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    }
2592dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    if (random->nextBool()) {
2602dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        flags |= GrDefaultGeoProcFactory::kCoverage_GPType;
2612dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    }
2622dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    if (random->nextBool()) {
2632dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType;
2644973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    }
2655478d427c6e67c986a3390162c8fec77c466058ajoshualitt
2668059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt    return DefaultGeoProc::Create(flags,
2678059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                  GrRandomColor(random),
2688059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                  GrProcessorUnitTest::TestMatrix(random),
2698059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                  GrProcessorUnitTest::TestMatrix(random),
2708059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                  random->nextBool(),
2718059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                  GrRandomCoverage(random));
2725478d427c6e67c986a3390162c8fec77c466058ajoshualitt}
2735478d427c6e67c986a3390162c8fec77c466058ajoshualitt
2748059eb9f6e24ed609393fbda4ad71edea03ac258joshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::Create(uint32_t gpTypeFlags,
2758059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                                           GrColor color,
2768059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                                           const SkMatrix& viewMatrix,
2778059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                                           const SkMatrix& localMatrix,
27856995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt                                                           bool opaqueVertexColors,
2798059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                                           uint8_t coverage) {
2808059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt    return DefaultGeoProc::Create(gpTypeFlags,
2818059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                  color,
2828059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                  viewMatrix,
2838059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                  localMatrix,
2848059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                  opaqueVertexColors,
2858059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                  coverage);
2864973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt}
287