Revert "Distinguish between "flushed" and "finished" idle state callbacks on GrTexture."
This reverts commit 9ac040700659cefff3c9a7ec6d4ada98948c307c.
Reason for revert: Breaking DDL Win10 skpbench bot
Original change's description:
> Distinguish between "flushed" and "finished" idle state callbacks on GrTexture.
>
> This is necessary to convert the promise image API to call Release when all
> work is flushed and Done when all work is complete (future work).
>
> Change-Id: I9745952bb0978ca2aaa79aeed460730b2fea856e
> Bug: skia:8800
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/197163
> Commit-Queue: Brian Salomon <bsalomon@google.com>
> Reviewed-by: Robert Phillips <robertphillips@google.com>
TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Bug: skia:8800
Change-Id: I5e6c4ea072beb4fb67a53d2ea2b007a7d201799d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/198603
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/image/SkImage_GpuBase.cpp b/src/image/SkImage_GpuBase.cpp
index 2618dd4..ec2e651 100644
--- a/src/image/SkImage_GpuBase.cpp
+++ b/src/image/SkImage_GpuBase.cpp
@@ -426,8 +426,10 @@
PromiseImageTextureDoneProc doneProc,
PromiseImageTextureContext context,
GrPixelConfig config)
- : fFulfillProc(fulfillProc), fReleaseProc(releaseProc), fConfig(config) {
- fDoneCallback = sk_make_sp<GrRefCntedCallback>(doneProc, context);
+ : fFulfillProc(fulfillProc), fConfig(config) {
+ auto doneHelper = sk_make_sp<GrRefCntedCallback>(doneProc, context);
+ fIdleCallback = sk_make_sp<GrRefCntedCallback>(releaseProc, context);
+ fIdleCallback->addChild(std::move(doneHelper));
}
PromiseLazyInstantiateCallback(PromiseLazyInstantiateCallback&&) = default;
PromiseLazyInstantiateCallback(const PromiseLazyInstantiateCallback&) {
@@ -441,20 +443,30 @@
return *this;
}
+ ~PromiseLazyInstantiateCallback() {
+ if (fIdleCallback) {
+ // We were never fulfilled. Pass false so done proc is still called.
+ fIdleCallback->abandon();
+ }
+ }
+
sk_sp<GrSurface> operator()(GrResourceProvider* resourceProvider) {
- SkASSERT(fDoneCallback);
- PromiseImageTextureContext textureContext = fDoneCallback->context();
+ SkASSERT(fIdleCallback);
+ PromiseImageTextureContext textureContext = fIdleCallback->context();
sk_sp<SkPromiseImageTexture> promiseTexture = fFulfillProc(textureContext);
// From here on out our contract is that the release proc must be called, even if
// the return from fulfill was invalid or we fail for some other reason.
- auto releaseCallback = sk_make_sp<GrRefCntedCallback>(fReleaseProc, textureContext);
if (!promiseTexture) {
+ // Make sure we explicitly reset this because our destructor assumes a non-null
+ // fIdleCallback means fulfill was never called.
+ fIdleCallback.reset();
return sk_sp<GrTexture>();
}
auto backendTexture = promiseTexture->backendTexture();
backendTexture.fConfig = fConfig;
if (!backendTexture.isValid()) {
+ fIdleCallback.reset();
return sk_sp<GrTexture>();
}
@@ -477,19 +489,18 @@
kRead_GrIOType))) {
tex->resourcePriv().setUniqueKey(key);
} else {
+ fIdleCallback.reset();
return sk_sp<GrTexture>();
}
}
- tex->addIdleProc(std::move(releaseCallback), GrTexture::IdleState::kFinished);
- tex->addIdleProc(std::move(fDoneCallback), GrTexture::IdleState::kFinished);
+ tex->addIdleProc(std::move(fIdleCallback));
promiseTexture->addKeyToInvalidate(tex->getContext()->priv().contextID(), key);
return std::move(tex);
}
private:
+ sk_sp<GrRefCntedCallback> fIdleCallback;
PromiseImageTextureFulfillProc fFulfillProc;
- PromiseImageTextureReleaseProc fReleaseProc;
- sk_sp<GrRefCntedCallback> fDoneCallback;
GrPixelConfig fConfig;
} callback(fulfillProc, releaseProc, doneProc, textureContext, config);