Revert "Revert "Change promise image contract to for when Release and Done are called.""
This reverts commit d716d4402aa3cb939d697c4b05f17df87f2c3df0.
Bug: skia:8800
Change-Id: Ic16cd4e960be2c3d2462bdf2b54b2e32abbd9f78
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/199081
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/core/SkDeferredDisplayListRecorder.cpp b/src/core/SkDeferredDisplayListRecorder.cpp
index 8063349..e81dbba 100644
--- a/src/core/SkDeferredDisplayListRecorder.cpp
+++ b/src/core/SkDeferredDisplayListRecorder.cpp
@@ -34,7 +34,8 @@
PromiseImageTextureFulfillProc textureFulfillProc,
PromiseImageTextureReleaseProc textureReleaseProc,
PromiseImageTextureDoneProc textureDoneProc,
- PromiseImageTextureContext textureContext) {
+ PromiseImageTextureContext textureContext,
+ PromiseImageApiVersion) {
return nullptr;
}
@@ -50,7 +51,8 @@
PromiseImageTextureFulfillProc textureFulfillProc,
PromiseImageTextureReleaseProc textureReleaseProc,
PromiseImageTextureDoneProc textureDoneProc,
- PromiseImageTextureContext textureContexts[]) {
+ PromiseImageTextureContext textureContexts[],
+ PromiseImageApiVersion) {
return nullptr;
}
@@ -233,7 +235,8 @@
PromiseImageTextureFulfillProc textureFulfillProc,
PromiseImageTextureReleaseProc textureReleaseProc,
PromiseImageTextureDoneProc textureDoneProc,
- PromiseImageTextureContext textureContext) {
+ PromiseImageTextureContext textureContext,
+ PromiseImageApiVersion version) {
if (!fContext) {
return nullptr;
}
@@ -250,7 +253,8 @@
textureFulfillProc,
textureReleaseProc,
textureDoneProc,
- textureContext);
+ textureContext,
+ version);
}
sk_sp<SkImage> SkDeferredDisplayListRecorder::makeYUVAPromiseTexture(
@@ -265,7 +269,8 @@
PromiseImageTextureFulfillProc textureFulfillProc,
PromiseImageTextureReleaseProc textureReleaseProc,
PromiseImageTextureDoneProc textureDoneProc,
- PromiseImageTextureContext textureContexts[]) {
+ PromiseImageTextureContext textureContexts[],
+ PromiseImageApiVersion version) {
if (!fContext) {
return nullptr;
}
@@ -282,7 +287,8 @@
textureFulfillProc,
textureReleaseProc,
textureDoneProc,
- textureContexts);
+ textureContexts,
+ version);
}
#endif
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp
index 33f77cf..4fec2ea 100644
--- a/src/image/SkImage_Gpu.cpp
+++ b/src/image/SkImage_Gpu.cpp
@@ -405,7 +405,8 @@
PromiseImageTextureFulfillProc textureFulfillProc,
PromiseImageTextureReleaseProc textureReleaseProc,
PromiseImageTextureDoneProc textureDoneProc,
- PromiseImageTextureContext textureContext) {
+ PromiseImageTextureContext textureContext,
+ PromiseImageApiVersion version) {
// The contract here is that if 'promiseDoneProc' is passed in it should always be called,
// even if creation of the SkImage fails. Once we call MakePromiseImageLazyProxy it takes
// responsibility for calling the done proc.
@@ -436,7 +437,7 @@
callDone.clear();
auto proxy = MakePromiseImageLazyProxy(context, width, height, origin, config, backendFormat,
mipMapped, textureFulfillProc, textureReleaseProc,
- textureDoneProc, textureContext);
+ textureDoneProc, textureContext, version);
if (!proxy) {
return nullptr;
}
diff --git a/src/image/SkImage_Gpu.h b/src/image/SkImage_Gpu.h
index e05ec6c..39ba49e 100644
--- a/src/image/SkImage_Gpu.h
+++ b/src/image/SkImage_Gpu.h
@@ -55,7 +55,8 @@
PromiseImageTextureFulfillProc textureFulfillProc,
PromiseImageTextureReleaseProc textureReleaseProc,
PromiseImageTextureDoneProc textureDoneProc,
- PromiseImageTextureContext textureContext);
+ PromiseImageTextureContext textureContext,
+ PromiseImageApiVersion);
static sk_sp<SkImage> ConvertYUVATexturesToRGB(GrContext*, SkYUVColorSpace yuvColorSpace,
const GrBackendTexture yuvaTextures[],
diff --git a/src/image/SkImage_GpuBase.cpp b/src/image/SkImage_GpuBase.cpp
index 6e29471..fe3d5ba 100644
--- a/src/image/SkImage_GpuBase.cpp
+++ b/src/image/SkImage_GpuBase.cpp
@@ -386,7 +386,8 @@
PromiseImageTextureFulfillProc fulfillProc,
PromiseImageTextureReleaseProc releaseProc,
PromiseImageTextureDoneProc doneProc,
- PromiseImageTextureContext textureContext) {
+ PromiseImageTextureContext textureContext,
+ PromiseImageApiVersion version) {
SkASSERT(context);
SkASSERT(width > 0 && height > 0);
SkASSERT(doneProc);
@@ -425,8 +426,12 @@
PromiseImageTextureReleaseProc releaseProc,
PromiseImageTextureDoneProc doneProc,
PromiseImageTextureContext context,
- GrPixelConfig config)
- : fFulfillProc(fulfillProc), fReleaseProc(releaseProc), fConfig(config) {
+ GrPixelConfig config,
+ PromiseImageApiVersion version)
+ : fFulfillProc(fulfillProc)
+ , fReleaseProc(releaseProc)
+ , fConfig(config)
+ , fVersion(version) {
fDoneCallback = sk_make_sp<GrRefCntedCallback>(doneProc, context);
}
PromiseLazyInstantiateCallback(PromiseLazyInstantiateCallback&&) = default;
@@ -492,7 +497,10 @@
return sk_sp<GrTexture>();
}
}
- tex->addIdleProc(std::move(releaseCallback), GrTexture::IdleState::kFinished);
+ auto releaseIdleState = fVersion == PromiseImageApiVersion::kLegacy
+ ? GrTexture::IdleState::kFinished
+ : GrTexture::IdleState::kFlushed;
+ tex->addIdleProc(std::move(releaseCallback), releaseIdleState);
tex->addIdleProc(std::move(fDoneCallback), GrTexture::IdleState::kFinished);
promiseTexture->addKeyToInvalidate(tex->getContext()->priv().contextID(), key);
fTexture = tex.get();
@@ -513,7 +521,8 @@
GrTexture* fTexture = nullptr;
uint32_t fTextureContextID = SK_InvalidUniqueID;
GrPixelConfig fConfig;
- } callback(fulfillProc, releaseProc, doneProc, textureContext, config);
+ PromiseImageApiVersion fVersion;
+ } callback(fulfillProc, releaseProc, doneProc, textureContext, config, version);
GrProxyProvider* proxyProvider = context->priv().proxyProvider();
diff --git a/src/image/SkImage_GpuBase.h b/src/image/SkImage_GpuBase.h
index 0058711..ad5fc1d 100644
--- a/src/image/SkImage_GpuBase.h
+++ b/src/image/SkImage_GpuBase.h
@@ -78,6 +78,7 @@
using PromiseImageTextureDoneProc = SkDeferredDisplayListRecorder::PromiseImageTextureDoneProc;
protected:
+ using PromiseImageApiVersion = SkDeferredDisplayListRecorder::PromiseImageApiVersion;
// Helper for making a lazy proxy for a promise image. The PromiseDoneProc we be called,
// if not null, immediately if this function fails. Othwerwise, it is installed in the
// proxy along with the TextureFulfillProc and TextureReleaseProc. PromiseDoneProc must not
@@ -85,7 +86,7 @@
static sk_sp<GrTextureProxy> MakePromiseImageLazyProxy(
GrContext*, int width, int height, GrSurfaceOrigin, GrPixelConfig, GrBackendFormat,
GrMipMapped, PromiseImageTextureFulfillProc, PromiseImageTextureReleaseProc,
- PromiseImageTextureDoneProc, PromiseImageTextureContext);
+ PromiseImageTextureDoneProc, PromiseImageTextureContext, PromiseImageApiVersion);
static bool RenderYUVAToRGBA(GrContext* ctx, GrRenderTargetContext* renderTargetContext,
const SkRect& rect, SkYUVColorSpace yuvColorSpace,
diff --git a/src/image/SkImage_GpuYUVA.cpp b/src/image/SkImage_GpuYUVA.cpp
index fe3eb92..ffa801c 100644
--- a/src/image/SkImage_GpuYUVA.cpp
+++ b/src/image/SkImage_GpuYUVA.cpp
@@ -282,7 +282,8 @@
PromiseImageTextureFulfillProc textureFulfillProc,
PromiseImageTextureReleaseProc textureReleaseProc,
PromiseImageTextureDoneProc promiseDoneProc,
- PromiseImageTextureContext textureContexts[]) {
+ PromiseImageTextureContext textureContexts[],
+ PromiseImageApiVersion version) {
int numTextures;
bool valid = SkYUVAIndex::AreValidIndices(yuvaIndices, &numTextures);
@@ -342,7 +343,7 @@
proxies[texIdx] = MakePromiseImageLazyProxy(
context, yuvaSizes[texIdx].width(), yuvaSizes[texIdx].height(), imageOrigin, config,
yuvaFormats[texIdx], GrMipMapped::kNo, textureFulfillProc, textureReleaseProc,
- promiseDoneProc, textureContexts[texIdx]);
+ promiseDoneProc, textureContexts[texIdx], version);
++proxiesCreated;
if (!proxies[texIdx]) {
return nullptr;
diff --git a/src/image/SkImage_GpuYUVA.h b/src/image/SkImage_GpuYUVA.h
index 33bea53..4f01735 100644
--- a/src/image/SkImage_GpuYUVA.h
+++ b/src/image/SkImage_GpuYUVA.h
@@ -73,7 +73,8 @@
PromiseImageTextureFulfillProc textureFulfillProc,
PromiseImageTextureReleaseProc textureReleaseProc,
PromiseImageTextureDoneProc textureDoneProc,
- PromiseImageTextureContext textureContexts[]);
+ PromiseImageTextureContext textureContexts[],
+ PromiseImageApiVersion);
private:
SkImage_GpuYUVA(const SkImage_GpuYUVA* image, sk_sp<SkColorSpace>);