| Index: src/gpu/GrTessellatingPathRenderer.cpp
|
| diff --git a/src/gpu/GrTessellatingPathRenderer.cpp b/src/gpu/GrTessellatingPathRenderer.cpp
|
| index 6a70a9028363cc677374957525282983f656eff7..9fe5278b42899236280bdc066c49da454612b0b2 100644
|
| --- a/src/gpu/GrTessellatingPathRenderer.cpp
|
| +++ b/src/gpu/GrTessellatingPathRenderer.cpp
|
| @@ -1417,7 +1417,8 @@ private:
|
|
|
| int tessellate(GrUniqueKey* key,
|
| GrResourceProvider* resourceProvider,
|
| - SkAutoTUnref<GrVertexBuffer>& vertexBuffer) {
|
| + SkAutoTUnref<GrVertexBuffer>& vertexBuffer,
|
| + bool canMapVB) {
|
| SkPath path;
|
| GrStrokeInfo stroke(fStroke);
|
| if (stroke.isDashed()) {
|
| @@ -1490,13 +1491,23 @@ private:
|
| SkDebugf("Could not allocate vertices\n");
|
| return 0;
|
| }
|
| - SkPoint* verts = static_cast<SkPoint*>(vertexBuffer->map());
|
| - LOG("emitting %d verts\n", count);
|
| + SkPoint* verts;
|
| + if (canMapVB) {
|
| + verts = static_cast<SkPoint*>(vertexBuffer->map());
|
| + } else {
|
| + verts = SkNEW_ARRAY(SkPoint, count);
|
| + }
|
| SkPoint* end = polys_to_triangles(polys, fillType, verts);
|
| - vertexBuffer->unmap();
|
| int actualCount = static_cast<int>(end - verts);
|
| LOG("actual count: %d\n", actualCount);
|
| SkASSERT(actualCount <= count);
|
| + if (canMapVB) {
|
| + vertexBuffer->unmap();
|
| + } else {
|
| + vertexBuffer->updateData(verts, actualCount * sizeof(SkPoint));
|
| + SkDELETE_ARRAY(verts);
|
| + }
|
| +
|
|
|
| if (!fPath.isVolatile()) {
|
| TessInfo info;
|
| @@ -1533,7 +1544,8 @@ private:
|
| SkScalar tol = GrPathUtils::scaleToleranceToSrc(
|
| screenSpaceTol, fViewMatrix, fPath.getBounds());
|
| if (!cache_match(vertexBuffer.get(), tol, &actualCount)) {
|
| - actualCount = tessellate(&key, rp, vertexBuffer);
|
| + bool canMapVB = GrCaps::kNone_MapFlags != target->caps().mapBufferFlags();
|
| + actualCount = tessellate(&key, rp, vertexBuffer, canMapVB);
|
| }
|
|
|
| if (actualCount == 0) {
|
|
|