GrDefaultGeoProcFactory.cpp revision 4ca2e6034365ad280ec64473f7f1d72ebd8335e4
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; 674ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; 684ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; 694973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 70abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit attributes 714ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel vertBuilder->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 { 784ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel this->setupUniformColor(pb, fragBuilder, args.fOutputColor, &fColorUniform); 79b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 80b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 81b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt 82abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // Setup position 834ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel this->setupPosition(pb, 844ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel vertBuilder, 854ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gpArgs, 864ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.inPosition()->fName, 874ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.viewMatrix(), 885559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt &fViewMatrixUniform); 894973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 90b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt if (gp.hasExplicitLocalCoords()) { 91abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit transforms with explicit local coords 924ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel this->emitTransforms(pb, 934ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel vertBuilder, 944ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gpArgs->fPositionVar, 954ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.inLocalCoords()->fName, 964ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.localMatrix(), 974ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel args.fTransformsIn, 984ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel args.fTransformsOut); 99b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } else if(gp.hasTransformedLocalCoords()) { 100b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt // transforms have already been applied to vertex attributes on the cpu 1014ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel this->emitTransforms(pb, 1024ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel vertBuilder, 1034ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.inLocalCoords()->fName, 1044ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel args.fTransformsIn, 1054ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel args.fTransformsOut); 106abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt } else { 107abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit transforms with position 1084ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel this->emitTransforms(pb, 1094ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel vertBuilder, 1104ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gpArgs->fPositionVar, 1114ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.inPosition()->fName, 1124ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.localMatrix(), 1134ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel args.fTransformsIn, 1144ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel args.fTransformsOut); 115abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt } 116abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt 1172dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup coverage as pass through 1187765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon if (!gp.coverageWillBeIgnored()) { 119b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (gp.hasVertexCoverage()) { 1204ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel fragBuilder->codeAppendf("float alpha = 1.0;"); 121b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); 1224ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); 123b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } else if (gp.coverage() == 0xff) { 1244ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel fragBuilder->codeAppendf("%s = vec4(1);", args.fOutputCoverage); 125b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } else { 126b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt const char* fragCoverage; 1272d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel fCoverageUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_Visibility, 128b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kFloat_GrSLType, 129b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kDefault_GrSLPrecision, 130b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt "Coverage", 131b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt &fragCoverage); 1324ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage); 133b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 1342dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1354973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 1364973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 13787f48d997ec29e5eeaa7567355775e93465dd60djoshualitt static inline void GenKey(const GrGeometryProcessor& gp, 138cfc18867d982119d9dc2888bf09f1093012daaddjvanverth const GrGLSLCaps&, 13987f48d997ec29e5eeaa7567355775e93465dd60djoshualitt GrProcessorKeyBuilder* b) { 1402dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); 1418fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt uint32_t key = def.fFlags; 142b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.colorIgnored() << 8; 1437765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon key |= def.coverageWillBeIgnored() << 9; 144b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.hasVertexColor() << 10; 145b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.hasVertexCoverage() << 11; 146b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt key |= def.coverage() == 0xff ? 0x1 << 12 : 0; 1477765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon key |= def.localCoordsWillBeRead() && def.localMatrix().hasPerspective() ? 0x1 << 24 : 1487765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon 0x0; 149e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt key |= ComputePosKey(def.viewMatrix()) << 25; 1508fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt b->add32(key); 1512dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1524973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 153018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void setData(const GrGLSLProgramDataManager& pdman, 154018fb62d12d1febf121fe265da5b6117b86a6541egdaniel const GrPrimitiveProcessor& gp) override { 155e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>(); 1565559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt 1575559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) { 1585559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt fViewMatrix = dgp.viewMatrix(); 159018fb62d12d1febf121fe265da5b6117b86a6541egdaniel float viewMatrix[3 * 3]; 16064c4728c70001ed074fecf5c4e083781987b12e9egdaniel GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); 1615559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 1625559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt } 163ee2af95db72152dfa61c841875df0594ca93437djoshualitt 164b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (dgp.color() != fColor && !dgp.hasVertexColor()) { 165018fb62d12d1febf121fe265da5b6117b86a6541egdaniel float c[4]; 166b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt GrColorToRGBAFloat(dgp.color(), c); 1679b98932adaceb7ad0a617ade16616923f6bffe84joshualitt pdman.set4fv(fColorUniform, 1, c); 168b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fColor = dgp.color(); 1699b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 170b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt 1717765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon if (!dgp.coverageWillBeIgnored() && 1727765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) { 173b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage())); 174b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fCoverage = dgp.coverage(); 1759b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 1769b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 1774973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 178e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt void setTransformData(const GrPrimitiveProcessor& primProc, 179018fb62d12d1febf121fe265da5b6117b86a6541egdaniel const GrGLSLProgramDataManager& pdman, 180e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt int index, 181e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt const SkTArray<const GrCoordTransform*, true>& transforms) override { 182e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt this->setTransformDataHelper<DefaultGeoProc>(primProc, pdman, index, transforms); 183e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt } 184e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 1854973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt private: 1865559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt SkMatrix fViewMatrix; 1879b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrColor fColor; 1889b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 1895559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt UniformHandle fViewMatrixUniform; 1909b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fColorUniform; 1919b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fCoverageUniform; 1929b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 193e659a581f63fdccb64dce2dc8a478cf56831feeaegdaniel typedef GrGLSLGeometryProcessor INHERITED; 1944973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt }; 1954973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 19657d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override { 19757d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel GLSLProcessor::GenKey(*this, caps, b); 198eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 199eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 20057d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const override { 20157d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel return new GLSLProcessor(); 202eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 203eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 2044973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittprivate: 2058059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt DefaultGeoProc(uint32_t gpTypeFlags, 2068059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrColor color, 2078059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 2088059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& localMatrix, 209b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt uint8_t coverage, 2107765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool localCoordsWillBeRead, 2117765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool coverageWillBeIgnored) 21296fcdcc219d2a0d3579719b84b28bede76efba64halcanary : fInPosition(nullptr) 21396fcdcc219d2a0d3579719b84b28bede76efba64halcanary , fInColor(nullptr) 21496fcdcc219d2a0d3579719b84b28bede76efba64halcanary , fInLocalCoords(nullptr) 21596fcdcc219d2a0d3579719b84b28bede76efba64halcanary , fInCoverage(nullptr) 21688c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt , fColor(color) 217e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt , fViewMatrix(viewMatrix) 218e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt , fLocalMatrix(localMatrix) 2199b98932adaceb7ad0a617ade16616923f6bffe84joshualitt , fCoverage(coverage) 220b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt , fFlags(gpTypeFlags) 2217765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon , fLocalCoordsWillBeRead(localCoordsWillBeRead) 2227765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon , fCoverageWillBeIgnored(coverageWillBeIgnored) { 223eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt this->initClassID<DefaultGeoProc>(); 224b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasColor = SkToBool(gpTypeFlags & kColor_GPFlag); 225b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasExplicitLocalCoords = SkToBool(gpTypeFlags & kLocalCoord_GPFlag); 226b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasTransformedLocalCoords = SkToBool(gpTypeFlags & kTransformedLocalCoord_GPFlag); 227b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasLocalCoord = hasExplicitLocalCoords || hasTransformedLocalCoords; 228b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPFlag); 229f2539d50f911914af0f80f0092ff8c654869e650senorblanco fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType, 230f2539d50f911914af0f80f0092ff8c654869e650senorblanco kHigh_GrSLPrecision)); 2312dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasColor) { 23271c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType)); 2332dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2342dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasLocalCoord) { 23571c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInLocalCoords = &this->addVertexAttrib(Attribute("inLocalCoord", 236b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt kVec2f_GrVertexAttribType)); 237b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt if (hasExplicitLocalCoords) { 238b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt this->setHasExplicitLocalCoords(); 239b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } else { 240b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt SkASSERT(hasTransformedLocalCoords); 241b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt this->setHasTransformedLocalCoords(); 242b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } 2432dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2442dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt if (hasCoverage) { 24571c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt fInCoverage = &this->addVertexAttrib(Attribute("inCoverage", 2467765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon kFloat_GrVertexAttribType)); 2472dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2482dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2494973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 25071c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInPosition; 25171c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInColor; 25271c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInLocalCoords; 25371c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* fInCoverage; 25488c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt GrColor fColor; 255e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt SkMatrix fViewMatrix; 256e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt SkMatrix fLocalMatrix; 2579b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 2582dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t fFlags; 2597765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool fLocalCoordsWillBeRead; 2607765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool fCoverageWillBeIgnored; 2614973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2622dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 2635478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2642e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt typedef GrGeometryProcessor INHERITED; 2654973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt}; 2664973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2674973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittGR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc); 2684973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 269c21b09eec91c9e263cb0b88467ea44e348ed4962bsalomonconst GrGeometryProcessor* DefaultGeoProc::TestCreate(GrProcessorTestData* d) { 2702dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t flags = 0; 2710067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 272b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kColor_GPFlag; 273b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } 274b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt if (d->fRandom->nextBool()) { 275b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kCoverage_GPFlag; 2764973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2770067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 278b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kLocalCoord_GPFlag; 2792dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2800067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 281b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= kTransformedLocalCoord_GPFlag; 2824973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2835478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2848059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt return DefaultGeoProc::Create(flags, 2850067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrRandomColor(d->fRandom), 2860067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrTest::TestMatrix(d->fRandom), 2870067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrTest::TestMatrix(d->fRandom), 2880067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt d->fRandom->nextBool(), 2890067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt d->fRandom->nextBool(), 2900067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt GrRandomCoverage(d->fRandom)); 2915478d427c6e67c986a3390162c8fec77c466058ajoshualitt} 2925478d427c6e67c986a3390162c8fec77c466058ajoshualitt 293e9d6095674979a9b843c291b85746922e9ac181ajoshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::Create(const Color& color, 294e9d6095674979a9b843c291b85746922e9ac181ajoshualitt const Coverage& coverage, 2950d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const LocalCoords& localCoords, 2960d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const SkMatrix& viewMatrix) { 297e9d6095674979a9b843c291b85746922e9ac181ajoshualitt uint32_t flags = 0; 298b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= color.fType == Color::kAttribute_Type ? kColor_GPFlag : 0; 299b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPFlag : 0; 300b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_GPFlag : 0; 301b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt flags |= localCoords.fType == LocalCoords::kHasTransformed_Type ? 302b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt kTransformedLocalCoord_GPFlag : 0; 303e9d6095674979a9b843c291b85746922e9ac181ajoshualitt 304e9d6095674979a9b843c291b85746922e9ac181ajoshualitt uint8_t inCoverage = coverage.fCoverage; 305e9d6095674979a9b843c291b85746922e9ac181ajoshualitt bool coverageWillBeIgnored = coverage.fType == Coverage::kNone_Type; 3060d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type; 307e9d6095674979a9b843c291b85746922e9ac181ajoshualitt 308e9d6095674979a9b843c291b85746922e9ac181ajoshualitt GrColor inColor = color.fColor; 309e9d6095674979a9b843c291b85746922e9ac181ajoshualitt return DefaultGeoProc::Create(flags, 310e9d6095674979a9b843c291b85746922e9ac181ajoshualitt inColor, 311e9d6095674979a9b843c291b85746922e9ac181ajoshualitt viewMatrix, 3120d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(), 313e9d6095674979a9b843c291b85746922e9ac181ajoshualitt localCoordsWillBeRead, 314e9d6095674979a9b843c291b85746922e9ac181ajoshualitt coverageWillBeIgnored, 315e9d6095674979a9b843c291b85746922e9ac181ajoshualitt inCoverage); 316e9d6095674979a9b843c291b85746922e9ac181ajoshualitt} 3170d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 3180d986d877edae36ad7dc6fbdbc69a56ca9372702joshualittconst GrGeometryProcessor* GrDefaultGeoProcFactory::CreateForDeviceSpace( 3190d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const Color& color, 3200d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const Coverage& coverage, 3210d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const LocalCoords& localCoords, 3220d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const SkMatrix& viewMatrix) { 3230d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt SkMatrix invert = SkMatrix::I(); 324df0c55785033c191d2d509c22662861588e4acd8joshualitt if (LocalCoords::kUnused_Type != localCoords.fType) { 325df0c55785033c191d2d509c22662861588e4acd8joshualitt SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType); 326df0c55785033c191d2d509c22662861588e4acd8joshualitt if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) { 327df0c55785033c191d2d509c22662861588e4acd8joshualitt SkDebugf("Could not invert\n"); 32896fcdcc219d2a0d3579719b84b28bede76efba64halcanary return nullptr; 329df0c55785033c191d2d509c22662861588e4acd8joshualitt } 3300d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 331df0c55785033c191d2d509c22662861588e4acd8joshualitt if (localCoords.hasLocalMatrix()) { 332df0c55785033c191d2d509c22662861588e4acd8joshualitt invert.preConcat(*localCoords.fMatrix); 333df0c55785033c191d2d509c22662861588e4acd8joshualitt } 3340d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt } 3350d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 3360d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert); 337df0c55785033c191d2d509c22662861588e4acd8joshualitt return Create(color, coverage, inverted, SkMatrix::I()); 3380d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt} 339