| Index: tests/ImageTest.cpp
|
| diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
|
| index ba071bb1f75ca6f878eba49e728fcc3edcb454ea..f5e1abc0a4ad34a61eaf12e1982c4d4a75a80531 100644
|
| --- a/tests/ImageTest.cpp
|
| +++ b/tests/ImageTest.cpp
|
| @@ -249,3 +249,65 @@ DEF_TEST(image_newfrombitmap, reporter) {
|
| REPORTER_ASSERT(reporter, peekSuccess == rec[i].fExpectPeekSuccess);
|
| }
|
| }
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////////////////////////
|
| +#if SK_SUPPORT_GPU
|
| +
|
| +static SkImage* make_gpu_image(GrContext* ctx, const SkImageInfo& info, SkColor color) {
|
| + const SkSurface::Budgeted budgeted = SkSurface::kNo_Budgeted;
|
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(ctx, budgeted, info, 0));
|
| + surface->getCanvas()->drawColor(color);
|
| + return surface->newImageSnapshot();
|
| +}
|
| +
|
| +#include "SkBitmapCache.h"
|
| +
|
| +/*
|
| + * This tests the caching (and preemptive purge) of the raster equivalent of a gpu-image.
|
| + * We cache it for performance when drawing into a raster surface.
|
| + *
|
| + * A cleaner test would know if each drawImage call triggered a read-back from the gpu,
|
| + * but we don't have that facility (at the moment) so we use a little internal knowledge
|
| + * of *how* the raster version is cached, and look for that.
|
| + */
|
| +DEF_GPUTEST(SkImage_Gpu2Cpu, reporter, factory) {
|
| + GrContext* ctx = factory->get(GrContextFactory::kNative_GLContextType);
|
| + if (!ctx) {
|
| + REPORTER_ASSERT(reporter, false);
|
| + return;
|
| + }
|
| +
|
| + const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10);
|
| + SkAutoTUnref<SkImage> image(make_gpu_image(ctx, info, SK_ColorRED));
|
| + const uint32_t uniqueID = image->uniqueID();
|
| +
|
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info));
|
| +
|
| + // now we can test drawing a gpu-backed image into a cpu-backed surface
|
| +
|
| + {
|
| + SkBitmap cachedBitmap;
|
| + REPORTER_ASSERT(reporter, !SkBitmapCache::Find(uniqueID, &cachedBitmap));
|
| + }
|
| +
|
| + surface->getCanvas()->drawImage(image, 0, 0);
|
| + {
|
| + SkBitmap cachedBitmap;
|
| + if (SkBitmapCache::Find(uniqueID, &cachedBitmap)) {
|
| + REPORTER_ASSERT(reporter, cachedBitmap.getGenerationID() == uniqueID);
|
| + REPORTER_ASSERT(reporter, cachedBitmap.isImmutable());
|
| + REPORTER_ASSERT(reporter, cachedBitmap.getPixels());
|
| + } else {
|
| + // unexpected, but not really a bug, since the cache is global and this test may be
|
| + // run w/ other threads competing for its budget.
|
| + SkDebugf("SkImage_Gpu2Cpu : cachedBitmap was already purged\n");
|
| + }
|
| + }
|
| +
|
| + image.reset(nullptr);
|
| + {
|
| + SkBitmap cachedBitmap;
|
| + REPORTER_ASSERT(reporter, !SkBitmapCache::Find(uniqueID, &cachedBitmap));
|
| + }
|
| +}
|
| +#endif
|
|
|