Make some GMs compatible with the *ooprddl configs

The more we can test these configs the better.

Change-Id: I2d86985770047937d7f31c9659ad6984caafe11d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/305569
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Adlai Holler <adlai@google.com>
diff --git a/gm/bc1_transparency.cpp b/gm/bc1_transparency.cpp
index 964122a..46c489d 100644
--- a/gm/bc1_transparency.cpp
+++ b/gm/bc1_transparency.cpp
@@ -14,6 +14,7 @@
 #include "src/gpu/GrCaps.h"
 #include "src/gpu/GrRecordingContextPriv.h"
 #include "src/image/SkImage_Base.h"
+#include "src/image/SkImage_GpuBase.h"
 
 constexpr int kImgWidth  = 16;
 constexpr int kImgHeight = 8;
@@ -115,12 +116,12 @@
     }
 }
 
-static void draw_image(GrRecordingContext* context, SkCanvas* canvas,
-                       sk_sp<SkImage> image, int x, int y) {
+static void draw_image(SkCanvas* canvas, sk_sp<SkImage> image, int x, int y) {
 
     bool isCompressed = false;
     if (image && image->isTextureBacked()) {
-        const GrCaps* caps = context->priv().caps();
+        GrRecordingContext* rContext = ((SkImage_GpuBase*) image.get())->context();
+        const GrCaps* caps = rContext->priv().caps();
 
         GrTextureProxy* proxy = as_IB(image)->peekProxy();
         isCompressed = caps->isFormatCompressed(proxy->backendFormat());
@@ -175,25 +176,39 @@
         return SkISize::Make(kImgWidth + 2 * kPad, 2 * kImgHeight + 3 * kPad);
     }
 
-    void onOnceBeforeDraw() override {
-        fBC1Data = make_compressed_data();
+    DrawResult onGpuSetup(GrDirectContext* dContext, SkString* errorMsg) override {
+        if (dContext && dContext->abandoned()) {
+            // This isn't a GpuGM so a null 'context' is okay but an abandoned context
+            // if forbidden.
+            return DrawResult::kSkip;
+        }
+
+        sk_sp<SkData> bc1Data = make_compressed_data();
+
+        fRGBImage = data_to_img(dContext, bc1Data, SkImage::CompressionType::kBC1_RGB8_UNORM);
+        fRGBAImage = data_to_img(dContext, std::move(bc1Data),
+                                 SkImage::CompressionType::kBC1_RGBA8_UNORM);
+        if (!fRGBImage || !fRGBAImage) {
+            *errorMsg = "Failed to create BC1 images.";
+            return DrawResult::kFail;
+        }
+
+        return DrawResult::kOk;
+    }
+
+    void onGpuTeardown() override {
+        fRGBImage = nullptr;
+        fRGBAImage = nullptr;
     }
 
     void onDraw(SkCanvas* canvas) override {
-        auto direct = GrAsDirectContext(canvas->recordingContext());
-
-        sk_sp<SkImage> rgbImg = data_to_img(direct, fBC1Data,
-                                            SkImage::CompressionType::kBC1_RGB8_UNORM);
-
-        sk_sp<SkImage> rgbaImg = data_to_img(direct, fBC1Data,
-                                             SkImage::CompressionType::kBC1_RGBA8_UNORM);
-
-        draw_image(direct, canvas, rgbImg, kPad, kPad);
-        draw_image(direct, canvas, rgbaImg, kPad, 2 * kPad + kImgHeight);
+        draw_image(canvas, fRGBImage, kPad, kPad);
+        draw_image(canvas, fRGBAImage, kPad, 2 * kPad + kImgHeight);
     }
 
 private:
-    sk_sp<SkData> fBC1Data;
+    sk_sp<SkImage> fRGBImage;
+    sk_sp<SkImage> fRGBAImage;
 
     typedef GM INHERITED;
 };