Delazify wrapped backend textures/render target proxies
These methods will fail on DDL contexts.
This is in preparation for removing the ability to specify origin for lazy proxies.
Change-Id: Iadcedfd4fce8ea2590729c974128e5c58cec38a8
Reviewed-on: https://skia-review.googlesource.com/112802
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/tests/DeferredDisplayListTest.cpp b/tests/DeferredDisplayListTest.cpp
index 4b425ae..b0c80c3 100644
--- a/tests/DeferredDisplayListTest.cpp
+++ b/tests/DeferredDisplayListTest.cpp
@@ -358,143 +358,50 @@
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(DDLWrapBackendTest, reporter, ctxInfo) {
GrContext* context = ctxInfo.grContext();
GrGpu* gpu = context->contextPriv().getGpu();
- for (auto lastStage : { DDLStage::kMakeImage, DDLStage::kDrawImage,
- DDLStage::kDetach, DDLStage::kDrawDDL } ) {
- for (auto earlyImageReset : { false , true } ) {
- GrBackendTexture backendTex = gpu->createTestingOnlyBackendTexture(
- nullptr, kSize, kSize, kRGBA_8888_GrPixelConfig, false, GrMipMapped::kNo);
- if (!backendTex.isValid()) {
- continue;
- }
-
- SurfaceParameters params;
-
- sk_sp<SkSurface> s = params.make(context);
- if (!s) {
- gpu->deleteTestingOnlyBackendTexture(&backendTex);
- continue;
- }
-
- SkSurfaceCharacterization c;
- SkAssertResult(s->characterize(&c));
-
- std::unique_ptr<SkDeferredDisplayListRecorder> recorder(
- new SkDeferredDisplayListRecorder(c));
-
- SkCanvas* canvas = recorder->getCanvas();
- if (!canvas) {
- gpu->deleteTestingOnlyBackendTexture(&backendTex);
- continue;
- }
-
- GrContext* deferredContext = canvas->getGrContext();
- if (!deferredContext) {
- gpu->deleteTestingOnlyBackendTexture(&backendTex);
- continue;
- }
-
- sk_sp<SkImage> image = SkImage::MakeFromAdoptedTexture(deferredContext, backendTex,
- kTopLeft_GrSurfaceOrigin,
- kRGBA_8888_SkColorType,
- kPremul_SkAlphaType, nullptr);
- // Adopted Textures are not supported in DDL
- REPORTER_ASSERT(reporter, !image);
-
- TextureReleaseChecker releaseChecker;
- image = SkImage::MakeFromTexture(deferredContext, backendTex,
- kTopLeft_GrSurfaceOrigin,
- kRGBA_8888_SkColorType,
- kPremul_SkAlphaType, nullptr,
- TextureReleaseChecker::Release, &releaseChecker);
-
- REPORTER_ASSERT(reporter, image);
- if (!image) {
- gpu->deleteTestingOnlyBackendTexture(&backendTex);
- continue;
- }
-
- if (DDLStage::kMakeImage == lastStage) {
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
- image.reset();
- REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount);
- recorder.reset();
- REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount);
- gpu->deleteTestingOnlyBackendTexture(&backendTex);
- continue;
- }
-
- canvas->drawImage(image.get(), 0, 0);
-
- if (earlyImageReset) {
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
- image.reset();
- // Ref should still be held by DDL recorder since we did the draw
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
- }
-
- if (DDLStage::kDrawImage == lastStage) {
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
- recorder.reset();
- if (earlyImageReset) {
- REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount);
- } else {
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
- image.reset();
- REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount);
- }
- gpu->deleteTestingOnlyBackendTexture(&backendTex);
- continue;
- }
-
- std::unique_ptr<SkDeferredDisplayList> ddl = recorder->detach();
- if (DDLStage::kDetach == lastStage) {
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
- recorder.reset();
-#ifndef SK_RASTER_RECORDER_IMPLEMENTATION
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
-#endif
- ddl.reset();
- if (earlyImageReset) {
- REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount);
- } else {
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
- image.reset();
- REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount);
- }
- gpu->deleteTestingOnlyBackendTexture(&backendTex);
- continue;
- }
-
- REPORTER_ASSERT(reporter, s->draw(ddl.get()));
-
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
- recorder.reset();
-#ifndef SK_RASTER_RECORDER_IMPLEMENTATION
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
-#endif
- ddl.reset();
-#ifndef SK_RASTER_RECORDER_IMPLEMENTATION
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
-#endif
-
- // Force all draws to flush and sync by calling a read pixels
- SkImageInfo imageInfo = SkImageInfo::Make(kSize, kSize, kRGBA_8888_SkColorType,
- kPremul_SkAlphaType);
- SkBitmap bitmap;
- bitmap.allocPixels(imageInfo);
- s->readPixels(imageInfo, bitmap.getPixels(), bitmap.rowBytes(), 0, 0);
-
- if (earlyImageReset) {
- REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount);
- } else {
- REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
- image.reset();
- REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount);
- }
-
- gpu->deleteTestingOnlyBackendTexture(&backendTex);
- }
+ GrBackendTexture backendTex = gpu->createTestingOnlyBackendTexture(
+ nullptr, kSize, kSize, kRGBA_8888_GrPixelConfig, false, GrMipMapped::kNo);
+ if (!backendTex.isValid()) {
+ return;
}
+
+ SurfaceParameters params;
+
+ sk_sp<SkSurface> s = params.make(context);
+ if (!s) {
+ gpu->deleteTestingOnlyBackendTexture(&backendTex);
+ return;
+ }
+
+ SkSurfaceCharacterization c;
+ SkAssertResult(s->characterize(&c));
+
+ std::unique_ptr<SkDeferredDisplayListRecorder> recorder(new SkDeferredDisplayListRecorder(c));
+
+ SkCanvas* canvas = recorder->getCanvas();
+ if (!canvas) {
+ gpu->deleteTestingOnlyBackendTexture(&backendTex);
+ return;
+ }
+
+ GrContext* deferredContext = canvas->getGrContext();
+ if (!deferredContext) {
+ gpu->deleteTestingOnlyBackendTexture(&backendTex);
+ return;
+ }
+
+ // Wrapped Backend Textures are not supported in DDL
+ sk_sp<SkImage> image =
+ SkImage::MakeFromAdoptedTexture(deferredContext, backendTex, kTopLeft_GrSurfaceOrigin,
+ kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr);
+ REPORTER_ASSERT(reporter, !image);
+
+ TextureReleaseChecker releaseChecker;
+ image = SkImage::MakeFromTexture(deferredContext, backendTex, kTopLeft_GrSurfaceOrigin,
+ kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr,
+ TextureReleaseChecker::Release, &releaseChecker);
+ REPORTER_ASSERT(reporter, !image);
+
+ gpu->deleteTestingOnlyBackendTexture(&backendTex);
}
diff --git a/tests/ProxyTest.cpp b/tests/ProxyTest.cpp
index 9d52281..8f5eb13 100644
--- a/tests/ProxyTest.cpp
+++ b/tests/ProxyTest.cpp
@@ -48,12 +48,17 @@
REPORTER_ASSERT(reporter, rtProxy->numStencilSamples() == numSamples);
GrSurfaceProxy::UniqueID idBefore = rtProxy->uniqueID();
+ bool preinstantiated = rtProxy->priv().isInstantiated();
REPORTER_ASSERT(reporter, rtProxy->instantiate(provider));
GrRenderTarget* rt = rtProxy->priv().peekRenderTarget();
REPORTER_ASSERT(reporter, rtProxy->uniqueID() == idBefore);
// Deferred resources should always have a different ID from their instantiated rendertarget
- REPORTER_ASSERT(reporter, rtProxy->uniqueID().asUInt() != rt->uniqueID().asUInt());
+ if (preinstantiated) {
+ REPORTER_ASSERT(reporter, rtProxy->uniqueID().asUInt() == rt->uniqueID().asUInt());
+ } else {
+ REPORTER_ASSERT(reporter, rtProxy->uniqueID().asUInt() != rt->uniqueID().asUInt());
+ }
if (SkBackingFit::kExact == fit) {
REPORTER_ASSERT(reporter, rt->width() == rtProxy->width());
@@ -76,12 +81,17 @@
SkBackingFit fit) {
GrSurfaceProxy::UniqueID idBefore = texProxy->uniqueID();
+ bool preinstantiated = texProxy->priv().isInstantiated();
REPORTER_ASSERT(reporter, texProxy->instantiate(provider));
GrTexture* tex = texProxy->priv().peekTexture();
REPORTER_ASSERT(reporter, texProxy->uniqueID() == idBefore);
// Deferred resources should always have a different ID from their instantiated texture
- REPORTER_ASSERT(reporter, texProxy->uniqueID().asUInt() != tex->uniqueID().asUInt());
+ if (preinstantiated) {
+ REPORTER_ASSERT(reporter, texProxy->uniqueID().asUInt() == tex->uniqueID().asUInt());
+ } else {
+ REPORTER_ASSERT(reporter, texProxy->uniqueID().asUInt() != tex->uniqueID().asUInt());
+ }
if (SkBackingFit::kExact == fit) {
REPORTER_ASSERT(reporter, tex->width() == texProxy->width());