diff options
author | robertphillips <robertphillips@google.com> | 2014-10-10 11:38:29 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-10 11:38:29 -0700 |
commit | 7bb9ed756e8663afe68e1a5fc680d57f83a31fea (patch) | |
tree | 7c9eb9b8f282521f42aecb35b5623dbdff24dca2 /tests/GpuLayerCacheTest.cpp | |
parent | 294c32612d712eb56361ac5439271a91ae96862e (diff) |
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
Diffstat (limited to 'tests/GpuLayerCacheTest.cpp')
-rw-r--r-- | tests/GpuLayerCacheTest.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
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) { |