GrDefaultGeoProcFactory.cpp revision a624bf3d1cb454c1959c5bbbf23a3afdfa3481f3
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright 2014 Google Inc.
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Use of this source code is governed by a BSD-style license that can be
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * found in the LICENSE file.
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "GrDefaultGeoProcFactory.h"
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "GrInvariantOutput.h"
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkRefCnt.h"
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLFragmentShaderBuilder.h"
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLGeometryProcessor.h"
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLVertexShaderBuilder.h"
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLVarying.h"
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLUniformHandler.h"
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLUtil.h"
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * The default Geometry Processor simply takes position and multiplies it by the uniform view
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * matrix. It also leaves coverage untouched.  Behind the scenes, we may add per vertex color or
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * local coords.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum GPFlag {
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    kColor_GPFlag =                 0x1,
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    kLocalCoord_GPFlag =            0x2,
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    kCoverage_GPFlag=               0x4,
29258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov};
30cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass DefaultGeoProc : public GrGeometryProcessor {
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectpublic:
338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson    static sk_sp<GrGeometryProcessor> Make(uint32_t gpTypeFlags,
348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson                                             GrColor color,
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             const SkMatrix& viewMatrix,
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             const SkMatrix& localMatrix,
37cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                             bool localCoordsWillBeRead,
38cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                             bool coverageWillBeIgnored,
39cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                             uint8_t coverage) {
40cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        return sk_sp<GrGeometryProcessor>(new DefaultGeoProc(
41cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                gpTypeFlags, color, viewMatrix, localMatrix, coverage,
42cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                localCoordsWillBeRead, coverageWillBeIgnored));
43cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
44cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
45cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    const char* name() const override { return "DefaultGeometryProcessor"; }
46cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
47cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    const Attribute* inPosition() const { return fInPosition; }
48cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    const Attribute* inColor() const { return fInColor; }
49cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    const Attribute* inLocalCoords() const { return fInLocalCoords; }
50cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    const Attribute* inCoverage() const { return fInCoverage; }
51cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    GrColor color() const { return fColor; }
52cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bool colorIgnored() const { return GrColor_ILLEGAL == fColor; }
53cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bool hasVertexColor() const { return SkToBool(fInColor); }
54cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    const SkMatrix& viewMatrix() const { return fViewMatrix; }
55cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    const SkMatrix& localMatrix() const { return fLocalMatrix; }
56cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bool localCoordsWillBeRead() const { return fLocalCoordsWillBeRead; }
57cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    uint8_t coverage() const { return fCoverage; }
58cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bool coverageWillBeIgnored() const { return fCoverageWillBeIgnored; }
59cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bool hasVertexCoverage() const { return SkToBool(fInCoverage); }
60cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
61cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    class GLSLProcessor : public GrGLSLGeometryProcessor {
62cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    public:
63cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        GLSLProcessor()
64cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage(0xff) {}
65cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override {
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>();
68cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
69cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
72cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
73cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            // emit attributes
74cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            varyingHandler->emitAttributes(gp);
75cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
76cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            // Setup pass through color
77cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            if (!gp.colorIgnored()) {
78cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                if (gp.hasVertexColor()) {
79cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    varyingHandler->addPassThroughAttribute(gp.inColor(), args.fOutputColor);
80cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                } else {
81cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
82cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                            &fColorUniform);
83cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                }
84cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            }
85cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
86cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            // Setup position
87cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            this->setupPosition(vertBuilder,
88cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                uniformHandler,
89cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                gpArgs,
90cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                gp.inPosition()->fName,
91cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                gp.viewMatrix(),
92cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                &fViewMatrixUniform);
93cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
94cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            if (gp.hasExplicitLocalCoords()) {
95cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                // emit transforms with explicit local coords
96cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                this->emitTransforms(vertBuilder,
97cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     varyingHandler,
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     uniformHandler,
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     gpArgs->fPositionVar,
100cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     gp.inLocalCoords()->fName,
101cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     gp.localMatrix(),
102cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     args.fFPCoordTransformHandler);
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            } else {
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                // emit transforms with position
105cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                this->emitTransforms(vertBuilder,
106cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     varyingHandler,
107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     uniformHandler,
108cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     gpArgs->fPositionVar,
109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     gp.inPosition()->fName,
110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     gp.localMatrix(),
111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                     args.fFPCoordTransformHandler);
112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            }
113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            // Setup coverage as pass through
115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            if (!gp.coverageWillBeIgnored()) {
116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                if (gp.hasVertexCoverage()) {
117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    fragBuilder->codeAppendf("float alpha = 1.0;");
118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    varyingHandler->addPassThroughAttribute(gp.inCoverage(), "alpha");
119cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                } else if (gp.coverage() == 0xff) {
121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    fragBuilder->codeAppendf("%s = vec4(1);", args.fOutputCoverage);
122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                } else {
123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    const char* fragCoverage;
124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    fCoverageUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                                  kFloat_GrSLType,
126cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                                  kDefault_GrSLPrecision,
127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                                  "Coverage",
128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                                  &fragCoverage);
129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                    fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage);
130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                }
131cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            }
132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        }
133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
134cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        static inline void GenKey(const GrGeometryProcessor& gp,
135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                  const GrGLSLCaps&,
136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                  GrProcessorKeyBuilder* b) {
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            const DefaultGeoProc& def = gp.cast<DefaultGeoProc>();
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            uint32_t key = def.fFlags;
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            key |= def.colorIgnored() << 8;
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            key |= def.coverageWillBeIgnored() << 9;
141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            key |= def.hasVertexColor() << 10;
142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            key |= def.hasVertexCoverage() << 11;
143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            key |= def.coverage() == 0xff ? 0x1 << 12 : 0;
144cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            key |= def.localCoordsWillBeRead() && def.localMatrix().hasPerspective() ? 0x1 << 24 :
145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                                                       0x0;
146cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            key |= ComputePosKey(def.viewMatrix()) << 25;
147cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            b->add32(key);
148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        }
149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        void setData(const GrGLSLProgramDataManager& pdman,
151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     const GrPrimitiveProcessor& gp,
152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     FPCoordTransformIter&& transformIter) override {
153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>();
154cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) {
156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                fViewMatrix = dgp.viewMatrix();
157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                float viewMatrix[3 * 3];
158cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
159cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
160cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            }
161cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
162cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            if (dgp.color() != fColor && !dgp.hasVertexColor()) {
163cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                float c[4];
164cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                GrColorToRGBAFloat(dgp.color(), c);
165cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                pdman.set4fv(fColorUniform, 1, c);
166cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                fColor = dgp.color();
167cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            }
168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            if (!dgp.coverageWillBeIgnored() &&
170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) {
171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage()));
172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                fCoverage = dgp.coverage();
173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            }
174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            this->setTransformDataHelper(dgp.fLocalMatrix, pdman, &transformIter);
175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        }
176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    private:
178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        SkMatrix fViewMatrix;
179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        GrColor fColor;
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        uint8_t fCoverage;
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UniformHandle fViewMatrixUniform;
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UniformHandle fColorUniform;
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UniformHandle fCoverageUniform;
184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        typedef GrGLSLGeometryProcessor INHERITED;
186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    };
187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
188cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override {
189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        GLSLProcessor::GenKey(*this, caps, b);
190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const override {
193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        return new GLSLProcessor();
194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonprivate:
197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    DefaultGeoProc(uint32_t gpTypeFlags,
198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   GrColor color,
199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   const SkMatrix& viewMatrix,
200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   const SkMatrix& localMatrix,
201cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   uint8_t coverage,
202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   bool localCoordsWillBeRead,
203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   bool coverageWillBeIgnored)
204cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        : fInPosition(nullptr)
205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        , fInColor(nullptr)
206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        , fInLocalCoords(nullptr)
207cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        , fInCoverage(nullptr)
208cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        , fColor(color)
209cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        , fViewMatrix(viewMatrix)
210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        , fLocalMatrix(localMatrix)
211cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        , fCoverage(coverage)
212cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        , fFlags(gpTypeFlags)
213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        , fLocalCoordsWillBeRead(localCoordsWillBeRead)
214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        , fCoverageWillBeIgnored(coverageWillBeIgnored) {
215cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        this->initClassID<DefaultGeoProc>();
216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bool hasColor = SkToBool(gpTypeFlags & kColor_GPFlag);
217cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bool hasExplicitLocalCoords = SkToBool(gpTypeFlags & kLocalCoord_GPFlag);
218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPFlag);
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             kHigh_GrSLPrecision);
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (hasColor) {
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribType);
223cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        }
224cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        if (hasExplicitLocalCoords) {
225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            fInLocalCoords = &this->addVertexAttrib("inLocalCoord", kVec2f_GrVertexAttribType);
226cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            this->setHasExplicitLocalCoords();
227cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        }
228cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        if (hasCoverage) {
229cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            fInCoverage = &this->addVertexAttrib("inCoverage", kFloat_GrVertexAttribType);
230cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        }
231cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
232cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
233cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    const Attribute* fInPosition;
234cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    const Attribute* fInColor;
235cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    const Attribute* fInLocalCoords;
236cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    const Attribute* fInCoverage;
237cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    GrColor fColor;
238cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    SkMatrix fViewMatrix;
239cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    SkMatrix fLocalMatrix;
240cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    uint8_t fCoverage;
241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    uint32_t fFlags;
242cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bool fLocalCoordsWillBeRead;
243cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bool fCoverageWillBeIgnored;
244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
247cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    typedef GrGeometryProcessor INHERITED;
248cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson};
249cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
250cd1fd07f1306e08fe048682dd5918987e579f937Myles WatsonGR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc);
251cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
252cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonsk_sp<GrGeometryProcessor> DefaultGeoProc::TestCreate(GrProcessorTestData* d) {
253cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    uint32_t flags = 0;
254cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (d->fRandom->nextBool()) {
255cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        flags |= kColor_GPFlag;
256cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
257cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (d->fRandom->nextBool()) {
258cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        flags |= kCoverage_GPFlag;
259cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
260cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (d->fRandom->nextBool()) {
261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        flags |= kLocalCoord_GPFlag;
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return DefaultGeoProc::Make(flags,
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                GrRandomColor(d->fRandom),
266e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen                                GrTest::TestMatrix(d->fRandom),
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                GrTest::TestMatrix(d->fRandom),
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                d->fRandom->nextBool(),
269cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                d->fRandom->nextBool(),
270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                GrRandomCoverage(d->fRandom));
271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson}
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectsk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::Make(const Color& color,
2748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson                                                         const Coverage& coverage,
2758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson                                                         const LocalCoords& localCoords,
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                         const SkMatrix& viewMatrix) {
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uint32_t flags = 0;
278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    flags |= color.fType == Color::kAttribute_Type ? kColor_GPFlag : 0;
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPFlag : 0;
280e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_GPFlag : 0;
281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    uint8_t inCoverage = coverage.fCoverage;
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bool coverageWillBeIgnored = coverage.fType == Coverage::kNone_Type;
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type;
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson    GrColor inColor = color.fColor;
2878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson    return DefaultGeoProc::Make(flags,
2888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson                                inColor,
2898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson                                viewMatrix,
2908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson                                localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(),
2918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson                                localCoordsWillBeRead,
292cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                coverageWillBeIgnored,
2931baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson                                inCoverage);
2948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson}
2958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson
296cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonsk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::MakeForDeviceSpace(
297cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                                     const Color& color,
298cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                                     const Coverage& coverage,
299cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                                     const LocalCoords& localCoords,
300cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                                                     const SkMatrix& viewMatrix) {
301cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    SkMatrix invert = SkMatrix::I();
302e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    if (LocalCoords::kUnused_Type != localCoords.fType) {
303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType);
304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) {
305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            SkDebugf("Could not invert\n");
306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            return nullptr;
307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        }
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (localCoords.hasLocalMatrix()) {
310cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            invert.preConcat(*localCoords.fMatrix);
311cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        }
312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
313cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
314cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert);
315cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return Make(color, coverage, inverted, SkMatrix::I());
316cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson}
317cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson