GrDefaultGeoProcFactory.cpp revision df0c55785033c191d2d509c22662861588e4acd8
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 10605dd0fbce9dbb2a0d3313e13e161f2bd54870d7egdaniel#include "GrInvariantOutput.h" 112dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt#include "gl/GrGLGeometryProcessor.h" 122dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt#include "gl/builders/GrGLProgramBuilder.h" 134973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 144973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt/* 154973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * The default Geometry Processor simply takes position and multiplies it by the uniform view 164973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * matrix. It also leaves coverage untouched. Behind the scenes, we may add per vertex color or 174973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * local coords. 184973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt */ 194973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittclass DefaultGeoProc : public GrGeometryProcessor { 204973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittpublic: 218059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt static GrGeometryProcessor* Create(uint32_t gpTypeFlags, 228059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrColor color, 238059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 248059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& localMatrix, 257765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool localCoordsWillBeRead, 267765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool coverageWillBeIgnored, 278059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt uint8_t coverage) { 288059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt return SkNEW_ARGS(DefaultGeoProc, (gpTypeFlags, 298059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt color, 308059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt viewMatrix, 318059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt localMatrix, 32b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt coverage, 337765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon localCoordsWillBeRead, 347765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon coverageWillBeIgnored)); 354973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 364973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 3736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* name() const override { return "DefaultGeometryProcessor"; } 384973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 3971c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inPosition() const { return fInPosition; } 4071c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inColor() const { return fInColor; } 4171c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inLocalCoords() const { return fInLocalCoords; } 4271c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inCoverage() const { return fInCoverage; } 4388c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt GrColor color() const { return fColor; } 44b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } 45b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt bool hasVertexColor() const { return SkToBool(fInColor); } 46e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt const SkMatrix& viewMatrix() const { return fViewMatrix; } 47e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const SkMatrix& localMatrix() const { return fLocalMatrix; } 487765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool localCoordsWillBeRead() const { return fLocalCoordsWillBeRead; } 499b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t coverage() const { return fCoverage; } 507765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool coverageWillBeIgnored() const { return fCoverageWillBeIgnored; } 51b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt bool hasVertexCoverage() const { return SkToBool(fInCoverage); } 529b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 534973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt class GLProcessor : public GrGLGeometryProcessor { 544973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt public: 559b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GLProcessor(const GrGeometryProcessor& gp, const GrBatchTracker&) 565559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage(0xff) {} 574973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 5836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { 592dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); 609b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrGLGPBuilder* pb = args.fPB; 6146d36f0e7b709a077c647841eee23bd3efdc4117robertphillips GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder(); 6229bee0fe657fabf7c396502b69c9167fba13eaaaegdaniel GrGLFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); 634973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 64abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit attributes 6546d36f0e7b709a077c647841eee23bd3efdc4117robertphillips vsBuilder->emitAttributes(gp); 662dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt 672dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup pass through color 68b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (!gp.colorIgnored()) { 69b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (gp.hasVertexColor()) { 70b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt pb->addPassThroughAttribute(gp.inColor(), args.fOutputColor); 71b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } else { 72b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 73b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 74b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 75b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt 76abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // Setup position 775559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), 785559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt &fViewMatrixUniform); 794973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 80abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt if (gp.inLocalCoords()) { 81abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit transforms with explicit local coords 8246d36f0e7b709a077c647841eee23bd3efdc4117robertphillips this->emitTransforms(pb, gpArgs->fPositionVar, gp.inLocalCoords()->fName, 83abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt gp.localMatrix(), args.fTransformsIn, args.fTransformsOut); 84abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt } else { 85abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit transforms with position 8646d36f0e7b709a077c647841eee23bd3efdc4117robertphillips this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, 87abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt gp.localMatrix(), args.fTransformsIn, args.fTransformsOut); 88abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt } 89abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt 902dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup coverage as pass through 917765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon if (!gp.coverageWillBeIgnored()) { 92b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (gp.hasVertexCoverage()) { 93b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("float alpha = 1.0;"); 94b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); 95b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); 96b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } else if (gp.coverage() == 0xff) { 97b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); 98b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } else { 99b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt const char* fragCoverage; 100b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, 101b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kFloat_GrSLType, 102b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kDefault_GrSLPrecision, 103b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt "Coverage", 104b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt &fragCoverage); 105b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage); 106b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 1072dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1084973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 1094973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 11087f48d997ec29e5eeaa7567355775e93465dd60djoshualitt static inline void GenKey(const GrGeometryProcessor& gp, 1119b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const GrBatchTracker& bt, 112cfc18867d982119d9dc2888bf09f1093012daaddjvanverth const GrGLSLCaps&, 11387f48d997ec29e5eeaa7567355775e93465dd60djoshualitt GrProcessorKeyBuilder* b) { 1142dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); 1158fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt uint32_t key = def.fFlags; 116b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.colorIgnored() << 8; 1177765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon key |= def.coverageWillBeIgnored() << 9; 118b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.hasVertexColor() << 10; 119b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.hasVertexCoverage() << 11; 120b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.coverage() == 0xff ? 0x1 << 12 : 0; 1217765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon key |= def.localCoordsWillBeRead() && def.localMatrix().hasPerspective() ? 0x1 << 24 : 1227765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon 0x0; 123e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt key |= ComputePosKey(def.viewMatrix()) << 25; 1248fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt b->add32(key); 1252dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1264973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 1279b98932adaceb7ad0a617ade16616923f6bffe84joshualitt virtual void setData(const GrGLProgramDataManager& pdman, 1289b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const GrPrimitiveProcessor& gp, 12936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const GrBatchTracker& bt) override { 130e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>(); 1315559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt 1325559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) { 1335559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt fViewMatrix = dgp.viewMatrix(); 1345559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt GrGLfloat viewMatrix[3 * 3]; 1355559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt GrGLGetMatrix<3>(viewMatrix, fViewMatrix); 1365559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 1375559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt } 138ee2af95db72152dfa61c841875df0594ca93437djoshualitt 139b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (dgp.color() != fColor && !dgp.hasVertexColor()) { 1409b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrGLfloat c[4]; 141b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt GrColorToRGBAFloat(dgp.color(), c); 1429b98932adaceb7ad0a617ade16616923f6bffe84joshualitt pdman.set4fv(fColorUniform, 1, c); 143b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fColor = dgp.color(); 1449b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 145b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt 1467765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon if (!dgp.coverageWillBeIgnored() && 1477765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) { 148b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage())); 149b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fCoverage = dgp.coverage(); 1509b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 1519b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 1524973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 153e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt void setTransformData(const GrPrimitiveProcessor& primProc, 154e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const GrGLProgramDataManager& pdman, 155e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt int index, 156e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const SkTArray<const GrCoordTransform*, true>& transforms) override { 157e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt this->setTransformDataHelper<DefaultGeoProc>(primProc, pdman, index, transforms); 158e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt } 159e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 1604973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt private: 1615559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt SkMatrix fViewMatrix; 1629b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrColor fColor; 1639b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 1645559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt UniformHandle fViewMatrixUniform; 1659b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fColorUniform; 1669b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fCoverageUniform; 1679b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 1684973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt typedef GrGLGeometryProcessor INHERITED; 1694973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt }; 1704973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 171eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt virtual void getGLProcessorKey(const GrBatchTracker& bt, 172cfc18867d982119d9dc2888bf09f1093012daaddjvanverth const GrGLSLCaps& caps, 17336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein GrProcessorKeyBuilder* b) const override { 174eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt GLProcessor::GenKey(*this, bt, caps, b); 175eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 176eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 177abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, 178cfc18867d982119d9dc2888bf09f1093012daaddjvanverth const GrGLSLCaps&) const override { 179eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt return SkNEW_ARGS(GLProcessor, (*this, bt)); 180eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 181eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 1824973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittprivate: 1838059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt DefaultGeoProc(uint32_t gpTypeFlags, 1848059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrColor color, 1858059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 1868059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& localMatrix, 187b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt uint8_t coverage, 1887765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool localCoordsWillBeRead, 1897765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool coverageWillBeIgnored) 190e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt : fInPosition(NULL) 1912dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt , fInColor(NULL) 1922dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt , fInLocalCoords(NULL) 1932dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt , fInCoverage(NULL) 19488c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt , fColor(color) 195e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt , fViewMatrix(viewMatrix) 196e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt , fLocalMatrix(localMatrix) 1979b98932adaceb7ad0a617ade16616923f6bffe84joshualitt , fCoverage(coverage) 198b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt , fFlags(gpTypeFlags) 1997765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon , fLocalCoordsWillBeRead(localCoordsWillBeRead) 2007765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon , fCoverageWillBeIgnored(coverageWillBeIgnored) { 201eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt this->initClassID<DefaultGeoProc>(); 2022dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt bool hasColor = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kColor_GPType); 2032dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt bool hasLocalCoord = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kLocalCoord_GPType); 2042dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt bool hasCoverage = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kCoverage_GPType); 205f2539d50f911914af0f80f0092ff8c654869e650senorblanco fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType, 206f2539d50f911914af0f80f0092ff8c654869e650senorblanco kHigh_GrSLPrecision)); 2072dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasColor) { 20871c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType)); 2092dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2102dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasLocalCoord) { 21171c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInLocalCoords = &this->addVertexAttrib(Attribute("inLocalCoord", 212b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kVec2f_GrVertexAttribType)); 2132dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt this->setHasLocalCoords(); 2142dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2152dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasCoverage) { 21671c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInCoverage = &this->addVertexAttrib(Attribute("inCoverage", 2177765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon kFloat_GrVertexAttribType)); 2182dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2192dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2204973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 22171c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInPosition; 22271c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInColor; 22371c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInLocalCoords; 22471c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInCoverage; 22588c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt GrColor fColor; 226e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt SkMatrix fViewMatrix; 227e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt SkMatrix fLocalMatrix; 2289b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 2292dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t fFlags; 2307765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool fLocalCoordsWillBeRead; 2317765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool fCoverageWillBeIgnored; 2324973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2332dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 2345478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2352e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt typedef GrGeometryProcessor INHERITED; 2364973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt}; 2374973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2384973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittGR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc); 2394973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2400067ff5e0f85084dd2b5ad9886b526482b89a116joshualittGrGeometryProcessor* DefaultGeoProc::TestCreate(GrProcessorTestData* d) { 2412dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t flags = 0; 2420067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 2432dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt flags |= GrDefaultGeoProcFactory::kColor_GPType; 2444973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2450067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 2462dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt flags |= GrDefaultGeoProcFactory::kCoverage_GPType; 2472dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2480067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 2492dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; 2504973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2515478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2528059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt return DefaultGeoProc::Create(flags, 2530067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrRandomColor(d->fRandom), 2540067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrTest::TestMatrix(d->fRandom), 2550067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrTest::TestMatrix(d->fRandom), 2560067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt d->fRandom->nextBool(), 2570067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt d->fRandom->nextBool(), 2580067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrRandomCoverage(d->fRandom)); 2595478d427c6e67c986a3390162c8fec77c466058ajoshualitt} 2605478d427c6e67c986a3390162c8fec77c466058ajoshualitt 261e9d6095674979a9b843c291b85746922e9ac181ajoshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::Create(const Color& color, 262e9d6095674979a9b843c291b85746922e9ac181ajoshualitt const Coverage& coverage, 2630d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const LocalCoords& localCoords, 2640d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const SkMatrix& viewMatrix) { 265e9d6095674979a9b843c291b85746922e9ac181ajoshualitt uint32_t flags = 0; 266e9d6095674979a9b843c291b85746922e9ac181ajoshualitt flags |= color.fType == Color::kAttribute_Type ? kColor_GPType : 0; 267e9d6095674979a9b843c291b85746922e9ac181ajoshualitt flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPType : 0; 2680d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_GPType : 0; 269e9d6095674979a9b843c291b85746922e9ac181ajoshualitt 270e9d6095674979a9b843c291b85746922e9ac181ajoshualitt uint8_t inCoverage = coverage.fCoverage; 271e9d6095674979a9b843c291b85746922e9ac181ajoshualitt bool coverageWillBeIgnored = coverage.fType == Coverage::kNone_Type; 2720d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type; 273e9d6095674979a9b843c291b85746922e9ac181ajoshualitt 274e9d6095674979a9b843c291b85746922e9ac181ajoshualitt GrColor inColor = color.fColor; 275e9d6095674979a9b843c291b85746922e9ac181ajoshualitt return DefaultGeoProc::Create(flags, 276e9d6095674979a9b843c291b85746922e9ac181ajoshualitt inColor, 277e9d6095674979a9b843c291b85746922e9ac181ajoshualitt viewMatrix, 2780d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(), 279e9d6095674979a9b843c291b85746922e9ac181ajoshualitt localCoordsWillBeRead, 280e9d6095674979a9b843c291b85746922e9ac181ajoshualitt coverageWillBeIgnored, 281e9d6095674979a9b843c291b85746922e9ac181ajoshualitt inCoverage); 282e9d6095674979a9b843c291b85746922e9ac181ajoshualitt} 2830d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 2840d986d877edae36ad7dc6fbdbc69a56ca9372702joshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::CreateForDeviceSpace( 2850d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const Color& color, 2860d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const Coverage& coverage, 2870d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const LocalCoords& localCoords, 2880d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const SkMatrix& viewMatrix) { 2890d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt SkMatrix invert = SkMatrix::I(); 290df0c55785033c191d2d509c22662861588e4acd8joshualitt if (LocalCoords::kUnused_Type != localCoords.fType) { 291df0c55785033c191d2d509c22662861588e4acd8joshualitt SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType); 292df0c55785033c191d2d509c22662861588e4acd8joshualitt if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) { 293df0c55785033c191d2d509c22662861588e4acd8joshualitt SkDebugf("Could not invert\n"); 294df0c55785033c191d2d509c22662861588e4acd8joshualitt return NULL; 295df0c55785033c191d2d509c22662861588e4acd8joshualitt } 2960d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 297df0c55785033c191d2d509c22662861588e4acd8joshualitt if (localCoords.hasLocalMatrix()) { 298df0c55785033c191d2d509c22662861588e4acd8joshualitt invert.preConcat(*localCoords.fMatrix); 299df0c55785033c191d2d509c22662861588e4acd8joshualitt } 3000d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt } 3010d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 3020d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert); 303df0c55785033c191d2d509c22662861588e4acd8joshualitt return Create(color, coverage, inverted, SkMatrix::I()); 3040d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt} 305