[graphite] Add system to support client caching of images

Bug: b/238756324
Change-Id: Idea51ba727b5f30fa9073690d25a754b933b0688
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/564196
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/gn/graphite.gni b/gn/graphite.gni
index 0284105..876dab4 100644
--- a/gn/graphite.gni
+++ b/gn/graphite.gni
@@ -13,6 +13,7 @@
   "$_include/Context.h",
   "$_include/ContextOptions.h",
   "$_include/GraphiteTypes.h",
+  "$_include/ImageProvider.h",
   "$_include/Recorder.h",
   "$_include/Recording.h",
   "$_include/SkStuff.h",
@@ -72,6 +73,8 @@
   "$_src/GraphicsPipelineDesc.h",
   "$_src/GraphiteResourceKey.cpp",
   "$_src/GraphiteResourceKey.h",
+  "$_src/ImageUtils.cpp",
+  "$_src/ImageUtils.h",
   "$_src/Image_Graphite.cpp",
   "$_src/Image_Graphite.h",
   "$_src/Log.h",
diff --git a/include/gpu/graphite/Context.h b/include/gpu/graphite/Context.h
index 793d865..6a4caa0 100644
--- a/include/gpu/graphite/Context.h
+++ b/include/gpu/graphite/Context.h
@@ -12,6 +12,7 @@
 #include "include/core/SkShader.h"
 #include "include/gpu/graphite/ContextOptions.h"
 #include "include/gpu/graphite/GraphiteTypes.h"
+#include "include/gpu/graphite/Recorder.h"
 #include "include/private/SingleOwner.h"
 
 #include <memory>
@@ -29,12 +30,11 @@
 class Gpu;
 struct MtlBackendContext;
 class QueueManager;
-class Recorder;
 class Recording;
 class ResourceProvider;
 class TextureInfo;
 
-class Context final {
+class SK_API Context final {
 public:
     Context(const Context&) = delete;
     Context(Context&&) = delete;
@@ -49,7 +49,7 @@
 
     BackendApi backend() const { return fBackend; }
 
-    std::unique_ptr<Recorder> makeRecorder();
+    std::unique_ptr<Recorder> makeRecorder(const RecorderOptions& = {});
 
     void insertRecording(const InsertRecordingInfo&);
     void submit(SyncToCpu = SyncToCpu::kNo);
diff --git a/include/gpu/graphite/GraphiteTypes.h b/include/gpu/graphite/GraphiteTypes.h
index e0b7a6f..2bec5e2 100644
--- a/include/gpu/graphite/GraphiteTypes.h
+++ b/include/gpu/graphite/GraphiteTypes.h
@@ -53,7 +53,7 @@
 /**
  * Is the texture mipmapped or not
  */
-enum class Mipmapped: bool {
+enum class Mipmapped : bool {
     kNo = false,
     kYes = true,
 };
diff --git a/include/gpu/graphite/ImageProvider.h b/include/gpu/graphite/ImageProvider.h
new file mode 100644
index 0000000..a679ff2
--- /dev/null
+++ b/include/gpu/graphite/ImageProvider.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef skgpu_graphite_ImageProvider_DEFINED
+#define skgpu_graphite_ImageProvider_DEFINED
+
+#include "include/core/SkRefCnt.h"
+
+class SkImage;
+
+namespace skgpu::graphite {
+
+enum class Mipmapped : bool;
+class Recorder;
+
+/*
+ * This class provides a centralized location for clients to perform any caching of images
+ * they desire. Whenever Graphite encounters an SkImage which is not Graphite-backed
+ * it will call ImageProvider::findOrCreate. The client's derived version of this class should
+ * return a Graphite-backed version of the provided SkImage that meets the mipmapping
+ * requirements. If the mipmapping requirements are not met by the returned image, Graphite
+ * will draw opaque red.
+ *
+ * Note: by default, Graphite will not perform any caching of images
+ *
+ * Threading concerns:
+ *   If the same ImageProvider is given to multiple Recorders it is up to the
+ *   client to handle any required thread synchronization. This is not limited to just
+ *   restricting access to whatever map a derived class may have but extends to ensuring
+ *   that an image created on one Recorder has had its creation work submitted before it
+ *   is used by any work submitted by another Recorder. Please note, this requirement
+ *   (re the submission of creation work and image usage on different threads) is common to all
+ *   graphite SkImages and isn't unique to SkImages returned by the ImageProvider.
+ *
+ * TODO(b/240996632): add documentation re shutdown order.
+ * TODO(b/240997067): add unit tests
+ */
+class SK_API ImageProvider : public SkRefCnt {
+public:
+    // If the client's derived class already has a Graphite-backed image that has the same
+    // contents as 'image' and meets the 'mipmapped' requirements, then it can be returned.
+    // makeTextureImage can always be called to create an acceptable Graphite-backed image
+    // which could then be cached.
+    virtual sk_sp<SkImage> findOrCreate(Recorder* recorder,
+                                        const SkImage* image,
+                                        Mipmapped mipmapped) = 0;
+};
+
+} // namespace skgpu::graphite
+
+#endif // skgpu_graphite_ImageProvider_DEFINED
diff --git a/include/gpu/graphite/Recorder.h b/include/gpu/graphite/Recorder.h
index af1f79b..0378684 100644
--- a/include/gpu/graphite/Recorder.h
+++ b/include/gpu/graphite/Recorder.h
@@ -34,6 +34,7 @@
 class DrawBufferManager;
 class GlobalCache;
 class Gpu;
+class ImageProvider;
 class RecorderPriv;
 class Recording;
 class ResourceProvider;
@@ -45,7 +46,14 @@
 using UniformDataCache = PipelineDataCache<SkUniformDataBlockPassThrough, SkUniformDataBlock>;
 using TextureDataCache = PipelineDataCache<std::unique_ptr<SkTextureDataBlock>, SkTextureDataBlock>;
 
-class Recorder final {
+struct SK_API RecorderOptions final {
+    RecorderOptions() = default;
+    ~RecorderOptions();
+
+    sk_sp<ImageProvider> fImageProvider;
+};
+
+class SK_API Recorder final {
 public:
     Recorder(const Recorder&) = delete;
     Recorder(Recorder&&) = delete;
@@ -56,6 +64,10 @@
 
     std::unique_ptr<Recording> snap();
 
+    ImageProvider* clientImageProvider() const {
+        return fClientImageProvider.get();
+    }
+
     // Provides access to functions that aren't part of the public API.
     RecorderPriv priv();
     const RecorderPriv priv() const;  // NOLINT(readability-const-return-type)
@@ -69,7 +81,7 @@
     friend class Device; // For registering and deregistering Devices;
     friend class RecorderPriv; // for ctor and hidden methods
 
-    Recorder(sk_sp<Gpu>, sk_sp<GlobalCache>);
+    Recorder(sk_sp<Gpu>, sk_sp<GlobalCache>, const RecorderOptions&);
 
     SingleOwner* singleOwner() const { return &fSingleOwner; }
 
@@ -108,6 +120,7 @@
     std::unique_ptr<TokenTracker> fTokenTracker;
     std::unique_ptr<sktext::gpu::StrikeCache> fStrikeCache;
     std::unique_ptr<sktext::gpu::TextBlobRedrawCoordinator> fTextBlobCache;
+    sk_sp<ImageProvider> fClientImageProvider;
 
     // In debug builds we guard against improper thread handling
     // This guard is passed to the ResourceCache.
diff --git a/infra/bots/gen_tasks_logic/dm_flags.go b/infra/bots/gen_tasks_logic/dm_flags.go
index 429018f..ae64e8f 100644
--- a/infra/bots/gen_tasks_logic/dm_flags.go
+++ b/infra/bots/gen_tasks_logic/dm_flags.go
@@ -323,6 +323,8 @@
 			skip(ALL, "gm", ALL, "localmatriximageshader")
 			skip(ALL, "gm", ALL, "savelayer_f16")
 			skip(ALL, "gm", ALL, "anisomips")
+			skip(ALL, "gm", ALL, "path_huge_aa")
+			skip(ALL, "gm", ALL, "hugebitmapshader")
 
 			// TODO: re-enable - currently fail bc surface to image conversion isn't implemented
 			skip(ALL, "gm", ALL, "xfermodes3")
diff --git a/infra/bots/tasks.json b/infra/bots/tasks.json
index d0911de..f7f6239 100755
--- a/infra/bots/tasks.json
+++ b/infra/bots/tasks.json
@@ -50852,7 +50852,7 @@
         "skia/infra/bots/run_recipe.py",
         "${ISOLATED_OUTDIR}",
         "test",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Mac10.15.7-Clang-MacBookPro11.5-GPU-RadeonHD8870M-x86_64-Debug-All-Graphite\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"x86_64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Debug\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"RadeonHD8870M\\\",\\\"extra_config\\\",\\\"Graphite\\\",\\\"model\\\",\\\"MacBookPro11.5\\\",\\\"os\\\",\\\"Mac10.15.7\\\",\\\"style\\\",\\\"default\\\",\\\"--randomProcessorTest\\\",\\\"--nocpu\\\",\\\"--nogpu\\\",\\\"--config\\\",\\\"grmtl\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"skp\\\",\\\"--skip\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"image_subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"blurrect_compare\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice_alpha\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximageshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"savelayer_f16\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"anisomips\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"xfermodes3\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"verylargebitmap\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"clipped_thinrect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"textblobgeometrychange\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surface_underdraw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_savelayer\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surfacenew\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"srcmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lit_shader_linear_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"linear_gradient_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_bw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"ninepatch-stretch\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lcdblendmodes\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"fast_slow_blurimagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurrepeatmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurclampmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imagealphathreshold_surface\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"dstreadshuffle\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"custommesh_cs\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"complexclip_blur_tiled\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"bleed_downscale\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_no_bleed\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_text_up\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_dog_down\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_rose\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgba32abf.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24prof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24lprof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"8bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"4bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"32bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"24bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"frame_larger_than_image.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc2.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc3.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc4.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc5.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc6.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc7.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc8.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc9.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc10.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc11.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc12.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc13.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc14.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"butterfly.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"testimgari.jpg\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle8-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle4-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLMatrixScalarNoOpFolding_GPU\\\",\\\"--match\\\",\\\"~async_rescale_and_read\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Mac10.15.7-Clang-MacBookPro11.5-GPU-RadeonHD8870M-x86_64-Debug-All-Graphite\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"true\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"gs_bucket\":\"skia-infra-gm\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Mac10.15.7-Clang-MacBookPro11.5-GPU-RadeonHD8870M-x86_64-Debug-All-Graphite\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"x86_64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Debug\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"RadeonHD8870M\\\",\\\"extra_config\\\",\\\"Graphite\\\",\\\"model\\\",\\\"MacBookPro11.5\\\",\\\"os\\\",\\\"Mac10.15.7\\\",\\\"style\\\",\\\"default\\\",\\\"--randomProcessorTest\\\",\\\"--nocpu\\\",\\\"--nogpu\\\",\\\"--config\\\",\\\"grmtl\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"skp\\\",\\\"--skip\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"image_subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"blurrect_compare\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice_alpha\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximageshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"savelayer_f16\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"anisomips\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"path_huge_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"hugebitmapshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"xfermodes3\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"verylargebitmap\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"clipped_thinrect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"textblobgeometrychange\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surface_underdraw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_savelayer\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surfacenew\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"srcmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lit_shader_linear_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"linear_gradient_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_bw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"ninepatch-stretch\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lcdblendmodes\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"fast_slow_blurimagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurrepeatmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurclampmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imagealphathreshold_surface\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"dstreadshuffle\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"custommesh_cs\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"complexclip_blur_tiled\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"bleed_downscale\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_no_bleed\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_text_up\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_dog_down\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_rose\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgba32abf.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24prof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24lprof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"8bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"4bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"32bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"24bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"frame_larger_than_image.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc2.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc3.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc4.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc5.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc6.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc7.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc8.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc9.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc10.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc11.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc12.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc13.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc14.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"butterfly.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"testimgari.jpg\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle8-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle4-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLMatrixScalarNoOpFolding_GPU\\\",\\\"--match\\\",\\\"~async_rescale_and_read\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Mac10.15.7-Clang-MacBookPro11.5-GPU-RadeonHD8870M-x86_64-Debug-All-Graphite\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"true\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"gs_bucket\":\"skia-infra-gm\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
         "skia"
       ],
       "dependencies": [
@@ -51784,7 +51784,7 @@
         "skia/infra/bots/run_recipe.py",
         "${ISOLATED_OUTDIR}",
         "test",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Debug-All-ASAN_Graphite\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"arm64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Debug\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"AppleM1\\\",\\\"extra_config\\\",\\\"ASAN_Graphite\\\",\\\"model\\\",\\\"MacMini9.1\\\",\\\"os\\\",\\\"Mac11\\\",\\\"style\\\",\\\"default\\\",\\\"--randomProcessorTest\\\",\\\"--nocpu\\\",\\\"--nogpu\\\",\\\"--config\\\",\\\"grmtl\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"skp\\\",\\\"--skip\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"image_subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"blurrect_compare\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice_alpha\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximageshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"savelayer_f16\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"anisomips\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"xfermodes3\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"verylargebitmap\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"clipped_thinrect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"textblobgeometrychange\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surface_underdraw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_savelayer\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surfacenew\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"srcmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lit_shader_linear_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"linear_gradient_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_bw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"ninepatch-stretch\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lcdblendmodes\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"fast_slow_blurimagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurrepeatmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurclampmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imagealphathreshold_surface\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"dstreadshuffle\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"custommesh_cs\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"complexclip_blur_tiled\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"bleed_downscale\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_no_bleed\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_text_up\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_dog_down\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_rose\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"yuv420_odd_dim\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"encode-alpha-jpeg\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"encode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"jpg-color-cube\\\",\\\"_\\\",\\\"test\\\",\\\"_\\\",\\\"TransferPixelsFromTextureTest\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgba32abf.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24prof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24lprof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"8bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"4bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"32bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"24bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"frame_larger_than_image.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc2.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc3.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc4.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc5.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc6.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc7.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc8.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc9.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc10.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc11.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc12.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc13.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc14.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"butterfly.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"testimgari.jpg\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle8-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle4-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"_\\\",\\\"test\\\",\\\"_\\\",\\\"SkPDF_JpegIdentification\\\",\\\"--match\\\",\\\"~async_rescale_and_read\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Debug-All-ASAN_Graphite\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"false\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Debug-All-ASAN_Graphite\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"arm64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Debug\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"AppleM1\\\",\\\"extra_config\\\",\\\"ASAN_Graphite\\\",\\\"model\\\",\\\"MacMini9.1\\\",\\\"os\\\",\\\"Mac11\\\",\\\"style\\\",\\\"default\\\",\\\"--randomProcessorTest\\\",\\\"--nocpu\\\",\\\"--nogpu\\\",\\\"--config\\\",\\\"grmtl\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"skp\\\",\\\"--skip\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"image_subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"blurrect_compare\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice_alpha\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximageshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"savelayer_f16\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"anisomips\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"path_huge_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"hugebitmapshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"xfermodes3\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"verylargebitmap\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"clipped_thinrect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"textblobgeometrychange\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surface_underdraw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_savelayer\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surfacenew\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"srcmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lit_shader_linear_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"linear_gradient_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_bw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"ninepatch-stretch\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lcdblendmodes\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"fast_slow_blurimagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurrepeatmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurclampmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imagealphathreshold_surface\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"dstreadshuffle\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"custommesh_cs\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"complexclip_blur_tiled\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"bleed_downscale\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_no_bleed\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_text_up\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_dog_down\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_rose\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"yuv420_odd_dim\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"encode-alpha-jpeg\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"encode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"jpg-color-cube\\\",\\\"_\\\",\\\"test\\\",\\\"_\\\",\\\"TransferPixelsFromTextureTest\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgba32abf.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24prof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24lprof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"8bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"4bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"32bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"24bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"frame_larger_than_image.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc2.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc3.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc4.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc5.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc6.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc7.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc8.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc9.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc10.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc11.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc12.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc13.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc14.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"butterfly.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"testimgari.jpg\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle8-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle4-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"_\\\",\\\"test\\\",\\\"_\\\",\\\"SkPDF_JpegIdentification\\\",\\\"--match\\\",\\\"~async_rescale_and_read\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Debug-All-ASAN_Graphite\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"false\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
         "skia"
       ],
       "dependencies": [
@@ -51990,7 +51990,7 @@
         "skia/infra/bots/run_recipe.py",
         "${ISOLATED_OUTDIR}",
         "test",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Release-All-Graphite\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"arm64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Release\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"AppleM1\\\",\\\"extra_config\\\",\\\"Graphite\\\",\\\"model\\\",\\\"MacMini9.1\\\",\\\"os\\\",\\\"Mac11\\\",\\\"style\\\",\\\"default\\\",\\\"--randomProcessorTest\\\",\\\"--nocpu\\\",\\\"--nogpu\\\",\\\"--config\\\",\\\"grmtl\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"skp\\\",\\\"--skip\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"image_subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"blurrect_compare\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice_alpha\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximageshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"savelayer_f16\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"anisomips\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"xfermodes3\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"verylargebitmap\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"clipped_thinrect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"textblobgeometrychange\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surface_underdraw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_savelayer\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surfacenew\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"srcmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lit_shader_linear_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"linear_gradient_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_bw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"ninepatch-stretch\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lcdblendmodes\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"fast_slow_blurimagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurrepeatmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurclampmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imagealphathreshold_surface\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"dstreadshuffle\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"custommesh_cs\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"complexclip_blur_tiled\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"bleed_downscale\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_no_bleed\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_text_up\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_dog_down\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_rose\\\",\\\"_\\\",\\\"test\\\",\\\"_\\\",\\\"TransferPixelsFromTextureTest\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgba32abf.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24prof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24lprof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"8bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"4bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"32bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"24bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"frame_larger_than_image.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc2.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc3.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc4.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc5.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc6.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc7.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc8.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc9.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc10.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc11.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc12.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc13.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc14.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"butterfly.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"testimgari.jpg\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle8-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle4-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"--match\\\",\\\"~async_rescale_and_read\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Release-All-Graphite\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"true\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"gs_bucket\":\"skia-infra-gm\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Release-All-Graphite\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"arm64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Release\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"AppleM1\\\",\\\"extra_config\\\",\\\"Graphite\\\",\\\"model\\\",\\\"MacMini9.1\\\",\\\"os\\\",\\\"Mac11\\\",\\\"style\\\",\\\"default\\\",\\\"--randomProcessorTest\\\",\\\"--nocpu\\\",\\\"--nogpu\\\",\\\"--config\\\",\\\"grmtl\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"skp\\\",\\\"--skip\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"image_subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"blurrect_compare\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice_alpha\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximageshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"savelayer_f16\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"anisomips\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"path_huge_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"hugebitmapshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"xfermodes3\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"verylargebitmap\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"clipped_thinrect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"textblobgeometrychange\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surface_underdraw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_savelayer\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surfacenew\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"srcmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lit_shader_linear_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"linear_gradient_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_bw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"ninepatch-stretch\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lcdblendmodes\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"fast_slow_blurimagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurrepeatmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurclampmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imagealphathreshold_surface\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"dstreadshuffle\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"custommesh_cs\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"complexclip_blur_tiled\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"bleed_downscale\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_no_bleed\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_text_up\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_dog_down\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_rose\\\",\\\"_\\\",\\\"test\\\",\\\"_\\\",\\\"TransferPixelsFromTextureTest\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgba32abf.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24prof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24lprof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"8bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"4bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"32bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"24bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"frame_larger_than_image.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc2.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc3.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc4.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc5.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc6.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc7.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc8.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc9.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc10.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc11.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc12.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc13.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc14.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"butterfly.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"testimgari.jpg\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle8-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle4-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"--match\\\",\\\"~async_rescale_and_read\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Release-All-Graphite\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"true\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"gs_bucket\":\"skia-infra-gm\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
         "skia"
       ],
       "dependencies": [
@@ -52406,7 +52406,7 @@
         "skia/infra/bots/run_recipe.py",
         "${ISOLATED_OUTDIR}",
         "test",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Mac12-Clang-MacBookPro16.2-GPU-IntelIrisPlus-x86_64-Debug-All-Graphite\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"x86_64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Debug\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"IntelIrisPlus\\\",\\\"extra_config\\\",\\\"Graphite\\\",\\\"model\\\",\\\"MacBookPro16.2\\\",\\\"os\\\",\\\"Mac12\\\",\\\"style\\\",\\\"default\\\",\\\"--randomProcessorTest\\\",\\\"--nocpu\\\",\\\"--nogpu\\\",\\\"--config\\\",\\\"grmtl\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"skp\\\",\\\"--skip\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"image_subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"blurrect_compare\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice_alpha\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximageshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"savelayer_f16\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"anisomips\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"xfermodes3\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"verylargebitmap\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"clipped_thinrect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"textblobgeometrychange\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surface_underdraw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_savelayer\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surfacenew\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"srcmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lit_shader_linear_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"linear_gradient_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_bw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"ninepatch-stretch\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lcdblendmodes\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"fast_slow_blurimagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurrepeatmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurclampmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imagealphathreshold_surface\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"dstreadshuffle\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"custommesh_cs\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"complexclip_blur_tiled\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"bleed_downscale\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_no_bleed\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_text_up\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_dog_down\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_rose\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgba32abf.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24prof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24lprof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"8bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"4bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"32bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"24bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"frame_larger_than_image.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc2.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc3.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc4.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc5.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc6.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc7.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc8.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc9.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc10.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc11.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc12.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc13.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc14.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"butterfly.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"testimgari.jpg\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle8-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle4-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLIntrinsicDFdy_GPU\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLIntrinsicDFdx_GPU\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLIntrinsicFwidth_GPU\\\",\\\"--match\\\",\\\"~^GrMeshTest$\\\",\\\"~async_rescale_and_read\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Mac12-Clang-MacBookPro16.2-GPU-IntelIrisPlus-x86_64-Debug-All-Graphite\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"true\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"gs_bucket\":\"skia-infra-gm\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
+        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Mac12-Clang-MacBookPro16.2-GPU-IntelIrisPlus-x86_64-Debug-All-Graphite\",\"dm_flags\":\"[\\\"dm\\\",\\\"--nameByHash\\\",\\\"--key\\\",\\\"arch\\\",\\\"x86_64\\\",\\\"compiler\\\",\\\"Clang\\\",\\\"configuration\\\",\\\"Debug\\\",\\\"cpu_or_gpu\\\",\\\"GPU\\\",\\\"cpu_or_gpu_value\\\",\\\"IntelIrisPlus\\\",\\\"extra_config\\\",\\\"Graphite\\\",\\\"model\\\",\\\"MacBookPro16.2\\\",\\\"os\\\",\\\"Mac12\\\",\\\"style\\\",\\\"default\\\",\\\"--randomProcessorTest\\\",\\\"--nocpu\\\",\\\"--nogpu\\\",\\\"--config\\\",\\\"grmtl\\\",\\\"--src\\\",\\\"tests\\\",\\\"gm\\\",\\\"skp\\\",\\\"--skip\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"image_subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"blurrect_compare\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice_alpha\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximageshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"savelayer_f16\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"anisomips\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"path_huge_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"hugebitmapshader\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"xfermodes3\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"verylargebitmap\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"clipped_thinrect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"textblobgeometrychange\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surface_underdraw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_savelayer\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"simple_snap_image\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"copy_on_write_retain\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"surfacenew\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"srcmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lit_shader_linear_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"linear_gradient_rt\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_bw\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"persp_shaders_aa\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"ninepatch-stretch\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"localmatriximagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lcdblendmodes\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice2\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"lattice\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"fast_slow_blurimagefilter\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurrepeatmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imageblurclampmode\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"imagealphathreshold_surface\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"dstreadshuffle\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-imagerect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect-subset\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"drawbitmaprect\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"custommesh_cs\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"complexclip_blur_tiled\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"bleed_downscale\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_no_bleed\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_text_up\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_dog_down\\\",\\\"_\\\",\\\"gm\\\",\\\"_\\\",\\\"async_rescale_and_read_rose\\\",\\\"_\\\",\\\"svg\\\",\\\"_\\\",\\\"svgparse_\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgba32abf.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24prof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rgb24lprof.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"8bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"4bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"32bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"24bpp-pixeldata-cropped.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"frame_larger_than_image.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc2.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc3.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc4.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc5.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc6.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc7.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc8.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc9.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc10.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc11.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc12.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc13.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc14.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.png\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"incInterlaced.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc1.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"inc0.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"butterfly.gif\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"testimgari.jpg\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle8-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"rle4-height-negative.bmp\\\",\\\"_\\\",\\\"image\\\",\\\"gen_platf\\\",\\\"error\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced1.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced2.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\"interlaced3.png\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".arw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".cr2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".dng\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".nrw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".orf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".raf\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".rw2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".pef\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".srw\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ARW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".CR2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".DNG\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".NRW\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".ORF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RAF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".RW2\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".PEF\\\",\\\"_\\\",\\\"image\\\",\\\"_\\\",\\\".SRW\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLIntrinsicDFdy_GPU\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLIntrinsicDFdx_GPU\\\",\\\"_\\\",\\\"tests\\\",\\\"_\\\",\\\"SkSLIntrinsicFwidth_GPU\\\",\\\"--match\\\",\\\"~^GrMeshTest$\\\",\\\"~async_rescale_and_read\\\",\\\"--nonativeFonts\\\",\\\"--verbose\\\"]\",\"dm_properties\":\"{\\\"buildbucket_build_id\\\":\\\"<(BUILDBUCKET_BUILD_ID)\\\",\\\"builder\\\":\\\"Test-Mac12-Clang-MacBookPro16.2-GPU-IntelIrisPlus-x86_64-Debug-All-Graphite\\\",\\\"gitHash\\\":\\\"<(REVISION)\\\",\\\"issue\\\":\\\"<(ISSUE)\\\",\\\"patch_storage\\\":\\\"<(PATCH_STORAGE)\\\",\\\"patchset\\\":\\\"<(PATCHSET)\\\",\\\"swarming_bot_id\\\":\\\"${SWARMING_BOT_ID}\\\",\\\"swarming_task_id\\\":\\\"${SWARMING_TASK_ID}\\\",\\\"task_id\\\":\\\"<(TASK_ID)\\\"}\",\"do_upload\":\"true\",\"gold_hashes_url\":\"https://gold.skia.org/json/v1/hashes\",\"gs_bucket\":\"skia-infra-gm\",\"images\":\"true\",\"patch_issue\":\"<(ISSUE_INT)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET_INT)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"resources\":\"true\",\"revision\":\"<(REVISION)\",\"skps\":\"true\",\"svgs\":\"true\",\"swarm_out_dir\":\"test\",\"task_id\":\"<(TASK_ID)\"}",
         "skia"
       ],
       "dependencies": [
diff --git a/public.bzl b/public.bzl
index 71faa0a..ecfe5f9 100644
--- a/public.bzl
+++ b/public.bzl
@@ -186,6 +186,7 @@
     "include/gpu/graphite/BackendTexture.h",
     "include/gpu/graphite/Context.h",
     "include/gpu/graphite/GraphiteTypes.h",
+    "include/gpu/graphite/ImageProvider.h",
     "include/gpu/graphite/mtl/MtlBackendContext.h",
     "include/gpu/graphite/mtl/MtlTypes.h",
     "include/gpu/graphite/Recorder.h",
diff --git a/src/core/SkKeyHelpers.cpp b/src/core/SkKeyHelpers.cpp
index d4c6d86..10ce86a 100644
--- a/src/core/SkKeyHelpers.cpp
+++ b/src/core/SkKeyHelpers.cpp
@@ -410,8 +410,6 @@
     if (builder->backend() == SkBackend::kGraphite) {
         // TODO: allow through lazy proxies
         if (gatherer && !imgData.fTextureProxy) {
-            // We're dropping the ImageShader here. This could be an instance of trying to draw
-            // a raster-backed image w/ a Graphite-backed canvas.
             // TODO: At some point the pre-compile path should also be creating a texture
             // proxy (i.e., we can remove the 'pipelineData' in the above test).
             SolidColorShaderBlock::BeginBlock(keyContext, builder, gatherer, kErrorColor);
diff --git a/src/gpu/graphite/Context.cpp b/src/gpu/graphite/Context.cpp
index 33282e3..1c4d477 100644
--- a/src/gpu/graphite/Context.cpp
+++ b/src/gpu/graphite/Context.cpp
@@ -75,10 +75,10 @@
 }
 #endif
 
-std::unique_ptr<Recorder> Context::makeRecorder() {
+std::unique_ptr<Recorder> Context::makeRecorder(const RecorderOptions& options) {
     ASSERT_SINGLE_OWNER
 
-    return std::unique_ptr<Recorder>(new Recorder(fGpu, fGlobalCache));
+    return std::unique_ptr<Recorder>(new Recorder(fGpu, fGlobalCache, options));
 }
 
 void Context::insertRecording(const InsertRecordingInfo& info) {
diff --git a/src/gpu/graphite/Device.cpp b/src/gpu/graphite/Device.cpp
index c176b2d..11c59ea 100644
--- a/src/gpu/graphite/Device.cpp
+++ b/src/gpu/graphite/Device.cpp
@@ -18,6 +18,7 @@
 #include "src/gpu/graphite/DrawList.h"
 #include "src/gpu/graphite/DrawParams.h"
 #include "src/gpu/graphite/Gpu.h"
+#include "src/gpu/graphite/ImageUtils.h"
 #include "src/gpu/graphite/Log.h"
 #include "src/gpu/graphite/RecorderPriv.h"
 #include "src/gpu/graphite/Renderer.h"
@@ -545,10 +546,17 @@
         }
     }
 
+    auto [ imageToDraw, newSampling ] = skgpu::graphite::GetGraphiteBacked(this->recorder(),
+                                                                           image, sampling);
+    if (!imageToDraw) {
+        SKGPU_LOG_W("Device::drawImageRect: Creation of Graphite-backed image failed");
+        return;
+    }
+
     // construct a shader, so we can call drawRect with the dst
-    auto s = make_img_shader_for_paint(paint, sk_ref_sp(image), tmpSrc,
+    auto s = make_img_shader_for_paint(paint, std::move(imageToDraw), tmpSrc,
                                        SkTileMode::kClamp, SkTileMode::kClamp,
-                                       sampling, &matrix);
+                                       newSampling, &matrix);
     if (!s) {
         return;
     }
diff --git a/src/gpu/graphite/ImageUtils.cpp b/src/gpu/graphite/ImageUtils.cpp
new file mode 100644
index 0000000..b9953d3
--- /dev/null
+++ b/src/gpu/graphite/ImageUtils.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "src/gpu/graphite/ImageUtils.h"
+
+#include "include/gpu/graphite/ImageProvider.h"
+#include "include/gpu/graphite/Recorder.h"
+#include "src/image/SkImage_Base.h"
+
+namespace {
+
+// We require that the user returns a Graphite-backed image that preserves the dimensions, channels
+// and alpha type of the original image. Additionally, it must satisfy the mipmap requirements.
+// The bit depth of the individual channels can change (e.g., 4444 -> 8888 is allowed).
+bool valid_client_provided_image(const SkImage* clientProvided,
+                                 const SkImage* original,
+                                 skgpu::graphite::Mipmapped mipmapped) {
+    if (!clientProvided ||
+        !as_IB(clientProvided)->isGraphiteBacked() ||
+        original->dimensions() != clientProvided->dimensions() ||
+        original->alphaType() != clientProvided->alphaType()) {
+        return false;
+    }
+
+    uint32_t origChannels = SkColorTypeChannelFlags(original->colorType());
+    uint32_t clientChannels = SkColorTypeChannelFlags(clientProvided->colorType());
+    if (origChannels != clientChannels) {
+        return false;
+    }
+
+    return mipmapped == skgpu::graphite::Mipmapped::kNo || clientProvided->hasMipmaps();
+}
+
+} // anonymous namespace
+
+namespace skgpu::graphite {
+
+std::pair<sk_sp<SkImage>, SkSamplingOptions> GetGraphiteBacked(Recorder* recorder,
+                                                               const SkImage* imageIn,
+                                                               SkSamplingOptions sampling) {
+    skgpu::graphite::Mipmapped mipmapped = (sampling.mipmap != SkMipmapMode::kNone)
+                                               ? skgpu::graphite::Mipmapped::kYes
+                                               : skgpu::graphite::Mipmapped::kNo;
+
+    sk_sp<SkImage> result;
+    if (as_IB(imageIn)->isGraphiteBacked()) {
+        result = sk_ref_sp(imageIn);
+
+        // If the preexisting Graphite-backed image doesn't have the required mipmaps we will drop
+        // down the sampling
+        if (mipmapped == skgpu::graphite::Mipmapped::kYes && !result->hasMipmaps()) {
+            mipmapped = skgpu::graphite::Mipmapped::kNo;
+            sampling = SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kNone);
+        }
+    } else {
+        auto clientImageProvider = recorder->clientImageProvider();
+        result = clientImageProvider->findOrCreate(recorder, imageIn, mipmapped);
+
+        if (!valid_client_provided_image(result.get(), imageIn, mipmapped)) {
+            // The client did not fulfill the ImageProvider contract so drop the image.
+            result = nullptr;
+        }
+    }
+
+    return { result, sampling };
+}
+
+} // namespace skgpu::graphite
diff --git a/src/gpu/graphite/ImageUtils.h b/src/gpu/graphite/ImageUtils.h
new file mode 100644
index 0000000..ffaeb1c
--- /dev/null
+++ b/src/gpu/graphite/ImageUtils.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef skgpu_graphite_ImageUtils_DEFINED
+#define skgpu_graphite_ImageUtils_DEFINED
+
+#include "include/core/SkRefCnt.h"
+
+class SkImage;
+struct SkSamplingOptions;
+
+namespace skgpu::graphite {
+
+class Recorder;
+
+std::pair<sk_sp<SkImage>, SkSamplingOptions> GetGraphiteBacked(Recorder*,
+                                                               const SkImage*,
+                                                               SkSamplingOptions);
+
+} // namespace skgpu::graphite
+
+#endif // skgpu_graphite_ImageUtils_DEFINED
diff --git a/src/gpu/graphite/Recorder.cpp b/src/gpu/graphite/Recorder.cpp
index 470c267..d915446 100644
--- a/src/gpu/graphite/Recorder.cpp
+++ b/src/gpu/graphite/Recorder.cpp
@@ -8,6 +8,8 @@
 #include "include/gpu/graphite/Recorder.h"
 
 #include "include/effects/SkRuntimeEffect.h"
+#include "include/gpu/graphite/GraphiteTypes.h"
+#include "include/gpu/graphite/ImageProvider.h"
 #include "include/gpu/graphite/Recording.h"
 #include "src/core/SkPipelineData.h"
 #include "src/gpu/AtlasTypes.h"
@@ -23,6 +25,7 @@
 #include "src/gpu/graphite/TaskGraph.h"
 #include "src/gpu/graphite/UploadBufferManager.h"
 #include "src/gpu/graphite/text/AtlasManager.h"
+#include "src/image/SkImage_Base.h"
 #include "src/text/gpu/StrikeCache.h"
 #include "src/text/gpu/TextBlobRedrawCoordinator.h"
 
@@ -30,6 +33,32 @@
 
 #define ASSERT_SINGLE_OWNER SKGPU_ASSERT_SINGLE_OWNER(this->singleOwner())
 
+/*
+ * The default image provider doesn't perform any conversion so, by default, Graphite won't
+ * draw any non-Graphite-backed images.
+ */
+class DefaultImageProvider final : public ImageProvider {
+public:
+    static sk_sp<DefaultImageProvider> Make() {
+        return sk_ref_sp(new DefaultImageProvider);
+    }
+
+    sk_sp<SkImage> findOrCreate(Recorder* recorder,
+                                const SkImage* image,
+                                Mipmapped mipmapped) override {
+        SkASSERT(!as_IB(image)->isGraphiteBacked());
+
+        return nullptr;
+    }
+
+private:
+    DefaultImageProvider() {}
+};
+
+/**************************************************************************************************/
+RecorderOptions::~RecorderOptions() = default;
+
+/**************************************************************************************************/
 static int32_t next_id() {
     static std::atomic<int32_t> nextID{1};
     int32_t id;
@@ -39,7 +68,9 @@
     return id;
 }
 
-Recorder::Recorder(sk_sp<Gpu> gpu, sk_sp<GlobalCache> globalCache)
+Recorder::Recorder(sk_sp<Gpu> gpu,
+                   sk_sp<GlobalCache> globalCache,
+                   const RecorderOptions& options)
         : fGpu(std::move(gpu))
         , fGraph(new TaskGraph)
         , fUniformDataCache(new UniformDataCache)
@@ -50,6 +81,11 @@
         , fStrikeCache(std::make_unique<sktext::gpu::StrikeCache>())
         , fTextBlobCache(std::make_unique<sktext::gpu::TextBlobRedrawCoordinator>(fRecorderID)) {
 
+    fClientImageProvider = options.fImageProvider;
+    if (!fClientImageProvider) {
+        fClientImageProvider = DefaultImageProvider::Make();
+    }
+
     fResourceProvider = fGpu->makeResourceProvider(std::move(globalCache), this->singleOwner());
     fDrawBufferManager.reset(new DrawBufferManager(fResourceProvider.get(),
                                                    fGpu->caps()->requiredUniformBufferAlignment()));
diff --git a/src/gpu/graphite/TextureUtils.cpp b/src/gpu/graphite/TextureUtils.cpp
index 222da08..21dcd2b 100644
--- a/src/gpu/graphite/TextureUtils.cpp
+++ b/src/gpu/graphite/TextureUtils.cpp
@@ -65,13 +65,14 @@
     }
 
     // setup MipLevels
+    sk_sp<SkMipmap> mipmaps;
     std::vector<MipLevel> texels;
     if (mipLevelCount == 1) {
         texels.resize(mipLevelCount);
         texels[0].fPixels = bmpToUpload.getPixels();
         texels[0].fRowBytes = bmpToUpload.rowBytes();
     } else {
-        sk_sp<SkMipmap> mipmaps(SkMipmap::Build(bmpToUpload.pixmap(), nullptr));
+        mipmaps.reset(SkMipmap::Build(bmpToUpload.pixmap(), nullptr));
         if (!mipmaps) {
             return {};
         }
diff --git a/src/gpu/graphite/UploadTask.cpp b/src/gpu/graphite/UploadTask.cpp
index 280db7a..700575f 100644
--- a/src/gpu/graphite/UploadTask.cpp
+++ b/src/gpu/graphite/UploadTask.cpp
@@ -45,7 +45,6 @@
 
         size_t trimmedSize = levelDimensions.area() * bytesPerPixel;
         combinedBufferSize = SkAlignTo(combinedBufferSize, minTransferBufferAlignment);
-        SkASSERT((0 == combinedBufferSize % 4) && (0 == combinedBufferSize % bytesPerPixel));
 
         individualMipOffsets->push_back(combinedBufferSize);
         combinedBufferSize += trimmedSize;
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index 2c94098..e83b529 100755
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -26,7 +26,7 @@
 #ifdef SK_ENABLE_SKSL
 
 #ifdef SK_GRAPHITE_ENABLED
-#include "src/gpu/graphite/Image_Graphite.h"
+#include "src/gpu/graphite/ImageUtils.h"
 #endif
 
 #include "src/core/SkKeyContext.h"
@@ -386,12 +386,17 @@
                                         this->getLocalMatrix());
 
 #ifdef SK_GRAPHITE_ENABLED
-    if (as_IB(fImage)->isGraphiteBacked()) {
-        skgpu::graphite::Image* grImage = static_cast<skgpu::graphite::Image*>(fImage.get());
+    auto [ imageToDraw, newSampling ] = skgpu::graphite::GetGraphiteBacked(keyContext.recorder(),
+                                                                           fImage.get(),
+                                                                           fSampling);
 
-        auto mipmapped = (fSampling.mipmap != SkMipmapMode::kNone) ?
-                skgpu::graphite::Mipmapped::kYes : skgpu::graphite::Mipmapped::kNo;
-        auto[view, ct] = grImage->asView(keyContext.recorder(), mipmapped);
+    if (imageToDraw) {
+        imgData.fSampling = newSampling;
+        skgpu::graphite::Mipmapped mipmapped = (newSampling.mipmap != SkMipmapMode::kNone)
+                                                   ? skgpu::graphite::Mipmapped::kYes
+                                                   : skgpu::graphite::Mipmapped::kNo;
+
+        auto [view, _] = as_IB(imageToDraw)->asView(keyContext.recorder(), mipmapped);
         imgData.fTextureProxy = view.refProxy();
     }
 #endif