Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(616)

Unified Diff: tests/GpuLayerCacheTest.cpp

Issue 354533004: Begin atlasing (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Readd missing file Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/image/SkSurface_Gpu.cpp ('k') | tools/render_pictures_main.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « src/image/SkSurface_Gpu.cpp ('k') | tools/render_pictures_main.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698