18072caa80384292858d31ae34b7e19768875866bjoshualitt/* 28072caa80384292858d31ae34b7e19768875866bjoshualitt * Copyright 2013 Google Inc. 38072caa80384292858d31ae34b7e19768875866bjoshualitt * 48072caa80384292858d31ae34b7e19768875866bjoshualitt * Use of this source code is governed by a BSD-style license that can be 58072caa80384292858d31ae34b7e19768875866bjoshualitt * found in the LICENSE file. 68072caa80384292858d31ae34b7e19768875866bjoshualitt */ 78072caa80384292858d31ae34b7e19768875866bjoshualitt 88072caa80384292858d31ae34b7e19768875866bjoshualitt#ifndef GrPathProcessor_DEFINED 98072caa80384292858d31ae34b7e19768875866bjoshualitt#define GrPathProcessor_DEFINED 108072caa80384292858d31ae34b7e19768875866bjoshualitt 118072caa80384292858d31ae34b7e19768875866bjoshualitt#include "GrPrimitiveProcessor.h" 128072caa80384292858d31ae34b7e19768875866bjoshualitt 138072caa80384292858d31ae34b7e19768875866bjoshualittstruct PathBatchTracker { 148072caa80384292858d31ae34b7e19768875866bjoshualitt GrGPInput fInputColorType; 158072caa80384292858d31ae34b7e19768875866bjoshualitt GrGPInput fInputCoverageType; 168072caa80384292858d31ae34b7e19768875866bjoshualitt GrColor fColor; 178072caa80384292858d31ae34b7e19768875866bjoshualitt bool fUsesLocalCoords; 188072caa80384292858d31ae34b7e19768875866bjoshualitt}; 198072caa80384292858d31ae34b7e19768875866bjoshualitt 208072caa80384292858d31ae34b7e19768875866bjoshualitt/* 218072caa80384292858d31ae34b7e19768875866bjoshualitt * The path equivalent of the GP. For now this just manages color. In the long term we plan on 228072caa80384292858d31ae34b7e19768875866bjoshualitt * extending this class to handle all nvpr uniform / varying / program work. 238072caa80384292858d31ae34b7e19768875866bjoshualitt */ 248072caa80384292858d31ae34b7e19768875866bjoshualittclass GrPathProcessor : public GrPrimitiveProcessor { 258072caa80384292858d31ae34b7e19768875866bjoshualittpublic: 268072caa80384292858d31ae34b7e19768875866bjoshualitt static GrPathProcessor* Create(GrColor color, 278072caa80384292858d31ae34b7e19768875866bjoshualitt const SkMatrix& viewMatrix = SkMatrix::I(), 288072caa80384292858d31ae34b7e19768875866bjoshualitt const SkMatrix& localMatrix = SkMatrix::I()) { 298072caa80384292858d31ae34b7e19768875866bjoshualitt return SkNEW_ARGS(GrPathProcessor, (color, viewMatrix, localMatrix)); 308072caa80384292858d31ae34b7e19768875866bjoshualitt } 318072caa80384292858d31ae34b7e19768875866bjoshualitt 3236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void initBatchTracker(GrBatchTracker*, const GrPipelineInfo&) const override; 338072caa80384292858d31ae34b7e19768875866bjoshualitt 348072caa80384292858d31ae34b7e19768875866bjoshualitt bool canMakeEqual(const GrBatchTracker& mine, 358072caa80384292858d31ae34b7e19768875866bjoshualitt const GrPrimitiveProcessor& that, 3636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const GrBatchTracker& theirs) const override; 378072caa80384292858d31ae34b7e19768875866bjoshualitt 3836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* name() const override { return "PathProcessor"; } 398072caa80384292858d31ae34b7e19768875866bjoshualitt 408072caa80384292858d31ae34b7e19768875866bjoshualitt GrColor color() const { return fColor; } 41e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const SkMatrix& viewMatrix() const { return fViewMatrix; } 42e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const SkMatrix& localMatrix() const { return fLocalMatrix; } 43e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 448072caa80384292858d31ae34b7e19768875866bjoshualitt 4536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void getInvariantOutputColor(GrInitInvariantOutput* out) const override; 4636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void getInvariantOutputCoverage(GrInitInvariantOutput* out) const override; 478072caa80384292858d31ae34b7e19768875866bjoshualitt 4836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool willUseGeoShader() const override { return false; } 498072caa80384292858d31ae34b7e19768875866bjoshualitt 508072caa80384292858d31ae34b7e19768875866bjoshualitt virtual void getGLProcessorKey(const GrBatchTracker& bt, 51cfc18867d982119d9dc2888bf09f1093012daaddjvanverth const GrGLSLCaps& caps, 5236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein GrProcessorKeyBuilder* b) const override; 538072caa80384292858d31ae34b7e19768875866bjoshualitt 548072caa80384292858d31ae34b7e19768875866bjoshualitt virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, 55cfc18867d982119d9dc2888bf09f1093012daaddjvanverth const GrGLSLCaps& caps) const override; 568072caa80384292858d31ae34b7e19768875866bjoshualitt 578072caa80384292858d31ae34b7e19768875866bjoshualittprivate: 58e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt GrPathProcessor(GrColor color, const SkMatrix& viewMatrix, const SkMatrix& localMatrix); 59e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 60e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt /* 61e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt * CanCombineOutput will return true if two draws are 'batchable' from a color perspective. 62e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt * TODO is this really necessary? 63e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt */ 64e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt static bool CanCombineOutput(GrGPInput left, GrColor lColor, GrGPInput right, GrColor rColor) { 65e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt if (left != right) { 66e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt return false; 67e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt } 68e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 69e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt if (kUniform_GrGPInput == left && lColor != rColor) { 70e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt return false; 71e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt } 72e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 73e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt return true; 74e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt } 75e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 76e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt static bool CanCombineLocalMatrices(const GrPrimitiveProcessor& l, 77e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt bool leftUsesLocalCoords, 78e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const GrPrimitiveProcessor& r, 79e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt bool rightUsesLocalCoords) { 80e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt if (leftUsesLocalCoords != rightUsesLocalCoords) { 81e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt return false; 82e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt } 83e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 84e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const GrPathProcessor& left = l.cast<GrPathProcessor>(); 85e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const GrPathProcessor& right = r.cast<GrPathProcessor>(); 86e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt if (leftUsesLocalCoords && !left.localMatrix().cheapEqualTo(right.localMatrix())) { 87e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt return false; 88e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt } 89e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt return true; 90e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt } 91e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 9236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool hasExplicitLocalCoords() const override { return false; } 938072caa80384292858d31ae34b7e19768875866bjoshualitt 948072caa80384292858d31ae34b7e19768875866bjoshualitt GrColor fColor; 95e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const SkMatrix fViewMatrix; 96e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const SkMatrix fLocalMatrix; 978072caa80384292858d31ae34b7e19768875866bjoshualitt 988072caa80384292858d31ae34b7e19768875866bjoshualitt typedef GrPrimitiveProcessor INHERITED; 998072caa80384292858d31ae34b7e19768875866bjoshualitt}; 1008072caa80384292858d31ae34b7e19768875866bjoshualitt 1018072caa80384292858d31ae34b7e19768875866bjoshualitt#endif 102