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