| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 "GrMSAAPathRenderer.h" | 8 #include "GrMSAAPathRenderer.h" |
| 9 | 9 |
| 10 #include "GrAuditTrail.h" | 10 #include "GrAuditTrail.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 }; | 77 }; |
| 78 | 78 |
| 79 static inline void append_contour_edge_indices(uint16_t fanCenterIdx, | 79 static inline void append_contour_edge_indices(uint16_t fanCenterIdx, |
| 80 uint16_t edgeV0Idx, | 80 uint16_t edgeV0Idx, |
| 81 MSAALineVertices& lines) { | 81 MSAALineVertices& lines) { |
| 82 *(lines.nextIndex++) = fanCenterIdx; | 82 *(lines.nextIndex++) = fanCenterIdx; |
| 83 *(lines.nextIndex++) = edgeV0Idx; | 83 *(lines.nextIndex++) = edgeV0Idx; |
| 84 *(lines.nextIndex++) = edgeV0Idx + 1; | 84 *(lines.nextIndex++) = edgeV0Idx + 1; |
| 85 } | 85 } |
| 86 | 86 |
| 87 static inline void add_quad(MSAALineVertices& lines, MSAAQuadVertices& quads, co
nst SkPoint pts[], | 87 static inline void add_quad(MSAALineVertices& lines, MSAAQuadVertices& quads, co
nst SkPoint pts[], |
| 88 SkColor color, bool indexed, uint16_t subpathLineIdx
Start) { | 88 SkColor color, bool indexed, uint16_t subpathLineIdx
Start) { |
| 89 SkASSERT(lines.nextVertex < lines.verticesEnd); | 89 SkASSERT(lines.nextVertex < lines.verticesEnd); |
| 90 *lines.nextVertex = { pts[2], color }; | 90 *lines.nextVertex = { pts[2], color }; |
| 91 if (indexed) { | 91 if (indexed) { |
| 92 int prevIdx = (uint16_t) (lines.nextVertex - lines.vertices - 1); | 92 int prevIdx = (uint16_t) (lines.nextVertex - lines.vertices - 1); |
| 93 if (prevIdx > subpathLineIdxStart) { | 93 if (prevIdx > subpathLineIdxStart) { |
| 94 append_contour_edge_indices(subpathLineIdxStart, prevIdx, lines); | 94 append_contour_edge_indices(subpathLineIdxStart, prevIdx, lines); |
| 95 } | 95 } |
| 96 } | 96 } |
| 97 lines.nextVertex++; | 97 lines.nextVertex++; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 | 137 |
| 138 // emit attributes | 138 // emit attributes |
| 139 varyingHandler->emitAttributes(qp); | 139 varyingHandler->emitAttributes(qp); |
| 140 varyingHandler->addPassThroughAttribute(qp.inColor(), args.fOutputCo
lor); | 140 varyingHandler->addPassThroughAttribute(qp.inColor(), args.fOutputCo
lor); |
| 141 | 141 |
| 142 GrGLSLVertToFrag uv(kVec2f_GrSLType); | 142 GrGLSLVertToFrag uv(kVec2f_GrSLType); |
| 143 varyingHandler->addVarying("uv", &uv, kHigh_GrSLPrecision); | 143 varyingHandler->addVarying("uv", &uv, kHigh_GrSLPrecision); |
| 144 vsBuilder->codeAppendf("%s = %s;", uv.vsOut(), qp.inUV()->fName); | 144 vsBuilder->codeAppendf("%s = %s;", uv.vsOut(), qp.inUV()->fName); |
| 145 | 145 |
| 146 // Setup position | 146 // Setup position |
| 147 this->setupPosition(vsBuilder, uniformHandler, gpArgs, qp.inPosition
()->fName, | 147 this->setupPosition(vsBuilder, uniformHandler, gpArgs, qp.inPosition
()->fName, |
| 148 qp.viewMatrix(), &fViewMatrixUniform); | 148 qp.viewMatrix(), &fViewMatrixUniform); |
| 149 | 149 |
| 150 // emit transforms | 150 // emit transforms |
| 151 this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpAr
gs->fPositionVar, | 151 this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpAr
gs->fPositionVar, |
| 152 qp.inPosition()->fName, SkMatrix::I(), args.fTr
ansformsIn, | 152 qp.inPosition()->fName, SkMatrix::I(), args.fTr
ansformsIn, |
| 153 args.fTransformsOut); | 153 args.fTransformsOut); |
| 154 | 154 |
| 155 GrGLSLPPFragmentBuilder* fsBuilder = args.fFragBuilder; | 155 GrGLSLPPFragmentBuilder* fsBuilder = args.fFragBuilder; |
| 156 fsBuilder->codeAppendf("if (%s.x * %s.x >= %s.y) discard;", uv.fsIn(
), uv.fsIn(), | 156 fsBuilder->codeAppendf("if (%s.x * %s.x >= %s.y) discard;", uv.fsIn(
), uv.fsIn(), |
| 157 uv.fsIn(
)); | 157 uv.fsIn(
)); |
| 158 fsBuilder->codeAppendf("%s = vec4(1.0);", args.fOutputCoverage); | 158 fsBuilder->codeAppendf("%s = vec4(1.0);", args.fOutputCoverage); |
| 159 } | 159 } |
| 160 | 160 |
| 161 static inline void GenKey(const GrGeometryProcessor& gp, | 161 static inline void GenKey(const GrGeometryProcessor& gp, |
| 162 const GrGLSLCaps&, | 162 const GrGLSLCaps&, |
| 163 GrProcessorKeyBuilder* b) { | 163 GrProcessorKeyBuilder* b) { |
| 164 const MSAAQuadProcessor& qp = gp.cast<MSAAQuadProcessor>(); | 164 const MSAAQuadProcessor& qp = gp.cast<MSAAQuadProcessor>(); |
| 165 uint32_t key = 0; | 165 uint32_t key = 0; |
| 166 key |= qp.viewMatrix().hasPerspective() ? 0x1 : 0x0; | 166 key |= qp.viewMatrix().hasPerspective() ? 0x1 : 0x0; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 197 } | 197 } |
| 198 | 198 |
| 199 virtual GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) cons
t override { | 199 virtual GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) cons
t override { |
| 200 return new GLSLProcessor(*this); | 200 return new GLSLProcessor(*this); |
| 201 } | 201 } |
| 202 | 202 |
| 203 private: | 203 private: |
| 204 MSAAQuadProcessor(const SkMatrix& viewMatrix) | 204 MSAAQuadProcessor(const SkMatrix& viewMatrix) |
| 205 : fViewMatrix(viewMatrix) { | 205 : fViewMatrix(viewMatrix) { |
| 206 this->initClassID<MSAAQuadProcessor>(); | 206 this->initClassID<MSAAQuadProcessor>(); |
| 207 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe
rtexAttribType, | 207 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe
rtexAttribType, |
| 208 kHigh_GrSLPrecision)); | 208 kHigh_GrSLPrecision)); |
| 209 fInUV = &this->addVertexAttrib(Attribute("inUV", kVec2f_GrVertexAttribTy
pe, | 209 fInUV = &this->addVertexAttrib(Attribute("inUV", kVec2f_GrVertexAttribTy
pe, |
| 210 kHigh_GrSLPrecision)); | 210 kHigh_GrSLPrecision)); |
| 211 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); | 211 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); |
| 212 this->setSampleShading(1.0f); | 212 this->setSampleShading(1.0f); |
| 213 } | 213 } |
| 214 | 214 |
| 215 const Attribute* fInPosition; | 215 const Attribute* fInPosition; |
| 216 const Attribute* fInUV; | 216 const Attribute* fInUV; |
| 217 const Attribute* fInColor; | 217 const Attribute* fInColor; |
| 218 SkMatrix fViewMatrix; | 218 SkMatrix fViewMatrix; |
| 219 | 219 |
| 220 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 220 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
| 221 | 221 |
| 222 typedef GrGeometryProcessor INHERITED; | 222 typedef GrGeometryProcessor INHERITED; |
| 223 }; | 223 }; |
| 224 | 224 |
| 225 class MSAAPathBatch : public GrVertexBatch { | 225 class MSAAPathBatch : public GrVertexBatch { |
| 226 public: | 226 public: |
| 227 DEFINE_BATCH_CLASS_ID | 227 DEFINE_BATCH_CLASS_ID |
| 228 | 228 |
| 229 struct Geometry { | 229 struct Geometry { |
| 230 GrColor fColor; | 230 GrColor fColor; |
| 231 SkPath fPath; | 231 SkPath fPath; |
| 232 SkScalar fTolerance; | 232 SkScalar fTolerance; |
| 233 }; | 233 }; |
| 234 | 234 |
| 235 static MSAAPathBatch* Create(const Geometry& geometry, const SkMatrix& viewM
atrix, | 235 static MSAAPathBatch* Create(const Geometry& geometry, const SkMatrix& viewM
atrix, |
| 236 const SkRect& devBounds) { | 236 const SkRect& devBounds) { |
| 237 return new MSAAPathBatch(geometry, viewMatrix, devBounds); | 237 return new MSAAPathBatch(geometry, viewMatrix, devBounds); |
| 238 } | 238 } |
| 239 | 239 |
| 240 const char* name() const override { return "MSAAPathBatch"; } | 240 const char* name() const override { return "MSAAPathBatch"; } |
| 241 | 241 |
| 242 void computePipelineOptimizations(GrInitInvariantOutput* color, | 242 void computePipelineOptimizations(GrInitInvariantOutput* color, |
| 243 GrInitInvariantOutput* coverage, | 243 GrInitInvariantOutput* coverage, |
| 244 GrBatchToXPOverrides* overrides) const ove
rride { | 244 GrBatchToXPOverrides* overrides) const ove
rride { |
| 245 // When this is called on a batch, there is only one geometry bundle | 245 // When this is called on a batch, there is only one geometry bundle |
| 246 color->setKnownFourComponents(fGeoData[0].fColor); | 246 color->setKnownFourComponents(fGeoData[0].fColor); |
| 247 coverage->setKnownSingleComponent(0xff); | 247 coverage->setKnownSingleComponent(0xff); |
| 248 } | 248 } |
| 249 | 249 |
| 250 bool isValid() const { | 250 bool isValid() const { |
| 251 return !fIsIndexed || fMaxLineIndices <= SK_MaxU16; | 251 return !fIsIndexed || fMaxLineIndices <= SK_MaxU16; |
| 252 } | 252 } |
| 253 | 253 |
| 254 private: | 254 private: |
| 255 void initBatchTracker(const GrXPOverridesForBatch& overrides) override { | 255 void initBatchTracker(const GrXPOverridesForBatch& overrides) override { |
| 256 // Handle any color overrides | 256 // Handle any color overrides |
| 257 if (!overrides.readsColor()) { | 257 if (!overrides.readsColor()) { |
| 258 fGeoData[0].fColor = GrColor_ILLEGAL; | 258 fGeoData[0].fColor = GrColor_ILLEGAL; |
| 259 } | 259 } |
| 260 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); | 260 overrides.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 261 } | 261 } |
| 262 | 262 |
| 263 void computeWorstCasePointCount(const SkPath& path, int* subpaths, SkScalar
tol, | 263 void computeWorstCasePointCount(const SkPath& path, int* subpaths, SkScalar
tol, |
| 264 int* outLinePointCount, int* outQuadPointCou
nt) const { | 264 int* outLinePointCount, int* outQuadPointCou
nt) const { |
| 265 int linePointCount = 0; | 265 int linePointCount = 0; |
| 266 int quadPointCount = 0; | 266 int quadPointCount = 0; |
| 267 *subpaths = 1; | 267 *subpaths = 1; |
| 268 | 268 |
| 269 bool first = true; | 269 bool first = true; |
| 270 | 270 |
| 271 SkPath::Iter iter(path, false); | 271 SkPath::Iter iter(path, false); |
| 272 SkPath::Verb verb; | 272 SkPath::Verb verb; |
| 273 | 273 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 *outQuadPointCount = quadPointCount; | 312 *outQuadPointCount = quadPointCount; |
| 313 } | 313 } |
| 314 | 314 |
| 315 void onPrepareDraws(Target* target) const override { | 315 void onPrepareDraws(Target* target) const override { |
| 316 SkASSERT(this->isValid()); | 316 SkASSERT(this->isValid()); |
| 317 if (fMaxLineVertices == 0) { | 317 if (fMaxLineVertices == 0) { |
| 318 SkASSERT(fMaxQuadVertices == 0); | 318 SkASSERT(fMaxQuadVertices == 0); |
| 319 return; | 319 return; |
| 320 } | 320 } |
| 321 | 321 |
| 322 GrPrimitiveType primitiveType = fIsIndexed ? kTriangles_GrPrimitiveType | 322 GrPrimitiveType primitiveType = fIsIndexed ? kTriangles_GrPrimitiveType |
| 323 : kTriangleFan_GrPrimitiveTyp
e; | 323 : kTriangleFan_GrPrimitiveTyp
e; |
| 324 | 324 |
| 325 // allocate vertex / index buffers | 325 // allocate vertex / index buffers |
| 326 const GrBuffer* lineVertexBuffer; | 326 const GrBuffer* lineVertexBuffer; |
| 327 int firstLineVertex; | 327 int firstLineVertex; |
| 328 MSAALineVertices lines; | 328 MSAALineVertices lines; |
| 329 size_t lineVertexStride = sizeof(MSAALineVertices::Vertex); | 329 size_t lineVertexStride = sizeof(MSAALineVertices::Vertex); |
| 330 lines.vertices = (MSAALineVertices::Vertex*) target->makeVertexSpace(lin
eVertexStride, | 330 lines.vertices = (MSAALineVertices::Vertex*) target->makeVertexSpace(lin
eVertexStride, |
| 331 fMa
xLineVertices, | 331 fMa
xLineVertices, |
| 332 &li
neVertexBuffer, | 332 &li
neVertexBuffer, |
| 333 &fi
rstLineVertex); | 333 &fi
rstLineVertex); |
| 334 if (!lines.vertices) { | 334 if (!lines.vertices) { |
| 335 SkDebugf("Could not allocate vertices\n"); | 335 SkDebugf("Could not allocate vertices\n"); |
| 336 return; | 336 return; |
| 337 } | 337 } |
| 338 lines.nextVertex = lines.vertices; | 338 lines.nextVertex = lines.vertices; |
| 339 SkDEBUGCODE(lines.verticesEnd = lines.vertices + fMaxLineVertices;) | 339 SkDEBUGCODE(lines.verticesEnd = lines.vertices + fMaxLineVertices;) |
| 340 | 340 |
| 341 MSAAQuadVertices quads; | 341 MSAAQuadVertices quads; |
| 342 size_t quadVertexStride = sizeof(MSAAQuadVertices::Vertex); | 342 size_t quadVertexStride = sizeof(MSAAQuadVertices::Vertex); |
| 343 SkAutoFree quadVertexPtr(sk_malloc_throw(fMaxQuadVertices * quadVertexSt
ride)); | 343 SkAutoFree quadVertexPtr(sk_malloc_throw(fMaxQuadVertices * quadVertexSt
ride)); |
| 344 quads.vertices = (MSAAQuadVertices::Vertex*) quadVertexPtr.get(); | 344 quads.vertices = (MSAAQuadVertices::Vertex*) quadVertexPtr.get(); |
| 345 quads.nextVertex = quads.vertices; | 345 quads.nextVertex = quads.vertices; |
| 346 SkDEBUGCODE(quads.verticesEnd = quads.vertices + fMaxQuadVertices;) | 346 SkDEBUGCODE(quads.verticesEnd = quads.vertices + fMaxQuadVertices;) |
| 347 | 347 |
| 348 const GrBuffer* lineIndexBuffer = nullptr; | 348 const GrBuffer* lineIndexBuffer = nullptr; |
| 349 int firstLineIndex; | 349 int firstLineIndex; |
| 350 if (fIsIndexed) { | 350 if (fIsIndexed) { |
| 351 lines.indices = target->makeIndexSpace(fMaxLineIndices, &lineIndexBu
ffer, | 351 lines.indices = target->makeIndexSpace(fMaxLineIndices, &lineIndexBu
ffer, |
| 352 &firstLineIndex); | 352 &firstLineIndex); |
| 353 if (!lines.indices) { | 353 if (!lines.indices) { |
| 354 SkDebugf("Could not allocate indices\n"); | 354 SkDebugf("Could not allocate indices\n"); |
| 355 return; | 355 return; |
| 356 } | 356 } |
| 357 lines.nextIndex = lines.indices; | 357 lines.nextIndex = lines.indices; |
| 358 } else { | 358 } else { |
| 359 lines.indices = nullptr; | 359 lines.indices = nullptr; |
| 360 lines.nextIndex = nullptr; | 360 lines.nextIndex = nullptr; |
| 361 } | 361 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 385 } | 385 } |
| 386 } | 386 } |
| 387 int lineVertexOffset = (int) (lines.nextVertex - lines.vertices); | 387 int lineVertexOffset = (int) (lines.nextVertex - lines.vertices); |
| 388 int lineIndexOffset = (int) (lines.nextIndex - lines.indices); | 388 int lineIndexOffset = (int) (lines.nextIndex - lines.indices); |
| 389 SkASSERT(lineVertexOffset <= fMaxLineVertices && lineIndexOffset <= fMax
LineIndices); | 389 SkASSERT(lineVertexOffset <= fMaxLineVertices && lineIndexOffset <= fMax
LineIndices); |
| 390 int quadVertexOffset = (int) (quads.nextVertex - quads.vertices); | 390 int quadVertexOffset = (int) (quads.nextVertex - quads.vertices); |
| 391 int quadIndexOffset = (int) (quads.nextIndex - quads.indices); | 391 int quadIndexOffset = (int) (quads.nextIndex - quads.indices); |
| 392 SkASSERT(quadVertexOffset <= fMaxQuadVertices && quadIndexOffset <= fMax
QuadIndices); | 392 SkASSERT(quadVertexOffset <= fMaxQuadVertices && quadIndexOffset <= fMax
QuadIndices); |
| 393 | 393 |
| 394 if (lineVertexOffset) { | 394 if (lineVertexOffset) { |
| 395 SkAutoTUnref<const GrGeometryProcessor> lineGP; | 395 sk_sp<GrGeometryProcessor> lineGP; |
| 396 { | 396 { |
| 397 using namespace GrDefaultGeoProcFactory; | 397 using namespace GrDefaultGeoProcFactory; |
| 398 lineGP.reset(GrDefaultGeoProcFactory::Create(Color(Color::kAttri
bute_Type), | 398 lineGP = GrDefaultGeoProcFactory::Make(Color(Color::kAttribute_T
ype), |
| 399 Coverage(255), | 399 Coverage(255), |
| 400 LocalCoords(LocalCo
ords::kUnused_Type), | 400 LocalCoords(LocalCoords::
kUnused_Type), |
| 401 fViewMatrix)); | 401 fViewMatrix); |
| 402 } | 402 } |
| 403 SkASSERT(lineVertexStride == lineGP->getVertexStride()); | 403 SkASSERT(lineVertexStride == lineGP->getVertexStride()); |
| 404 | 404 |
| 405 GrMesh lineMeshes; | 405 GrMesh lineMeshes; |
| 406 if (fIsIndexed) { | 406 if (fIsIndexed) { |
| 407 lineMeshes.initIndexed(primitiveType, lineVertexBuffer, lineInde
xBuffer, | 407 lineMeshes.initIndexed(primitiveType, lineVertexBuffer, lineInde
xBuffer, |
| 408 firstLineVertex, firstLineIndex, lineVe
rtexOffset, | 408 firstLineVertex, firstLineIndex, lineVe
rtexOffset, |
| 409 lineIndexOffset); | 409 lineIndexOffset); |
| 410 } else { | 410 } else { |
| 411 lineMeshes.init(primitiveType, lineVertexBuffer, firstLineVertex
, | 411 lineMeshes.init(primitiveType, lineVertexBuffer, firstLineVertex
, |
| 412 lineVertexOffset); | 412 lineVertexOffset); |
| 413 } | 413 } |
| 414 target->draw(lineGP, lineMeshes); | 414 target->draw(lineGP.get(), lineMeshes); |
| 415 } | 415 } |
| 416 | 416 |
| 417 if (quadVertexOffset) { | 417 if (quadVertexOffset) { |
| 418 SkAutoTUnref<const GrGeometryProcessor> quadGP(MSAAQuadProcessor::Cr
eate(fViewMatrix)); | 418 SkAutoTUnref<const GrGeometryProcessor> quadGP(MSAAQuadProcessor::Cr
eate(fViewMatrix)); |
| 419 SkASSERT(quadVertexStride == quadGP->getVertexStride()); | 419 SkASSERT(quadVertexStride == quadGP->getVertexStride()); |
| 420 | 420 |
| 421 const GrBuffer* quadVertexBuffer; | 421 const GrBuffer* quadVertexBuffer; |
| 422 int firstQuadVertex; | 422 int firstQuadVertex; |
| 423 MSAAQuadVertices::Vertex* quadVertices = (MSAAQuadVertices::Vertex*)
| 423 MSAAQuadVertices::Vertex* quadVertices = (MSAAQuadVertices::Vertex*) |
| 424 target->makeVertexSpace(quadVertexStride, quadVertexOffset,
&quadVertexBuffer, | 424 target->makeVertexSpace(quadVertexStride, quadVertexOffset,
&quadVertexBuffer, |
| 425 &firstQuadVertex); | 425 &firstQuadVertex); |
| 426 memcpy(quadVertices, quads.vertices, quadVertexStride * quadVertexOf
fset); | 426 memcpy(quadVertices, quads.vertices, quadVertexStride * quadVertexOf
fset); |
| 427 GrMesh quadMeshes; | 427 GrMesh quadMeshes; |
| 428 if (fIsIndexed) { | 428 if (fIsIndexed) { |
| 429 const GrBuffer* quadIndexBuffer; | 429 const GrBuffer* quadIndexBuffer; |
| 430 int firstQuadIndex; | 430 int firstQuadIndex; |
| 431 uint16_t* quadIndices = (uint16_t*) target->makeIndexSpace(quadI
ndexOffset, | 431 uint16_t* quadIndices = (uint16_t*) target->makeIndexSpace(quadI
ndexOffset, |
| 432 &quad
IndexBuffer, | 432 &quad
IndexBuffer, |
| 433 &firs
tQuadIndex); | 433 &firs
tQuadIndex); |
| 434 memcpy(quadIndices, quads.indices, sizeof(uint16_t) * quadIndexO
ffset); | 434 memcpy(quadIndices, quads.indices, sizeof(uint16_t) * quadIndexO
ffset); |
| 435 quadMeshes.initIndexed(kTriangles_GrPrimitiveType, quadVertexBuf
fer, | 435 quadMeshes.initIndexed(kTriangles_GrPrimitiveType, quadVertexBuf
fer, |
| 436 quadIndexBuffer, firstQuadVertex, firstQu
adIndex, | 436 quadIndexBuffer, firstQuadVertex, firstQu
adIndex, |
| 437 quadVertexOffset, quadIndexOffset); | 437 quadVertexOffset, quadIndexOffset); |
| 438 } else { | 438 } else { |
| 439 quadMeshes.init(kTriangles_GrPrimitiveType, quadVertexBuffer, fi
rstQuadVertex, | 439 quadMeshes.init(kTriangles_GrPrimitiveType, quadVertexBuffer, fi
rstQuadVertex, |
| 440 quadVertexOffset); | 440 quadVertexOffset); |
| 441 } | 441 } |
| 442 target->draw(quadGP, quadMeshes); | 442 target->draw(quadGP, quadMeshes); |
| 443 } | 443 } |
| 444 } | 444 } |
| 445 | 445 |
| 446 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 446 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 447 | 447 |
| 448 MSAAPathBatch(const Geometry& geometry, const SkMatrix& viewMatrix, const Sk
Rect& devBounds) | 448 MSAAPathBatch(const Geometry& geometry, const SkMatrix& viewMatrix, const Sk
Rect& devBounds) |
| 449 : INHERITED(ClassID()) | 449 : INHERITED(ClassID()) |
| 450 , fViewMatrix(viewMatrix) { | 450 , fViewMatrix(viewMatrix) { |
| 451 fGeoData.push_back(geometry); | 451 fGeoData.push_back(geometry); |
| 452 this->setBounds(devBounds); | 452 this->setBounds(devBounds); |
| 453 int contourCount; | 453 int contourCount; |
| 454 this->computeWorstCasePointCount(geometry.fPath, &contourCount, kToleran
ce, | 454 this->computeWorstCasePointCount(geometry.fPath, &contourCount, kToleran
ce, |
| 455 &fMaxLineVertices, &fMaxQuadVertices); | 455 &fMaxLineVertices, &fMaxQuadVertices); |
| 456 fMaxLineIndices = fMaxLineVertices * 3; | 456 fMaxLineIndices = fMaxLineVertices * 3; |
| 457 fMaxQuadIndices = fMaxQuadVertices * 3; | 457 fMaxQuadIndices = fMaxQuadVertices * 3; |
| 458 fIsIndexed = contourCount > 1; | 458 fIsIndexed = contourCount > 1; |
| 459 } | 459 } |
| 460 | 460 |
| 461 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 461 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 462 MSAAPathBatch* that = t->cast<MSAAPathBatch>(); | 462 MSAAPathBatch* that = t->cast<MSAAPathBatch>(); |
| 463 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 463 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 464 that->bounds(), caps)) { | 464 that->bounds(), caps)) { |
| 465 return false; | 465 return false; |
| 466 } | 466 } |
| 467 | 467 |
| 468 if (!fViewMatrix.cheapEqualTo(that->fViewMatrix)) { | 468 if (!fViewMatrix.cheapEqualTo(that->fViewMatrix)) { |
| 469 return false; | 469 return false; |
| 470 } | 470 } |
| 471 | 471 |
| 472 if ((fMaxLineIndices + that->fMaxLineIndices > SK_MaxU16) || | 472 if ((fMaxLineIndices + that->fMaxLineIndices > SK_MaxU16) || |
| 473 (fMaxQuadIndices + that->fMaxQuadIndices > SK_MaxU16)) { | 473 (fMaxQuadIndices + that->fMaxQuadIndices > SK_MaxU16)) { |
| 474 return false; | 474 return false; |
| 475 } | 475 } |
| 476 | 476 |
| 477 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; | 477 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; |
| 478 this->joinBounds(that->bounds()); | 478 this->joinBounds(that->bounds()); |
| 479 fIsIndexed = true; | 479 fIsIndexed = true; |
| 480 fMaxLineVertices += that->fMaxLineVertices; | 480 fMaxLineVertices += that->fMaxLineVertices; |
| 481 fMaxQuadVertices += that->fMaxQuadVertices; | 481 fMaxQuadVertices += that->fMaxQuadVertices; |
| 482 fMaxLineIndices += that->fMaxLineIndices; | 482 fMaxLineIndices += that->fMaxLineIndices; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 if (prevIdx > subpathIdxStart) { | 517 if (prevIdx > subpathIdxStart) { |
| 518 append_contour_edge_indices(subpathIdxStart, pre
vIdx, lines); | 518 append_contour_edge_indices(subpathIdxStart, pre
vIdx, lines); |
| 519 } | 519 } |
| 520 } | 520 } |
| 521 SkASSERT(lines.nextVertex < lines.verticesEnd); | 521 SkASSERT(lines.nextVertex < lines.verticesEnd); |
| 522 *(lines.nextVertex++) = { pts[1], color }; | 522 *(lines.nextVertex++) = { pts[1], color }; |
| 523 break; | 523 break; |
| 524 case SkPath::kConic_Verb: { | 524 case SkPath::kConic_Verb: { |
| 525 SkScalar weight = iter.conicWeight(); | 525 SkScalar weight = iter.conicWeight(); |
| 526 SkAutoConicToQuads converter; | 526 SkAutoConicToQuads converter; |
| 527 const SkPoint* quadPts = converter.computeQuads(pts, wei
ght, | 527 const SkPoint* quadPts = converter.computeQuads(pts, wei
ght, |
| 528 kToleran
ce); | 528 kToleran
ce); |
| 529 for (int i = 0; i < converter.countQuads(); ++i) { | 529 for (int i = 0; i < converter.countQuads(); ++i) { |
| 530 add_quad(lines, quads, quadPts + i * 2, color, isInd
exed, | 530 add_quad(lines, quads, quadPts + i * 2, color, isInd
exed, |
| 531 subpathIdxStart); | 531 subpathIdxStart); |
| 532 } | 532 } |
| 533 break; | 533 break; |
| 534 } | 534 } |
| 535 case SkPath::kQuad_Verb: { | 535 case SkPath::kQuad_Verb: { |
| 536 add_quad(lines, quads, pts, color, isIndexed, subpathIdx
Start); | 536 add_quad(lines, quads, pts, color, isIndexed, subpathIdx
Start); |
| 537 break; | 537 break; |
| 538 } | 538 } |
| 539 case SkPath::kCubic_Verb: { | 539 case SkPath::kCubic_Verb: { |
| 540 SkSTArray<15, SkPoint, true> quadPts; | 540 SkSTArray<15, SkPoint, true> quadPts; |
| 541 GrPathUtils::convertCubicToQuads(pts, kTolerance, &quadP
ts); | 541 GrPathUtils::convertCubicToQuads(pts, kTolerance, &quadP
ts); |
| 542 int count = quadPts.count(); | 542 int count = quadPts.count(); |
| 543 for (int i = 0; i < count; i += 3) { | 543 for (int i = 0; i < count; i += 3) { |
| 544 add_quad(lines, quads, &quadPts[i], color, isIndexed
, subpathIdxStart); | 544 add_quad(lines, quads, &quadPts[i], color, isIndexed
, subpathIdxStart); |
| 545 } | 545 } |
| 546 break; | 546 break; |
| 547 } | 547 } |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 pipelineBuilder.setUserStencil(userStencilSettings); | 675 pipelineBuilder.setUserStencil(userStencilSettings); |
| 676 } | 676 } |
| 677 | 677 |
| 678 drawContext->drawBatch(pipelineBuilder, clip, batch); | 678 drawContext->drawBatch(pipelineBuilder, clip, batch); |
| 679 } else { | 679 } else { |
| 680 MSAAPathBatch::Geometry geometry; | 680 MSAAPathBatch::Geometry geometry; |
| 681 geometry.fColor = color; | 681 geometry.fColor = color; |
| 682 geometry.fPath = path; | 682 geometry.fPath = path; |
| 683 geometry.fTolerance = kTolerance; | 683 geometry.fTolerance = kTolerance; |
| 684 | 684 |
| 685 SkAutoTUnref<MSAAPathBatch> batch(MSAAPathBatch::Create(geometry, vi
ewMatrix, | 685 SkAutoTUnref<MSAAPathBatch> batch(MSAAPathBatch::Create(geometry, vi
ewMatrix, |
| 686 devBounds)); | 686 devBounds)); |
| 687 if (!batch->isValid()) { | 687 if (!batch->isValid()) { |
| 688 return false; | 688 return false; |
| 689 } | 689 } |
| 690 | 690 |
| 691 GrPipelineBuilder pipelineBuilder(paint, drawContext->mustUseHWAA(pa
int)); | 691 GrPipelineBuilder pipelineBuilder(paint, drawContext->mustUseHWAA(pa
int)); |
| 692 pipelineBuilder.setDrawFace(drawFace[p]); | 692 pipelineBuilder.setDrawFace(drawFace[p]); |
| 693 if (passes[p]) { | 693 if (passes[p]) { |
| 694 pipelineBuilder.setUserStencil(passes[p]); | 694 pipelineBuilder.setUserStencil(passes[p]); |
| 695 } else { | 695 } else { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 742 false); | 742 false); |
| 743 } | 743 } |
| 744 | 744 |
| 745 void GrMSAAPathRenderer::onStencilPath(const StencilPathArgs& args) { | 745 void GrMSAAPathRenderer::onStencilPath(const StencilPathArgs& args) { |
| 746 GR_AUDIT_TRAIL_AUTO_FRAME(args.fDrawContext->auditTrail(), | 746 GR_AUDIT_TRAIL_AUTO_FRAME(args.fDrawContext->auditTrail(), |
| 747 "GrMSAAPathRenderer::onStencilPath"); | 747 "GrMSAAPathRenderer::onStencilPath"); |
| 748 SkASSERT(SkPath::kInverseEvenOdd_FillType != args.fPath->getFillType()); | 748 SkASSERT(SkPath::kInverseEvenOdd_FillType != args.fPath->getFillType()); |
| 749 SkASSERT(SkPath::kInverseWinding_FillType != args.fPath->getFillType()); | 749 SkASSERT(SkPath::kInverseWinding_FillType != args.fPath->getFillType()); |
| 750 | 750 |
| 751 GrPaint paint; | 751 GrPaint paint; |
| 752 SkSafeUnref(paint.setXPFactory(GrDisableColorXPFactory::Create())); | 752 paint.setXPFactory(GrDisableColorXPFactory::Make()); |
| 753 paint.setAntiAlias(args.fIsAA); | 753 paint.setAntiAlias(args.fIsAA); |
| 754 | 754 |
| 755 this->internalDrawPath(args.fDrawContext, | 755 this->internalDrawPath(args.fDrawContext, |
| 756 paint, | 756 paint, |
| 757 &GrUserStencilSettings::kUnused, | 757 &GrUserStencilSettings::kUnused, |
| 758 *args.fClip, | 758 *args.fClip, |
| 759 GrColor_WHITE, | 759 GrColor_WHITE, |
| 760 *args.fViewMatrix, | 760 *args.fViewMatrix, |
| 761 *args.fPath, | 761 *args.fPath, |
| 762 true); | 762 true); |
| 763 } | 763 } |
| 764 | 764 |
| 765 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 765 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| OLD | NEW |