Make SkPromiseImageTexture ref counted.

This makes the API easier to use in Chrome.

It is no longer required to pass the SkPromiseImageTexture to the
release proc.

Bug: skia:
Change-Id: I6636401f6a7915d3ad15e890718638bc91a58cc4
Reviewed-on: https://skia-review.googlesource.com/c/183383
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/tests/PromiseImageTest.cpp b/tests/PromiseImageTest.cpp
index 54bb3c8..bc9b26b 100644
--- a/tests/PromiseImageTest.cpp
+++ b/tests/PromiseImageTest.cpp
@@ -17,11 +17,11 @@
 
 struct PromiseTextureChecker {
     explicit PromiseTextureChecker(const GrBackendTexture& tex)
-            : fTexture(tex)
+            : fTexture(SkPromiseImageTexture::Make(tex))
             , fFulfillCount(0)
             , fReleaseCount(0)
             , fDoneCount(0) {}
-    SkPromiseImageTexture fTexture;
+    sk_sp<SkPromiseImageTexture> fTexture;
     int fFulfillCount;
     int fReleaseCount;
     int fDoneCount;
@@ -33,29 +33,26 @@
      * it is deleted. The default argument will remove the existing texture without installing a
      * valid replacement.
      */
-    SkPromiseImageTexture replaceTexture(const GrBackendTexture& tex = GrBackendTexture()) {
+    sk_sp<const SkPromiseImageTexture> replaceTexture(
+            const GrBackendTexture& tex = GrBackendTexture()) {
         // Can't change this while in active fulfillment.
         SkASSERT(fFulfillCount == fReleaseCount);
         auto temp = std::move(fTexture);
-        fTexture = SkPromiseImageTexture(tex);
-        return temp;
+        fTexture = SkPromiseImageTexture::Make(tex);
+        return std::move(temp);
     }
 
     SkTArray<GrUniqueKey> uniqueKeys() const {
-        return fTexture.testingOnly_uniqueKeysToInvalidate();
+        return fTexture->testingOnly_uniqueKeysToInvalidate();
     }
 
-    static SkPromiseImageTexture* Fulfill(void* self) {
+    static sk_sp<SkPromiseImageTexture> Fulfill(void* self) {
         auto checker = static_cast<PromiseTextureChecker*>(self);
-        SkASSERT(checker->fTexture.isValid());
         checker->fFulfillCount++;
-        checker->fLastFulfilledTexture = checker->fTexture.backendTexture();
-        return &checker->fTexture;
+        checker->fLastFulfilledTexture = checker->fTexture->backendTexture();
+        return checker->fTexture;
     }
-    static void Release(void* self, const SkPromiseImageTexture* texture) {
-        SkASSERT(&static_cast<PromiseTextureChecker*>(self)->fTexture == texture);
-        static_cast<PromiseTextureChecker*>(self)->fReleaseCount++;
-    }
+    static void Release(void* self) { static_cast<PromiseTextureChecker*>(self)->fReleaseCount++; }
     static void Done(void* self) {
         static_cast<PromiseTextureChecker*>(self)->fDoneCount++;
     }
@@ -347,7 +344,7 @@
                                                              reporter));
     REPORTER_ASSERT(reporter,
                     GrBackendTexture::TestingOnly_Equals(
-                            promiseChecker.replaceTexture().backendTexture(), backendTex1));
+                            promiseChecker.replaceTexture()->backendTexture(), backendTex1));
     gpu->deleteTestingOnlyBackendTexture(backendTex1);
 
     ctx->contextPriv().getResourceCache()->purgeAsNeeded();
@@ -427,9 +424,10 @@
     REPORTER_ASSERT(reporter, ctx->contextPriv().resourceProvider()->findByUniqueKey<>(texKey2));
 
     // Now we test keeping tex2 alive but fulfilling with a new texture.
-    SkPromiseImageTexture promiseImageTexture2 = promiseChecker.replaceTexture(backendTex3);
+    sk_sp<const SkPromiseImageTexture> promiseImageTexture2 =
+            promiseChecker.replaceTexture(backendTex3);
     REPORTER_ASSERT(reporter, GrBackendTexture::TestingOnly_Equals(
-                                      promiseImageTexture2.backendTexture(), backendTex2));
+                                      promiseImageTexture2->backendTexture(), backendTex2));
 
     canvas->drawImage(refImg, 0, 0);
 
@@ -454,7 +452,7 @@
     ctx->contextPriv().getResourceCache()->purgeAsNeeded();
     REPORTER_ASSERT(reporter, !ctx->contextPriv().resourceProvider()->findByUniqueKey<>(texKey2));
     REPORTER_ASSERT(reporter, ctx->contextPriv().resourceProvider()->findByUniqueKey<>(texKey3));
-    gpu->deleteTestingOnlyBackendTexture(promiseImageTexture2.backendTexture());
+    gpu->deleteTestingOnlyBackendTexture(promiseImageTexture2->backendTexture());
 
     // Make a new promise image also backed by texture 3.
     sk_sp<SkImage> refImg2(
@@ -497,7 +495,7 @@
     // If we delete the SkPromiseImageTexture we should trigger both key removals.
     REPORTER_ASSERT(reporter,
                     GrBackendTexture::TestingOnly_Equals(
-                            promiseChecker.replaceTexture().backendTexture(), backendTex3));
+                            promiseChecker.replaceTexture()->backendTexture(), backendTex3));
 
     ctx->contextPriv().getResourceCache()->purgeAsNeeded();
     REPORTER_ASSERT(reporter, !ctx->contextPriv().resourceProvider()->findByUniqueKey<>(texKey3));