GrDefaultGeoProcFactory.cpp revision 3de0aee181b8fe0013b15100cba7381eb0468db4
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" 1106ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman#include "SkRefCnt.h" 122d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel#include "glsl/GrGLSLFragmentShaderBuilder.h" 13e659a581f63fdccb64dce2dc8a478cf56831feeaegdaniel#include "glsl/GrGLSLGeometryProcessor.h" 142d721d33aad192cc8a7a1321504b39bdca2a57ceegdaniel#include "glsl/GrGLSLVertexShaderBuilder.h" 150eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel#include "glsl/GrGLSLVarying.h" 167ea439b2203855db97330b25945b87dd4b170b8begdaniel#include "glsl/GrGLSLUniformHandler.h" 1764c4728c70001ed074fecf5c4e083781987b12e9egdaniel#include "glsl/GrGLSLUtil.h" 184973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 194973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt/* 204973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * The default Geometry Processor simply takes position and multiplies it by the uniform view 214973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * matrix. It also leaves coverage untouched. Behind the scenes, we may add per vertex color or 224973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt * local coords. 234973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt */ 24b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt 25b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualittenum GPFlag { 263de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon kColorAttribute_GPFlag = 0x1, 273de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon kColorAttributeIsSkColor_GPFlag = 0x2, 283de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon kLocalCoordAttribute_GPFlag = 0x4, 293de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon kCoverageAttribute_GPFlag = 0x8, 30b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt}; 31b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt 324973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittclass DefaultGeoProc : public GrGeometryProcessor { 334973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittpublic: 3406ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman static sk_sp<GrGeometryProcessor> Make(uint32_t gpTypeFlags, 353de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon GrColor color, 363de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon const SkMatrix& viewMatrix, 373de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon const SkMatrix& localMatrix, 383de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon bool localCoordsWillBeRead, 393de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon uint8_t coverage) { 4006ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman return sk_sp<GrGeometryProcessor>(new DefaultGeoProc( 418c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon gpTypeFlags, color, viewMatrix, localMatrix, coverage, localCoordsWillBeRead)); 424973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 434973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 4436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* name() const override { return "DefaultGeometryProcessor"; } 454973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 4671c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inPosition() const { return fInPosition; } 4771c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inColor() const { return fInColor; } 4871c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inLocalCoords() const { return fInLocalCoords; } 4971c9260e6fa1798ad1e41b2c2ae9b3cce08bb610joshualitt const Attribute* inCoverage() const { return fInCoverage; } 5088c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt GrColor color() const { return 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; } 56b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt bool hasVertexCoverage() const { return SkToBool(fInCoverage); } 579b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 5857d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel class GLSLProcessor : public GrGLSLGeometryProcessor { 594973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt public: 6057d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel GLSLProcessor() 615559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage(0xff) {} 624973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 6336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { 642dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); 654ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; 668528541dd7f09f5bd76f3f1ce5f45d08ac7347c7cdalton GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder; 670eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; 687ea439b2203855db97330b25945b87dd4b170b8begdaniel GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; 694973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 70abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit attributes 710eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel varyingHandler->emitAttributes(gp); 722dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt 732dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup pass through color 74bfd5183b9e039b50fb33441d1f90130b8eced80aBrian Salomon if (gp.hasVertexColor()) { 753de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon GrGLSLVertToFrag varying(kVec4f_GrSLType); 763de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon varyingHandler->addVarying("color", &varying); 773de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon if (gp.fFlags & kColorAttributeIsSkColor_GPFlag) { 783de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon // Do a red/blue swap and premul the color. 793de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon vertBuilder->codeAppendf("%s = vec4(%s.a*%s.bgr, %s.a);", varying.vsOut(), 803de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon gp.inColor()->fName, gp.inColor()->fName, 813de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon gp.inColor()->fName); 823de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon } else { 833de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon vertBuilder->codeAppendf("%s = %s;\n", varying.vsOut(), gp.inColor()->fName); 843de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon } 853de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, varying.fsIn()); 86bfd5183b9e039b50fb33441d1f90130b8eced80aBrian Salomon } else { 87bfd5183b9e039b50fb33441d1f90130b8eced80aBrian Salomon this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, 88bfd5183b9e039b50fb33441d1f90130b8eced80aBrian Salomon &fColorUniform); 89b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt } 90b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt 91abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // Setup position 927ea439b2203855db97330b25945b87dd4b170b8begdaniel this->setupPosition(vertBuilder, 937ea439b2203855db97330b25945b87dd4b170b8begdaniel uniformHandler, 944ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gpArgs, 954ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.inPosition()->fName, 964ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.viewMatrix(), 975559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt &fViewMatrixUniform); 984973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 99b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt if (gp.hasExplicitLocalCoords()) { 100abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit transforms with explicit local coords 1017ea439b2203855db97330b25945b87dd4b170b8begdaniel this->emitTransforms(vertBuilder, 1020eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel varyingHandler, 1037ea439b2203855db97330b25945b87dd4b170b8begdaniel uniformHandler, 1044ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gpArgs->fPositionVar, 1054ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.inLocalCoords()->fName, 1064ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.localMatrix(), 107a624bf3d1cb454c1959c5bbbf23a3afdfa3481f3bsalomon args.fFPCoordTransformHandler); 108abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt } else { 109abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt // emit transforms with position 1107ea439b2203855db97330b25945b87dd4b170b8begdaniel this->emitTransforms(vertBuilder, 1110eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel varyingHandler, 1127ea439b2203855db97330b25945b87dd4b170b8begdaniel uniformHandler, 1134ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gpArgs->fPositionVar, 1144ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.inPosition()->fName, 1154ca2e6034365ad280ec64473f7f1d72ebd8335e4egdaniel gp.localMatrix(), 116a624bf3d1cb454c1959c5bbbf23a3afdfa3481f3bsalomon args.fFPCoordTransformHandler); 117abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt } 118abb52a1a70a81915c6196e0fb3e9bcb05e8be14djoshualitt 1192dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt // Setup coverage as pass through 1208c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon if (gp.hasVertexCoverage()) { 1218c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon fragBuilder->codeAppendf("float alpha = 1.0;"); 1228c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon varyingHandler->addPassThroughAttribute(gp.inCoverage(), "alpha"); 1238c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); 1248c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon } else if (gp.coverage() == 0xff) { 1258c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon fragBuilder->codeAppendf("%s = vec4(1);", args.fOutputCoverage); 1268c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon } else { 1278c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon const char* fragCoverage; 1288c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon fCoverageUniform = uniformHandler->addUniform(kFragment_GrShaderFlag, 1298c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon kFloat_GrSLType, 1308c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon kDefault_GrSLPrecision, 1318c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon "Coverage", 1328c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon &fragCoverage); 1338c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage); 1342dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1354973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 1364973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 13787f48d997ec29e5eeaa7567355775e93465dd60djoshualitt static inline void GenKey(const GrGeometryProcessor& gp, 13894efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon const GrShaderCaps&, 13987f48d997ec29e5eeaa7567355775e93465dd60djoshualitt GrProcessorKeyBuilder* b) { 1402dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); 1418fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt uint32_t key = def.fFlags; 1423de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon key |= (def.coverage() == 0xff) ? 0x10 : 0; 1433de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon key |= (def.localCoordsWillBeRead() && def.localMatrix().hasPerspective()) ? 0x20 : 0x0; 1443de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon key |= ComputePosKey(def.viewMatrix()) << 20; 1458fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt b->add32(key); 1462dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 1474973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 148018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void setData(const GrGLSLProgramDataManager& pdman, 149a624bf3d1cb454c1959c5bbbf23a3afdfa3481f3bsalomon const GrPrimitiveProcessor& gp, 150a624bf3d1cb454c1959c5bbbf23a3afdfa3481f3bsalomon FPCoordTransformIter&& transformIter) override { 151e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>(); 1525559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt 1535559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) { 1545559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt fViewMatrix = dgp.viewMatrix(); 155018fb62d12d1febf121fe265da5b6117b86a6541egdaniel float viewMatrix[3 * 3]; 15664c4728c70001ed074fecf5c4e083781987b12e9egdaniel GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); 1575559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 1585559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt } 159ee2af95db72152dfa61c841875df0594ca93437djoshualitt 160b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt if (dgp.color() != fColor && !dgp.hasVertexColor()) { 161018fb62d12d1febf121fe265da5b6117b86a6541egdaniel float c[4]; 162b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt GrColorToRGBAFloat(dgp.color(), c); 1639b98932adaceb7ad0a617ade16616923f6bffe84joshualitt pdman.set4fv(fColorUniform, 1, c); 164b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fColor = dgp.color(); 1659b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 166b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt 1678c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon if (dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) { 168b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage())); 169b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt fCoverage = dgp.coverage(); 1709b98932adaceb7ad0a617ade16616923f6bffe84joshualitt } 171a624bf3d1cb454c1959c5bbbf23a3afdfa3481f3bsalomon this->setTransformDataHelper(dgp.fLocalMatrix, pdman, &transformIter); 172e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt } 173e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt 1744973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt private: 1755559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt SkMatrix fViewMatrix; 1769b98932adaceb7ad0a617ade16616923f6bffe84joshualitt GrColor fColor; 1779b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 1785559ca2a18687ef16b2fc92d8fcacbc1c3e93d54joshualitt UniformHandle fViewMatrixUniform; 1799b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fColorUniform; 1809b98932adaceb7ad0a617ade16616923f6bffe84joshualitt UniformHandle fCoverageUniform; 1819b98932adaceb7ad0a617ade16616923f6bffe84joshualitt 182e659a581f63fdccb64dce2dc8a478cf56831feeaegdaniel typedef GrGLSLGeometryProcessor INHERITED; 1834973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt }; 1844973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 18594efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override { 18657d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel GLSLProcessor::GenKey(*this, caps, b); 187eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 188eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 18994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override { 19057d3b039c635945e1dc2fcbac3462ed8bfedb068egdaniel return new GLSLProcessor(); 191eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt } 192eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt 1934973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittprivate: 1948059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt DefaultGeoProc(uint32_t gpTypeFlags, 1958059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrColor color, 1968059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 1978059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& localMatrix, 198b8c241ad099f3f0c2cbf3e7c10f5f6207175d490joshualitt uint8_t coverage, 1998c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon bool localCoordsWillBeRead) 2003de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon : fColor(color) 2018c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon , fViewMatrix(viewMatrix) 2028c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon , fLocalMatrix(localMatrix) 2038c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon , fCoverage(coverage) 2048c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon , fFlags(gpTypeFlags) 2058c852be264d003b2e610c5b8634bc0f81c46bbbaBrian Salomon , fLocalCoordsWillBeRead(localCoordsWillBeRead) { 206eb2a6761654307e8aeeeaabdd63c6bf9ab0411e9joshualitt this->initClassID<DefaultGeoProc>(); 2076cb807bf99ac0f8f166e1790f91bcb3afbfb5458bsalomon fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType, 2086cb807bf99ac0f8f166e1790f91bcb3afbfb5458bsalomon kHigh_GrSLPrecision); 2093de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon if (fFlags & kColorAttribute_GPFlag) { 2106cb807bf99ac0f8f166e1790f91bcb3afbfb5458bsalomon fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribType); 2112dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2123de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon if (fFlags & kLocalCoordAttribute_GPFlag) { 2139b345e3615a19f72ecae897c328a64662caf1370Brian Salomon fInLocalCoords = &this->addVertexAttrib("inLocalCoord", kVec2f_GrVertexAttribType, 2149b345e3615a19f72ecae897c328a64662caf1370Brian Salomon kHigh_GrSLPrecision); 215cc6aeee67509680e6a82a3024de2fd8562e0afd3bsalomon this->setHasExplicitLocalCoords(); 2162dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2173de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon if (fFlags & kCoverageAttribute_GPFlag) { 2186cb807bf99ac0f8f166e1790f91bcb3afbfb5458bsalomon fInCoverage = &this->addVertexAttrib("inCoverage", kFloat_GrVertexAttribType); 2192dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2202dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2214973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2223de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon const Attribute* fInPosition = nullptr; 2233de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon const Attribute* fInColor = nullptr; 2243de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon const Attribute* fInLocalCoords = nullptr; 2253de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon const Attribute* fInCoverage = nullptr; 22688c23fc6e8ed0243159fd17d815b4f813805647bjoshualitt GrColor fColor; 227e578a95d3ab16544794b94da4e7ae13fc2ce6244joshualitt SkMatrix fViewMatrix; 228e3ababe44315452cd33b96a18ce316ede09ff3c3joshualitt SkMatrix fLocalMatrix; 2299b98932adaceb7ad0a617ade16616923f6bffe84joshualitt uint8_t fCoverage; 2302dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t fFlags; 2317765a477ee3ca5e2c6ada1e16c31dfaae2079240bsalomon bool fLocalCoordsWillBeRead; 2324973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2332dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 2345478d427c6e67c986a3390162c8fec77c466058ajoshualitt 2352e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt typedef GrGeometryProcessor INHERITED; 2364973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt}; 2374973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 2384973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualittGR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc); 2394973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt 24006ca8ec87cf6fab57cadd043a5ac18c4154a4129bungemansk_sp<GrGeometryProcessor> DefaultGeoProc::TestCreate(GrProcessorTestData* d) { 2412dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt uint32_t flags = 0; 2420067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 2433de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon flags |= kColorAttribute_GPFlag; 244b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt } 245b2aa7cb90f4c66125056bac70dbca2093dd5ba41joshualitt if (d->fRandom->nextBool()) { 2463de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon flags |= kColorAttributeIsSkColor_GPFlag; 2474973d9da4aeb7c4d8b8e67e167586c7cc9534eeejoshualitt } 2480067ff5e0f85084dd2b5ad9886b526482b89a116joshualitt if (d->fRandom->nextBool()) { 2493de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon flags |= kCoverageAttribute_GPFlag; 2503de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon } 2513de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon if (d->fRandom->nextBool()) { 2523de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon flags |= kLocalCoordAttribute_GPFlag; 2532dd1ae016d7f297b433c3ea3a771ef8e01657c1fjoshualitt } 2545478d427c6e67c986a3390162c8fec77c466058ajoshualitt 25506ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman return DefaultGeoProc::Make(flags, 25606ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman GrRandomColor(d->fRandom), 25706ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman GrTest::TestMatrix(d->fRandom), 25806ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman GrTest::TestMatrix(d->fRandom), 2593de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon 26006ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman d->fRandom->nextBool(), 26106ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman GrRandomCoverage(d->fRandom)); 2625478d427c6e67c986a3390162c8fec77c466058ajoshualitt} 2635478d427c6e67c986a3390162c8fec77c466058ajoshualitt 26406ca8ec87cf6fab57cadd043a5ac18c4154a4129bungemansk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::Make(const Color& color, 26506ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman const Coverage& coverage, 26606ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman const LocalCoords& localCoords, 26706ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman const SkMatrix& viewMatrix) { 268e9d6095674979a9b843c291b85746922e9ac181ajoshualitt uint32_t flags = 0; 2693de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon if (Color::kPremulGrColorAttribute_Type == color.fType) { 2703de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon flags |= kColorAttribute_GPFlag; 2713de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon } else if (Color::kUnpremulSkColorAttribute_Type == color.fType) { 2723de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon flags |= kColorAttribute_GPFlag | kColorAttributeIsSkColor_GPFlag; 2733de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon } 2743de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverageAttribute_GPFlag : 0; 2753de0aee181b8fe0013b15100cba7381eb0468db4Brian Salomon flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoordAttribute_GPFlag : 0; 276e9d6095674979a9b843c291b85746922e9ac181ajoshualitt 277e9d6095674979a9b843c291b85746922e9ac181ajoshualitt uint8_t inCoverage = coverage.fCoverage; 2780d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type; 279e9d6095674979a9b843c291b85746922e9ac181ajoshualitt 280e9d6095674979a9b843c291b85746922e9ac181ajoshualitt GrColor inColor = color.fColor; 28106ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman return DefaultGeoProc::Make(flags, 28206ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman inColor, 28306ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman viewMatrix, 28406ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(), 28506ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman localCoordsWillBeRead, 28606ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman inCoverage); 287e9d6095674979a9b843c291b85746922e9ac181ajoshualitt} 2880d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 28906ca8ec87cf6fab57cadd043a5ac18c4154a4129bungemansk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::MakeForDeviceSpace( 2900d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const Color& color, 2910d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const Coverage& coverage, 2920d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const LocalCoords& localCoords, 2930d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt const SkMatrix& viewMatrix) { 2940d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt SkMatrix invert = SkMatrix::I(); 295df0c55785033c191d2d509c22662861588e4acd8joshualitt if (LocalCoords::kUnused_Type != localCoords.fType) { 296df0c55785033c191d2d509c22662861588e4acd8joshualitt SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType); 297df0c55785033c191d2d509c22662861588e4acd8joshualitt if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) { 298df0c55785033c191d2d509c22662861588e4acd8joshualitt SkDebugf("Could not invert\n"); 29996fcdcc219d2a0d3579719b84b28bede76efba64halcanary return nullptr; 300df0c55785033c191d2d509c22662861588e4acd8joshualitt } 3010d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 302df0c55785033c191d2d509c22662861588e4acd8joshualitt if (localCoords.hasLocalMatrix()) { 303df0c55785033c191d2d509c22662861588e4acd8joshualitt invert.preConcat(*localCoords.fMatrix); 304df0c55785033c191d2d509c22662861588e4acd8joshualitt } 3050d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt } 3060d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt 3070d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert); 30806ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman return Make(color, coverage, inverted, SkMatrix::I()); 3090d986d877edae36ad7dc6fbdbc69a56ca9372702joshualitt} 310