Revise GM infrastructure to not rely on GrSurfaceDrawContext

The SDC will soon be V1-only. Remove it from the generic testing infrastructure and require each V1-specific GM to explicitly retrieve it.

Bug: skia:11837
Change-Id: I4c904b7e333333382062bde4b17a1f9f81bee6a9
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/430425
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
diff --git a/gm/gpu_blur_utils.cpp b/gm/gpu_blur_utils.cpp
index 8b137d6..a48ba12 100644
--- a/gm/gpu_blur_utils.cpp
+++ b/gm/gpu_blur_utils.cpp
@@ -9,6 +9,7 @@
 
 #include "include/effects/SkGradientShader.h"
 #include "include/gpu/GrRecordingContext.h"
+#include "src/core/SkCanvasPriv.h"
 #include "src/core/SkGpuBlurUtils.h"
 #include "src/gpu/GrRecordingContextPriv.h"
 #include "src/gpu/GrStyle.h"
@@ -17,6 +18,8 @@
 #include "src/gpu/effects/GrTextureEffect.h"
 #include "src/image/SkImage_Base.h"
 
+namespace {
+
 static GrSurfaceProxyView blur(GrRecordingContext* ctx,
                                GrSurfaceProxyView src,
                                SkIRect dstB,
@@ -174,10 +177,22 @@
     return src;
 }
 
-static void run(GrRecordingContext* rContext, GrSurfaceDrawContext* sdc, bool subsetSrc, bool ref) {
+} // namespace
+
+namespace skiagm {
+
+static GM::DrawResult run(GrRecordingContext* rContext, SkCanvas* canvas,  SkString* errorMsg,
+                          bool subsetSrc, bool ref) {
     GrSurfaceProxyView src = make_src_image(rContext, {60, 60});
     if (!src) {
-        return;
+        *errorMsg = "Failed to create source image";
+        return DrawResult::kSkip;
+    }
+
+    auto sdc = SkCanvasPriv::TopDeviceSurfaceDrawContext(canvas);
+    if (!sdc) {
+        *errorMsg = GM::kErrorMsg_DrawSkippedGpuOnly;
+        return DrawResult::kSkip;
     }
 
     SkIRect srcRect = SkIRect::MakeSize(src.dimensions());
@@ -330,18 +345,24 @@
         trans.fX = kPad;
         trans.fY += testArea.height() + kPad;
     }
+
+    return DrawResult::kOk;
 }
 
-DEF_SIMPLE_GPU_GM(gpu_blur_utils, ctx, sdc, canvas, 765, 955) { run(ctx, sdc, false, false); }
-
-DEF_SIMPLE_GPU_GM(gpu_blur_utils_ref, ctx, sdc, canvas, 765, 955) { run(ctx, sdc, false, true); }
-
-DEF_SIMPLE_GPU_GM(gpu_blur_utils_subset_rect, ctx, sdc, canvas, 485, 730) {
-    run(ctx, sdc, true, false);
+DEF_SIMPLE_GPU_GM_CAN_FAIL(gpu_blur_utils, rContext, canvas, errorMsg, 765, 955) {
+    return run(rContext, canvas, errorMsg, false, false);
 }
 
-DEF_SIMPLE_GPU_GM(gpu_blur_utils_subset_ref, ctx, sdc, canvas, 485, 730) {
-    run(ctx, sdc, true, true);
+DEF_SIMPLE_GPU_GM_CAN_FAIL(gpu_blur_utils_ref, rContext, canvas, errorMsg, 765, 955) {
+    return run(rContext, canvas, errorMsg, false, true);
+}
+
+DEF_SIMPLE_GPU_GM_CAN_FAIL(gpu_blur_utils_subset_rect, rContext, canvas, errorMsg, 485, 730) {
+    return run(rContext, canvas, errorMsg, true, false);
+}
+
+DEF_SIMPLE_GPU_GM_CAN_FAIL(gpu_blur_utils_subset_ref, rContext, canvas, errorMsg, 485, 730) {
+    return run(rContext, canvas, errorMsg, true, true);
 }
 
 // Because of the way blur sigmas concat (sigTotal = sqrt(sig1^2 + sig2^2) generating these images
@@ -349,10 +370,17 @@
 // check results.
 static bool constexpr kShowSlowRefImages = false;
 
-static void do_very_large_blur_gm(GrSurfaceDrawContext* sdc,
-                                  GrRecordingContext* rContext,
-                                  GrSurfaceProxyView src,
-                                  SkIRect srcB) {
+static DrawResult do_very_large_blur_gm(GrRecordingContext* rContext,
+                                        SkCanvas* canvas,
+                                        SkString* errorMsg,
+                                        GrSurfaceProxyView src,
+                                        SkIRect srcB) {
+    auto sdc = SkCanvasPriv::TopDeviceSurfaceDrawContext(canvas);
+    if (!sdc) {
+        *errorMsg = GM::kErrorMsg_DrawSkippedGpuOnly;
+        return DrawResult::kSkip;
+    }
+
     // Clear to a color other than gray to contrast with test image.
     sdc->clear(SkColor4f{0.3f, 0.4f, 0.2f, 1});
 
@@ -400,28 +428,36 @@
             y += dstB.height() + 10;
         }
     }
+
+    return DrawResult::kOk;
 }
 
-DEF_SIMPLE_GPU_GM(very_large_sigma_gpu_blur, ctx, sdc, canvas, 350, 1030) {
-    auto src = make_src_image(ctx, {15, 15});
+DEF_SIMPLE_GPU_GM_CAN_FAIL(very_large_sigma_gpu_blur, rContext, canvas, errorMsg, 350, 1030) {
+    auto src = make_src_image(rContext, {15, 15});
     auto srcB = SkIRect::MakeSize(src.dimensions());
-    do_very_large_blur_gm(sdc, ctx, std::move(src), srcB);
+    return do_very_large_blur_gm(rContext, canvas, errorMsg, std::move(src), srcB);
 }
 
-DEF_SIMPLE_GPU_GM(very_large_sigma_gpu_blur_subset, ctx, sdc, canvas, 350, 1030) {
+DEF_SIMPLE_GPU_GM_CAN_FAIL(very_large_sigma_gpu_blur_subset,
+                           rContext,
+                           canvas,
+                           errorMsg,
+                           350, 1030) {
     auto srcB = SkIRect::MakeXYWH(2, 2, 15, 15);
     SkISize imageSize = SkISize{srcB.width() + 4, srcB.height() + 4};
-    auto src = make_src_image(ctx, imageSize, &srcB);
-    do_very_large_blur_gm(sdc, ctx, std::move(src), srcB);
+    auto src = make_src_image(rContext, imageSize, &srcB);
+    return do_very_large_blur_gm(rContext, canvas, errorMsg, std::move(src), srcB);
 }
 
-DEF_SIMPLE_GPU_GM(very_large_sigma_gpu_blur_subset_transparent_border,
-                  ctx,
-                  sdc,
-                  canvas,
-                  355, 1055) {
+DEF_SIMPLE_GPU_GM_CAN_FAIL(very_large_sigma_gpu_blur_subset_transparent_border,
+                           rContext,
+                           canvas,
+                           errorMsg,
+                           355, 1055) {
     auto srcB = SkIRect::MakeXYWH(3, 3, 15, 15);
     SkISize imageSize = SkISize{srcB.width() + 4, srcB.height() + 4};
-    auto src = make_src_image(ctx, imageSize, &srcB);
-    do_very_large_blur_gm(sdc, ctx, std::move(src), srcB.makeOutset(1, 1));
+    auto src = make_src_image(rContext, imageSize, &srcB);
+    return do_very_large_blur_gm(rContext, canvas, errorMsg, std::move(src), srcB.makeOutset(1, 1));
 }
+
+} // namespace skiagm