Index: cc/prioritized_resource_unittest.cc |
diff --git a/cc/prioritized_resource_unittest.cc b/cc/prioritized_resource_unittest.cc |
deleted file mode 100644 |
index 3c4a42e41fa30efc670c6b1e6bf424cc15c9a3d0..0000000000000000000000000000000000000000 |
--- a/cc/prioritized_resource_unittest.cc |
+++ /dev/null |
@@ -1,707 +0,0 @@ |
-// Copyright 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "cc/prioritized_resource.h" |
- |
-#include "cc/prioritized_resource_manager.h" |
-#include "cc/resource.h" |
-#include "cc/test/fake_output_surface.h" |
-#include "cc/test/fake_proxy.h" |
-#include "cc/test/tiled_layer_test_common.h" |
-#include "cc/trees/single_thread_proxy.h" // For DebugScopedSetImplThread |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace cc { |
- |
-class PrioritizedResourceTest : public testing::Test { |
-public: |
- PrioritizedResourceTest() |
- : m_proxy(scoped_ptr<Thread>(NULL)) |
- , m_textureSize(256, 256) |
- , m_textureFormat(GL_RGBA) |
- , m_outputSurface(createFakeOutputSurface()) |
- { |
- DebugScopedSetImplThread implThread(&m_proxy); |
- m_resourceProvider = ResourceProvider::Create(m_outputSurface.get()); |
- } |
- |
- virtual ~PrioritizedResourceTest() |
- { |
- DebugScopedSetImplThread implThread(&m_proxy); |
- m_resourceProvider.reset(); |
- } |
- |
- size_t texturesMemorySize(size_t textureCount) |
- { |
- return Resource::MemorySizeBytes(m_textureSize, m_textureFormat) * textureCount; |
- } |
- |
- scoped_ptr<PrioritizedResourceManager> createManager(size_t maxTextures) |
- { |
- scoped_ptr<PrioritizedResourceManager> manager = PrioritizedResourceManager::create(&m_proxy); |
- manager->setMaxMemoryLimitBytes(texturesMemorySize(maxTextures)); |
- return manager.Pass(); |
- } |
- |
- bool validateTexture(scoped_ptr<PrioritizedResource>& texture, bool requestLate) |
- { |
- resourceManagerAssertInvariants(texture->resourceManager()); |
- if (requestLate) |
- texture->requestLate(); |
- resourceManagerAssertInvariants(texture->resourceManager()); |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- bool success = texture->canAcquireBackingTexture(); |
- if (success) |
- texture->acquireBackingTexture(resourceProvider()); |
- return success; |
- } |
- |
- void prioritizeTexturesAndBackings(PrioritizedResourceManager* resourceManager) |
- { |
- resourceManager->prioritizeTextures(); |
- resourceManagerUpdateBackingsPriorities(resourceManager); |
- } |
- |
- void resourceManagerUpdateBackingsPriorities(PrioritizedResourceManager* resourceManager) |
- { |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->pushTexturePrioritiesToBackings(); |
- } |
- |
- ResourceProvider* resourceProvider() |
- { |
- return m_resourceProvider.get(); |
- } |
- |
- void resourceManagerAssertInvariants(PrioritizedResourceManager* resourceManager) |
- { |
-#ifndef NDEBUG |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->assertInvariants(); |
-#endif |
- } |
- |
- bool textureBackingIsAbovePriorityCutoff(PrioritizedResource* texture) |
- { |
- return texture->m_backing->wasAbovePriorityCutoffAtLastPriorityUpdate(); |
- } |
- |
- size_t evictedBackingCount(PrioritizedResourceManager* resourceManager) |
- { |
- return resourceManager->m_evictedBackings.size(); |
- } |
- |
-protected: |
- FakeProxy m_proxy; |
- const gfx::Size m_textureSize; |
- const GLenum m_textureFormat; |
- scoped_ptr<OutputSurface> m_outputSurface; |
- scoped_ptr<ResourceProvider> m_resourceProvider; |
-}; |
- |
-namespace { |
- |
-TEST_F(PrioritizedResourceTest, requestTextureExceedingMaxLimit) |
-{ |
- const size_t maxTextures = 8; |
- scoped_ptr<PrioritizedResourceManager> resourceManager = createManager(maxTextures); |
- |
- // Create textures for double our memory limit. |
- scoped_ptr<PrioritizedResource> textures[maxTextures*2]; |
- |
- for (size_t i = 0; i < maxTextures*2; ++i) |
- textures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- |
- // Set decreasing priorities |
- for (size_t i = 0; i < maxTextures*2; ++i) |
- textures[i]->setRequestPriority(100 + i); |
- |
- // Only lower half should be available. |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- EXPECT_TRUE(validateTexture(textures[0], false)); |
- EXPECT_TRUE(validateTexture(textures[7], false)); |
- EXPECT_FALSE(validateTexture(textures[8], false)); |
- EXPECT_FALSE(validateTexture(textures[15], false)); |
- |
- // Set increasing priorities |
- for (size_t i = 0; i < maxTextures*2; ++i) |
- textures[i]->setRequestPriority(100 - i); |
- |
- // Only upper half should be available. |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- EXPECT_FALSE(validateTexture(textures[0], false)); |
- EXPECT_FALSE(validateTexture(textures[7], false)); |
- EXPECT_TRUE(validateTexture(textures[8], false)); |
- EXPECT_TRUE(validateTexture(textures[15], false)); |
- |
- EXPECT_EQ(texturesMemorySize(maxTextures), resourceManager->memoryAboveCutoffBytes()); |
- EXPECT_LE(resourceManager->memoryUseBytes(), resourceManager->memoryAboveCutoffBytes()); |
- |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->clearAllMemory(resourceProvider()); |
-} |
- |
-TEST_F(PrioritizedResourceTest, changeMemoryLimits) |
-{ |
- const size_t maxTextures = 8; |
- scoped_ptr<PrioritizedResourceManager> resourceManager = createManager(maxTextures); |
- scoped_ptr<PrioritizedResource> textures[maxTextures]; |
- |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i]->setRequestPriority(100 + i); |
- |
- // Set max limit to 8 textures |
- resourceManager->setMaxMemoryLimitBytes(texturesMemorySize(8)); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- for (size_t i = 0; i < maxTextures; ++i) |
- validateTexture(textures[i], false); |
- { |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->reduceMemory(resourceProvider()); |
- } |
- |
- EXPECT_EQ(texturesMemorySize(8), resourceManager->memoryAboveCutoffBytes()); |
- EXPECT_LE(resourceManager->memoryUseBytes(), resourceManager->memoryAboveCutoffBytes()); |
- |
- // Set max limit to 5 textures |
- resourceManager->setMaxMemoryLimitBytes(texturesMemorySize(5)); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- for (size_t i = 0; i < maxTextures; ++i) |
- EXPECT_EQ(validateTexture(textures[i], false), i < 5); |
- { |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->reduceMemory(resourceProvider()); |
- } |
- |
- EXPECT_EQ(texturesMemorySize(5), resourceManager->memoryAboveCutoffBytes()); |
- EXPECT_LE(resourceManager->memoryUseBytes(), resourceManager->memoryAboveCutoffBytes()); |
- |
- // Set max limit to 4 textures |
- resourceManager->setMaxMemoryLimitBytes(texturesMemorySize(4)); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- for (size_t i = 0; i < maxTextures; ++i) |
- EXPECT_EQ(validateTexture(textures[i], false), i < 4); |
- { |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->reduceMemory(resourceProvider()); |
- } |
- |
- EXPECT_EQ(texturesMemorySize(4), resourceManager->memoryAboveCutoffBytes()); |
- EXPECT_LE(resourceManager->memoryUseBytes(), resourceManager->memoryAboveCutoffBytes()); |
- |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->clearAllMemory(resourceProvider()); |
-} |
- |
-TEST_F(PrioritizedResourceTest, changePriorityCutoff) |
-{ |
- const size_t maxTextures = 8; |
- scoped_ptr<PrioritizedResourceManager> resourceManager = createManager(maxTextures); |
- scoped_ptr<PrioritizedResource> textures[maxTextures]; |
- |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i]->setRequestPriority(100 + i); |
- |
- // Set the cutoff to drop two textures. Try to requestLate on all textures, and |
- // make sure that requestLate doesn't work on a texture with equal priority to |
- // the cutoff. |
- resourceManager->setMaxMemoryLimitBytes(texturesMemorySize(8)); |
- resourceManager->setExternalPriorityCutoff(106); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- for (size_t i = 0; i < maxTextures; ++i) |
- EXPECT_EQ(validateTexture(textures[i], true), i < 6); |
- { |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->reduceMemory(resourceProvider()); |
- } |
- EXPECT_EQ(texturesMemorySize(6), resourceManager->memoryAboveCutoffBytes()); |
- EXPECT_LE(resourceManager->memoryUseBytes(), resourceManager->memoryAboveCutoffBytes()); |
- |
- // Set the cutoff to drop two more textures. |
- resourceManager->setExternalPriorityCutoff(104); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- for (size_t i = 0; i < maxTextures; ++i) |
- EXPECT_EQ(validateTexture(textures[i], false), i < 4); |
- { |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->reduceMemory(resourceProvider()); |
- } |
- EXPECT_EQ(texturesMemorySize(4), resourceManager->memoryAboveCutoffBytes()); |
- |
- // Do a one-time eviction for one more texture based on priority cutoff |
- PrioritizedResourceManager::BackingList evictedBackings; |
- resourceManager->unlinkAndClearEvictedBackings(); |
- { |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->reduceMemoryOnImplThread(texturesMemorySize(8), 104, resourceProvider()); |
- EXPECT_EQ(0, evictedBackingCount(resourceManager.get())); |
- resourceManager->reduceMemoryOnImplThread(texturesMemorySize(8), 103, resourceProvider()); |
- EXPECT_EQ(1, evictedBackingCount(resourceManager.get())); |
- } |
- resourceManager->unlinkAndClearEvictedBackings(); |
- EXPECT_EQ(texturesMemorySize(3), resourceManager->memoryUseBytes()); |
- |
- // Re-allocate the the texture after the one-time drop. |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- for (size_t i = 0; i < maxTextures; ++i) |
- EXPECT_EQ(validateTexture(textures[i], false), i < 4); |
- { |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->reduceMemory(resourceProvider()); |
- } |
- EXPECT_EQ(texturesMemorySize(4), resourceManager->memoryAboveCutoffBytes()); |
- |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->clearAllMemory(resourceProvider()); |
-} |
- |
-TEST_F(PrioritizedResourceTest, resourceManagerPartialUpdateTextures) |
-{ |
- const size_t maxTextures = 4; |
- const size_t numTextures = 4; |
- scoped_ptr<PrioritizedResourceManager> resourceManager = createManager(maxTextures); |
- scoped_ptr<PrioritizedResource> textures[numTextures]; |
- scoped_ptr<PrioritizedResource> moreTextures[numTextures]; |
- |
- for (size_t i = 0; i < numTextures; ++i) { |
- textures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- moreTextures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- } |
- |
- for (size_t i = 0; i < numTextures; ++i) |
- textures[i]->setRequestPriority(200 + i); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- |
- // Allocate textures which are currently high priority. |
- EXPECT_TRUE(validateTexture(textures[0], false)); |
- EXPECT_TRUE(validateTexture(textures[1], false)); |
- EXPECT_TRUE(validateTexture(textures[2], false)); |
- EXPECT_TRUE(validateTexture(textures[3], false)); |
- |
- EXPECT_TRUE(textures[0]->haveBackingTexture()); |
- EXPECT_TRUE(textures[1]->haveBackingTexture()); |
- EXPECT_TRUE(textures[2]->haveBackingTexture()); |
- EXPECT_TRUE(textures[3]->haveBackingTexture()); |
- |
- for (size_t i = 0; i < numTextures; ++i) |
- moreTextures[i]->setRequestPriority(100 + i); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- |
- // Textures are now below cutoff. |
- EXPECT_FALSE(validateTexture(textures[0], false)); |
- EXPECT_FALSE(validateTexture(textures[1], false)); |
- EXPECT_FALSE(validateTexture(textures[2], false)); |
- EXPECT_FALSE(validateTexture(textures[3], false)); |
- |
- // But they are still valid to use. |
- EXPECT_TRUE(textures[0]->haveBackingTexture()); |
- EXPECT_TRUE(textures[1]->haveBackingTexture()); |
- EXPECT_TRUE(textures[2]->haveBackingTexture()); |
- EXPECT_TRUE(textures[3]->haveBackingTexture()); |
- |
- // Higher priority textures are finally needed. |
- EXPECT_TRUE(validateTexture(moreTextures[0], false)); |
- EXPECT_TRUE(validateTexture(moreTextures[1], false)); |
- EXPECT_TRUE(validateTexture(moreTextures[2], false)); |
- EXPECT_TRUE(validateTexture(moreTextures[3], false)); |
- |
- // Lower priority have been fully evicted. |
- EXPECT_FALSE(textures[0]->haveBackingTexture()); |
- EXPECT_FALSE(textures[1]->haveBackingTexture()); |
- EXPECT_FALSE(textures[2]->haveBackingTexture()); |
- EXPECT_FALSE(textures[3]->haveBackingTexture()); |
- |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->clearAllMemory(resourceProvider()); |
-} |
- |
-TEST_F(PrioritizedResourceTest, resourceManagerPrioritiesAreEqual) |
-{ |
- const size_t maxTextures = 16; |
- scoped_ptr<PrioritizedResourceManager> resourceManager = createManager(maxTextures); |
- scoped_ptr<PrioritizedResource> textures[maxTextures]; |
- |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- |
- // All 16 textures have the same priority except 2 higher priority. |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i]->setRequestPriority(100); |
- textures[0]->setRequestPriority(99); |
- textures[1]->setRequestPriority(99); |
- |
- // Set max limit to 8 textures |
- resourceManager->setMaxMemoryLimitBytes(texturesMemorySize(8)); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- |
- // The two high priority textures should be available, others should not. |
- for (size_t i = 0; i < 2; ++i) |
- EXPECT_TRUE(validateTexture(textures[i], false)); |
- for (size_t i = 2; i < maxTextures; ++i) |
- EXPECT_FALSE(validateTexture(textures[i], false)); |
- EXPECT_EQ(texturesMemorySize(2), resourceManager->memoryAboveCutoffBytes()); |
- EXPECT_LE(resourceManager->memoryUseBytes(), resourceManager->memoryAboveCutoffBytes()); |
- |
- // Manually reserving textures should only succeed on the higher priority textures, |
- // and on remaining textures up to the memory limit. |
- for (size_t i = 0; i < 8; i++) |
- EXPECT_TRUE(validateTexture(textures[i], true)); |
- for (size_t i = 9; i < maxTextures; i++) |
- EXPECT_FALSE(validateTexture(textures[i], true)); |
- EXPECT_EQ(texturesMemorySize(8), resourceManager->memoryAboveCutoffBytes()); |
- EXPECT_LE(resourceManager->memoryUseBytes(), resourceManager->memoryAboveCutoffBytes()); |
- |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->clearAllMemory(resourceProvider()); |
-} |
- |
-TEST_F(PrioritizedResourceTest, resourceManagerDestroyedFirst) |
-{ |
- scoped_ptr<PrioritizedResourceManager> resourceManager = createManager(1); |
- scoped_ptr<PrioritizedResource> texture = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- |
- // Texture is initially invalid, but it will become available. |
- EXPECT_FALSE(texture->haveBackingTexture()); |
- |
- texture->setRequestPriority(100); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- |
- EXPECT_TRUE(validateTexture(texture, false)); |
- EXPECT_TRUE(texture->canAcquireBackingTexture()); |
- EXPECT_TRUE(texture->haveBackingTexture()); |
- |
- { |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->clearAllMemory(resourceProvider()); |
- } |
- resourceManager.reset(); |
- |
- EXPECT_FALSE(texture->canAcquireBackingTexture()); |
- EXPECT_FALSE(texture->haveBackingTexture()); |
-} |
- |
-TEST_F(PrioritizedResourceTest, textureMovedToNewManager) |
-{ |
- scoped_ptr<PrioritizedResourceManager> resourceManagerOne = createManager(1); |
- scoped_ptr<PrioritizedResourceManager> resourceManagerTwo = createManager(1); |
- scoped_ptr<PrioritizedResource> texture = resourceManagerOne->createTexture(m_textureSize, m_textureFormat); |
- |
- // Texture is initially invalid, but it will become available. |
- EXPECT_FALSE(texture->haveBackingTexture()); |
- |
- texture->setRequestPriority(100); |
- prioritizeTexturesAndBackings(resourceManagerOne.get()); |
- |
- EXPECT_TRUE(validateTexture(texture, false)); |
- EXPECT_TRUE(texture->canAcquireBackingTexture()); |
- EXPECT_TRUE(texture->haveBackingTexture()); |
- |
- texture->setTextureManager(0); |
- |
- { |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManagerOne->clearAllMemory(resourceProvider()); |
- } |
- resourceManagerOne.reset(); |
- |
- EXPECT_FALSE(texture->canAcquireBackingTexture()); |
- EXPECT_FALSE(texture->haveBackingTexture()); |
- |
- texture->setTextureManager(resourceManagerTwo.get()); |
- |
- prioritizeTexturesAndBackings(resourceManagerTwo.get()); |
- |
- EXPECT_TRUE(validateTexture(texture, false)); |
- EXPECT_TRUE(texture->canAcquireBackingTexture()); |
- EXPECT_TRUE(texture->haveBackingTexture()); |
- |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManagerTwo->clearAllMemory(resourceProvider()); |
-} |
- |
-TEST_F(PrioritizedResourceTest, renderSurfacesReduceMemoryAvailableOutsideRootSurface) |
-{ |
- const size_t maxTextures = 8; |
- scoped_ptr<PrioritizedResourceManager> resourceManager = createManager(maxTextures); |
- |
- // Half of the memory is taken by surfaces (with high priority place-holder) |
- scoped_ptr<PrioritizedResource> renderSurfacePlaceHolder = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- renderSurfacePlaceHolder->setToSelfManagedMemoryPlaceholder(texturesMemorySize(4)); |
- renderSurfacePlaceHolder->setRequestPriority(PriorityCalculator::RenderSurfacePriority()); |
- |
- // Create textures to fill our memory limit. |
- scoped_ptr<PrioritizedResource> textures[maxTextures]; |
- |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- |
- // Set decreasing non-visible priorities outside root surface. |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i]->setRequestPriority(100 + i); |
- |
- // Only lower half should be available. |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- EXPECT_TRUE(validateTexture(textures[0], false)); |
- EXPECT_TRUE(validateTexture(textures[3], false)); |
- EXPECT_FALSE(validateTexture(textures[4], false)); |
- EXPECT_FALSE(validateTexture(textures[7], false)); |
- |
- // Set increasing non-visible priorities outside root surface. |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i]->setRequestPriority(100 - i); |
- |
- // Only upper half should be available. |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- EXPECT_FALSE(validateTexture(textures[0], false)); |
- EXPECT_FALSE(validateTexture(textures[3], false)); |
- EXPECT_TRUE(validateTexture(textures[4], false)); |
- EXPECT_TRUE(validateTexture(textures[7], false)); |
- |
- EXPECT_EQ(texturesMemorySize(4), resourceManager->memoryAboveCutoffBytes()); |
- EXPECT_EQ(texturesMemorySize(4), resourceManager->memoryForSelfManagedTextures()); |
- EXPECT_LE(resourceManager->memoryUseBytes(), resourceManager->memoryAboveCutoffBytes()); |
- |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->clearAllMemory(resourceProvider()); |
-} |
- |
-TEST_F(PrioritizedResourceTest, renderSurfacesReduceMemoryAvailableForRequestLate) |
-{ |
- const size_t maxTextures = 8; |
- scoped_ptr<PrioritizedResourceManager> resourceManager = createManager(maxTextures); |
- |
- // Half of the memory is taken by surfaces (with high priority place-holder) |
- scoped_ptr<PrioritizedResource> renderSurfacePlaceHolder = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- renderSurfacePlaceHolder->setToSelfManagedMemoryPlaceholder(texturesMemorySize(4)); |
- renderSurfacePlaceHolder->setRequestPriority(PriorityCalculator::RenderSurfacePriority()); |
- |
- // Create textures to fill our memory limit. |
- scoped_ptr<PrioritizedResource> textures[maxTextures]; |
- |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- |
- // Set equal priorities. |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i]->setRequestPriority(100); |
- |
- // The first four to be requested late will be available. |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- for (unsigned i = 0; i < maxTextures; ++i) |
- EXPECT_FALSE(validateTexture(textures[i], false)); |
- for (unsigned i = 0; i < maxTextures; i += 2) |
- EXPECT_TRUE(validateTexture(textures[i], true)); |
- for (unsigned i = 1; i < maxTextures; i += 2) |
- EXPECT_FALSE(validateTexture(textures[i], true)); |
- |
- EXPECT_EQ(texturesMemorySize(4), resourceManager->memoryAboveCutoffBytes()); |
- EXPECT_EQ(texturesMemorySize(4), resourceManager->memoryForSelfManagedTextures()); |
- EXPECT_LE(resourceManager->memoryUseBytes(), resourceManager->memoryAboveCutoffBytes()); |
- |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->clearAllMemory(resourceProvider()); |
-} |
- |
-TEST_F(PrioritizedResourceTest, whenRenderSurfaceNotAvailableTexturesAlsoNotAvailable) |
-{ |
- const size_t maxTextures = 8; |
- scoped_ptr<PrioritizedResourceManager> resourceManager = createManager(maxTextures); |
- |
- // Half of the memory is taken by surfaces (with high priority place-holder) |
- scoped_ptr<PrioritizedResource> renderSurfacePlaceHolder = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- renderSurfacePlaceHolder->setToSelfManagedMemoryPlaceholder(texturesMemorySize(4)); |
- renderSurfacePlaceHolder->setRequestPriority(PriorityCalculator::RenderSurfacePriority()); |
- |
- // Create textures to fill our memory limit. |
- scoped_ptr<PrioritizedResource> textures[maxTextures]; |
- |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- |
- // Set 6 visible textures in the root surface, and 2 in a child surface. |
- for (size_t i = 0; i < 6; ++i) |
- textures[i]->setRequestPriority(PriorityCalculator::VisiblePriority(true)); |
- for (size_t i = 6; i < 8; ++i) |
- textures[i]->setRequestPriority(PriorityCalculator::VisiblePriority(false)); |
- |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- |
- // Unable to requestLate textures in the child surface. |
- EXPECT_FALSE(validateTexture(textures[6], true)); |
- EXPECT_FALSE(validateTexture(textures[7], true)); |
- |
- // Root surface textures are valid. |
- for (size_t i = 0; i < 6; ++i) |
- EXPECT_TRUE(validateTexture(textures[i], false)); |
- |
- EXPECT_EQ(texturesMemorySize(6), resourceManager->memoryAboveCutoffBytes()); |
- EXPECT_EQ(texturesMemorySize(2), resourceManager->memoryForSelfManagedTextures()); |
- EXPECT_LE(resourceManager->memoryUseBytes(), resourceManager->memoryAboveCutoffBytes()); |
- |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->clearAllMemory(resourceProvider()); |
-} |
- |
-TEST_F(PrioritizedResourceTest, requestLateBackingsSorting) |
-{ |
- const size_t maxTextures = 8; |
- scoped_ptr<PrioritizedResourceManager> resourceManager = createManager(maxTextures); |
- resourceManager->setMaxMemoryLimitBytes(texturesMemorySize(maxTextures)); |
- |
- // Create textures to fill our memory limit. |
- scoped_ptr<PrioritizedResource> textures[maxTextures]; |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- |
- // Set equal priorities, and allocate backings for all textures. |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i]->setRequestPriority(100); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- for (unsigned i = 0; i < maxTextures; ++i) |
- EXPECT_TRUE(validateTexture(textures[i], false)); |
- |
- // Drop the memory limit and prioritize (none will be above the threshold, |
- // but they still have backings because reduceMemory hasn't been called). |
- resourceManager->setMaxMemoryLimitBytes(texturesMemorySize(maxTextures / 2)); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- |
- // Push half of them back over the limit. |
- for (size_t i = 0; i < maxTextures; i += 2) |
- EXPECT_TRUE(textures[i]->requestLate()); |
- |
- // Push the priorities to the backings array and sort the backings array |
- resourceManagerUpdateBackingsPriorities(resourceManager.get()); |
- |
- // Assert that the backings list be sorted with the below-limit backings |
- // before the above-limit backings. |
- resourceManagerAssertInvariants(resourceManager.get()); |
- |
- // Make sure that we have backings for all of the textures. |
- for (size_t i = 0; i < maxTextures; ++i) |
- EXPECT_TRUE(textures[i]->haveBackingTexture()); |
- |
- // Make sure that only the requestLate textures are above the priority cutoff |
- for (size_t i = 0; i < maxTextures; i += 2) |
- EXPECT_TRUE(textureBackingIsAbovePriorityCutoff(textures[i].get())); |
- for (size_t i = 1; i < maxTextures; i += 2) |
- EXPECT_FALSE(textureBackingIsAbovePriorityCutoff(textures[i].get())); |
- |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->clearAllMemory(resourceProvider()); |
-} |
- |
-TEST_F(PrioritizedResourceTest, clearUploadsToEvictedResources) |
-{ |
- const size_t maxTextures = 4; |
- scoped_ptr<PrioritizedResourceManager> resourceManager = |
- createManager(maxTextures); |
- resourceManager->setMaxMemoryLimitBytes(texturesMemorySize(maxTextures)); |
- |
- // Create textures to fill our memory limit. |
- scoped_ptr<PrioritizedResource> textures[maxTextures]; |
- |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- |
- // Set equal priorities, and allocate backings for all textures. |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i]->setRequestPriority(100); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- for (unsigned i = 0; i < maxTextures; ++i) |
- EXPECT_TRUE(validateTexture(textures[i], false)); |
- |
- ResourceUpdateQueue queue; |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- for (size_t i = 0; i < maxTextures; ++i) { |
- const ResourceUpdate upload = ResourceUpdate::Create( |
- textures[i].get(), NULL, gfx::Rect(), gfx::Rect(), gfx::Vector2d()); |
- queue.appendFullUpload(upload); |
- } |
- |
- // Make sure that we have backings for all of the textures. |
- for (size_t i = 0; i < maxTextures; ++i) |
- EXPECT_TRUE(textures[i]->haveBackingTexture()); |
- |
- queue.clearUploadsToEvictedResources(); |
- EXPECT_EQ(4, queue.fullUploadSize()); |
- |
- resourceManager->reduceMemoryOnImplThread( |
- texturesMemorySize(1), PriorityCalculator::AllowEverythingCutoff(), resourceProvider()); |
- queue.clearUploadsToEvictedResources(); |
- EXPECT_EQ(1, queue.fullUploadSize()); |
- |
- resourceManager->reduceMemoryOnImplThread(0, PriorityCalculator::AllowEverythingCutoff(), resourceProvider()); |
- queue.clearUploadsToEvictedResources(); |
- EXPECT_EQ(0, queue.fullUploadSize()); |
- |
-} |
- |
-TEST_F(PrioritizedResourceTest, usageStatistics) |
-{ |
- const size_t maxTextures = 5; |
- scoped_ptr<PrioritizedResourceManager> resourceManager = createManager(maxTextures); |
- scoped_ptr<PrioritizedResource> textures[maxTextures]; |
- |
- for (size_t i = 0; i < maxTextures; ++i) |
- textures[i] = resourceManager->createTexture(m_textureSize, m_textureFormat); |
- |
- textures[0]->setRequestPriority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1); |
- textures[1]->setRequestPriority(PriorityCalculator::AllowVisibleOnlyCutoff()); |
- textures[2]->setRequestPriority(PriorityCalculator::AllowVisibleAndNearbyCutoff() - 1); |
- textures[3]->setRequestPriority(PriorityCalculator::AllowVisibleAndNearbyCutoff()); |
- textures[4]->setRequestPriority(PriorityCalculator::AllowVisibleAndNearbyCutoff() + 1); |
- |
- // Set max limit to 2 textures. |
- resourceManager->setMaxMemoryLimitBytes(texturesMemorySize(2)); |
- prioritizeTexturesAndBackings(resourceManager.get()); |
- |
- // The first two textures should be available, others should not. |
- for (size_t i = 0; i < 2; ++i) |
- EXPECT_TRUE(validateTexture(textures[i], false)); |
- for (size_t i = 2; i < maxTextures; ++i) |
- EXPECT_FALSE(validateTexture(textures[i], false)); |
- |
- // Validate the statistics. |
- { |
- DebugScopedSetImplThread implThread(&m_proxy); |
- EXPECT_EQ(texturesMemorySize(2), resourceManager->memoryUseBytes()); |
- EXPECT_EQ(texturesMemorySize(1), resourceManager->memoryVisibleBytes()); |
- EXPECT_EQ(texturesMemorySize(3), resourceManager->memoryVisibleAndNearbyBytes()); |
- } |
- |
- // Re-prioritize the textures, but do not push the values to backings. |
- textures[0]->setRequestPriority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1); |
- textures[1]->setRequestPriority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1); |
- textures[2]->setRequestPriority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1); |
- textures[3]->setRequestPriority(PriorityCalculator::AllowVisibleAndNearbyCutoff() - 1); |
- textures[4]->setRequestPriority(PriorityCalculator::AllowVisibleAndNearbyCutoff()); |
- resourceManager->prioritizeTextures(); |
- |
- // Verify that we still see the old values. |
- { |
- DebugScopedSetImplThread implThread(&m_proxy); |
- EXPECT_EQ(texturesMemorySize(2), resourceManager->memoryUseBytes()); |
- EXPECT_EQ(texturesMemorySize(1), resourceManager->memoryVisibleBytes()); |
- EXPECT_EQ(texturesMemorySize(3), resourceManager->memoryVisibleAndNearbyBytes()); |
- } |
- |
- // Push priorities to backings, and verify we see the new values. |
- { |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->pushTexturePrioritiesToBackings(); |
- EXPECT_EQ(texturesMemorySize(2), resourceManager->memoryUseBytes()); |
- EXPECT_EQ(texturesMemorySize(3), resourceManager->memoryVisibleBytes()); |
- EXPECT_EQ(texturesMemorySize(4), resourceManager->memoryVisibleAndNearbyBytes()); |
- } |
- |
- DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked(&m_proxy); |
- resourceManager->clearAllMemory(resourceProvider()); |
-} |
- |
-} // namespace |
-} // namespace cc |