From 2960d1693cb3842282663aa395708de788f92ffa Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Wed, 25 Nov 2020 11:49:22 -0500 Subject: [PATCH] Stop copying VectorDrawable pixels when drawing. Drawing a mutable SkBitmap to an SkCanvas will result in the pixels being copied and a new genID assigned. This results in both a cpu and gpu copy every time a VectorDrawable is redrawn. The solution is to create an SkImage using the flag to instruct it not to copy the pixels which is what Bitmap::makeImage() does. Bug: 173732636 Test: captured SKP and verified the genID is consistent between frames Change-Id: Ie13385e89de51c6b9ee2f2ba31eccbfdf3adac48 --- libs/hwui/VectorDrawable.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index cd908354aea5f..6030c36add7a3 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -505,13 +505,11 @@ void Tree::draw(SkCanvas* canvas, const SkRect& bounds, const SkPaint& inPaint) SkPaint paint = inPaint; paint.setAlpha(mProperties.getRootAlpha() * 255); - Bitmap& bitmap = getBitmapUpdateIfDirty(); - SkBitmap skiaBitmap; - bitmap.getSkBitmap(&skiaBitmap); + sk_sp cachedBitmap = getBitmapUpdateIfDirty().makeImage(); int scaledWidth = SkScalarCeilToInt(mProperties.getScaledWidth()); int scaledHeight = SkScalarCeilToInt(mProperties.getScaledHeight()); - canvas->drawBitmapRect(skiaBitmap, SkRect::MakeWH(scaledWidth, scaledHeight), bounds, + canvas->drawImageRect(cachedBitmap, SkRect::MakeWH(scaledWidth, scaledHeight), bounds, &paint, SkCanvas::kFast_SrcRectConstraint); }