| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrDefaultGeoProcFactory.h" | 8 #include "GrDefaultGeoProcFactory.h" |
| 9 | 9 |
| 10 #include "GrInvariantOutput.h" | 10 #include "GrInvariantOutput.h" |
| 11 #include "SkRefCnt.h" | 11 #include "SkRefCnt.h" |
| 12 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 12 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
| 13 #include "glsl/GrGLSLGeometryProcessor.h" | 13 #include "glsl/GrGLSLGeometryProcessor.h" |
| 14 #include "glsl/GrGLSLVertexShaderBuilder.h" | 14 #include "glsl/GrGLSLVertexShaderBuilder.h" |
| 15 #include "glsl/GrGLSLVarying.h" | 15 #include "glsl/GrGLSLVarying.h" |
| 16 #include "glsl/GrGLSLUniformHandler.h" | 16 #include "glsl/GrGLSLUniformHandler.h" |
| 17 #include "glsl/GrGLSLUtil.h" | 17 #include "glsl/GrGLSLUtil.h" |
| 18 | 18 |
| 19 /* | 19 /* |
| 20 * The default Geometry Processor simply takes position and multiplies it by the
uniform view | 20 * The default Geometry Processor simply takes position and multiplies it by the
uniform view |
| 21 * matrix. It also leaves coverage untouched. Behind the scenes, we may add per
vertex color or | 21 * matrix. It also leaves coverage untouched. Behind the scenes, we may add per
vertex color or |
| 22 * local coords. | 22 * local coords. |
| 23 */ | 23 */ |
| 24 | 24 |
| 25 enum GPFlag { | 25 enum GPFlag { |
| 26 kColor_GPFlag = 0x1, | 26 kColor_GPFlag = 0x1, |
| 27 kLocalCoord_GPFlag = 0x2, | 27 kLocalCoord_GPFlag = 0x2, |
| 28 kCoverage_GPFlag= 0x4, | 28 kCoverage_GPFlag= 0x4, |
| 29 kTransformedLocalCoord_GPFlag = 0x8, | |
| 30 }; | 29 }; |
| 31 | 30 |
| 32 class DefaultGeoProc : public GrGeometryProcessor { | 31 class DefaultGeoProc : public GrGeometryProcessor { |
| 33 public: | 32 public: |
| 34 static sk_sp<GrGeometryProcessor> Make(uint32_t gpTypeFlags, | 33 static sk_sp<GrGeometryProcessor> Make(uint32_t gpTypeFlags, |
| 35 GrColor color, | 34 GrColor color, |
| 36 const SkMatrix& viewMatrix, | 35 const SkMatrix& viewMatrix, |
| 37 const SkMatrix& localMatrix, | 36 const SkMatrix& localMatrix, |
| 38 bool localCoordsWillBeRead, | 37 bool localCoordsWillBeRead, |
| 39 bool coverageWillBeIgnored, | 38 bool coverageWillBeIgnored, |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 if (gp.hasExplicitLocalCoords()) { | 94 if (gp.hasExplicitLocalCoords()) { |
| 96 // emit transforms with explicit local coords | 95 // emit transforms with explicit local coords |
| 97 this->emitTransforms(vertBuilder, | 96 this->emitTransforms(vertBuilder, |
| 98 varyingHandler, | 97 varyingHandler, |
| 99 uniformHandler, | 98 uniformHandler, |
| 100 gpArgs->fPositionVar, | 99 gpArgs->fPositionVar, |
| 101 gp.inLocalCoords()->fName, | 100 gp.inLocalCoords()->fName, |
| 102 gp.localMatrix(), | 101 gp.localMatrix(), |
| 103 args.fTransformsIn, | 102 args.fTransformsIn, |
| 104 args.fTransformsOut); | 103 args.fTransformsOut); |
| 105 } else if(gp.hasTransformedLocalCoords()) { | |
| 106 // transforms have already been applied to vertex attributes on
the cpu | |
| 107 this->emitTransforms(vertBuilder, | |
| 108 varyingHandler, | |
| 109 gp.inLocalCoords()->fName, | |
| 110 args.fTransformsIn, | |
| 111 args.fTransformsOut); | |
| 112 } else { | 104 } else { |
| 113 // emit transforms with position | 105 // emit transforms with position |
| 114 this->emitTransforms(vertBuilder, | 106 this->emitTransforms(vertBuilder, |
| 115 varyingHandler, | 107 varyingHandler, |
| 116 uniformHandler, | 108 uniformHandler, |
| 117 gpArgs->fPositionVar, | 109 gpArgs->fPositionVar, |
| 118 gp.inPosition()->fName, | 110 gp.inPosition()->fName, |
| 119 gp.localMatrix(), | 111 gp.localMatrix(), |
| 120 args.fTransformsIn, | 112 args.fTransformsIn, |
| 121 args.fTransformsOut); | 113 args.fTransformsOut); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 , fColor(color) | 216 , fColor(color) |
| 225 , fViewMatrix(viewMatrix) | 217 , fViewMatrix(viewMatrix) |
| 226 , fLocalMatrix(localMatrix) | 218 , fLocalMatrix(localMatrix) |
| 227 , fCoverage(coverage) | 219 , fCoverage(coverage) |
| 228 , fFlags(gpTypeFlags) | 220 , fFlags(gpTypeFlags) |
| 229 , fLocalCoordsWillBeRead(localCoordsWillBeRead) | 221 , fLocalCoordsWillBeRead(localCoordsWillBeRead) |
| 230 , fCoverageWillBeIgnored(coverageWillBeIgnored) { | 222 , fCoverageWillBeIgnored(coverageWillBeIgnored) { |
| 231 this->initClassID<DefaultGeoProc>(); | 223 this->initClassID<DefaultGeoProc>(); |
| 232 bool hasColor = SkToBool(gpTypeFlags & kColor_GPFlag); | 224 bool hasColor = SkToBool(gpTypeFlags & kColor_GPFlag); |
| 233 bool hasExplicitLocalCoords = SkToBool(gpTypeFlags & kLocalCoord_GPFlag)
; | 225 bool hasExplicitLocalCoords = SkToBool(gpTypeFlags & kLocalCoord_GPFlag)
; |
| 234 bool hasTransformedLocalCoords = SkToBool(gpTypeFlags & kTransformedLoca
lCoord_GPFlag); | |
| 235 bool hasLocalCoord = hasExplicitLocalCoords || hasTransformedLocalCoords
; | |
| 236 bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPFlag); | 226 bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPFlag); |
| 237 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttrib
Type, | 227 fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttrib
Type, |
| 238 kHigh_GrSLPrecision); | 228 kHigh_GrSLPrecision); |
| 239 if (hasColor) { | 229 if (hasColor) { |
| 240 fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribT
ype); | 230 fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribT
ype); |
| 241 } | 231 } |
| 242 if (hasLocalCoord) { | 232 if (hasExplicitLocalCoords) { |
| 243 fInLocalCoords = &this->addVertexAttrib("inLocalCoord", kVec2f_GrVer
texAttribType); | 233 fInLocalCoords = &this->addVertexAttrib("inLocalCoord", kVec2f_GrVer
texAttribType); |
| 244 if (hasExplicitLocalCoords) { | 234 this->setHasExplicitLocalCoords(); |
| 245 this->setHasExplicitLocalCoords(); | |
| 246 } else { | |
| 247 SkASSERT(hasTransformedLocalCoords); | |
| 248 this->setHasTransformedLocalCoords(); | |
| 249 } | |
| 250 } | 235 } |
| 251 if (hasCoverage) { | 236 if (hasCoverage) { |
| 252 fInCoverage = &this->addVertexAttrib("inCoverage", kFloat_GrVertexAt
tribType); | 237 fInCoverage = &this->addVertexAttrib("inCoverage", kFloat_GrVertexAt
tribType); |
| 253 } | 238 } |
| 254 } | 239 } |
| 255 | 240 |
| 256 const Attribute* fInPosition; | 241 const Attribute* fInPosition; |
| 257 const Attribute* fInColor; | 242 const Attribute* fInColor; |
| 258 const Attribute* fInLocalCoords; | 243 const Attribute* fInLocalCoords; |
| 259 const Attribute* fInCoverage; | 244 const Attribute* fInCoverage; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 276 uint32_t flags = 0; | 261 uint32_t flags = 0; |
| 277 if (d->fRandom->nextBool()) { | 262 if (d->fRandom->nextBool()) { |
| 278 flags |= kColor_GPFlag; | 263 flags |= kColor_GPFlag; |
| 279 } | 264 } |
| 280 if (d->fRandom->nextBool()) { | 265 if (d->fRandom->nextBool()) { |
| 281 flags |= kCoverage_GPFlag; | 266 flags |= kCoverage_GPFlag; |
| 282 } | 267 } |
| 283 if (d->fRandom->nextBool()) { | 268 if (d->fRandom->nextBool()) { |
| 284 flags |= kLocalCoord_GPFlag; | 269 flags |= kLocalCoord_GPFlag; |
| 285 } | 270 } |
| 286 if (d->fRandom->nextBool()) { | |
| 287 flags |= kTransformedLocalCoord_GPFlag; | |
| 288 } | |
| 289 | 271 |
| 290 return DefaultGeoProc::Make(flags, | 272 return DefaultGeoProc::Make(flags, |
| 291 GrRandomColor(d->fRandom), | 273 GrRandomColor(d->fRandom), |
| 292 GrTest::TestMatrix(d->fRandom), | 274 GrTest::TestMatrix(d->fRandom), |
| 293 GrTest::TestMatrix(d->fRandom), | 275 GrTest::TestMatrix(d->fRandom), |
| 294 d->fRandom->nextBool(), | 276 d->fRandom->nextBool(), |
| 295 d->fRandom->nextBool(), | 277 d->fRandom->nextBool(), |
| 296 GrRandomCoverage(d->fRandom)); | 278 GrRandomCoverage(d->fRandom)); |
| 297 } | 279 } |
| 298 | 280 |
| 299 sk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::Make(const Color& color, | 281 sk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::Make(const Color& color, |
| 300 const Coverage& coverag
e, | 282 const Coverage& coverag
e, |
| 301 const LocalCoords& loca
lCoords, | 283 const LocalCoords& loca
lCoords, |
| 302 const SkMatrix& viewMat
rix) { | 284 const SkMatrix& viewMat
rix) { |
| 303 uint32_t flags = 0; | 285 uint32_t flags = 0; |
| 304 flags |= color.fType == Color::kAttribute_Type ? kColor_GPFlag : 0; | 286 flags |= color.fType == Color::kAttribute_Type ? kColor_GPFlag : 0; |
| 305 flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPFlag : 0; | 287 flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverage_GPFlag : 0; |
| 306 flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_G
PFlag : 0; | 288 flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoord_G
PFlag : 0; |
| 307 flags |= localCoords.fType == LocalCoords::kHasTransformed_Type ? | |
| 308 kTransformedLocalCoord_GPFlag : 0; | |
| 309 | 289 |
| 310 uint8_t inCoverage = coverage.fCoverage; | 290 uint8_t inCoverage = coverage.fCoverage; |
| 311 bool coverageWillBeIgnored = coverage.fType == Coverage::kNone_Type; | 291 bool coverageWillBeIgnored = coverage.fType == Coverage::kNone_Type; |
| 312 bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type; | 292 bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type; |
| 313 | 293 |
| 314 GrColor inColor = color.fColor; | 294 GrColor inColor = color.fColor; |
| 315 return DefaultGeoProc::Make(flags, | 295 return DefaultGeoProc::Make(flags, |
| 316 inColor, | 296 inColor, |
| 317 viewMatrix, | 297 viewMatrix, |
| 318 localCoords.fMatrix ? *localCoords.fMatrix : SkM
atrix::I(), | 298 localCoords.fMatrix ? *localCoords.fMatrix : SkM
atrix::I(), |
| (...skipping 16 matching lines...) Expand all Loading... |
| 335 } | 315 } |
| 336 | 316 |
| 337 if (localCoords.hasLocalMatrix()) { | 317 if (localCoords.hasLocalMatrix()) { |
| 338 invert.preConcat(*localCoords.fMatrix); | 318 invert.preConcat(*localCoords.fMatrix); |
| 339 } | 319 } |
| 340 } | 320 } |
| 341 | 321 |
| 342 LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert); | 322 LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert); |
| 343 return Make(color, coverage, inverted, SkMatrix::I()); | 323 return Make(color, coverage, inverted, SkMatrix::I()); |
| 344 } | 324 } |
| OLD | NEW |