GrDefaultGeoProcFactory.cpp revision ee2af95db72152dfa61c841875df0594ca93437d
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 104973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt#include "GrDrawState.h" 11605dd0fbce9dbb2a0d3313e13e161f2bd54870d7egdaniel#include "GrInvariantOutput.h" 122dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt#include "gl/GrGLGeometryProcessor.h" 132dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt#include "gl/builders/GrGLProgramBuilder.h" 144973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 154973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt/* 164973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * The default Geometry Processor simply takes position and multiplies it by the uniform view 174973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * matrix. It also leaves coverage untouched. Behind the scenes, we may add per vertex color or 184973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * local coords. 194973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt */ 202dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitttypedef GrDefaultGeoProcFactory Flag; 212dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt 224973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittclass DefaultGeoProc : public GrGeometryProcessor { 234973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittpublic: 248059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt static GrGeometryProcessor* Create(uint32_t gpTypeFlags, 258059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrColor color, 268059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 278059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& localMatrix, 288059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt bool opaqueVertexColors, 298059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt uint8_t coverage) { 308059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt return SkNEW_ARGS(DefaultGeoProc, (gpTypeFlags, 318059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt color, 328059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt viewMatrix, 338059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt localMatrix, 348059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt opaqueVertexColors, 358059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt coverage)); 364973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 374973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 38eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProcessor"; } 394973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 402dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const GrAttribute* inPosition() const { return fInPosition; } 412dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const GrAttribute* inColor() const { return fInColor; } 422dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const GrAttribute* inLocalCoords() const { return fInLocalCoords; } 432dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const GrAttribute* inCoverage() const { return fInCoverage; } 449b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t coverage() const { return fCoverage; } 459b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 469b98932adaceb7ad0a617ade16616923f6bffe84joshualitt void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE { 479b98932adaceb7ad0a617ade16616923f6bffe84joshualitt BatchTracker* local = bt->cast<BatchTracker>(); 489b98932adaceb7ad0a617ade16616923f6bffe84joshualitt local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, 499b98932adaceb7ad0a617ade16616923f6bffe84joshualitt SkToBool(fInColor)); 509b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 519b98932adaceb7ad0a617ade16616923f6bffe84joshualitt bool hasVertexCoverage = SkToBool(fInCoverage) && !init.fCoverageIgnored; 529b98932adaceb7ad0a617ade16616923f6bffe84joshualitt bool covIsSolidWhite = !hasVertexCoverage && 0xff == this->coverage(); 539b98932adaceb7ad0a617ade16616923f6bffe84joshualitt if (covIsSolidWhite) { 549b98932adaceb7ad0a617ade16616923f6bffe84joshualitt local->fInputCoverageType = kAllOnes_GrGPInput; 559b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } else if (!hasVertexCoverage) { 569b98932adaceb7ad0a617ade16616923f6bffe84joshualitt local->fInputCoverageType = kUniform_GrGPInput; 579b98932adaceb7ad0a617ade16616923f6bffe84joshualitt local->fCoverage = this->coverage(); 589b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } else if (hasVertexCoverage) { 599b98932adaceb7ad0a617ade16616923f6bffe84joshualitt SkASSERT(fInCoverage); 609b98932adaceb7ad0a617ade16616923f6bffe84joshualitt local->fInputCoverageType = kAttribute_GrGPInput; 619b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } else { 629b98932adaceb7ad0a617ade16616923f6bffe84joshualitt local->fInputCoverageType = kIgnored_GrGPInput; 639b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 64290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt 65290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt local->fUsesLocalCoords = init.fUsesLocalCoords; 669b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 679b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 68290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt bool onCanMakeEqual(const GrBatchTracker& m, 69290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt const GrGeometryProcessor& that, 70290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt const GrBatchTracker& t) const SK_OVERRIDE { 719b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const BatchTracker& mine = m.cast<BatchTracker>(); 729b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const BatchTracker& theirs = t.cast<BatchTracker>(); 73290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, 74290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt that, theirs.fUsesLocalCoords) && 75290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt CanCombineOutput(mine.fInputColorType, mine.fColor, 769b98932adaceb7ad0a617ade16616923f6bffe84joshualitt theirs.fInputColorType, theirs.fColor) && 779b98932adaceb7ad0a617ade16616923f6bffe84joshualitt CanCombineOutput(mine.fInputCoverageType, mine.fCoverage, 789b98932adaceb7ad0a617ade16616923f6bffe84joshualitt theirs.fInputCoverageType, theirs.fCoverage); 799b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 802dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt 814973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt class GLProcessor : public GrGLGeometryProcessor { 824973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt public: 839b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GLProcessor(const GrGeometryProcessor& gp, const GrBatchTracker&) 849b98932adaceb7ad0a617ade16616923f6bffe84joshualitt : fColor(GrColor_ILLEGAL), fCoverage(0xff) {} 854973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 864973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { 872dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); 889b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrGLGPBuilder* pb = args.fPB; 899b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrGLVertexBuilder* vs = pb->getVertexShaderBuilder(); 909b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); 919b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const BatchTracker& local = args.fBT.cast<BatchTracker>(); 924973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 932dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->fName); 942dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt 952dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup pass through color 969b98932adaceb7ad0a617ade16616923f6bffe84joshualitt this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, gp.inColor(), 979b98932adaceb7ad0a617ade16616923f6bffe84joshualitt &fColorUniform); 982dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt 992dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup local coords if needed 1002dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (gp.inLocalCoords()) { 1012dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords()->fName); 1022dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } else { 1032dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()->fName); 1042dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1052dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt 106ee2af95db72152dfa61c841875df0594ca93437djoshualitt // setup uniform viewMatrix 107ee2af95db72152dfa61c841875df0594ca93437djoshualitt this->addUniformViewMatrix(pb); 108ee2af95db72152dfa61c841875df0594ca93437djoshualitt 1094973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt // setup position varying 110ee2af95db72152dfa61c841875df0594ca93437djoshualitt vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), this->uViewM(), 1112dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt gp.inPosition()->fName); 1124973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 1132dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup coverage as pass through 1149b98932adaceb7ad0a617ade16616923f6bffe84joshualitt if (kUniform_GrGPInput == local.fInputCoverageType) { 1159b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const char* fragCoverage; 1169b98932adaceb7ad0a617ade16616923f6bffe84joshualitt fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, 1179b98932adaceb7ad0a617ade16616923f6bffe84joshualitt kFloat_GrSLType, 1189b98932adaceb7ad0a617ade16616923f6bffe84joshualitt kDefault_GrSLPrecision, 1199b98932adaceb7ad0a617ade16616923f6bffe84joshualitt "Coverage", 1209b98932adaceb7ad0a617ade16616923f6bffe84joshualitt &fragCoverage); 1219b98932adaceb7ad0a617ade16616923f6bffe84joshualitt fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage); 1229b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } else if (kAttribute_GrGPInput == local.fInputCoverageType) { 1239b98932adaceb7ad0a617ade16616923f6bffe84joshualitt SkASSERT(gp.inCoverage()); 1249b98932adaceb7ad0a617ade16616923f6bffe84joshualitt fs->codeAppendf("float alpha = 1.0;"); 1252dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); 1269b98932adaceb7ad0a617ade16616923f6bffe84joshualitt fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); 1279b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } else if (kAllOnes_GrGPInput == local.fInputCoverageType) { 1289b98932adaceb7ad0a617ade16616923f6bffe84joshualitt fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); 1292dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1304973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 1314973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 13287f48d997ec29e5eeaa7567355775e93465dd60djoshualitt static inline void GenKey(const GrGeometryProcessor& gp, 1339b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const GrBatchTracker& bt, 13487f48d997ec29e5eeaa7567355775e93465dd60djoshualitt const GrGLCaps&, 13587f48d997ec29e5eeaa7567355775e93465dd60djoshualitt GrProcessorKeyBuilder* b) { 1362dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); 1379b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const BatchTracker& local = bt.cast<BatchTracker>(); 1388fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt uint32_t key = def.fFlags; 1398fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt key |= local.fInputColorType << 8 | local.fInputCoverageType << 16; 1408fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1 << 24 : 0x0; 1418fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt b->add32(key); 1422dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1434973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 1449b98932adaceb7ad0a617ade16616923f6bffe84joshualitt virtual void setData(const GrGLProgramDataManager& pdman, 1459b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const GrPrimitiveProcessor& gp, 1469b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const GrBatchTracker& bt) SK_OVERRIDE { 147ee2af95db72152dfa61c841875df0594ca93437djoshualitt this->setUniformViewMatrix(pdman, gp.viewMatrix()); 148ee2af95db72152dfa61c841875df0594ca93437djoshualitt 1499b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const BatchTracker& local = bt.cast<BatchTracker>(); 1509b98932adaceb7ad0a617ade16616923f6bffe84joshualitt if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { 1519b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrGLfloat c[4]; 1529b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrColorToRGBAFloat(local.fColor, c); 1539b98932adaceb7ad0a617ade16616923f6bffe84joshualitt pdman.set4fv(fColorUniform, 1, c); 1549b98932adaceb7ad0a617ade16616923f6bffe84joshualitt fColor = local.fColor; 1559b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 1569b98932adaceb7ad0a617ade16616923f6bffe84joshualitt if (kUniform_GrGPInput == local.fInputCoverageType && local.fCoverage != fCoverage) { 1579b98932adaceb7ad0a617ade16616923f6bffe84joshualitt pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(local.fCoverage)); 1589b98932adaceb7ad0a617ade16616923f6bffe84joshualitt fCoverage = local.fCoverage; 1599b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 1609b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 1614973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 1624973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt private: 1639b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrColor fColor; 1649b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 1659b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fColorUniform; 1669b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fCoverageUniform; 1679b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 1684973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt typedef GrGLGeometryProcessor INHERITED; 1694973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt }; 1704973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 171eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt virtual void getGLProcessorKey(const GrBatchTracker& bt, 172eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt const GrGLCaps& caps, 173eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt GrProcessorKeyBuilder* b) const SK_OVERRIDE { 174eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt GLProcessor::GenKey(*this, bt, caps, b); 175eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 176eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 177eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE { 178eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt return SkNEW_ARGS(GLProcessor, (*this, bt)); 179eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 180eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 1814973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittprivate: 1828059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt DefaultGeoProc(uint32_t gpTypeFlags, 1838059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrColor color, 1848059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 1858059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& localMatrix, 1868059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt bool opaqueVertexColors, 1878059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt uint8_t coverage) 1888059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt : INHERITED(color, viewMatrix, localMatrix, opaqueVertexColors) 1892e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt , fInPosition(NULL) 1902dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt , fInColor(NULL) 1912dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt , fInLocalCoords(NULL) 1922dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt , fInCoverage(NULL) 1939b98932adaceb7ad0a617ade16616923f6bffe84joshualitt , fCoverage(coverage) 1942dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt , fFlags(gpTypeFlags) { 195eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt this->initClassID<DefaultGeoProc>(); 1962dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt bool hasColor = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kColor_GPType); 1972dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt bool hasLocalCoord = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kLocalCoord_GPType); 1982dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt bool hasCoverage = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kCoverage_GPType); 1992dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType)); 2002dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasColor) { 2012dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVertexAttribType)); 2022dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt this->setHasVertexColor(); 2032dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2042dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasLocalCoord) { 2052dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt fInLocalCoords = &this->addVertexAttrib(GrAttribute("inLocalCoord", 2062dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt kVec2f_GrVertexAttribType)); 2072dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt this->setHasLocalCoords(); 2082dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2092dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasCoverage) { 2102dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt fInCoverage = &this->addVertexAttrib(GrAttribute("inCoverage", 2112dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt kFloat_GrVertexAttribType)); 2122dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2132dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2144973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2154973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { 2162dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& gp = other.cast<DefaultGeoProc>(); 2172dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt return gp.fFlags == this->fFlags; 2184973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2194973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 22056995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE { 2212dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (fInCoverage) { 22256995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt out->setUnknownSingleComponent(); 2235478d427c6e67c986a3390162c8fec77c466058ajoshualitt } else { 22456995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt // uniform coverage 22556995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt out->setKnownSingleComponent(this->coverage()); 2265478d427c6e67c986a3390162c8fec77c466058ajoshualitt } 2274973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2284973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2299b98932adaceb7ad0a617ade16616923f6bffe84joshualitt struct BatchTracker { 2309b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrGPInput fInputColorType; 2319b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrGPInput fInputCoverageType; 2329b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrColor fColor; 2339b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrColor fCoverage; 234290c09b8bbd8d221d363150e2ce87158f4668df0joshualitt bool fUsesLocalCoords; 2359b98932adaceb7ad0a617ade16616923f6bffe84joshualitt }; 2369b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 2372dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const GrAttribute* fInPosition; 2382dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const GrAttribute* fInColor; 2392dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const GrAttribute* fInLocalCoords; 2402dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const GrAttribute* fInCoverage; 2419b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 2422dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t fFlags; 2434973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2442dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 2455478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2462e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt typedef GrGeometryProcessor INHERITED; 2474973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt}; 2484973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2494973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittGR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc); 2504973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2514973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittGrGeometryProcessor* DefaultGeoProc::TestCreate(SkRandom* random, 2524973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt GrContext*, 2534973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt const GrDrawTargetCaps& caps, 2544973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt GrTexture*[]) { 2552dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t flags = 0; 2562dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (random->nextBool()) { 2572dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt flags |= GrDefaultGeoProcFactory::kColor_GPType; 2584973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2592dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (random->nextBool()) { 2602dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt flags |= GrDefaultGeoProcFactory::kCoverage_GPType; 2612dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2622dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (random->nextBool()) { 2632dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; 2644973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2655478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2668059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt return DefaultGeoProc::Create(flags, 2678059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrRandomColor(random), 2688059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrProcessorUnitTest::TestMatrix(random), 2698059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrProcessorUnitTest::TestMatrix(random), 2708059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt random->nextBool(), 2718059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrRandomCoverage(random)); 2725478d427c6e67c986a3390162c8fec77c466058ajoshualitt} 2735478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2748059eb9f6e24ed609393fbda4ad71edea03ac258joshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::Create(uint32_t gpTypeFlags, 2758059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrColor color, 2768059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 2778059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& localMatrix, 27856995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt bool opaqueVertexColors, 2798059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt uint8_t coverage) { 2808059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt return DefaultGeoProc::Create(gpTypeFlags, 2818059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt color, 2828059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt viewMatrix, 2838059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt localMatrix, 2848059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt opaqueVertexColors, 2858059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt coverage); 2864973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt} 287