aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/ImageTest.cpp
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2017-06-21 15:10:33 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-21 20:04:50 +0000
commitceb7a4264972536a065ba9c0cdc8b87285c4b4b6 (patch)
tree47ab14db435b79d803d58b4f2822751b57e102dc /tests/ImageTest.cpp
parent7f4124058eda42e8379f2e979fabc339b8580348 (diff)
Fix cross context test to actually use shared GL contexts
It's incredible that this was working on so many devices and GL implementations. Bug: skia: Change-Id: I8d43405b1eaea170e28840f17a7088d2f59aa612 Reviewed-on: https://skia-review.googlesource.com/20449 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'tests/ImageTest.cpp')
-rw-r--r--tests/ImageTest.cpp221
1 files changed, 117 insertions, 104 deletions
diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
index d69b89fb90..13a8a131d9 100644
--- a/tests/ImageTest.cpp
+++ b/tests/ImageTest.cpp
@@ -841,132 +841,145 @@ DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(SkImage_NewFromTextureRelease, reporter, c
ctxInfo.grContext()->getGpu()->deleteTestingOnlyBackendTexture(backendTexHandle);
}
-DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(SkImage_MakeCrossContextRelease, reporter, ctxInfo) {
- GrContext* ctx = ctxInfo.grContext();
-
- // If we don't have proper support for this feature, the factory will fallback to returning
- // codec-backed images. Those will "work", but some of our checks will fail because we expect
- // the cross-context images not to work on multiple contexts at once.
- if (!ctx->caps()->crossContextTextureSupport()) {
- return;
- }
-
- // We test three lifetime patterns for a single context:
- // 1) Create image, free image
- // 2) Create image, draw, flush, free image
- // 3) Create image, draw, free image, flush
- // ... and then repeat the last two patterns with drawing on a second* context:
- // 4) Create image, draw*, flush*, free image
- // 5) Create image, draw*, free iamge, flush*
+DEF_GPUTEST(SkImage_MakeCrossContextRelease, reporter, /*factory*/) {
+ GrContextFactory testFactory;
sk_sp<SkData> data = GetResourceAsData("mandrill_128.png");
SkASSERT(data.get());
- // Case #1: Create image, free image
- {
- sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
- refImg.reset(nullptr); // force a release of the image
- }
+ for (int i = 0; i < GrContextFactory::kContextTypeCnt; ++i) {
+ GrContextFactory::ContextType ctxType = static_cast<GrContextFactory::ContextType>(i);
+ ContextInfo ctxInfo = testFactory.getContextInfo(ctxType);
+ GrContext* ctx = ctxInfo.grContext();
+ if (!ctx) {
+ continue;
+ }
- SkImageInfo info = SkImageInfo::MakeN32Premul(128, 128);
- sk_sp<SkSurface> surface = SkSurface::MakeRenderTarget(ctx, SkBudgeted::kNo, info);
- SkCanvas* canvas = surface->getCanvas();
+ // If we don't have proper support for this feature, the factory will fallback to returning
+ // codec-backed images. Those will "work", but some of our checks will fail because we
+ // expect the cross-context images not to work on multiple contexts at once.
+ if (!ctx->caps()->crossContextTextureSupport()) {
+ continue;
+ }
- // Case #2: Create image, draw, flush, free image
- {
- sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
+ // We test three lifetime patterns for a single context:
+ // 1) Create image, free image
+ // 2) Create image, draw, flush, free image
+ // 3) Create image, draw, free image, flush
+ // ... and then repeat the last two patterns with drawing on a second* context:
+ // 4) Create image, draw*, flush*, free image
+ // 5) Create image, draw*, free iamge, flush*
+
+ // Case #1: Create image, free image
+ {
+ sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
+ refImg.reset(nullptr); // force a release of the image
+ }
- canvas->drawImage(refImg, 0, 0);
- canvas->flush();
+ SkImageInfo info = SkImageInfo::MakeN32Premul(128, 128);
+ sk_sp<SkSurface> surface = SkSurface::MakeRenderTarget(ctx, SkBudgeted::kNo, info);
+ SkCanvas* canvas = surface->getCanvas();
- refImg.reset(nullptr); // force a release of the image
- }
+ // Case #2: Create image, draw, flush, free image
+ {
+ sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
- // Case #3: Create image, draw, free image, flush
- {
- sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
+ canvas->drawImage(refImg, 0, 0);
+ canvas->flush();
- canvas->drawImage(refImg, 0, 0);
- refImg.reset(nullptr); // force a release of the image
+ refImg.reset(nullptr); // force a release of the image
+ }
- canvas->flush();
- }
+ // Case #3: Create image, draw, free image, flush
+ {
+ sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
- // Configure second context
- sk_gpu_test::TestContext* testContext = ctxInfo.testContext();
+ canvas->drawImage(refImg, 0, 0);
+ refImg.reset(nullptr); // force a release of the image
- GrContextFactory otherFactory;
- ContextInfo otherContextInfo = otherFactory.getContextInfo(ctxInfo.type());
- GrContext* otherCtx = otherContextInfo.grContext();
- sk_gpu_test::TestContext* otherTestContext = otherContextInfo.testContext();
+ canvas->flush();
+ }
- surface = SkSurface::MakeRenderTarget(otherCtx, SkBudgeted::kNo, info);
- canvas = surface->getCanvas();
+ // Configure second context
+ sk_gpu_test::TestContext* testContext = ctxInfo.testContext();
- // Case #4: Create image, draw*, flush*, free image
- {
- testContext->makeCurrent();
- sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
+ ContextInfo otherContextInfo = testFactory.getSharedContextInfo(ctx);
+ GrContext* otherCtx = otherContextInfo.grContext();
+ sk_gpu_test::TestContext* otherTestContext = otherContextInfo.testContext();
- otherTestContext->makeCurrent();
- canvas->drawImage(refImg, 0, 0);
- canvas->flush();
+ // Creating a context in a share group may fail
+ if (!otherCtx) {
+ continue;
+ }
- testContext->makeCurrent();
- refImg.reset(nullptr); // force a release of the image
- }
+ surface = SkSurface::MakeRenderTarget(otherCtx, SkBudgeted::kNo, info);
+ canvas = surface->getCanvas();
- // Case #5: Create image, draw*, free image, flush*
- {
- testContext->makeCurrent();
- sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
+ // Case #4: Create image, draw*, flush*, free image
+ {
+ testContext->makeCurrent();
+ sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
- otherTestContext->makeCurrent();
- canvas->drawImage(refImg, 0, 0);
+ otherTestContext->makeCurrent();
+ canvas->drawImage(refImg, 0, 0);
+ canvas->flush();
- testContext->makeCurrent();
- refImg.reset(nullptr); // force a release of the image
+ testContext->makeCurrent();
+ refImg.reset(nullptr); // force a release of the image
+ }
- otherTestContext->makeCurrent();
- canvas->flush();
- }
+ // Case #5: Create image, draw*, free image, flush*
+ {
+ testContext->makeCurrent();
+ sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
- // Case #6: Verify that only one context can be using the image at a time
- {
- testContext->makeCurrent();
- sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
-
- // Any context should be able to borrow the texture at this point
- sk_sp<SkColorSpace> texColorSpace;
- sk_sp<GrTextureProxy> proxy = as_IB(refImg)->asTextureProxyRef(
- ctx, GrSamplerParams::ClampNoFilter(), nullptr, &texColorSpace, nullptr);
- REPORTER_ASSERT(reporter, proxy);
-
- // But once it's borrowed, no other context should be able to borrow
- otherTestContext->makeCurrent();
- sk_sp<GrTextureProxy> otherProxy = as_IB(refImg)->asTextureProxyRef(
- otherCtx, GrSamplerParams::ClampNoFilter(), nullptr, &texColorSpace, nullptr);
- REPORTER_ASSERT(reporter, !otherProxy);
-
- // Original context (that's already borrowing) should be okay
- testContext->makeCurrent();
- sk_sp<GrTextureProxy> proxySecondRef = as_IB(refImg)->asTextureProxyRef(
- ctx, GrSamplerParams::ClampNoFilter(), nullptr, &texColorSpace, nullptr);
- REPORTER_ASSERT(reporter, proxySecondRef);
-
- // Releae all refs from the original context
- proxy.reset(nullptr);
- proxySecondRef.reset(nullptr);
-
- // Now we should be able to borrow the texture from the other context
- otherTestContext->makeCurrent();
- otherProxy = as_IB(refImg)->asTextureProxyRef(
- otherCtx, GrSamplerParams::ClampNoFilter(), nullptr, &texColorSpace, nullptr);
- REPORTER_ASSERT(reporter, otherProxy);
-
- // Release everything
- otherProxy.reset(nullptr);
- refImg.reset(nullptr);
+ otherTestContext->makeCurrent();
+ canvas->drawImage(refImg, 0, 0);
+
+ testContext->makeCurrent();
+ refImg.reset(nullptr); // force a release of the image
+
+ otherTestContext->makeCurrent();
+ canvas->flush();
+ }
+
+ // Case #6: Verify that only one context can be using the image at a time
+ {
+ testContext->makeCurrent();
+ sk_sp<SkImage> refImg(SkImage::MakeCrossContextFromEncoded(ctx, data, false, nullptr));
+
+ // Any context should be able to borrow the texture at this point
+ sk_sp<SkColorSpace> texColorSpace;
+ sk_sp<GrTextureProxy> proxy = as_IB(refImg)->asTextureProxyRef(
+ ctx, GrSamplerParams::ClampNoFilter(), nullptr, &texColorSpace, nullptr);
+ REPORTER_ASSERT(reporter, proxy);
+
+ // But once it's borrowed, no other context should be able to borrow
+ otherTestContext->makeCurrent();
+ sk_sp<GrTextureProxy> otherProxy = as_IB(refImg)->asTextureProxyRef(
+ otherCtx, GrSamplerParams::ClampNoFilter(), nullptr, &texColorSpace, nullptr);
+ REPORTER_ASSERT(reporter, !otherProxy);
+
+ // Original context (that's already borrowing) should be okay
+ testContext->makeCurrent();
+ sk_sp<GrTextureProxy> proxySecondRef = as_IB(refImg)->asTextureProxyRef(
+ ctx, GrSamplerParams::ClampNoFilter(), nullptr, &texColorSpace, nullptr);
+ REPORTER_ASSERT(reporter, proxySecondRef);
+
+ // Releae all refs from the original context
+ proxy.reset(nullptr);
+ proxySecondRef.reset(nullptr);
+
+ // Now we should be able to borrow the texture from the other context
+ otherTestContext->makeCurrent();
+ otherProxy = as_IB(refImg)->asTextureProxyRef(
+ otherCtx, GrSamplerParams::ClampNoFilter(), nullptr, &texColorSpace, nullptr);
+ REPORTER_ASSERT(reporter, otherProxy);
+
+ // Release everything
+ otherProxy.reset(nullptr);
+ refImg.reset(nullptr);
+ }
}
}