aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/GpuLayerCacheTest.cpp
diff options
context:
space:
mode:
authorGravatar robertphillips <robertphillips@google.com>2014-10-10 11:38:29 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-10-10 11:38:29 -0700
commit7bb9ed756e8663afe68e1a5fc680d57f83a31fea (patch)
tree7c9eb9b8f282521f42aecb35b5623dbdff24dca2 /tests/GpuLayerCacheTest.cpp
parent294c32612d712eb56361ac5439271a91ae96862e (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.cpp15
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) {