From 7bb9ed756e8663afe68e1a5fc680d57f83a31fea Mon Sep 17 00:00:00 2001 From: robertphillips Date: Fri, 10 Oct 2014 11:38:29 -0700 Subject: Fix bug in GrCachedLayer reuse In the new MultiPictureDraw tests a single hoisted layer is reused multiple times. The previous plot locking scheme allowed GrCachedLayer objects to be aggressively deleted prematurely leaving the reusing GrHoistedLayer objects with dangling pointers. This CL changes adds a new pseudo-ref to GrCachedLayer. (It can't be a real ref since the cached layers aren't deleted when it goes to 0). NOTRY=true Committed: https://skia.googlesource.com/skia/+/5c481666c9678f43e039ad605457be3854cf8de3 Review URL: https://codereview.chromium.org/640323002 --- tests/GpuLayerCacheTest.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'tests/GpuLayerCacheTest.cpp') diff --git a/tests/GpuLayerCacheTest.cpp b/tests/GpuLayerCacheTest.cpp index 9e07056421..f7b2d6ef3e 100644 --- a/tests/GpuLayerCacheTest.cpp +++ b/tests/GpuLayerCacheTest.cpp @@ -21,6 +21,9 @@ public: static void Purge(GrLayerCache* cache, uint32_t pictureID) { cache->purge(pictureID); } + static int Uses(GrCachedLayer* layer) { + return layer->uses(); + } }; // Add several layers to the cache @@ -70,6 +73,10 @@ static void lock_layer(skiatest::Reporter* reporter, REPORTER_ASSERT(reporter, layer->texture()); REPORTER_ASSERT(reporter, layer->locked()); + + cache->addUse(layer); + + REPORTER_ASSERT(reporter, 1 == TestingAccess::Uses(layer)); } // This test case exercises the public API of the GrLayerCache class. @@ -120,20 +127,22 @@ DEF_GPUTEST(GpuLayerCache, reporter, factory) { for (int i = 0; i < kInitialNumLayers; ++i) { GrCachedLayer* layer = cache.findLayer(picture->uniqueID(), i+1, SkMatrix::I()); REPORTER_ASSERT(reporter, layer); - cache.unlock(layer); + cache.removeUse(layer); } for (int i = 0; i < kInitialNumLayers; ++i) { GrCachedLayer* layer = cache.findLayer(picture->uniqueID(), i+1, SkMatrix::I()); REPORTER_ASSERT(reporter, layer); + // All the layers should be unlocked REPORTER_ASSERT(reporter, !layer->locked()); + // The first 4 layers should still be in the atlas. if (i < 4) { REPORTER_ASSERT(reporter, layer->texture()); REPORTER_ASSERT(reporter, layer->isAtlased()); } else { - // The final layer should be unlocked. + // The final layer should not be atlased. REPORTER_ASSERT(reporter, NULL == layer->texture()); REPORTER_ASSERT(reporter, !layer->isAtlased()); } @@ -148,7 +157,7 @@ DEF_GPUTEST(GpuLayerCache, reporter, factory) { REPORTER_ASSERT(reporter, layer); lock_layer(reporter, &cache, layer); - cache.unlock(layer); + cache.removeUse(layer); } for (int i = 0; i < kInitialNumLayers+1; ++i) { -- cgit v1.2.3