| Index: tests/SurfaceTest.cpp
|
| ===================================================================
|
| --- tests/SurfaceTest.cpp (revision 10357)
|
| +++ tests/SurfaceTest.cpp (working copy)
|
| @@ -139,15 +139,48 @@
|
| // This test succeeds by not triggering an assertion.
|
| // The test verifies that the surface remains writable (usable) after
|
| // acquiring and releasing a snapshot without triggering a copy on write.
|
| - SkSurface* surface = createSurface(surfaceType, context);
|
| - SkAutoTUnref<SkSurface> aur_surface(surface);
|
| + SkAutoTUnref<SkSurface> surface(createSurface(surfaceType, context));
|
| SkCanvas* canvas = surface->getCanvas();
|
| canvas->clear(1);
|
| surface->newImageSnapshot()->unref(); // Create and destroy SkImage
|
| - canvas->clear(2);
|
| + canvas->clear(2); // Must not assert internally
|
| }
|
|
|
| #if SK_SUPPORT_GPU
|
| +static void Test_crbug263329(skiatest::Reporter* reporter,
|
| + GrContext* context) {
|
| + // This is a regression test for crbug.com/263329
|
| + // Bug was caused by onCopyOnWrite releasing the old surface texture
|
| + // back to the scratch texture pool even though the texture is used
|
| + // by and active SkImage_Gpu.
|
| + SkAutoTUnref<SkSurface> surface1(createSurface(kGpu_SurfaceType, context));
|
| + SkAutoTUnref<SkSurface> surface2(createSurface(kGpu_SurfaceType, context));
|
| + SkCanvas* canvas1 = surface1->getCanvas();
|
| + SkCanvas* canvas2 = surface2->getCanvas();
|
| + canvas1->clear(1);
|
| + SkAutoTUnref<SkImage> image1(surface1->newImageSnapshot());
|
| + // Trigger copy on write, new backing is a scratch texture
|
| + canvas1->clear(2);
|
| + SkAutoTUnref<SkImage> image2(surface1->newImageSnapshot());
|
| + // Trigger copy on write, old backing should not be returned to scratch
|
| + // pool because it is held by image2
|
| + canvas1->clear(3);
|
| +
|
| + canvas2->clear(4);
|
| + SkAutoTUnref<SkImage> image3(surface2->newImageSnapshot());
|
| + // Trigger copy on write on surface2. The new backing store should not
|
| + // be recycling a texture that is held by an existing image.
|
| + canvas2->clear(5);
|
| + SkAutoTUnref<SkImage> image4(surface2->newImageSnapshot());
|
| + REPORTER_ASSERT(reporter, image4->getTexture() != image3->getTexture());
|
| + // The following assertion checks crbug.com/263329
|
| + REPORTER_ASSERT(reporter, image4->getTexture() != image2->getTexture());
|
| + REPORTER_ASSERT(reporter, image4->getTexture() != image1->getTexture());
|
| + REPORTER_ASSERT(reporter, image3->getTexture() != image2->getTexture());
|
| + REPORTER_ASSERT(reporter, image3->getTexture() != image1->getTexture());
|
| + REPORTER_ASSERT(reporter, image2->getTexture() != image1->getTexture());
|
| +}
|
| +
|
| static void TestGetTexture(skiatest::Reporter* reporter,
|
| SurfaceType surfaceType,
|
| GrContext* context) {
|
| @@ -209,6 +242,7 @@
|
| TestGetTexture(reporter, kPicture_SurfaceType, NULL);
|
| if (NULL != factory) {
|
| GrContext* context = factory->get(GrContextFactory::kNative_GLContextType);
|
| + Test_crbug263329(reporter, context);
|
| TestSurfaceCopyOnWrite(reporter, kGpu_SurfaceType, context);
|
| TestSurfaceWritableAfterSnapshotRelease(reporter, kGpu_SurfaceType, context);
|
| TestSurfaceNoCanvas(reporter, kGpu_SurfaceType, context, SkSurface::kDiscard_ContentChangeMode);
|
|
|