added caching of SkVertices

SkVertices can now be "volatile", meaning they should not be cached.
SkVertices is volatile by default if the argument is not given.

Pulled from reverted CL: https://skia-review.googlesource.com/c/skia/+/138596

Docs-Preview: https://skia.org/?cl=139545
Bug: skia:
Change-Id: I92cf832efe1c0aaa8f432eedde2678582dd2454e
Reviewed-on: https://skia-review.googlesource.com/139545
Reviewed-by: Brian Osman <brianosman@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Ruiqi Mao <ruiqimao@google.com>
diff --git a/tools/viewer/NIMASlide.cpp b/tools/viewer/NIMASlide.cpp
index c13ff2f..25d023f 100644
--- a/tools/viewer/NIMASlide.cpp
+++ b/tools/viewer/NIMASlide.cpp
@@ -62,7 +62,7 @@
         this->updateBones();
 
         // Update the vertices object.
-        this->updateVerticesObject(false);
+        this->updateVerticesObject(false, false);
     }
 
     void renderBackend(SkCanvas* canvas) {
@@ -70,16 +70,13 @@
         if (fRenderMode != kBackend_RenderMode) {
             fRenderMode = kBackend_RenderMode;
             this->updateVertices();
-            this->updateVerticesObject(false);
+            this->updateVerticesObject(false, false);
         }
 
-        canvas->save();
-
         // Update the vertex data.
-        if (fActorImage->doesAnimationVertexDeform() && fActorImage->isVertexDeformDirty()) {
+        if (fActorImage->doesAnimationVertexDeform()) {
             this->updateVertices();
-            this->updateVerticesObject(false);
-            fActorImage->isVertexDeformDirty(false);
+            this->updateVerticesObject(false, true);
         }
 
         // Update the bones.
@@ -87,8 +84,6 @@
 
         // Draw the vertices object.
         this->drawVerticesObject(canvas, true);
-
-        canvas->restore();
     }
 
     void renderImmediate(SkCanvas* canvas) {
@@ -96,7 +91,7 @@
         if (fRenderMode != kImmediate_RenderMode) {
             fRenderMode = kImmediate_RenderMode;
             this->updateVertices();
-            this->updateVerticesObject(true);
+            this->updateVerticesObject(true, true);
         }
 
         // Update the vertex data.
@@ -106,7 +101,7 @@
         }
 
         // Update the vertices object.
-        this->updateVerticesObject(true);
+        this->updateVerticesObject(true, true);
 
         // Draw the vertices object.
         this->drawVerticesObject(canvas, false);
@@ -198,7 +193,7 @@
         nima_to_skmatrix(fActorImage->worldTransform().values(), fBones[0]);
     }
 
-    void updateVerticesObject(bool applyDeforms) {
+    void updateVerticesObject(bool applyDeforms, bool isVolatile) {
         std::vector<SkPoint>* positions = &fPositions;
 
         // Apply deforms if requested.
@@ -229,7 +224,8 @@
                                          fBoneIdx.data(),
                                          fBoneWgt.data(),
                                          fIndices.size(),
-                                         fIndices.data());
+                                         fIndices.data(),
+                                         isVolatile);
     }
 
     void drawVerticesObject(SkCanvas* canvas, bool useBones) const {
@@ -421,11 +417,19 @@
 void NIMASlide::draw(SkCanvas* canvas) {
     canvas->save();
 
-    canvas->translate(500, 500);
-    canvas->scale(1, -1);
+    for (int i = 0; i < 10; i ++) {
+        for (int j = 0; j < 10; j ++) {
+            canvas->save();
 
-    // Render the actor.
-    fActor->render(canvas, fRenderMode);
+            canvas->translate(1250 - 250 * i, 1250 - 250 * j);
+            canvas->scale(0.5, -0.5);
+
+            // Render the actor.
+            fActor->render(canvas, fRenderMode);
+
+            canvas->restore();
+        }
+    }
 
     canvas->restore();