GrDefaultGeoProcFactory.cpp revision df0c55785033c191d2d509c22662861588e4acd8
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
10605dd0fbce9dbb2a0d3313e13e161f2bd54870d7egdaniel#include "GrInvariantOutput.h"
112dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt#include "gl/GrGLGeometryProcessor.h"
122dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt#include "gl/builders/GrGLProgramBuilder.h"
134973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
144973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt/*
154973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * The default Geometry Processor simply takes position and multiplies it by the uniform view
164973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * matrix. It also leaves coverage untouched.  Behind the scenes, we may add per vertex color or
174973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * local coords.
184973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt */
194973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittclass DefaultGeoProc : public GrGeometryProcessor {
204973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittpublic:
218059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt    static GrGeometryProcessor* Create(uint32_t gpTypeFlags,
228059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       GrColor color,
238059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       const SkMatrix& viewMatrix,
248059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       const SkMatrix& localMatrix,
257765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                                       bool localCoordsWillBeRead,
267765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                                       bool coverageWillBeIgnored,
278059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       uint8_t coverage) {
288059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt        return SkNEW_ARGS(DefaultGeoProc, (gpTypeFlags,
298059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                           color,
308059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                           viewMatrix,
318059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                           localMatrix,
32b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                                           coverage,
337765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                                           localCoordsWillBeRead,
347765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                                           coverageWillBeIgnored));
354973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    }
364973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
3736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* name() const override { return "DefaultGeometryProcessor"; }
384973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
3971c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* inPosition() const { return fInPosition; }
4071c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* inColor() const { return fInColor; }
4171c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* inLocalCoords() const { return fInLocalCoords; }
4271c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* inCoverage() const { return fInCoverage; }
4388c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt    GrColor color() const { return fColor; }
44b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt    bool colorIgnored() const { return GrColor_ILLEGAL == fColor; }
45b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt    bool hasVertexColor() const { return SkToBool(fInColor); }
46e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt    const SkMatrix& viewMatrix() const { return fViewMatrix; }
47e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt    const SkMatrix& localMatrix() const { return fLocalMatrix; }
487765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon    bool localCoordsWillBeRead() const { return fLocalCoordsWillBeRead; }
499b98932adaceb7ad0a617ade16616923f6bffe84joshualitt    uint8_t coverage() const { return fCoverage; }
507765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon    bool coverageWillBeIgnored() const { return fCoverageWillBeIgnored; }
51b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt    bool hasVertexCoverage() const { return SkToBool(fInCoverage); }
529b98932adaceb7ad0a617ade16616923f6bffe84joshualitt
534973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    class GLProcessor : public GrGLGeometryProcessor {
544973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    public:
559b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        GLProcessor(const GrGeometryProcessor& gp, const GrBatchTracker&)
565559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt            : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage(0xff) {}
574973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
5836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein        void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override {
592dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>();
609b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            GrGLGPBuilder* pb = args.fPB;
6146d36f0e7b709a077c647841eee23bd3efdc4117robertphillips            GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder();
6229bee0fe657fabf7c396502b69c9167fba13eaaaegdaniel            GrGLFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder();
634973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
64abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt            // emit attributes
6546d36f0e7b709a077c647841eee23bd3efdc4117robertphillips            vsBuilder->emitAttributes(gp);
662dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt
672dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            // Setup pass through color
68b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            if (!gp.colorIgnored()) {
69b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                if (gp.hasVertexColor()) {
70b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    pb->addPassThroughAttribute(gp.inColor(), args.fOutputColor);
71b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                } else {
72b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
73b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                }
74b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            }
75b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt
76abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt            // Setup position
775559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt            this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(),
785559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt                                &fViewMatrixUniform);
794973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
80abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt            if (gp.inLocalCoords()) {
81abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt                // emit transforms with explicit local coords
8246d36f0e7b709a077c647841eee23bd3efdc4117robertphillips                this->emitTransforms(pb, gpArgs->fPositionVar, gp.inLocalCoords()->fName,
83abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt                                     gp.localMatrix(), args.fTransformsIn, args.fTransformsOut);
84abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt            } else {
85abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt                // emit transforms with position
8646d36f0e7b709a077c647841eee23bd3efdc4117robertphillips                this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName,
87abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt                                     gp.localMatrix(), args.fTransformsIn, args.fTransformsOut);
88abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt            }
89abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt
902dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            // Setup coverage as pass through
917765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon            if (!gp.coverageWillBeIgnored()) {
92b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                if (gp.hasVertexCoverage()) {
93b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    fs->codeAppendf("float alpha = 1.0;");
94b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha");
95b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
96b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                } else if (gp.coverage() == 0xff) {
97b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage);
98b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                } else {
99b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    const char* fragCoverage;
100b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
101b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                                                      kFloat_GrSLType,
102b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                                                      kDefault_GrSLPrecision,
103b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                                                      "Coverage",
104b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                                                      &fragCoverage);
105b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage);
106b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                }
1072dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            }
1084973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt        }
1094973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
11087f48d997ec29e5eeaa7567355775e93465dd60djoshualitt        static inline void GenKey(const GrGeometryProcessor& gp,
1119b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                                  const GrBatchTracker& bt,
112cfc18867d982119d9dc2888bf09f1093012daaddjvanverth                                  const GrGLSLCaps&,
11387f48d997ec29e5eeaa7567355775e93465dd60djoshualitt                                  GrProcessorKeyBuilder* b) {
1142dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            const DefaultGeoProc& def = gp.cast<DefaultGeoProc>();
1158fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt            uint32_t key = def.fFlags;
116b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            key |= def.colorIgnored() << 8;
1177765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon            key |= def.coverageWillBeIgnored() << 9;
118b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            key |= def.hasVertexColor() << 10;
119b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            key |= def.hasVertexCoverage() << 11;
120b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            key |= def.coverage() == 0xff ? 0x1 << 12 : 0;
1217765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon            key |= def.localCoordsWillBeRead() && def.localMatrix().hasPerspective() ? 0x1 << 24 :
1227765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                                                                                       0x0;
123e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt            key |= ComputePosKey(def.viewMatrix()) << 25;
1248fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt            b->add32(key);
1252dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
1264973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
1279b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        virtual void setData(const GrGLProgramDataManager& pdman,
1289b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                             const GrPrimitiveProcessor& gp,
12936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                             const GrBatchTracker& bt) override {
130e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt            const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>();
1315559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt
1325559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt            if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) {
1335559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt                fViewMatrix = dgp.viewMatrix();
1345559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt                GrGLfloat viewMatrix[3 * 3];
1355559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt                GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
1365559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt                pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
1375559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt            }
138ee2af95db72152dfa61c841875df0594ca93437djoshualitt
139b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            if (dgp.color() != fColor && !dgp.hasVertexColor()) {
1409b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                GrGLfloat c[4];
141b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                GrColorToRGBAFloat(dgp.color(), c);
1429b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                pdman.set4fv(fColorUniform, 1, c);
143b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                fColor = dgp.color();
1449b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            }
145b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt
1467765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon            if (!dgp.coverageWillBeIgnored() &&
1477765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) {
148b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage()));
149b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                fCoverage = dgp.coverage();
1509b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            }
1519b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        }
1524973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
153e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt        void setTransformData(const GrPrimitiveProcessor& primProc,
154e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt                              const GrGLProgramDataManager& pdman,
155e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt                              int index,
156e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt                              const SkTArray<const GrCoordTransform*, true>& transforms) override {
157e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt            this->setTransformDataHelper<DefaultGeoProc>(primProc, pdman, index, transforms);
158e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt        }
159e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt
1604973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    private:
1615559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt        SkMatrix fViewMatrix;
1629b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        GrColor fColor;
1639b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        uint8_t fCoverage;
1645559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt        UniformHandle fViewMatrixUniform;
1659b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        UniformHandle fColorUniform;
1669b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        UniformHandle fCoverageUniform;
1679b98932adaceb7ad0a617ade16616923f6bffe84joshualitt
1684973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt        typedef GrGLGeometryProcessor INHERITED;
1694973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    };
1704973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
171eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt    virtual void getGLProcessorKey(const GrBatchTracker& bt,
172cfc18867d982119d9dc2888bf09f1093012daaddjvanverth                                   const GrGLSLCaps& caps,
17336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                                   GrProcessorKeyBuilder* b) const override {
174eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt        GLProcessor::GenKey(*this, bt, caps, b);
175eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt    }
176eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt
177abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt    virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt,
178cfc18867d982119d9dc2888bf09f1093012daaddjvanverth                                                     const GrGLSLCaps&) const override {
179eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt        return SkNEW_ARGS(GLProcessor, (*this, bt));
180eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt    }
181eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt
1824973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittprivate:
1838059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt    DefaultGeoProc(uint32_t gpTypeFlags,
1848059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                   GrColor color,
1858059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                   const SkMatrix& viewMatrix,
1868059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                   const SkMatrix& localMatrix,
187b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                   uint8_t coverage,
1887765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                   bool localCoordsWillBeRead,
1897765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                   bool coverageWillBeIgnored)
190e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt        : fInPosition(NULL)
1912dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        , fInColor(NULL)
1922dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        , fInLocalCoords(NULL)
1932dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        , fInCoverage(NULL)
19488c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt        , fColor(color)
195e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt        , fViewMatrix(viewMatrix)
196e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt        , fLocalMatrix(localMatrix)
1979b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        , fCoverage(coverage)
198b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt        , fFlags(gpTypeFlags)
1997765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon        , fLocalCoordsWillBeRead(localCoordsWillBeRead)
2007765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon        , fCoverageWillBeIgnored(coverageWillBeIgnored) {
201eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt        this->initClassID<DefaultGeoProc>();
2022dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        bool hasColor = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kColor_GPType);
2032dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        bool hasLocalCoord = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kLocalCoord_GPType);
2042dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        bool hasCoverage = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kCoverage_GPType);
205f2539d50f911914af0f80f0092ff8c654869e650senorblanco        fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
206f2539d50f911914af0f80f0092ff8c654869e650senorblanco                                                       kHigh_GrSLPrecision));
2072dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        if (hasColor) {
20871c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt            fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType));
2092dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
2102dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        if (hasLocalCoord) {
21171c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt            fInLocalCoords = &this->addVertexAttrib(Attribute("inLocalCoord",
212b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                                                              kVec2f_GrVertexAttribType));
2132dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            this->setHasLocalCoords();
2142dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
2152dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        if (hasCoverage) {
21671c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt            fInCoverage = &this->addVertexAttrib(Attribute("inCoverage",
2177765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                                                           kFloat_GrVertexAttribType));
2182dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
2192dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    }
2204973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
22171c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* fInPosition;
22271c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* fInColor;
22371c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* fInLocalCoords;
22471c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* fInCoverage;
22588c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt    GrColor fColor;
226e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt    SkMatrix fViewMatrix;
227e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt    SkMatrix fLocalMatrix;
2289b98932adaceb7ad0a617ade16616923f6bffe84joshualitt    uint8_t fCoverage;
2292dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    uint32_t fFlags;
2307765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon    bool fLocalCoordsWillBeRead;
2317765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon    bool fCoverageWillBeIgnored;
2324973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
2332dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
2345478d427c6e67c986a3390162c8fec77c466058ajoshualitt
2352e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt    typedef GrGeometryProcessor INHERITED;
2364973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt};
2374973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
2384973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittGR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc);
2394973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
2400067ff5e0f85084dd2b5ad9886b526482b89a116joshualittGrGeometryProcessor* DefaultGeoProc::TestCreate(GrProcessorTestData* d) {
2412dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    uint32_t flags = 0;
2420067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt    if (d->fRandom->nextBool()) {
2432dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        flags |= GrDefaultGeoProcFactory::kColor_GPType;
2444973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    }
2450067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt    if (d->fRandom->nextBool()) {
2462dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        flags |= GrDefaultGeoProcFactory::kCoverage_GPType;
2472dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    }
2480067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt    if (d->fRandom->nextBool()) {
2492dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType;
2504973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    }
2515478d427c6e67c986a3390162c8fec77c466058ajoshualitt
2528059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt    return DefaultGeoProc::Create(flags,
2530067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  GrRandomColor(d->fRandom),
2540067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  GrTest::TestMatrix(d->fRandom),
2550067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  GrTest::TestMatrix(d->fRandom),
2560067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  d->fRandom->nextBool(),
2570067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  d->fRandom->nextBool(),
2580067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  GrRandomCoverage(d->fRandom));
2595478d427c6e67c986a3390162c8fec77c466058ajoshualitt}
2605478d427c6e67c986a3390162c8fec77c466058ajoshualitt
261e9d6095674979a9b843c291b85746922e9ac181ajoshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::Create(const Color& color,
262e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                                           const Coverage& coverage,
2630d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                           const LocalCoords& localCoords,
2640d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                           const SkMatrix& viewMatrix) {
265e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    uint32_t flags = 0;
266e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    flags |= color.fType == Color::kAttribute_Type ? kColor_GPType : 0;
267e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPType : 0;
2680d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt    flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_GPType : 0;
269e9d6095674979a9b843c291b85746922e9ac181ajoshualitt
270e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    uint8_t inCoverage = coverage.fCoverage;
271e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    bool coverageWillBeIgnored = coverage.fType == Coverage::kNone_Type;
2720d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt    bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type;
273e9d6095674979a9b843c291b85746922e9ac181ajoshualitt
274e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    GrColor inColor = color.fColor;
275e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    return DefaultGeoProc::Create(flags,
276e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                  inColor,
277e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                  viewMatrix,
2780d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                  localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(),
279e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                  localCoordsWillBeRead,
280e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                  coverageWillBeIgnored,
281e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                  inCoverage);
282e9d6095674979a9b843c291b85746922e9ac181ajoshualitt}
2830d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt
2840d986d877edae36ad7dc6fbdbc69a56ca9372702joshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::CreateForDeviceSpace(
2850d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                                     const Color& color,
2860d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                                     const Coverage& coverage,
2870d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                                     const LocalCoords& localCoords,
2880d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                                     const SkMatrix& viewMatrix) {
2890d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt    SkMatrix invert = SkMatrix::I();
290df0c55785033c191d2d509c22662861588e4acd8joshualitt    if (LocalCoords::kUnused_Type != localCoords.fType) {
291df0c55785033c191d2d509c22662861588e4acd8joshualitt        SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType);
292df0c55785033c191d2d509c22662861588e4acd8joshualitt        if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) {
293df0c55785033c191d2d509c22662861588e4acd8joshualitt            SkDebugf("Could not invert\n");
294df0c55785033c191d2d509c22662861588e4acd8joshualitt            return NULL;
295df0c55785033c191d2d509c22662861588e4acd8joshualitt        }
2960d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt
297df0c55785033c191d2d509c22662861588e4acd8joshualitt        if (localCoords.hasLocalMatrix()) {
298df0c55785033c191d2d509c22662861588e4acd8joshualitt            invert.preConcat(*localCoords.fMatrix);
299df0c55785033c191d2d509c22662861588e4acd8joshualitt        }
3000d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt    }
3010d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt
3020d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt    LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert);
303df0c55785033c191d2d509c22662861588e4acd8joshualitt    return Create(color, coverage, inverted, SkMatrix::I());
3040d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt}
305