GrDefaultGeoProcFactory.cpp revision c21b09eec91c9e263cb0b88467ea44e348ed4962
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 */ 19b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt 20b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualittenum GPFlag { 21b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt kColor_GPFlag = 0x1, 22b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt kLocalCoord_GPFlag = 0x2, 23b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt kCoverage_GPFlag= 0x4, 24b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt kTransformedLocalCoord_GPFlag = 0x8, 25b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt}; 26b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt 274973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittclass DefaultGeoProc : public GrGeometryProcessor { 284973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittpublic: 298059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt static GrGeometryProcessor* Create(uint32_t gpTypeFlags, 308059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrColor color, 318059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 328059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& localMatrix, 337765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool localCoordsWillBeRead, 347765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool coverageWillBeIgnored, 358059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt uint8_t coverage) { 36385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary return new DefaultGeoProc(gpTypeFlags, color, viewMatrix, localMatrix, coverage, 37385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary localCoordsWillBeRead, coverageWillBeIgnored); 384973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 394973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 4036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* name() const override { return "DefaultGeometryProcessor"; } 414973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 4271c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inPosition() const { return fInPosition; } 4371c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inColor() const { return fInColor; } 4471c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inLocalCoords() const { return fInLocalCoords; } 4571c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inCoverage() const { return fInCoverage; } 4688c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt GrColor color() const { return fColor; } 47b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } 48b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt bool hasVertexColor() const { return SkToBool(fInColor); } 49e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt const SkMatrix& viewMatrix() const { return fViewMatrix; } 50e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const SkMatrix& localMatrix() const { return fLocalMatrix; } 517765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool localCoordsWillBeRead() const { return fLocalCoordsWillBeRead; } 529b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t coverage() const { return fCoverage; } 537765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool coverageWillBeIgnored() const { return fCoverageWillBeIgnored; } 54b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt bool hasVertexCoverage() const { return SkToBool(fInCoverage); } 559b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 564973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt class GLProcessor : public GrGLGeometryProcessor { 574973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt public: 589b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GLProcessor(const GrGeometryProcessor& gp, const GrBatchTracker&) 595559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage(0xff) {} 604973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 6136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { 622dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); 639b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrGLGPBuilder* pb = args.fPB; 6446d36f0e7b709a077c647841eee23bd3efdc4117robertphillips GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder(); 6529bee0fe657fabf7c396502b69c9167fba13eaaaegdaniel GrGLFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); 664973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 67abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit attributes 6846d36f0e7b709a077c647841eee23bd3efdc4117robertphillips vsBuilder->emitAttributes(gp); 692dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt 702dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup pass through color 71b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (!gp.colorIgnored()) { 72b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (gp.hasVertexColor()) { 73b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt pb->addPassThroughAttribute(gp.inColor(), args.fOutputColor); 74b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } else { 75b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 76b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 77b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 78b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt 79abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // Setup position 805559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), 815559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt &fViewMatrixUniform); 824973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 83b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt if (gp.hasExplicitLocalCoords()) { 84abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit transforms with explicit local coords 8546d36f0e7b709a077c647841eee23bd3efdc4117robertphillips this->emitTransforms(pb, gpArgs->fPositionVar, gp.inLocalCoords()->fName, 86abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt gp.localMatrix(), args.fTransformsIn, args.fTransformsOut); 87b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } else if(gp.hasTransformedLocalCoords()) { 88b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt // transforms have already been applied to vertex attributes on the cpu 89b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt this->emitTransforms(pb, gp.inLocalCoords()->fName, 90b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt args.fTransformsIn, args.fTransformsOut); 91abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt } else { 92abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit transforms with position 9346d36f0e7b709a077c647841eee23bd3efdc4117robertphillips this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, 94abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt gp.localMatrix(), args.fTransformsIn, args.fTransformsOut); 95abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt } 96abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt 972dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup coverage as pass through 987765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon if (!gp.coverageWillBeIgnored()) { 99b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (gp.hasVertexCoverage()) { 100b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("float alpha = 1.0;"); 101b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); 102b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); 103b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } else if (gp.coverage() == 0xff) { 104b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); 105b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } else { 106b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt const char* fragCoverage; 107b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, 108b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kFloat_GrSLType, 109b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kDefault_GrSLPrecision, 110b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt "Coverage", 111b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt &fragCoverage); 112b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage); 113b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 1142dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1154973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 1164973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 11787f48d997ec29e5eeaa7567355775e93465dd60djoshualitt static inline void GenKey(const GrGeometryProcessor& gp, 1189b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const GrBatchTracker& bt, 119cfc18867d982119d9dc2888bf09f1093012daaddjvanverth const GrGLSLCaps&, 12087f48d997ec29e5eeaa7567355775e93465dd60djoshualitt GrProcessorKeyBuilder* b) { 1212dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); 1228fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt uint32_t key = def.fFlags; 123b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.colorIgnored() << 8; 1247765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon key |= def.coverageWillBeIgnored() << 9; 125b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.hasVertexColor() << 10; 126b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.hasVertexCoverage() << 11; 127b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.coverage() == 0xff ? 0x1 << 12 : 0; 1287765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon key |= def.localCoordsWillBeRead() && def.localMatrix().hasPerspective() ? 0x1 << 24 : 1297765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon 0x0; 130e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt key |= ComputePosKey(def.viewMatrix()) << 25; 1318fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt b->add32(key); 1322dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1334973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 1349b98932adaceb7ad0a617ade16616923f6bffe84joshualitt virtual void setData(const GrGLProgramDataManager& pdman, 1359b98932adaceb7ad0a617ade16616923f6bffe84joshualitt const GrPrimitiveProcessor& gp, 13636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const GrBatchTracker& bt) override { 137e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>(); 1385559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt 1395559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) { 1405559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt fViewMatrix = dgp.viewMatrix(); 1415559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt GrGLfloat viewMatrix[3 * 3]; 1425559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt GrGLGetMatrix<3>(viewMatrix, fViewMatrix); 1435559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 1445559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt } 145ee2af95db72152dfa61c841875df0594ca93437djoshualitt 146b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (dgp.color() != fColor && !dgp.hasVertexColor()) { 1479b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrGLfloat c[4]; 148b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt GrColorToRGBAFloat(dgp.color(), c); 1499b98932adaceb7ad0a617ade16616923f6bffe84joshualitt pdman.set4fv(fColorUniform, 1, c); 150b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fColor = dgp.color(); 1519b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 152b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt 1537765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon if (!dgp.coverageWillBeIgnored() && 1547765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) { 155b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage())); 156b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fCoverage = dgp.coverage(); 1579b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 1589b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 1594973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 160e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt void setTransformData(const GrPrimitiveProcessor& primProc, 161e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const GrGLProgramDataManager& pdman, 162e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt int index, 163e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const SkTArray<const GrCoordTransform*, true>& transforms) override { 164e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt this->setTransformDataHelper<DefaultGeoProc>(primProc, pdman, index, transforms); 165e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt } 166e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 1674973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt private: 1685559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt SkMatrix fViewMatrix; 1699b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrColor fColor; 1709b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 1715559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt UniformHandle fViewMatrixUniform; 1729b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fColorUniform; 1739b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fCoverageUniform; 1749b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 1754973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt typedef GrGLGeometryProcessor INHERITED; 1764973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt }; 1774973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 178eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt virtual void getGLProcessorKey(const GrBatchTracker& bt, 179cfc18867d982119d9dc2888bf09f1093012daaddjvanverth const GrGLSLCaps& caps, 18036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein GrProcessorKeyBuilder* b) const override { 181eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt GLProcessor::GenKey(*this, bt, caps, b); 182eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 183eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 184abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, 185cfc18867d982119d9dc2888bf09f1093012daaddjvanverth const GrGLSLCaps&) const override { 186385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary return new GLProcessor(*this, bt); 187eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 188eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 1894973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittprivate: 1908059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt DefaultGeoProc(uint32_t gpTypeFlags, 1918059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrColor color, 1928059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 1938059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& localMatrix, 194b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt uint8_t coverage, 1957765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool localCoordsWillBeRead, 1967765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool coverageWillBeIgnored) 19796fcdcc219d2a0d3579719b84b28bede76efba64halcanary : fInPosition(nullptr) 19896fcdcc219d2a0d3579719b84b28bede76efba64halcanary , fInColor(nullptr) 19996fcdcc219d2a0d3579719b84b28bede76efba64halcanary , fInLocalCoords(nullptr) 20096fcdcc219d2a0d3579719b84b28bede76efba64halcanary , fInCoverage(nullptr) 20188c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt , fColor(color) 202e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt , fViewMatrix(viewMatrix) 203e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt , fLocalMatrix(localMatrix) 2049b98932adaceb7ad0a617ade16616923f6bffe84joshualitt , fCoverage(coverage) 205b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt , fFlags(gpTypeFlags) 2067765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon , fLocalCoordsWillBeRead(localCoordsWillBeRead) 2077765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon , fCoverageWillBeIgnored(coverageWillBeIgnored) { 208eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt this->initClassID<DefaultGeoProc>(); 209b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasColor = SkToBool(gpTypeFlags & kColor_GPFlag); 210b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasExplicitLocalCoords = SkToBool(gpTypeFlags & kLocalCoord_GPFlag); 211b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasTransformedLocalCoords = SkToBool(gpTypeFlags & kTransformedLocalCoord_GPFlag); 212b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasLocalCoord = hasExplicitLocalCoords || hasTransformedLocalCoords; 213b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPFlag); 214f2539d50f911914af0f80f0092ff8c654869e650senorblanco fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType, 215f2539d50f911914af0f80f0092ff8c654869e650senorblanco kHigh_GrSLPrecision)); 2162dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasColor) { 21771c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType)); 2182dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2192dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasLocalCoord) { 22071c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInLocalCoords = &this->addVertexAttrib(Attribute("inLocalCoord", 221b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kVec2f_GrVertexAttribType)); 222b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt if (hasExplicitLocalCoords) { 223b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt this->setHasExplicitLocalCoords(); 224b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } else { 225b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt SkASSERT(hasTransformedLocalCoords); 226b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt this->setHasTransformedLocalCoords(); 227b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } 2282dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2292dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasCoverage) { 23071c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInCoverage = &this->addVertexAttrib(Attribute("inCoverage", 2317765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon kFloat_GrVertexAttribType)); 2322dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2332dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2344973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 23571c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInPosition; 23671c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInColor; 23771c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInLocalCoords; 23871c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInCoverage; 23988c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt GrColor fColor; 240e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt SkMatrix fViewMatrix; 241e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt SkMatrix fLocalMatrix; 2429b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 2432dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t fFlags; 2447765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool fLocalCoordsWillBeRead; 2457765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool fCoverageWillBeIgnored; 2464973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2472dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 2485478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2492e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt typedef GrGeometryProcessor INHERITED; 2504973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt}; 2514973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2524973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittGR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc); 2534973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 254c21b09eec91c9e263cb0b88467ea44e348ed4962bsalomonconst GrGeometryProcessor* DefaultGeoProc::TestCreate(GrProcessorTestData* d) { 2552dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t flags = 0; 2560067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 257b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kColor_GPFlag; 258b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } 259b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt if (d->fRandom->nextBool()) { 260b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kCoverage_GPFlag; 2614973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2620067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 263b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kLocalCoord_GPFlag; 2642dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2650067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 266b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kTransformedLocalCoord_GPFlag; 2674973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2685478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2698059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt return DefaultGeoProc::Create(flags, 2700067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrRandomColor(d->fRandom), 2710067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrTest::TestMatrix(d->fRandom), 2720067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrTest::TestMatrix(d->fRandom), 2730067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt d->fRandom->nextBool(), 2740067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt d->fRandom->nextBool(), 2750067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrRandomCoverage(d->fRandom)); 2765478d427c6e67c986a3390162c8fec77c466058ajoshualitt} 2775478d427c6e67c986a3390162c8fec77c466058ajoshualitt 278e9d6095674979a9b843c291b85746922e9ac181ajoshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::Create(const Color& color, 279e9d6095674979a9b843c291b85746922e9ac181ajoshualitt const Coverage& coverage, 2800d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const LocalCoords& localCoords, 2810d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const SkMatrix& viewMatrix) { 282e9d6095674979a9b843c291b85746922e9ac181ajoshualitt uint32_t flags = 0; 283b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= color.fType == Color::kAttribute_Type ? kColor_GPFlag : 0; 284b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPFlag : 0; 285b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_GPFlag : 0; 286b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= localCoords.fType == LocalCoords::kHasTransformed_Type ? 287b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt kTransformedLocalCoord_GPFlag : 0; 288e9d6095674979a9b843c291b85746922e9ac181ajoshualitt 289e9d6095674979a9b843c291b85746922e9ac181ajoshualitt uint8_t inCoverage = coverage.fCoverage; 290e9d6095674979a9b843c291b85746922e9ac181ajoshualitt bool coverageWillBeIgnored = coverage.fType == Coverage::kNone_Type; 2910d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type; 292e9d6095674979a9b843c291b85746922e9ac181ajoshualitt 293e9d6095674979a9b843c291b85746922e9ac181ajoshualitt GrColor inColor = color.fColor; 294e9d6095674979a9b843c291b85746922e9ac181ajoshualitt return DefaultGeoProc::Create(flags, 295e9d6095674979a9b843c291b85746922e9ac181ajoshualitt inColor, 296e9d6095674979a9b843c291b85746922e9ac181ajoshualitt viewMatrix, 2970d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(), 298e9d6095674979a9b843c291b85746922e9ac181ajoshualitt localCoordsWillBeRead, 299e9d6095674979a9b843c291b85746922e9ac181ajoshualitt coverageWillBeIgnored, 300e9d6095674979a9b843c291b85746922e9ac181ajoshualitt inCoverage); 301e9d6095674979a9b843c291b85746922e9ac181ajoshualitt} 3020d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 3030d986d877edae36ad7dc6fbdbc69a56ca9372702joshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::CreateForDeviceSpace( 3040d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const Color& color, 3050d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const Coverage& coverage, 3060d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const LocalCoords& localCoords, 3070d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const SkMatrix& viewMatrix) { 3080d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt SkMatrix invert = SkMatrix::I(); 309df0c55785033c191d2d509c22662861588e4acd8joshualitt if (LocalCoords::kUnused_Type != localCoords.fType) { 310df0c55785033c191d2d509c22662861588e4acd8joshualitt SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType); 311df0c55785033c191d2d509c22662861588e4acd8joshualitt if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) { 312df0c55785033c191d2d509c22662861588e4acd8joshualitt SkDebugf("Could not invert\n"); 31396fcdcc219d2a0d3579719b84b28bede76efba64halcanary return nullptr; 314df0c55785033c191d2d509c22662861588e4acd8joshualitt } 3150d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 316df0c55785033c191d2d509c22662861588e4acd8joshualitt if (localCoords.hasLocalMatrix()) { 317df0c55785033c191d2d509c22662861588e4acd8joshualitt invert.preConcat(*localCoords.fMatrix); 318df0c55785033c191d2d509c22662861588e4acd8joshualitt } 3190d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt } 3200d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 3210d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert); 322df0c55785033c191d2d509c22662861588e4acd8joshualitt return Create(color, coverage, inverted, SkMatrix::I()); 3230d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt} 324