1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef GrDrawVerticesOp_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrDrawVerticesOp_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrColor.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrMeshDrawOp.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrRenderTargetContext.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrSimpleMeshDrawOpHelper.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrTypes.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkMatrix.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRect.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTDArray.h"
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkVertices.h"
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrOpFlushState;
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkVertices;
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct GrInitInvariantOutput;
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrDrawVerticesOp final : public GrMeshDrawOp {
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    using Helper = GrSimpleMeshDrawOpHelper;
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    DEFINE_OP_CLASS_ID
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Draw a SkVertices. The GrPaint param's color is used if the vertices lack per-vertex color.
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * If the vertices lack local coords then the vertex positions are used as local coords. The
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * primitive type drawn is derived from the SkVertices object, unless overridePrimType is
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * specified. If gammaCorrect is true, the vertex colors will be linearized in the shader to get
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * correct rendering.
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static std::unique_ptr<GrDrawOp> Make(GrPaint&&, sk_sp<SkVertices>, const SkMatrix& viewMatrix,
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                          GrAAType, bool gammaCorrect, sk_sp<GrColorSpaceXform>,
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                          GrPrimitiveType* overridePrimType = nullptr);
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrDrawVerticesOp(const Helper::MakeArgs& helperArgs, GrColor, sk_sp<SkVertices>,
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     GrPrimitiveType, GrAAType, bool gammaCorrect, sk_sp<GrColorSpaceXform>,
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const SkMatrix& viewMatrix);
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* name() const override { return "DrawVerticesOp"; }
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void visitProxies(const VisitProxyFunc& func) const override {
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fHelper.visitProxies(func);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString dumpInfo() const override;
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    FixedFunctionFlags fixedFunctionFlags() const override;
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    RequiresDstTexture finalize(const GrCaps& caps, const GrAppliedClip* clip,
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                GrPixelConfigIsClamped dstIsClamped) override;
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum class ColorArrayType {
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kPremulGrColor,
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kSkColor,
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onPrepareDraws(Target*) override;
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrGeometryProcessor> makeGP(bool* hasColorAttribute, bool* hasLocalCoordAttribute) const;
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrPrimitiveType primitiveType() const { return fPrimitiveType; }
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool combinablePrimitive() const {
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return GrPrimitiveType::kTriangles == fPrimitiveType ||
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot               GrPrimitiveType::kLines == fPrimitiveType ||
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot               GrPrimitiveType::kPoints == fPrimitiveType;
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool onCombineIfPossible(GrOp* t, const GrCaps&) override;
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    struct Mesh {
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrColor fColor;  // Used if this->hasPerVertexColors() is false.
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<SkVertices> fVertices;
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkMatrix fViewMatrix;
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bool fIgnoreTexCoords;
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bool fIgnoreColors;
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bool hasExplicitLocalCoords() const {
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return fVertices->hasTexCoords() && !fIgnoreTexCoords;
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bool hasPerVertexColors() const {
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return fVertices->hasColors() && !fIgnoreColors;
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isIndexed() const {
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Consistency enforced in onCombineIfPossible.
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fMeshes[0].fVertices->hasIndices();
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool requiresPerVertexColors() const {
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkToBool(kRequiresPerVertexColors_Flag & fFlags);
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool anyMeshHasExplicitLocalCoords() const {
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkToBool(kAnyMeshHasExplicitLocalCoords & fFlags);
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool hasMultipleViewMatrices() const {
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkToBool(kHasMultipleViewMatrices_Flag & fFlags);
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum Flags {
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kRequiresPerVertexColors_Flag = 0x1,
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kAnyMeshHasExplicitLocalCoords = 0x2,
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kHasMultipleViewMatrices_Flag = 0x4
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Helper fHelper;
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkSTArray<1, Mesh, true> fMeshes;
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // GrPrimitiveType is more expressive than fVertices.mode() so it is used instead and we ignore
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // the SkVertices mode (though fPrimitiveType may have been inferred from it).
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrPrimitiveType fPrimitiveType;
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint32_t fFlags;
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int fVertexCount;
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int fIndexCount;
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ColorArrayType fColorArrayType;
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fLinearizeColors;
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrColorSpaceXform> fColorSpaceXform;
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef GrMeshDrawOp INHERITED;
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
135