GrDefaultGeoProcFactory.cpp revision a624bf3d1cb454c1959c5bbbf23a3afdfa3481f3
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright 2014 Google Inc. 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Use of this source code is governed by a BSD-style license that can be 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * found in the LICENSE file. 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "GrDefaultGeoProcFactory.h" 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "GrInvariantOutput.h" 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkRefCnt.h" 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLFragmentShaderBuilder.h" 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLGeometryProcessor.h" 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLVertexShaderBuilder.h" 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLVarying.h" 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLUniformHandler.h" 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "glsl/GrGLSLUtil.h" 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * The default Geometry Processor simply takes position and multiplies it by the uniform view 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * matrix. It also leaves coverage untouched. Behind the scenes, we may add per vertex color or 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * local coords. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum GPFlag { 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project kColor_GPFlag = 0x1, 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project kLocalCoord_GPFlag = 0x2, 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project kCoverage_GPFlag= 0x4, 29258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov}; 30cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass DefaultGeoProc : public GrGeometryProcessor { 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectpublic: 338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson static sk_sp<GrGeometryProcessor> Make(uint32_t gpTypeFlags, 348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson GrColor color, 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const SkMatrix& viewMatrix, 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const SkMatrix& localMatrix, 37cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool localCoordsWillBeRead, 38cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool coverageWillBeIgnored, 39cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t coverage) { 40cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return sk_sp<GrGeometryProcessor>(new DefaultGeoProc( 41cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson gpTypeFlags, color, viewMatrix, localMatrix, coverage, 42cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson localCoordsWillBeRead, coverageWillBeIgnored)); 43cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 44cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 45cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const char* name() const override { return "DefaultGeometryProcessor"; } 46cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 47cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const Attribute* inPosition() const { return fInPosition; } 48cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const Attribute* inColor() const { return fInColor; } 49cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const Attribute* inLocalCoords() const { return fInLocalCoords; } 50cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const Attribute* inCoverage() const { return fInCoverage; } 51cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GrColor color() const { return fColor; } 52cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool colorIgnored() const { return GrColor_ILLEGAL == fColor; } 53cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool hasVertexColor() const { return SkToBool(fInColor); } 54cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const SkMatrix& viewMatrix() const { return fViewMatrix; } 55cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const SkMatrix& localMatrix() const { return fLocalMatrix; } 56cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool localCoordsWillBeRead() const { return fLocalCoordsWillBeRead; } 57cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t coverage() const { return fCoverage; } 58cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool coverageWillBeIgnored() const { return fCoverageWillBeIgnored; } 59cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool hasVertexCoverage() const { return SkToBool(fInCoverage); } 60cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 61cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson class GLSLProcessor : public GrGLSLGeometryProcessor { 62cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson public: 63cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GLSLProcessor() 64cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage(0xff) {} 65cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); 68cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; 69cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; 72cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 73cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // emit attributes 74cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson varyingHandler->emitAttributes(gp); 75cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 76cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // Setup pass through color 77cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!gp.colorIgnored()) { 78cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (gp.hasVertexColor()) { 79cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson varyingHandler->addPassThroughAttribute(gp.inColor(), args.fOutputColor); 80cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 81cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, 82cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &fColorUniform); 83cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 84cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 85cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 86cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // Setup position 87cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson this->setupPosition(vertBuilder, 88cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uniformHandler, 89cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson gpArgs, 90cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson gp.inPosition()->fName, 91cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson gp.viewMatrix(), 92cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &fViewMatrixUniform); 93cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 94cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (gp.hasExplicitLocalCoords()) { 95cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // emit transforms with explicit local coords 96cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson this->emitTransforms(vertBuilder, 97cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson varyingHandler, 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uniformHandler, 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gpArgs->fPositionVar, 100cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson gp.inLocalCoords()->fName, 101cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson gp.localMatrix(), 102cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson args.fFPCoordTransformHandler); 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } else { 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // emit transforms with position 105cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson this->emitTransforms(vertBuilder, 106cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson varyingHandler, 107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uniformHandler, 108cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson gpArgs->fPositionVar, 109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson gp.inPosition()->fName, 110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson gp.localMatrix(), 111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson args.fFPCoordTransformHandler); 112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // Setup coverage as pass through 115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!gp.coverageWillBeIgnored()) { 116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (gp.hasVertexCoverage()) { 117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson fragBuilder->codeAppendf("float alpha = 1.0;"); 118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson varyingHandler->addPassThroughAttribute(gp.inCoverage(), "alpha"); 119cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); 120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (gp.coverage() == 0xff) { 121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson fragBuilder->codeAppendf("%s = vec4(1);", args.fOutputCoverage); 122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const char* fragCoverage; 124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson fCoverageUniform = uniformHandler->addUniform(kFragment_GrShaderFlag, 125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson kFloat_GrSLType, 126cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson kDefault_GrSLPrecision, 127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "Coverage", 128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &fragCoverage); 129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCoverage); 130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 131cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 134cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson static inline void GenKey(const GrGeometryProcessor& gp, 135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const GrGLSLCaps&, 136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GrProcessorKeyBuilder* b) { 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t key = def.fFlags; 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key |= def.colorIgnored() << 8; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key |= def.coverageWillBeIgnored() << 9; 141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson key |= def.hasVertexColor() << 10; 142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson key |= def.hasVertexCoverage() << 11; 143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson key |= def.coverage() == 0xff ? 0x1 << 12 : 0; 144cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson key |= def.localCoordsWillBeRead() && def.localMatrix().hasPerspective() ? 0x1 << 24 : 145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 0x0; 146cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson key |= ComputePosKey(def.viewMatrix()) << 25; 147cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson b->add32(key); 148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson void setData(const GrGLSLProgramDataManager& pdman, 151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const GrPrimitiveProcessor& gp, 152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson FPCoordTransformIter&& transformIter) override { 153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>(); 154cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) { 156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson fViewMatrix = dgp.viewMatrix(); 157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson float viewMatrix[3 * 3]; 158cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); 159cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 160cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 161cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 162cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (dgp.color() != fColor && !dgp.hasVertexColor()) { 163cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson float c[4]; 164cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GrColorToRGBAFloat(dgp.color(), c); 165cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson pdman.set4fv(fColorUniform, 1, c); 166cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson fColor = dgp.color(); 167cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!dgp.coverageWillBeIgnored() && 170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) { 171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage())); 172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson fCoverage = dgp.coverage(); 173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson this->setTransformDataHelper(dgp.fLocalMatrix, pdman, &transformIter); 175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson private: 178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson SkMatrix fViewMatrix; 179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GrColor fColor; 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint8_t fCoverage; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UniformHandle fViewMatrixUniform; 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UniformHandle fColorUniform; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UniformHandle fCoverageUniform; 184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson typedef GrGLSLGeometryProcessor INHERITED; 186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson }; 187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 188cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson void getGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override { 189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GLSLProcessor::GenKey(*this, caps, b); 190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) const override { 193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return new GLSLProcessor(); 194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonprivate: 197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson DefaultGeoProc(uint32_t gpTypeFlags, 198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GrColor color, 199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const SkMatrix& viewMatrix, 200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const SkMatrix& localMatrix, 201cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t coverage, 202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool localCoordsWillBeRead, 203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool coverageWillBeIgnored) 204cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson : fInPosition(nullptr) 205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson , fInColor(nullptr) 206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson , fInLocalCoords(nullptr) 207cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson , fInCoverage(nullptr) 208cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson , fColor(color) 209cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson , fViewMatrix(viewMatrix) 210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson , fLocalMatrix(localMatrix) 211cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson , fCoverage(coverage) 212cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson , fFlags(gpTypeFlags) 213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson , fLocalCoordsWillBeRead(localCoordsWillBeRead) 214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson , fCoverageWillBeIgnored(coverageWillBeIgnored) { 215cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson this->initClassID<DefaultGeoProc>(); 216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool hasColor = SkToBool(gpTypeFlags & kColor_GPFlag); 217cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool hasExplicitLocalCoords = SkToBool(gpTypeFlags & kLocalCoord_GPFlag); 218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPFlag); 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType, 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project kHigh_GrSLPrecision); 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hasColor) { 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribType); 223cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 224cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (hasExplicitLocalCoords) { 225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson fInLocalCoords = &this->addVertexAttrib("inLocalCoord", kVec2f_GrVertexAttribType); 226cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson this->setHasExplicitLocalCoords(); 227cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 228cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (hasCoverage) { 229cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson fInCoverage = &this->addVertexAttrib("inCoverage", kFloat_GrVertexAttribType); 230cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 231cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 232cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 233cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const Attribute* fInPosition; 234cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const Attribute* fInColor; 235cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const Attribute* fInLocalCoords; 236cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const Attribute* fInCoverage; 237cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GrColor fColor; 238cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson SkMatrix fViewMatrix; 239cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson SkMatrix fLocalMatrix; 240cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t fCoverage; 241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t fFlags; 242cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool fLocalCoordsWillBeRead; 243cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool fCoverageWillBeIgnored; 244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 247cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson typedef GrGeometryProcessor INHERITED; 248cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson}; 249cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 250cd1fd07f1306e08fe048682dd5918987e579f937Myles WatsonGR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc); 251cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 252cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonsk_sp<GrGeometryProcessor> DefaultGeoProc::TestCreate(GrProcessorTestData* d) { 253cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t flags = 0; 254cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (d->fRandom->nextBool()) { 255cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson flags |= kColor_GPFlag; 256cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 257cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (d->fRandom->nextBool()) { 258cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson flags |= kCoverage_GPFlag; 259cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 260cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (d->fRandom->nextBool()) { 261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson flags |= kLocalCoord_GPFlag; 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return DefaultGeoProc::Make(flags, 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GrRandomColor(d->fRandom), 266e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen GrTest::TestMatrix(d->fRandom), 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GrTest::TestMatrix(d->fRandom), 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project d->fRandom->nextBool(), 269cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson d->fRandom->nextBool(), 270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GrRandomCoverage(d->fRandom)); 271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson} 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectsk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::Make(const Color& color, 2748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson const Coverage& coverage, 2758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson const LocalCoords& localCoords, 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const SkMatrix& viewMatrix) { 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t flags = 0; 278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson flags |= color.fType == Color::kAttribute_Type ? kColor_GPFlag : 0; 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPFlag : 0; 280e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_GPFlag : 0; 281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t inCoverage = coverage.fCoverage; 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool coverageWillBeIgnored = coverage.fType == Coverage::kNone_Type; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type; 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson GrColor inColor = color.fColor; 2878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson return DefaultGeoProc::Make(flags, 2888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson inColor, 2898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson viewMatrix, 2908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(), 2918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson localCoordsWillBeRead, 292cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson coverageWillBeIgnored, 2931baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson inCoverage); 2948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson} 2958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson 296cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonsk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::MakeForDeviceSpace( 297cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const Color& color, 298cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const Coverage& coverage, 299cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const LocalCoords& localCoords, 300cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const SkMatrix& viewMatrix) { 301cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson SkMatrix invert = SkMatrix::I(); 302e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen if (LocalCoords::kUnused_Type != localCoords.fType) { 303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType); 304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) { 305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson SkDebugf("Could not invert\n"); 306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return nullptr; 307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (localCoords.hasLocalMatrix()) { 310cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson invert.preConcat(*localCoords.fMatrix); 311cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 313cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 314cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert); 315cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return Make(color, coverage, inverted, SkMatrix::I()); 316cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson} 317cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson