GrDefaultGeoProcFactory.cpp revision 57d3b039c635945e1dc2fcbac3462ed8bfedb068
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" 112d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel#include "glsl/GrGLSLFragmentShaderBuilder.h" 12e659a581f63fdccb64dce2dc8a478cf56831feeaegdaniel#include "glsl/GrGLSLGeometryProcessor.h" 132d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel#include "glsl/GrGLSLProgramBuilder.h" 142d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel#include "glsl/GrGLSLVertexShaderBuilder.h" 1564c4728c70001ed074fecf5c4e083781987b12e9egdaniel#include "glsl/GrGLSLUtil.h" 164973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 174973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt/* 184973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * The default Geometry Processor simply takes position and multiplies it by the uniform view 194973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * matrix. It also leaves coverage untouched. Behind the scenes, we may add per vertex color or 204973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * local coords. 214973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt */ 22b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt 23b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualittenum GPFlag { 24b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt kColor_GPFlag = 0x1, 25b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt kLocalCoord_GPFlag = 0x2, 26b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt kCoverage_GPFlag= 0x4, 27b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt kTransformedLocalCoord_GPFlag = 0x8, 28b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt}; 29b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt 304973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittclass DefaultGeoProc : public GrGeometryProcessor { 314973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittpublic: 328059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt static GrGeometryProcessor* Create(uint32_t gpTypeFlags, 338059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrColor color, 348059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 358059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& localMatrix, 367765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool localCoordsWillBeRead, 377765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool coverageWillBeIgnored, 388059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt uint8_t coverage) { 39385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary return new DefaultGeoProc(gpTypeFlags, color, viewMatrix, localMatrix, coverage, 40385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary localCoordsWillBeRead, coverageWillBeIgnored); 414973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 424973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 4336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* name() const override { return "DefaultGeometryProcessor"; } 444973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 4571c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inPosition() const { return fInPosition; } 4671c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inColor() const { return fInColor; } 4771c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inLocalCoords() const { return fInLocalCoords; } 4871c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inCoverage() const { return fInCoverage; } 4988c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt GrColor color() const { return fColor; } 50b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } 51b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt bool hasVertexColor() const { return SkToBool(fInColor); } 52e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt const SkMatrix& viewMatrix() const { return fViewMatrix; } 53e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const SkMatrix& localMatrix() const { return fLocalMatrix; } 547765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool localCoordsWillBeRead() const { return fLocalCoordsWillBeRead; } 559b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t coverage() const { return fCoverage; } 567765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool coverageWillBeIgnored() const { return fCoverageWillBeIgnored; } 57b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt bool hasVertexCoverage() const { return SkToBool(fInCoverage); } 589b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 5957d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel class GLSLProcessor : public GrGLSLGeometryProcessor { 604973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt public: 6157d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel GLSLProcessor() 625559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage(0xff) {} 634973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 6436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { 652dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); 668dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel GrGLSLGPBuilder* pb = args.fPB; 672d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel GrGLSLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder(); 682d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel GrGLSLFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); 694973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 70abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit attributes 7146d36f0e7b709a077c647841eee23bd3efdc4117robertphillips vsBuilder->emitAttributes(gp); 722dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt 732dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup pass through color 74b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (!gp.colorIgnored()) { 75b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (gp.hasVertexColor()) { 76b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt pb->addPassThroughAttribute(gp.inColor(), args.fOutputColor); 77b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } else { 78b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 79b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 80b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 81b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt 82abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // Setup position 835559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), 845559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt &fViewMatrixUniform); 854973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 86b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt if (gp.hasExplicitLocalCoords()) { 87abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit transforms with explicit local coords 8846d36f0e7b709a077c647841eee23bd3efdc4117robertphillips this->emitTransforms(pb, gpArgs->fPositionVar, gp.inLocalCoords()->fName, 89abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt gp.localMatrix(), args.fTransformsIn, args.fTransformsOut); 90b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } else if(gp.hasTransformedLocalCoords()) { 91b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt // transforms have already been applied to vertex attributes on the cpu 92b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt this->emitTransforms(pb, gp.inLocalCoords()->fName, 93b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt args.fTransformsIn, args.fTransformsOut); 94abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt } else { 95abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit transforms with position 9646d36f0e7b709a077c647841eee23bd3efdc4117robertphillips this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, 97abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt gp.localMatrix(), args.fTransformsIn, args.fTransformsOut); 98abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt } 99abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt 1002dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup coverage as pass through 1017765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon if (!gp.coverageWillBeIgnored()) { 102b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (gp.hasVertexCoverage()) { 103b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("float alpha = 1.0;"); 104b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); 105b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); 106b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } else if (gp.coverage() == 0xff) { 107b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); 108b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } else { 109b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt const char* fragCoverage; 1102d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel fCoverageUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_Visibility, 111b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kFloat_GrSLType, 112b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kDefault_GrSLPrecision, 113b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt "Coverage", 114b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt &fragCoverage); 115b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage); 116b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 1172dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1184973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 1194973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 12087f48d997ec29e5eeaa7567355775e93465dd60djoshualitt static inline void GenKey(const GrGeometryProcessor& gp, 121cfc18867d982119d9dc2888bf09f1093012daaddjvanverth const GrGLSLCaps&, 12287f48d997ec29e5eeaa7567355775e93465dd60djoshualitt GrProcessorKeyBuilder* b) { 1232dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); 1248fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt uint32_t key = def.fFlags; 125b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.colorIgnored() << 8; 1267765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon key |= def.coverageWillBeIgnored() << 9; 127b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.hasVertexColor() << 10; 128b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.hasVertexCoverage() << 11; 129b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.coverage() == 0xff ? 0x1 << 12 : 0; 1307765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon key |= def.localCoordsWillBeRead() && def.localMatrix().hasPerspective() ? 0x1 << 24 : 1317765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon 0x0; 132e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt key |= ComputePosKey(def.viewMatrix()) << 25; 1338fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt b->add32(key); 1342dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1354973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 136018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void setData(const GrGLSLProgramDataManager& pdman, 137018fb62d12d1febf121fe265da5b6117b86a6541egdaniel const GrPrimitiveProcessor& gp) override { 138e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>(); 1395559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt 1405559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) { 1415559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt fViewMatrix = dgp.viewMatrix(); 142018fb62d12d1febf121fe265da5b6117b86a6541egdaniel float viewMatrix[3 * 3]; 14364c4728c70001ed074fecf5c4e083781987b12e9egdaniel GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); 1445559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 1455559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt } 146ee2af95db72152dfa61c841875df0594ca93437djoshualitt 147b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (dgp.color() != fColor && !dgp.hasVertexColor()) { 148018fb62d12d1febf121fe265da5b6117b86a6541egdaniel float c[4]; 149b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt GrColorToRGBAFloat(dgp.color(), c); 1509b98932adaceb7ad0a617ade16616923f6bffe84joshualitt pdman.set4fv(fColorUniform, 1, c); 151b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fColor = dgp.color(); 1529b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 153b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt 1547765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon if (!dgp.coverageWillBeIgnored() && 1557765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) { 156b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage())); 157b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fCoverage = dgp.coverage(); 1589b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 1599b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 1604973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 161e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt void setTransformData(const GrPrimitiveProcessor& primProc, 162018fb62d12d1febf121fe265da5b6117b86a6541egdaniel const GrGLSLProgramDataManager& pdman, 163e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt int index, 164e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const SkTArray<const GrCoordTransform*, true>& transforms) override { 165e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt this->setTransformDataHelper<DefaultGeoProc>(primProc, pdman, index, transforms); 166e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt } 167e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 1684973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt private: 1695559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt SkMatrix fViewMatrix; 1709b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrColor fColor; 1719b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 1725559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt UniformHandle fViewMatrixUniform; 1739b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fColorUniform; 1749b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fCoverageUniform; 1759b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 176e659a581f63fdccb64dce2dc8a478cf56831feeaegdaniel typedef GrGLSLGeometryProcessor INHERITED; 1774973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt }; 1784973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 17957d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override { 18057d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel GLSLProcessor::GenKey(*this, caps, b); 181eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 182eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 18357d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const override { 18457d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel return new GLSLProcessor(); 185eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 186eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 1874973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittprivate: 1888059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt DefaultGeoProc(uint32_t gpTypeFlags, 1898059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrColor color, 1908059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 1918059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& localMatrix, 192b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt uint8_t coverage, 1937765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool localCoordsWillBeRead, 1947765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool coverageWillBeIgnored) 19596fcdcc219d2a0d3579719b84b28bede76efba64halcanary : fInPosition(nullptr) 19696fcdcc219d2a0d3579719b84b28bede76efba64halcanary , fInColor(nullptr) 19796fcdcc219d2a0d3579719b84b28bede76efba64halcanary , fInLocalCoords(nullptr) 19896fcdcc219d2a0d3579719b84b28bede76efba64halcanary , fInCoverage(nullptr) 19988c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt , fColor(color) 200e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt , fViewMatrix(viewMatrix) 201e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt , fLocalMatrix(localMatrix) 2029b98932adaceb7ad0a617ade16616923f6bffe84joshualitt , fCoverage(coverage) 203b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt , fFlags(gpTypeFlags) 2047765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon , fLocalCoordsWillBeRead(localCoordsWillBeRead) 2057765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon , fCoverageWillBeIgnored(coverageWillBeIgnored) { 206eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt this->initClassID<DefaultGeoProc>(); 207b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasColor = SkToBool(gpTypeFlags & kColor_GPFlag); 208b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasExplicitLocalCoords = SkToBool(gpTypeFlags & kLocalCoord_GPFlag); 209b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasTransformedLocalCoords = SkToBool(gpTypeFlags & kTransformedLocalCoord_GPFlag); 210b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasLocalCoord = hasExplicitLocalCoords || hasTransformedLocalCoords; 211b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPFlag); 212f2539d50f911914af0f80f0092ff8c654869e650senorblanco fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType, 213f2539d50f911914af0f80f0092ff8c654869e650senorblanco kHigh_GrSLPrecision)); 2142dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasColor) { 21571c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType)); 2162dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2172dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasLocalCoord) { 21871c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInLocalCoords = &this->addVertexAttrib(Attribute("inLocalCoord", 219b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kVec2f_GrVertexAttribType)); 220b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt if (hasExplicitLocalCoords) { 221b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt this->setHasExplicitLocalCoords(); 222b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } else { 223b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt SkASSERT(hasTransformedLocalCoords); 224b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt this->setHasTransformedLocalCoords(); 225b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } 2262dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2272dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasCoverage) { 22871c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInCoverage = &this->addVertexAttrib(Attribute("inCoverage", 2297765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon kFloat_GrVertexAttribType)); 2302dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2312dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2324973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 23371c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInPosition; 23471c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInColor; 23571c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInLocalCoords; 23671c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInCoverage; 23788c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt GrColor fColor; 238e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt SkMatrix fViewMatrix; 239e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt SkMatrix fLocalMatrix; 2409b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 2412dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t fFlags; 2427765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool fLocalCoordsWillBeRead; 2437765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool fCoverageWillBeIgnored; 2444973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2452dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 2465478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2472e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt typedef GrGeometryProcessor INHERITED; 2484973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt}; 2494973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2504973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittGR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc); 2514973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 252c21b09eec91c9e263cb0b88467ea44e348ed4962bsalomonconst GrGeometryProcessor* DefaultGeoProc::TestCreate(GrProcessorTestData* d) { 2532dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t flags = 0; 2540067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 255b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kColor_GPFlag; 256b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } 257b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt if (d->fRandom->nextBool()) { 258b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kCoverage_GPFlag; 2594973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2600067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 261b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kLocalCoord_GPFlag; 2622dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2630067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 264b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kTransformedLocalCoord_GPFlag; 2654973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2665478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2678059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt return DefaultGeoProc::Create(flags, 2680067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrRandomColor(d->fRandom), 2690067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrTest::TestMatrix(d->fRandom), 2700067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrTest::TestMatrix(d->fRandom), 2710067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt d->fRandom->nextBool(), 2720067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt d->fRandom->nextBool(), 2730067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrRandomCoverage(d->fRandom)); 2745478d427c6e67c986a3390162c8fec77c466058ajoshualitt} 2755478d427c6e67c986a3390162c8fec77c466058ajoshualitt 276e9d6095674979a9b843c291b85746922e9ac181ajoshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::Create(const Color& color, 277e9d6095674979a9b843c291b85746922e9ac181ajoshualitt const Coverage& coverage, 2780d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const LocalCoords& localCoords, 2790d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const SkMatrix& viewMatrix) { 280e9d6095674979a9b843c291b85746922e9ac181ajoshualitt uint32_t flags = 0; 281b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= color.fType == Color::kAttribute_Type ? kColor_GPFlag : 0; 282b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPFlag : 0; 283b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_GPFlag : 0; 284b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= localCoords.fType == LocalCoords::kHasTransformed_Type ? 285b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt kTransformedLocalCoord_GPFlag : 0; 286e9d6095674979a9b843c291b85746922e9ac181ajoshualitt 287e9d6095674979a9b843c291b85746922e9ac181ajoshualitt uint8_t inCoverage = coverage.fCoverage; 288e9d6095674979a9b843c291b85746922e9ac181ajoshualitt bool coverageWillBeIgnored = coverage.fType == Coverage::kNone_Type; 2890d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type; 290e9d6095674979a9b843c291b85746922e9ac181ajoshualitt 291e9d6095674979a9b843c291b85746922e9ac181ajoshualitt GrColor inColor = color.fColor; 292e9d6095674979a9b843c291b85746922e9ac181ajoshualitt return DefaultGeoProc::Create(flags, 293e9d6095674979a9b843c291b85746922e9ac181ajoshualitt inColor, 294e9d6095674979a9b843c291b85746922e9ac181ajoshualitt viewMatrix, 2950d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(), 296e9d6095674979a9b843c291b85746922e9ac181ajoshualitt localCoordsWillBeRead, 297e9d6095674979a9b843c291b85746922e9ac181ajoshualitt coverageWillBeIgnored, 298e9d6095674979a9b843c291b85746922e9ac181ajoshualitt inCoverage); 299e9d6095674979a9b843c291b85746922e9ac181ajoshualitt} 3000d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 3010d986d877edae36ad7dc6fbdbc69a56ca9372702joshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::CreateForDeviceSpace( 3020d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const Color& color, 3030d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const Coverage& coverage, 3040d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const LocalCoords& localCoords, 3050d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const SkMatrix& viewMatrix) { 3060d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt SkMatrix invert = SkMatrix::I(); 307df0c55785033c191d2d509c22662861588e4acd8joshualitt if (LocalCoords::kUnused_Type != localCoords.fType) { 308df0c55785033c191d2d509c22662861588e4acd8joshualitt SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType); 309df0c55785033c191d2d509c22662861588e4acd8joshualitt if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) { 310df0c55785033c191d2d509c22662861588e4acd8joshualitt SkDebugf("Could not invert\n"); 31196fcdcc219d2a0d3579719b84b28bede76efba64halcanary return nullptr; 312df0c55785033c191d2d509c22662861588e4acd8joshualitt } 3130d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 314df0c55785033c191d2d509c22662861588e4acd8joshualitt if (localCoords.hasLocalMatrix()) { 315df0c55785033c191d2d509c22662861588e4acd8joshualitt invert.preConcat(*localCoords.fMatrix); 316df0c55785033c191d2d509c22662861588e4acd8joshualitt } 3170d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt } 3180d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 3190d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert); 320df0c55785033c191d2d509c22662861588e4acd8joshualitt return Create(color, coverage, inverted, SkMatrix::I()); 3210d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt} 322