Initialize written paths and strokerecs lazily during GPU drawPath
Initialize SkPaths and SkStrokeRecs lazily during GPU drawPath calls.
The constructors seem to appear in some profiler results on ARM (~1%).
R=bsalomon@google.com, robertphillips@google.com
Author: kkinnunen@nvidia.com
Review URL: https://codereview.chromium.org/118143002
git-svn-id: http://skia.googlecode.com/svn/trunk@13069 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 36e76e9..5ba174c 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -877,13 +877,14 @@
// where the original path can in fact be modified in place (even though
// its parameter type is const).
SkPath* pathPtr = const_cast<SkPath*>(&origSrcPath);
- SkPath tmpPath, effectPath;
+ SkTLazy<SkPath> tmpPath;
+ SkTLazy<SkPath> effectPath;
if (prePathMatrix) {
SkPath* result = pathPtr;
if (!pathIsMutable) {
- result = &tmpPath;
+ result = tmpPath.init();
pathIsMutable = true;
}
// should I push prePathMatrix on our MV stack temporarily, instead
@@ -897,22 +898,24 @@
SkStrokeRec stroke(paint);
SkPathEffect* pathEffect = paint.getPathEffect();
const SkRect* cullRect = NULL; // TODO: what is our bounds?
- if (pathEffect && pathEffect->filterPath(&effectPath, *pathPtr, &stroke,
+ if (pathEffect && pathEffect->filterPath(effectPath.init(), *pathPtr, &stroke,
cullRect)) {
- pathPtr = &effectPath;
+ pathPtr = effectPath.get();
+ pathIsMutable = true;
}
if (paint.getMaskFilter()) {
if (!stroke.isHairlineStyle()) {
- if (stroke.applyToPath(&tmpPath, *pathPtr)) {
- pathPtr = &tmpPath;
+ SkPath* strokedPath = pathIsMutable ? pathPtr : tmpPath.init();
+ if (stroke.applyToPath(strokedPath, *pathPtr)) {
+ pathPtr = strokedPath;
pathIsMutable = true;
stroke.setFillStyle();
}
}
// avoid possibly allocating a new path in transform if we can
- SkPath* devPathPtr = pathIsMutable ? pathPtr : &tmpPath;
+ SkPath* devPathPtr = pathIsMutable ? pathPtr : tmpPath.init();
// transform the path into device space
pathPtr->transform(fContext->getMatrix(), devPathPtr);