GrDefaultGeoProcFactory.cpp revision 4ca2e6034365ad280ec64473f7f1d72ebd8335e4
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"
112d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel#include "glsl/GrGLSLFragmentShaderBuilder.h"
12e659a581f63fdccb64dce2dc8a478cf56831feeaegdaniel#include "glsl/GrGLSLGeometryProcessor.h"
132d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel#include "glsl/GrGLSLProgramBuilder.h"
142d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel#include "glsl/GrGLSLVertexShaderBuilder.h"
1564c4728c70001ed074fecf5c4e083781987b12e9egdaniel#include "glsl/GrGLSLUtil.h"
164973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
174973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt/*
184973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * The default Geometry Processor simply takes position and multiplies it by the uniform view
194973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * matrix. It also leaves coverage untouched.  Behind the scenes, we may add per vertex color or
204973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * local coords.
214973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt */
22b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt
23b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualittenum GPFlag {
24b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt    kColor_GPFlag =                 0x1,
25b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt    kLocalCoord_GPFlag =            0x2,
26b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt    kCoverage_GPFlag=               0x4,
27b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt    kTransformedLocalCoord_GPFlag = 0x8,
28b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt};
29b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt
304973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittclass DefaultGeoProc : public GrGeometryProcessor {
314973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittpublic:
328059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt    static GrGeometryProcessor* Create(uint32_t gpTypeFlags,
338059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       GrColor color,
348059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       const SkMatrix& viewMatrix,
358059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       const SkMatrix& localMatrix,
367765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                                       bool localCoordsWillBeRead,
377765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                                       bool coverageWillBeIgnored,
388059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                                       uint8_t coverage) {
39385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary        return new DefaultGeoProc(gpTypeFlags, color, viewMatrix, localMatrix, coverage,
40385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary                                  localCoordsWillBeRead, coverageWillBeIgnored);
414973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    }
424973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
4336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* name() const override { return "DefaultGeometryProcessor"; }
444973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
4571c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* inPosition() const { return fInPosition; }
4671c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* inColor() const { return fInColor; }
4771c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* inLocalCoords() const { return fInLocalCoords; }
4871c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* inCoverage() const { return fInCoverage; }
4988c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt    GrColor color() const { return fColor; }
50b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt    bool colorIgnored() const { return GrColor_ILLEGAL == fColor; }
51b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt    bool hasVertexColor() const { return SkToBool(fInColor); }
52e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt    const SkMatrix& viewMatrix() const { return fViewMatrix; }
53e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt    const SkMatrix& localMatrix() const { return fLocalMatrix; }
547765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon    bool localCoordsWillBeRead() const { return fLocalCoordsWillBeRead; }
559b98932adaceb7ad0a617ade16616923f6bffe84joshualitt    uint8_t coverage() const { return fCoverage; }
567765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon    bool coverageWillBeIgnored() const { return fCoverageWillBeIgnored; }
57b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt    bool hasVertexCoverage() const { return SkToBool(fInCoverage); }
589b98932adaceb7ad0a617ade16616923f6bffe84joshualitt
5957d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel    class GLSLProcessor : public GrGLSLGeometryProcessor {
604973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    public:
6157d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel        GLSLProcessor()
625559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt            : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage(0xff) {}
634973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
6436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein        void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override {
652dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>();
668dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel            GrGLSLGPBuilder* pb = args.fPB;
674ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel            GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
684ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel            GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
694973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
70abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt            // emit attributes
714ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel            vertBuilder->emitAttributes(gp);
722dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt
732dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            // Setup pass through color
74b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            if (!gp.colorIgnored()) {
75b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                if (gp.hasVertexColor()) {
76b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    pb->addPassThroughAttribute(gp.inColor(), args.fOutputColor);
77b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                } else {
784ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                    this->setupUniformColor(pb, fragBuilder, args.fOutputColor, &fColorUniform);
79b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                }
80b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            }
81b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt
82abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt            // Setup position
834ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel            this->setupPosition(pb,
844ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                vertBuilder,
854ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                gpArgs,
864ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                gp.inPosition()->fName,
874ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                gp.viewMatrix(),
885559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt                                &fViewMatrixUniform);
894973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
90b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt            if (gp.hasExplicitLocalCoords()) {
91abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt                // emit transforms with explicit local coords
924ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                this->emitTransforms(pb,
934ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     vertBuilder,
944ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     gpArgs->fPositionVar,
954ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     gp.inLocalCoords()->fName,
964ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     gp.localMatrix(),
974ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     args.fTransformsIn,
984ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     args.fTransformsOut);
99b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt            } else if(gp.hasTransformedLocalCoords()) {
100b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt                // transforms have already been applied to vertex attributes on the cpu
1014ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                this->emitTransforms(pb,
1024ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     vertBuilder,
1034ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     gp.inLocalCoords()->fName,
1044ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     args.fTransformsIn,
1054ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     args.fTransformsOut);
106abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt            } else {
107abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt                // emit transforms with position
1084ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                this->emitTransforms(pb,
1094ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     vertBuilder,
1104ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     gpArgs->fPositionVar,
1114ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     gp.inPosition()->fName,
1124ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     gp.localMatrix(),
1134ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     args.fTransformsIn,
1144ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                                     args.fTransformsOut);
115abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt            }
116abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt
1172dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            // Setup coverage as pass through
1187765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon            if (!gp.coverageWillBeIgnored()) {
119b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                if (gp.hasVertexCoverage()) {
1204ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                    fragBuilder->codeAppendf("float alpha = 1.0;");
121b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha");
1224ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                    fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
123b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                } else if (gp.coverage() == 0xff) {
1244ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                    fragBuilder->codeAppendf("%s = vec4(1);", args.fOutputCoverage);
125b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                } else {
126b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                    const char* fragCoverage;
1272d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel                    fCoverageUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
128b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                                                      kFloat_GrSLType,
129b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                                                      kDefault_GrSLPrecision,
130b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                                                      "Coverage",
131b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                                                      &fragCoverage);
1324ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel                    fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage);
133b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                }
1342dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            }
1354973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt        }
1364973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
13787f48d997ec29e5eeaa7567355775e93465dd60djoshualitt        static inline void GenKey(const GrGeometryProcessor& gp,
138cfc18867d982119d9dc2888bf09f1093012daaddjvanverth                                  const GrGLSLCaps&,
13987f48d997ec29e5eeaa7567355775e93465dd60djoshualitt                                  GrProcessorKeyBuilder* b) {
1402dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt            const DefaultGeoProc& def = gp.cast<DefaultGeoProc>();
1418fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt            uint32_t key = def.fFlags;
142b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            key |= def.colorIgnored() << 8;
1437765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon            key |= def.coverageWillBeIgnored() << 9;
144b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            key |= def.hasVertexColor() << 10;
145b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            key |= def.hasVertexCoverage() << 11;
146b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            key |= def.coverage() == 0xff ? 0x1 << 12 : 0;
1477765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon            key |= def.localCoordsWillBeRead() && def.localMatrix().hasPerspective() ? 0x1 << 24 :
1487765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                                                                                       0x0;
149e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt            key |= ComputePosKey(def.viewMatrix()) << 25;
1508fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt            b->add32(key);
1512dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
1524973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
153018fb62d12d1febf121fe265da5b6117b86a6541egdaniel        void setData(const GrGLSLProgramDataManager& pdman,
154018fb62d12d1febf121fe265da5b6117b86a6541egdaniel                     const GrPrimitiveProcessor& gp) override {
155e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt            const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>();
1565559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt
1575559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt            if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) {
1585559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt                fViewMatrix = dgp.viewMatrix();
159018fb62d12d1febf121fe265da5b6117b86a6541egdaniel                float viewMatrix[3 * 3];
16064c4728c70001ed074fecf5c4e083781987b12e9egdaniel                GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
1615559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt                pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
1625559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt            }
163ee2af95db72152dfa61c841875df0594ca93437djoshualitt
164b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt            if (dgp.color() != fColor && !dgp.hasVertexColor()) {
165018fb62d12d1febf121fe265da5b6117b86a6541egdaniel                float c[4];
166b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                GrColorToRGBAFloat(dgp.color(), c);
1679b98932adaceb7ad0a617ade16616923f6bffe84joshualitt                pdman.set4fv(fColorUniform, 1, c);
168b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                fColor = dgp.color();
1699b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            }
170b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt
1717765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon            if (!dgp.coverageWillBeIgnored() &&
1727765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) {
173b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage()));
174b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                fCoverage = dgp.coverage();
1759b98932adaceb7ad0a617ade16616923f6bffe84joshualitt            }
1769b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        }
1774973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
178e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt        void setTransformData(const GrPrimitiveProcessor& primProc,
179018fb62d12d1febf121fe265da5b6117b86a6541egdaniel                              const GrGLSLProgramDataManager& pdman,
180e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt                              int index,
181e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt                              const SkTArray<const GrCoordTransform*, true>& transforms) override {
182e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt            this->setTransformDataHelper<DefaultGeoProc>(primProc, pdman, index, transforms);
183e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt        }
184e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt
1854973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    private:
1865559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt        SkMatrix fViewMatrix;
1879b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        GrColor fColor;
1889b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        uint8_t fCoverage;
1895559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt        UniformHandle fViewMatrixUniform;
1909b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        UniformHandle fColorUniform;
1919b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        UniformHandle fCoverageUniform;
1929b98932adaceb7ad0a617ade16616923f6bffe84joshualitt
193e659a581f63fdccb64dce2dc8a478cf56831feeaegdaniel        typedef GrGLSLGeometryProcessor INHERITED;
1944973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    };
1954973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
19657d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel    void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override {
19757d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel        GLSLProcessor::GenKey(*this, caps, b);
198eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt    }
199eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt
20057d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel    GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const override {
20157d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel        return new GLSLProcessor();
202eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt    }
203eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt
2044973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittprivate:
2058059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt    DefaultGeoProc(uint32_t gpTypeFlags,
2068059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                   GrColor color,
2078059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                   const SkMatrix& viewMatrix,
2088059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                   const SkMatrix& localMatrix,
209b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                   uint8_t coverage,
2107765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                   bool localCoordsWillBeRead,
2117765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                   bool coverageWillBeIgnored)
21296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        : fInPosition(nullptr)
21396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        , fInColor(nullptr)
21496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        , fInLocalCoords(nullptr)
21596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        , fInCoverage(nullptr)
21688c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt        , fColor(color)
217e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt        , fViewMatrix(viewMatrix)
218e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt        , fLocalMatrix(localMatrix)
2199b98932adaceb7ad0a617ade16616923f6bffe84joshualitt        , fCoverage(coverage)
220b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt        , fFlags(gpTypeFlags)
2217765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon        , fLocalCoordsWillBeRead(localCoordsWillBeRead)
2227765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon        , fCoverageWillBeIgnored(coverageWillBeIgnored) {
223eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt        this->initClassID<DefaultGeoProc>();
224b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt        bool hasColor = SkToBool(gpTypeFlags & kColor_GPFlag);
225b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt        bool hasExplicitLocalCoords = SkToBool(gpTypeFlags & kLocalCoord_GPFlag);
226b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt        bool hasTransformedLocalCoords = SkToBool(gpTypeFlags & kTransformedLocalCoord_GPFlag);
227b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt        bool hasLocalCoord = hasExplicitLocalCoords || hasTransformedLocalCoords;
228b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt        bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPFlag);
229f2539d50f911914af0f80f0092ff8c654869e650senorblanco        fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
230f2539d50f911914af0f80f0092ff8c654869e650senorblanco                                                       kHigh_GrSLPrecision));
2312dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        if (hasColor) {
23271c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt            fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType));
2332dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
2342dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        if (hasLocalCoord) {
23571c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt            fInLocalCoords = &this->addVertexAttrib(Attribute("inLocalCoord",
236b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt                                                              kVec2f_GrVertexAttribType));
237b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt            if (hasExplicitLocalCoords) {
238b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt                this->setHasExplicitLocalCoords();
239b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt            } else {
240b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt                SkASSERT(hasTransformedLocalCoords);
241b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt                this->setHasTransformedLocalCoords();
242b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt            }
2432dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
2442dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        if (hasCoverage) {
24571c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt            fInCoverage = &this->addVertexAttrib(Attribute("inCoverage",
2467765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon                                                           kFloat_GrVertexAttribType));
2472dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt        }
2482dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    }
2494973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
25071c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* fInPosition;
25171c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* fInColor;
25271c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* fInLocalCoords;
25371c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt    const Attribute* fInCoverage;
25488c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt    GrColor fColor;
255e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt    SkMatrix fViewMatrix;
256e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt    SkMatrix fLocalMatrix;
2579b98932adaceb7ad0a617ade16616923f6bffe84joshualitt    uint8_t fCoverage;
2582dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    uint32_t fFlags;
2597765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon    bool fLocalCoordsWillBeRead;
2607765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon    bool fCoverageWillBeIgnored;
2614973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
2622dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
2635478d427c6e67c986a3390162c8fec77c466058ajoshualitt
2642e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt    typedef GrGeometryProcessor INHERITED;
2654973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt};
2664973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
2674973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittGR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc);
2684973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt
269c21b09eec91c9e263cb0b88467ea44e348ed4962bsalomonconst GrGeometryProcessor* DefaultGeoProc::TestCreate(GrProcessorTestData* d) {
2702dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    uint32_t flags = 0;
2710067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt    if (d->fRandom->nextBool()) {
272b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt        flags |= kColor_GPFlag;
273b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt    }
274b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt    if (d->fRandom->nextBool()) {
275b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt        flags |= kCoverage_GPFlag;
2764973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    }
2770067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt    if (d->fRandom->nextBool()) {
278b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt        flags |= kLocalCoord_GPFlag;
2792dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt    }
2800067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt    if (d->fRandom->nextBool()) {
281b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt        flags |= kTransformedLocalCoord_GPFlag;
2824973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt    }
2835478d427c6e67c986a3390162c8fec77c466058ajoshualitt
2848059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt    return DefaultGeoProc::Create(flags,
2850067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  GrRandomColor(d->fRandom),
2860067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  GrTest::TestMatrix(d->fRandom),
2870067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  GrTest::TestMatrix(d->fRandom),
2880067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  d->fRandom->nextBool(),
2890067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  d->fRandom->nextBool(),
2900067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt                                  GrRandomCoverage(d->fRandom));
2915478d427c6e67c986a3390162c8fec77c466058ajoshualitt}
2925478d427c6e67c986a3390162c8fec77c466058ajoshualitt
293e9d6095674979a9b843c291b85746922e9ac181ajoshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::Create(const Color& color,
294e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                                           const Coverage& coverage,
2950d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                           const LocalCoords& localCoords,
2960d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                           const SkMatrix& viewMatrix) {
297e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    uint32_t flags = 0;
298b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt    flags |= color.fType == Color::kAttribute_Type ? kColor_GPFlag : 0;
299b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt    flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPFlag : 0;
300b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt    flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_GPFlag : 0;
301b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt    flags |= localCoords.fType == LocalCoords::kHasTransformed_Type ?
302b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt                                  kTransformedLocalCoord_GPFlag : 0;
303e9d6095674979a9b843c291b85746922e9ac181ajoshualitt
304e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    uint8_t inCoverage = coverage.fCoverage;
305e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    bool coverageWillBeIgnored = coverage.fType == Coverage::kNone_Type;
3060d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt    bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type;
307e9d6095674979a9b843c291b85746922e9ac181ajoshualitt
308e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    GrColor inColor = color.fColor;
309e9d6095674979a9b843c291b85746922e9ac181ajoshualitt    return DefaultGeoProc::Create(flags,
310e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                  inColor,
311e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                  viewMatrix,
3120d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                  localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(),
313e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                  localCoordsWillBeRead,
314e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                  coverageWillBeIgnored,
315e9d6095674979a9b843c291b85746922e9ac181ajoshualitt                                  inCoverage);
316e9d6095674979a9b843c291b85746922e9ac181ajoshualitt}
3170d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt
3180d986d877edae36ad7dc6fbdbc69a56ca9372702joshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::CreateForDeviceSpace(
3190d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                                     const Color& color,
3200d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                                     const Coverage& coverage,
3210d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                                     const LocalCoords& localCoords,
3220d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt                                                                     const SkMatrix& viewMatrix) {
3230d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt    SkMatrix invert = SkMatrix::I();
324df0c55785033c191d2d509c22662861588e4acd8joshualitt    if (LocalCoords::kUnused_Type != localCoords.fType) {
325df0c55785033c191d2d509c22662861588e4acd8joshualitt        SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType);
326df0c55785033c191d2d509c22662861588e4acd8joshualitt        if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) {
327df0c55785033c191d2d509c22662861588e4acd8joshualitt            SkDebugf("Could not invert\n");
32896fcdcc219d2a0d3579719b84b28bede76efba64halcanary            return nullptr;
329df0c55785033c191d2d509c22662861588e4acd8joshualitt        }
3300d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt
331df0c55785033c191d2d509c22662861588e4acd8joshualitt        if (localCoords.hasLocalMatrix()) {
332df0c55785033c191d2d509c22662861588e4acd8joshualitt            invert.preConcat(*localCoords.fMatrix);
333df0c55785033c191d2d509c22662861588e4acd8joshualitt        }
3340d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt    }
3350d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt
3360d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt    LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert);
337df0c55785033c191d2d509c22662861588e4acd8joshualitt    return Create(color, coverage, inverted, SkMatrix::I());
3380d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt}
339