OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "GrTessellatingPathRenderer.h" | 8 #include "GrTessellatingPathRenderer.h" |
9 | 9 |
10 #include "GrBatchTarget.h" | 10 #include "GrBatchFlushState.h" |
11 #include "GrBatchTest.h" | 11 #include "GrBatchTest.h" |
12 #include "GrDefaultGeoProcFactory.h" | 12 #include "GrDefaultGeoProcFactory.h" |
13 #include "GrPathUtils.h" | 13 #include "GrPathUtils.h" |
14 #include "GrVertices.h" | 14 #include "GrVertices.h" |
15 #include "GrResourceCache.h" | 15 #include "GrResourceCache.h" |
16 #include "GrResourceProvider.h" | 16 #include "GrResourceProvider.h" |
17 #include "SkChunkAlloc.h" | 17 #include "SkChunkAlloc.h" |
18 #include "SkGeometry.h" | 18 #include "SkGeometry.h" |
19 | 19 |
20 #include "batches/GrVertexBatch.h" | 20 #include "batches/GrVertexBatch.h" |
(...skipping 1481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1502 info.fTolerance = isLinear ? 0 : tol; | 1502 info.fTolerance = isLinear ? 0 : tol; |
1503 info.fCount = actualCount; | 1503 info.fCount = actualCount; |
1504 SkAutoTUnref<SkData> data(SkData::NewWithCopy(&info, sizeof(info))); | 1504 SkAutoTUnref<SkData> data(SkData::NewWithCopy(&info, sizeof(info))); |
1505 key->setCustomData(data.get()); | 1505 key->setCustomData(data.get()); |
1506 resourceProvider->assignUniqueKeyToResource(*key, vertexBuffer.get()
); | 1506 resourceProvider->assignUniqueKeyToResource(*key, vertexBuffer.get()
); |
1507 SkPathPriv::AddGenIDChangeListener(fPath, SkNEW(PathInvalidator(*key
))); | 1507 SkPathPriv::AddGenIDChangeListener(fPath, SkNEW(PathInvalidator(*key
))); |
1508 } | 1508 } |
1509 return actualCount; | 1509 return actualCount; |
1510 } | 1510 } |
1511 | 1511 |
1512 void generateGeometry(GrBatchTarget* batchTarget) override { | 1512 void onPrepareDraws(Target* target) override { |
1513 // construct a cache key from the path's genID and the view matrix | 1513 // construct a cache key from the path's genID and the view matrix |
1514 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain()
; | 1514 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain()
; |
1515 GrUniqueKey key; | 1515 GrUniqueKey key; |
1516 int clipBoundsSize32 = | 1516 int clipBoundsSize32 = |
1517 fPath.isInverseFillType() ? sizeof(fClipBounds) / sizeof(uint32_t) :
0; | 1517 fPath.isInverseFillType() ? sizeof(fClipBounds) / sizeof(uint32_t) :
0; |
1518 int strokeDataSize32 = fStroke.computeUniqueKeyFragmentData32Cnt(); | 1518 int strokeDataSize32 = fStroke.computeUniqueKeyFragmentData32Cnt(); |
1519 GrUniqueKey::Builder builder(&key, kDomain, 2 + clipBoundsSize32 + strok
eDataSize32); | 1519 GrUniqueKey::Builder builder(&key, kDomain, 2 + clipBoundsSize32 + strok
eDataSize32); |
1520 builder[0] = fPath.getGenerationID(); | 1520 builder[0] = fPath.getGenerationID(); |
1521 builder[1] = fPath.getFillType(); | 1521 builder[1] = fPath.getFillType(); |
1522 // For inverse fills, the tessellation is dependent on clip bounds. | 1522 // For inverse fills, the tessellation is dependent on clip bounds. |
1523 if (fPath.isInverseFillType()) { | 1523 if (fPath.isInverseFillType()) { |
1524 memcpy(&builder[2], &fClipBounds, sizeof(fClipBounds)); | 1524 memcpy(&builder[2], &fClipBounds, sizeof(fClipBounds)); |
1525 } | 1525 } |
1526 fStroke.asUniqueKeyFragment(&builder[2 + clipBoundsSize32]); | 1526 fStroke.asUniqueKeyFragment(&builder[2 + clipBoundsSize32]); |
1527 builder.finish(); | 1527 builder.finish(); |
1528 GrResourceProvider* rp = batchTarget->resourceProvider(); | 1528 GrResourceProvider* rp = target->resourceProvider(); |
1529 SkAutoTUnref<GrVertexBuffer> vertexBuffer(rp->findAndRefTByUniqueKey<GrV
ertexBuffer>(key)); | 1529 SkAutoTUnref<GrVertexBuffer> vertexBuffer(rp->findAndRefTByUniqueKey<GrV
ertexBuffer>(key)); |
1530 int actualCount; | 1530 int actualCount; |
1531 SkScalar screenSpaceTol = GrPathUtils::kDefaultTolerance; | 1531 SkScalar screenSpaceTol = GrPathUtils::kDefaultTolerance; |
1532 SkScalar tol = GrPathUtils::scaleToleranceToSrc( | 1532 SkScalar tol = GrPathUtils::scaleToleranceToSrc( |
1533 screenSpaceTol, fViewMatrix, fPath.getBounds()); | 1533 screenSpaceTol, fViewMatrix, fPath.getBounds()); |
1534 if (!cache_match(vertexBuffer.get(), tol, &actualCount)) { | 1534 if (!cache_match(vertexBuffer.get(), tol, &actualCount)) { |
1535 actualCount = tessellate(&key, rp, vertexBuffer); | 1535 actualCount = tessellate(&key, rp, vertexBuffer); |
1536 } | 1536 } |
1537 | 1537 |
1538 if (actualCount == 0) { | 1538 if (actualCount == 0) { |
(...skipping 12 matching lines...) Expand all Loading... |
1551 if (fPipelineInfo.readsCoverage()) { | 1551 if (fPipelineInfo.readsCoverage()) { |
1552 coverageType = Coverage::kSolid_Type; | 1552 coverageType = Coverage::kSolid_Type; |
1553 } else { | 1553 } else { |
1554 coverageType = Coverage::kNone_Type; | 1554 coverageType = Coverage::kNone_Type; |
1555 } | 1555 } |
1556 Coverage coverage(coverageType); | 1556 Coverage coverage(coverageType); |
1557 gp.reset(GrDefaultGeoProcFactory::Create(color, coverage, localCoord
s, | 1557 gp.reset(GrDefaultGeoProcFactory::Create(color, coverage, localCoord
s, |
1558 fViewMatrix)); | 1558 fViewMatrix)); |
1559 } | 1559 } |
1560 | 1560 |
1561 batchTarget->initDraw(gp, this->pipeline()); | 1561 target->initDraw(gp, this->pipeline()); |
1562 SkASSERT(gp->getVertexStride() == sizeof(SkPoint)); | 1562 SkASSERT(gp->getVertexStride() == sizeof(SkPoint)); |
1563 | 1563 |
1564 GrPrimitiveType primitiveType = WIREFRAME ? kLines_GrPrimitiveType | 1564 GrPrimitiveType primitiveType = WIREFRAME ? kLines_GrPrimitiveType |
1565 : kTriangles_GrPrimitiveType; | 1565 : kTriangles_GrPrimitiveType; |
1566 GrVertices vertices; | 1566 GrVertices vertices; |
1567 vertices.init(primitiveType, vertexBuffer.get(), 0, actualCount); | 1567 vertices.init(primitiveType, vertexBuffer.get(), 0, actualCount); |
1568 batchTarget->draw(vertices); | 1568 target->draw(vertices); |
1569 } | 1569 } |
1570 | 1570 |
1571 bool onCombineIfPossible(GrBatch*, const GrCaps&) override { return false; } | 1571 bool onCombineIfPossible(GrBatch*, const GrCaps&) override { return false; } |
1572 | 1572 |
1573 private: | 1573 private: |
1574 TessellatingPathBatch(const GrColor& color, | 1574 TessellatingPathBatch(const GrColor& color, |
1575 const SkPath& path, | 1575 const SkPath& path, |
1576 const GrStrokeInfo& stroke, | 1576 const GrStrokeInfo& stroke, |
1577 const SkMatrix& viewMatrix, | 1577 const SkMatrix& viewMatrix, |
1578 const SkRect& clipBounds) | 1578 const SkRect& clipBounds) |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1641 bool result = viewMatrix.invert(&vmi); | 1641 bool result = viewMatrix.invert(&vmi); |
1642 if (!result) { | 1642 if (!result) { |
1643 SkFAIL("Cannot invert matrix\n"); | 1643 SkFAIL("Cannot invert matrix\n"); |
1644 } | 1644 } |
1645 vmi.mapRect(&clipBounds); | 1645 vmi.mapRect(&clipBounds); |
1646 GrStrokeInfo strokeInfo = GrTest::TestStrokeInfo(random); | 1646 GrStrokeInfo strokeInfo = GrTest::TestStrokeInfo(random); |
1647 return TessellatingPathBatch::Create(color, path, strokeInfo, viewMatrix, cl
ipBounds); | 1647 return TessellatingPathBatch::Create(color, path, strokeInfo, viewMatrix, cl
ipBounds); |
1648 } | 1648 } |
1649 | 1649 |
1650 #endif | 1650 #endif |
OLD | NEW |