Copy sub texture, even in non OOP-R

Has become a straightforward revert of this commit.
https://chromium-review.googlesource.com/c/chromium/src/+/2216591

For as yet unknown reasons, not using CopySubTexture can cause rapid
flickering between pixellated and non-pixellated rendering. Considering
this is negatively effecting many users right now, it may be worth
pushing this change through as a quick fix.

(cherry picked from commit 568b4fffeb1f346e9a4ff3805b8836af2b1452d8)

Bug: 1134799
Change-Id: Ia25b312f3755063b1fdeaa39be5057b7654b7548
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2450842
Reviewed-by: Jonah Chin <[email protected]>
Reviewed-by: Juanmi Huertas <[email protected]>
Reviewed-by: Fernando Serboncini <[email protected]>
Commit-Queue: Aaron Krajeski <[email protected]>
Cr-Original-Commit-Position: refs/heads/master@{#815697}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2476497
Reviewed-by: Aaron Krajeski <[email protected]>
Commit-Queue: Juanmi Huertas <[email protected]>
Cr-Commit-Position: refs/branch-heads/4280@{#555}
Cr-Branched-From: ea420fb963f9658c9969b6513c56b8f47efa1a2a-refs/heads/master@{#812852}
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
index 83ffde1..7807757 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -444,17 +444,27 @@
       resource_ = NewOrRecycledResource();
       DCHECK(resource_);
 
-      if (use_oop_rasterization_) {
+      auto* raster_interface = RasterInterface();
+      if (raster_interface) {
+        if (!use_oop_rasterization_)
+          TearDownSkSurface();
+
         if (mode_ == SkSurface::kRetain_ContentChangeMode) {
           auto old_mailbox = old_resource_shared_image->GetOrCreateGpuMailbox(
               kOrderingBarrier);
           auto mailbox = resource()->GetOrCreateGpuMailbox(kOrderingBarrier);
 
-          RasterInterface()->CopySubTexture(
+          raster_interface->CopySubTexture(
               old_mailbox, mailbox, GetBackingTextureTarget(), 0, 0, 0, 0,
               Size().Width(), Size().Height(), false /* unpack_flip_y */,
               false /* unpack_premultiply_alpha */);
         }
+
+        // In non-OOPR mode we need to update the client side SkSurface with the
+        // copied texture. Recreating SkSurface here matches the GPU process
+        // behaviour that will happen in OOPR mode.
+        if (!use_oop_rasterization_)
+          GetSkSurface();
       } else {
         EnsureWriteAccess();
         if (surface_) {
@@ -1492,6 +1502,11 @@
   return recorder_ && recorder_->ListHasDrawOps();
 }
 
+void CanvasResourceProvider::TearDownSkSurface() {
+  skia_canvas_ = nullptr;
+  surface_ = nullptr;
+}
+
 size_t CanvasResourceProvider::ComputeSurfaceSize() const {
   if (!surface_)
     return 0;
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
index 1ee50ad..89671f6 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
@@ -265,6 +265,7 @@
   cc::PaintImage MakeImageSnapshot();
   virtual void RasterRecord(sk_sp<cc::PaintRecord>);
   CanvasImageProvider* GetOrCreateCanvasImageProvider();
+  void TearDownSkSurface();
 
   ResourceProviderType type_;
   mutable sk_sp<SkSurface> surface_;  // mutable for lazy init