aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Greg Daniel <egdaniel@google.com>2018-01-16 16:14:41 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-01-17 14:58:26 +0000
commit94a6ce84ece51ff1c46c698753716f3f47585742 (patch)
tree6e8354476a3f3cc1a32906aae553813371af1d35
parent4e6cf91b7e6f7908d941275dc56c829143345402 (diff)
Add ability for lazy proxy callback to free captured resources
This will be needed for DDLs that get recorded, but then deleted before the proxies actually get instantiated. Bug: skia: Change-Id: I745366fc7a7edbcd43bc617220d3d4997baa8319 Reviewed-on: https://skia-review.googlesource.com/95101 Reviewed-by: Robert Phillips <robertphillips@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
-rw-r--r--include/private/GrSurfaceProxy.h4
-rw-r--r--src/gpu/GrSurfaceProxy.cpp5
-rw-r--r--src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp3
-rw-r--r--tests/LazyProxyTest.cpp37
4 files changed, 49 insertions, 0 deletions
diff --git a/include/private/GrSurfaceProxy.h b/include/private/GrSurfaceProxy.h
index 5a2a4b536e..cc12fcb010 100644
--- a/include/private/GrSurfaceProxy.h
+++ b/include/private/GrSurfaceProxy.h
@@ -198,6 +198,10 @@ public:
* (Stencil is not supported by this method.) The width and height must either both be greater
* than 0 or both less than or equal to zero. A non-positive value is a signal that the width
* and height are currently unknown.
+ *
+ * When called, the callback must be able to cleanup any resources that it captured at creation.
+ * It also must support being passed in a null GrResourceProvider. When this happens, the
+ * callback should cleanup any resources it captured and return an empty sk_sp<GrTextureProxy>.
* DDL TODO: remove this entry point
*/
static sk_sp<GrTextureProxy> MakeLazy(LazyInstantiateCallback&&, const GrSurfaceDesc& desc,
diff --git a/src/gpu/GrSurfaceProxy.cpp b/src/gpu/GrSurfaceProxy.cpp
index c9da6ce592..0408b79c91 100644
--- a/src/gpu/GrSurfaceProxy.cpp
+++ b/src/gpu/GrSurfaceProxy.cpp
@@ -83,6 +83,11 @@ GrSurfaceProxy::GrSurfaceProxy(sk_sp<GrSurface> surface, GrSurfaceOrigin origin,
}
GrSurfaceProxy::~GrSurfaceProxy() {
+ if (fLazyInstantiateCallback) {
+ // We have an uninstantiated lazy proxy. Call fLazyInstantiateCallback with a nullptr for
+ // the GrResourceProvider to signal the callback should clean itself up.
+ this->fLazyInstantiateCallback(nullptr, nullptr);
+ }
// For this to be deleted the opList that held a ref on it (if there was one) must have been
// deleted. Which would have cleared out this back pointer.
SkASSERT(!fLastOpList);
diff --git a/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp b/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
index 67098ccb9b..1e0bb29acd 100644
--- a/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
+++ b/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
@@ -227,6 +227,9 @@ void CCPR::ClipPath::init(const SkPath& deviceSpacePath, const SkIRect& accessRe
fAtlasLazyProxy = GrSurfaceProxy::MakeFullyLazy(
[this](GrResourceProvider* resourceProvider, GrSurfaceOrigin* outOrigin) {
+ if (!resourceProvider) {
+ return sk_sp<GrTexture>();
+ }
SkASSERT(fHasAtlas);
SkASSERT(!fHasAtlasTransform);
diff --git a/tests/LazyProxyTest.cpp b/tests/LazyProxyTest.cpp
index a55593134d..1fe4fc4cb0 100644
--- a/tests/LazyProxyTest.cpp
+++ b/tests/LazyProxyTest.cpp
@@ -15,6 +15,7 @@
#include "GrRenderTargetContext.h"
#include "GrRenderTargetContextPriv.h"
#include "GrSurfaceProxy.h"
+#include "GrSurfaceProxyPriv.h"
#include "GrTexture.h"
#include "GrTextureProxy.h"
#include "GrTextureProxyPriv.h"
@@ -187,4 +188,40 @@ DEF_GPUTEST(LazyProxyTest, reporter, /* options */) {
}
}
+DEF_GPUTEST(LazyProxyReleaseTest, reporter, /* options */) {
+ GrMockOptions mockOptions;
+ sk_sp<GrContext> ctx = GrContext::MakeMock(&mockOptions, GrContextOptions());
+
+ GrSurfaceDesc desc;
+ desc.fWidth = 16;
+ desc.fHeight = 16;
+ desc.fConfig = kRGBA_8888_GrPixelConfig;
+
+ for (bool doInstantiate : {true, false}) {
+ int testCount = 0;
+ int* testCountPtr = &testCount;
+ sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeLazy(
+ [testCountPtr](GrResourceProvider* resourceProvider, GrSurfaceOrigin* outOrigin) {
+ if (!resourceProvider) {
+ *testCountPtr = -1;
+ return sk_sp<GrTexture>();
+ }
+ *testCountPtr = 1;
+ return sk_sp<GrTexture>();
+ }, desc, GrMipMapped::kNo, SkBackingFit::kExact, SkBudgeted::kNo);
+
+ REPORTER_ASSERT(reporter, 0 == testCount);
+
+ if (doInstantiate) {
+ proxy->priv().doLazyInstantiation(ctx->contextPriv().resourceProvider());
+ REPORTER_ASSERT(reporter, 1 == testCount);
+ proxy.reset();
+ REPORTER_ASSERT(reporter, 1 == testCount);
+ } else {
+ proxy.reset();
+ REPORTER_ASSERT(reporter, -1 == testCount);
+ }
+ }
+}
+
#endif