| Index: tests/GpuLayerCacheTest.cpp
|
| diff --git a/tests/GpuLayerCacheTest.cpp b/tests/GpuLayerCacheTest.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d6371e1657b84c36751b5d52f9200ab1dd3a9ca5
|
| --- /dev/null
|
| +++ b/tests/GpuLayerCacheTest.cpp
|
| @@ -0,0 +1,137 @@
|
| +/*
|
| +* Copyright 2014 Google Inc.
|
| +*
|
| +* Use of this source code is governed by a BSD-style license that can be
|
| +* found in the LICENSE file.
|
| +*/
|
| +
|
| +#if SK_SUPPORT_GPU
|
| +
|
| +#include "GrContext.h"
|
| +#include "GrContextFactory.h"
|
| +#include "GrLayerCache.h"
|
| +#include "Test.h"
|
| +
|
| +static const int kNumLayers = 5;
|
| +
|
| +class GetNumLayers {
|
| +public:
|
| + static int NumLayers(GrLayerCache* cache) {
|
| + return cache->numLayers();
|
| + }
|
| +};
|
| +
|
| +// Add several layers to the cache
|
| +static void create_layers(skiatest::Reporter* reporter,
|
| + GrLayerCache* cache,
|
| + const SkPicture& picture) {
|
| + GrCachedLayer* layers[kNumLayers];
|
| +
|
| + for (int i = 0; i < kNumLayers; ++i) {
|
| + layers[i] = cache->findLayerOrCreate(&picture, i);
|
| + REPORTER_ASSERT(reporter, NULL != layers[i]);
|
| + GrCachedLayer* layer = cache->findLayer(&picture, i);
|
| + REPORTER_ASSERT(reporter, layer == layers[i]);
|
| +
|
| + REPORTER_ASSERT(reporter, GetNumLayers::NumLayers(cache) == i+1);
|
| +
|
| + REPORTER_ASSERT(reporter, picture.uniqueID() == layers[i]->pictureID());
|
| + REPORTER_ASSERT(reporter, layers[i]->layerID() == i);
|
| + REPORTER_ASSERT(reporter, NULL == layers[i]->texture());
|
| + REPORTER_ASSERT(reporter, layers[i]->rect().isEmpty());
|
| + }
|
| +
|
| +}
|
| +
|
| +// This test case exercises the public API of the GrLayerCache class.
|
| +// In particular it checks its interaction with the resource cache (w.r.t.
|
| +// locking & unlocking textures).
|
| +// TODO: need to add checks on VRAM usage!
|
| +DEF_GPUTEST(GpuLayerCache, reporter, factory) {
|
| +
|
| + GrContext* context = factory->get(GrContextFactory::kNative_GLContextType);
|
| + if (NULL == context) {
|
| + return;
|
| + }
|
| +
|
| + SkPicture picture;
|
| +
|
| + GrLayerCache cache(context);
|
| +
|
| + create_layers(reporter, &cache, picture);
|
| +
|
| + // Lock the layers making them all 512x512
|
| + GrTextureDesc desc;
|
| + desc.fWidth = 512;
|
| + desc.fHeight = 512;
|
| + desc.fConfig = kSkia8888_GrPixelConfig;
|
| +
|
| + for (int i = 0; i < kNumLayers; ++i) {
|
| + GrCachedLayer* layer = cache.findLayer(&picture, i);
|
| + REPORTER_ASSERT(reporter, NULL != layer);
|
| +
|
| + bool foundInCache = cache.lock(layer, desc);
|
| + REPORTER_ASSERT(reporter, !foundInCache);
|
| + foundInCache = cache.lock(layer, desc);
|
| + REPORTER_ASSERT(reporter, foundInCache);
|
| +
|
| + REPORTER_ASSERT(reporter, NULL != layer->texture());
|
| +#if USE_ATLAS
|
| + // The first 4 layers should be in the atlas (and thus have non-empty
|
| + // rects)
|
| + if (i < 4) {
|
| + REPORTER_ASSERT(reporter, !layer->rect().isEmpty());
|
| + } else {
|
| +#endif
|
| + REPORTER_ASSERT(reporter, layer->rect().isEmpty());
|
| +#if USE_ATLAS
|
| + }
|
| +#endif
|
| + }
|
| +
|
| + // Unlock the textures
|
| + for (int i = 0; i < kNumLayers; ++i) {
|
| + GrCachedLayer* layer = cache.findLayer(&picture, i);
|
| + REPORTER_ASSERT(reporter, NULL != layer);
|
| +
|
| + cache.unlock(layer);
|
| + }
|
| +
|
| + for (int i = 0; i < kNumLayers; ++i) {
|
| + GrCachedLayer* layer = cache.findLayer(&picture, i);
|
| + REPORTER_ASSERT(reporter, NULL != layer);
|
| +
|
| +#if USE_ATLAS
|
| + // The first 4 layers should be in the atlas (and thus do not
|
| + // currently unlock). The final layer should be unlocked.
|
| + if (i < 4) {
|
| + REPORTER_ASSERT(reporter, NULL != layer->texture());
|
| + REPORTER_ASSERT(reporter, !layer->rect().isEmpty());
|
| + } else {
|
| +#endif
|
| + REPORTER_ASSERT(reporter, NULL == layer->texture());
|
| + REPORTER_ASSERT(reporter, layer->rect().isEmpty());
|
| +#if USE_ATLAS
|
| + }
|
| +#endif
|
| + }
|
| +
|
| + // Free them all SkGpuDevice-style. This will not free up the
|
| + // atlas' texture but will eliminate all the layers.
|
| + cache.purge(&picture);
|
| +
|
| + REPORTER_ASSERT(reporter, GetNumLayers::NumLayers(&cache) == 0);
|
| + // TODO: add VRAM/resource cache check here
|
| +#if 0
|
| + // Re-create the layers
|
| + create_layers(reporter, &cache, picture);
|
| +
|
| + // Free them again GrContext-style. This should free up everything.
|
| + cache.freeAll();
|
| +
|
| + REPORTER_ASSERT(reporter, GetNumLayers::NumLayers(&cache) == 0);
|
| + // TODO: add VRAM/resource cache check here
|
| +#endif
|
| +}
|
| +
|
| +#endif
|
|
|