[go: nahoru, domu]

[cc] Stop caching paths in paint_op_buffer for 2d canvas use cases

The cache eviction logic for cached paths is a profiling hot spot
for 2d canvas path rendering, and the cache is not useful for 2d canvas
since there are no opportunities to recycle SkPath objects, except when
using the Path2D web interface.  Path2D object will continue to hit the
cache.

Furthermore, Skia-side caching is not useful for SkPath objects that are
rasterized only once, so this change also disables that cache for 2D
canvas use cases.

Bug: 1200458
Change-Id: I4d7837c9b4713710d5cb549e51e32e88b266bc73
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2860803
Commit-Queue: Justin Novosad <junov@chromium.org>
Reviewed-by: Jeremy Roman <jbroman@chromium.org>
Reviewed-by: Khushal <khushalsagar@chromium.org>
Reviewed-by: Philip Rogers <pdr@chromium.org>
Reviewed-by: Fernando Serboncini <fserb@chromium.org>
Reviewed-by: ccameron <ccameron@chromium.org>
Cr-Commit-Position: refs/heads/master@{#890784}
diff --git a/cc/paint/paint_canvas.h b/cc/paint/paint_canvas.h
index 9162606..a97c67a2 100644
--- a/cc/paint/paint_canvas.h
+++ b/cc/paint/paint_canvas.h
@@ -27,6 +27,8 @@
 class PaintFlags;
 class PaintOpBuffer;
 
+enum class UsePaintCache { kDisabled = 0, kEnabled };
+
 using PaintRecord = PaintOpBuffer;
 
 // PaintCanvas is the cc/paint wrapper of SkCanvas.  It has a more restricted
@@ -109,10 +111,17 @@
 
   virtual void clipPath(const SkPath& path,
                         SkClipOp op,
-                        bool do_anti_alias) = 0;
-  void clipPath(const SkPath& path, SkClipOp op) { clipPath(path, op, false); }
+                        bool do_anti_alias,
+                        UsePaintCache) = 0;
+  void clipPath(const SkPath& path, SkClipOp op, bool do_anti_alias) {
+    clipPath(path, op, do_anti_alias, UsePaintCache::kEnabled);
+  }
+  void clipPath(const SkPath& path, SkClipOp op) {
+    clipPath(path, op, /*do_anti_alias=*/false, UsePaintCache::kEnabled);
+  }
   void clipPath(const SkPath& path, bool do_anti_alias) {
-    clipPath(path, SkClipOp::kIntersect, do_anti_alias);
+    clipPath(path, SkClipOp::kIntersect, do_anti_alias,
+             UsePaintCache::kEnabled);
   }
 
   virtual SkRect getLocalClipBounds() const = 0;
@@ -141,7 +150,12 @@
                              SkScalar rx,
                              SkScalar ry,
                              const PaintFlags& flags) = 0;
-  virtual void drawPath(const SkPath& path, const PaintFlags& flags) = 0;
+  virtual void drawPath(const SkPath& path,
+                        const PaintFlags& flags,
+                        UsePaintCache) = 0;
+  void drawPath(const SkPath& path, const PaintFlags& flags) {
+    drawPath(path, flags, UsePaintCache::kEnabled);
+  }
   virtual void drawImage(const PaintImage& image,
                          SkScalar left,
                          SkScalar top,