| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #include "cc/resource_update_controller.h" | 7 #include "cc/resource_update_controller.h" |
| 8 | 8 |
| 9 #include "cc/single_thread_proxy.h" // For DebugScopedSetImplThread | 9 #include "cc/single_thread_proxy.h" // For DebugScopedSetImplThread |
| 10 #include "cc/test/fake_proxy.h" |
| 10 #include "cc/test/fake_web_compositor_output_surface.h" | 11 #include "cc/test/fake_web_compositor_output_surface.h" |
| 11 #include "cc/test/fake_web_graphics_context_3d.h" | 12 #include "cc/test/fake_web_graphics_context_3d.h" |
| 12 #include "cc/test/scheduler_test_common.h" | 13 #include "cc/test/scheduler_test_common.h" |
| 13 #include "cc/test/tiled_layer_test_common.h" | 14 #include "cc/test/tiled_layer_test_common.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 15 #include "third_party/khronos/GLES2/gl2ext.h" | 16 #include "third_party/khronos/GLES2/gl2ext.h" |
| 16 | 17 |
| 17 using namespace cc; | 18 using namespace cc; |
| 18 using namespace WebKit; | 19 using namespace WebKit; |
| 19 using namespace WebKitTests; | 20 using namespace WebKitTests; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 | 58 |
| 58 private: | 59 private: |
| 59 ResourceUpdateControllerTest* m_test; | 60 ResourceUpdateControllerTest* m_test; |
| 60 bool m_supportShallowFlush; | 61 bool m_supportShallowFlush; |
| 61 }; | 62 }; |
| 62 | 63 |
| 63 | 64 |
| 64 class ResourceUpdateControllerTest : public Test { | 65 class ResourceUpdateControllerTest : public Test { |
| 65 public: | 66 public: |
| 66 ResourceUpdateControllerTest() | 67 ResourceUpdateControllerTest() |
| 67 : m_queue(make_scoped_ptr(new ResourceUpdateQueue)) | 68 : m_proxy(scoped_ptr<Thread>(NULL)) |
| 68 , m_resourceManager(PrioritizedResourceManager::create(60*1024*1024, 102
4, Renderer::ContentPool)) | 69 , m_queue(make_scoped_ptr(new ResourceUpdateQueue)) |
| 70 , m_resourceManager(PrioritizedResourceManager::create(60*1024*1024, 102
4, Renderer::ContentPool, &m_proxy)) |
| 69 , m_fullUploadCountExpected(0) | 71 , m_fullUploadCountExpected(0) |
| 70 , m_partialCountExpected(0) | 72 , m_partialCountExpected(0) |
| 71 , m_totalUploadCountExpected(0) | 73 , m_totalUploadCountExpected(0) |
| 72 , m_maxUploadCountPerUpdate(0) | 74 , m_maxUploadCountPerUpdate(0) |
| 73 , m_numConsecutiveFlushes(0) | 75 , m_numConsecutiveFlushes(0) |
| 74 , m_numDanglingUploads(0) | 76 , m_numDanglingUploads(0) |
| 75 , m_numTotalUploads(0) | 77 , m_numTotalUploads(0) |
| 76 , m_numTotalFlushes(0) | 78 , m_numTotalFlushes(0) |
| 77 , m_queryResultsAvailable(0) | 79 , m_queryResultsAvailable(0) |
| 78 { | 80 { |
| 79 } | 81 } |
| 80 | 82 |
| 81 ~ResourceUpdateControllerTest() | 83 ~ResourceUpdateControllerTest() |
| 82 { | 84 { |
| 83 DebugScopedSetImplThreadAndMainThreadBlocked | 85 DebugScopedSetImplThreadAndMainThreadBlocked |
| 84 implThreadAndMainThreadBlocked; | 86 implThreadAndMainThreadBlocked(&m_proxy); |
| 85 m_resourceManager->clearAllMemory(m_resourceProvider.get()); | 87 m_resourceManager->clearAllMemory(m_resourceProvider.get()); |
| 86 } | 88 } |
| 87 | 89 |
| 88 public: | 90 public: |
| 89 void onFlush() | 91 void onFlush() |
| 90 { | 92 { |
| 91 // Check for back-to-back flushes. | 93 // Check for back-to-back flushes. |
| 92 EXPECT_EQ(0, m_numConsecutiveFlushes) << "Back-to-back flushes detected.
"; | 94 EXPECT_EQ(0, m_numConsecutiveFlushes) << "Back-to-back flushes detected.
"; |
| 93 | 95 |
| 94 m_numDanglingUploads = 0; | 96 m_numDanglingUploads = 0; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 m_bitmap.allocPixels(); | 128 m_bitmap.allocPixels(); |
| 127 | 129 |
| 128 for (int i = 0; i < 4; i++) { | 130 for (int i = 0; i < 4; i++) { |
| 129 m_textures[i] = PrioritizedResource::create( | 131 m_textures[i] = PrioritizedResource::create( |
| 130 m_resourceManager.get(), gfx::Size(300, 150), GL_RGBA); | 132 m_resourceManager.get(), gfx::Size(300, 150), GL_RGBA); |
| 131 m_textures[i]->setRequestPriority( | 133 m_textures[i]->setRequestPriority( |
| 132 PriorityCalculator::visiblePriority(true)); | 134 PriorityCalculator::visiblePriority(true)); |
| 133 } | 135 } |
| 134 m_resourceManager->prioritizeTextures(); | 136 m_resourceManager->prioritizeTextures(); |
| 135 | 137 |
| 136 DebugScopedSetImplThread implThread; | |
| 137 m_resourceProvider = ResourceProvider::create(m_context.get()); | 138 m_resourceProvider = ResourceProvider::create(m_context.get()); |
| 138 } | 139 } |
| 139 | 140 |
| 140 | 141 |
| 141 void appendFullUploadsOfIndexedTextureToUpdateQueue(int count, int textureIn
dex) | 142 void appendFullUploadsOfIndexedTextureToUpdateQueue(int count, int textureIn
dex) |
| 142 { | 143 { |
| 143 m_fullUploadCountExpected += count; | 144 m_fullUploadCountExpected += count; |
| 144 m_totalUploadCountExpected += count; | 145 m_totalUploadCountExpected += count; |
| 145 | 146 |
| 146 const gfx::Rect rect(0, 0, 300, 150); | 147 const gfx::Rect rect(0, 0, 300, 150); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 173 } | 174 } |
| 174 | 175 |
| 175 void setMaxUploadCountPerUpdate(int count) | 176 void setMaxUploadCountPerUpdate(int count) |
| 176 { | 177 { |
| 177 m_maxUploadCountPerUpdate = count; | 178 m_maxUploadCountPerUpdate = count; |
| 178 } | 179 } |
| 179 | 180 |
| 180 void updateTextures() | 181 void updateTextures() |
| 181 { | 182 { |
| 182 DebugScopedSetImplThreadAndMainThreadBlocked | 183 DebugScopedSetImplThreadAndMainThreadBlocked |
| 183 implThreadAndMainThreadBlocked; | 184 implThreadAndMainThreadBlocked(&m_proxy); |
| 184 scoped_ptr<ResourceUpdateController> updateController = | 185 scoped_ptr<ResourceUpdateController> updateController = |
| 185 ResourceUpdateController::create( | 186 ResourceUpdateController::create( |
| 186 NULL, | 187 NULL, |
| 187 Proxy::implThread(), | 188 m_proxy.implThread(), |
| 188 m_queue.Pass(), | 189 m_queue.Pass(), |
| 189 m_resourceProvider.get()); | 190 m_resourceProvider.get(), |
| 191 m_proxy.hasImplThread()); |
| 190 updateController->finalize(); | 192 updateController->finalize(); |
| 191 } | 193 } |
| 192 | 194 |
| 193 void makeQueryResultAvailable() | 195 void makeQueryResultAvailable() |
| 194 { | 196 { |
| 195 m_queryResultsAvailable++; | 197 m_queryResultsAvailable++; |
| 196 } | 198 } |
| 197 | 199 |
| 198 protected: | 200 protected: |
| 199 // Classes required to interact and test the ResourceUpdateController | 201 // Classes required to interact and test the ResourceUpdateController |
| 202 FakeProxy m_proxy; |
| 200 scoped_ptr<GraphicsContext> m_context; | 203 scoped_ptr<GraphicsContext> m_context; |
| 201 scoped_ptr<ResourceProvider> m_resourceProvider; | 204 scoped_ptr<ResourceProvider> m_resourceProvider; |
| 202 scoped_ptr<ResourceUpdateQueue> m_queue; | 205 scoped_ptr<ResourceUpdateQueue> m_queue; |
| 203 scoped_ptr<PrioritizedResource> m_textures[4]; | 206 scoped_ptr<PrioritizedResource> m_textures[4]; |
| 204 scoped_ptr<PrioritizedResourceManager> m_resourceManager; | 207 scoped_ptr<PrioritizedResourceManager> m_resourceManager; |
| 205 SkBitmap m_bitmap; | 208 SkBitmap m_bitmap; |
| 206 int m_queryResultsAvailable; | 209 int m_queryResultsAvailable; |
| 207 | 210 |
| 208 // Properties / expectations of this test | 211 // Properties / expectations of this test |
| 209 int m_fullUploadCountExpected; | 212 int m_fullUploadCountExpected; |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 | 360 |
| 358 void setNow(base::TimeTicks time) { m_now = time; } | 361 void setNow(base::TimeTicks time) { m_now = time; } |
| 359 virtual base::TimeTicks now() const OVERRIDE { return m_now; } | 362 virtual base::TimeTicks now() const OVERRIDE { return m_now; } |
| 360 void setUpdateMoreTexturesTime(base::TimeDelta time) { m_updateMoreTexturesT
ime = time; } | 363 void setUpdateMoreTexturesTime(base::TimeDelta time) { m_updateMoreTexturesT
ime = time; } |
| 361 virtual base::TimeDelta updateMoreTexturesTime() const OVERRIDE { return m_u
pdateMoreTexturesTime; } | 364 virtual base::TimeDelta updateMoreTexturesTime() const OVERRIDE { return m_u
pdateMoreTexturesTime; } |
| 362 void setUpdateMoreTexturesSize(size_t size) { m_updateMoreTexturesSize = siz
e; } | 365 void setUpdateMoreTexturesSize(size_t size) { m_updateMoreTexturesSize = siz
e; } |
| 363 virtual size_t updateMoreTexturesSize() const OVERRIDE { return m_updateMore
TexturesSize; } | 366 virtual size_t updateMoreTexturesSize() const OVERRIDE { return m_updateMore
TexturesSize; } |
| 364 | 367 |
| 365 protected: | 368 protected: |
| 366 FakeResourceUpdateController(cc::ResourceUpdateControllerClient* client, cc:
:Thread* thread, scoped_ptr<ResourceUpdateQueue> queue, ResourceProvider* resour
ceProvider) | 369 FakeResourceUpdateController(cc::ResourceUpdateControllerClient* client, cc:
:Thread* thread, scoped_ptr<ResourceUpdateQueue> queue, ResourceProvider* resour
ceProvider) |
| 367 : cc::ResourceUpdateController(client, thread, queue.Pass(), resourcePro
vider) | 370 : cc::ResourceUpdateController(client, thread, queue.Pass(), resourcePro
vider, false) |
| 368 , m_updateMoreTexturesSize(0) { } | 371 , m_updateMoreTexturesSize(0) { } |
| 369 | 372 |
| 370 base::TimeTicks m_now; | 373 base::TimeTicks m_now; |
| 371 base::TimeDelta m_updateMoreTexturesTime; | 374 base::TimeDelta m_updateMoreTexturesTime; |
| 372 size_t m_updateMoreTexturesSize; | 375 size_t m_updateMoreTexturesSize; |
| 373 }; | 376 }; |
| 374 | 377 |
| 375 static void runPendingTask(FakeThread* thread, FakeResourceUpdateController* con
troller) | 378 static void runPendingTask(FakeThread* thread, FakeResourceUpdateController* con
troller) |
| 376 { | 379 { |
| 377 EXPECT_TRUE(thread->hasPendingTask()); | 380 EXPECT_TRUE(thread->hasPendingTask()); |
| 378 controller->setNow(controller->now() + base::TimeDelta::FromMilliseconds(thr
ead->pendingDelayMs())); | 381 controller->setNow(controller->now() + base::TimeDelta::FromMilliseconds(thr
ead->pendingDelayMs())); |
| 379 thread->runPendingTask(); | 382 thread->runPendingTask(); |
| 380 } | 383 } |
| 381 | 384 |
| 382 TEST_F(ResourceUpdateControllerTest, UpdateMoreTextures) | 385 TEST_F(ResourceUpdateControllerTest, UpdateMoreTextures) |
| 383 { | 386 { |
| 384 FakeResourceUpdateControllerClient client; | 387 FakeResourceUpdateControllerClient client; |
| 385 FakeThread thread; | 388 FakeThread thread; |
| 386 | 389 |
| 387 setMaxUploadCountPerUpdate(1); | 390 setMaxUploadCountPerUpdate(1); |
| 388 appendFullUploadsToUpdateQueue(3); | 391 appendFullUploadsToUpdateQueue(3); |
| 389 appendPartialUploadsToUpdateQueue(0); | 392 appendPartialUploadsToUpdateQueue(0); |
| 390 | 393 |
| 391 DebugScopedSetImplThreadAndMainThreadBlocked | 394 DebugScopedSetImplThreadAndMainThreadBlocked |
| 392 implThreadAndMainThreadBlocked; | 395 implThreadAndMainThreadBlocked(&m_proxy); |
| 393 scoped_ptr<FakeResourceUpdateController> controller(FakeResourceUpdateContro
ller::create(&client, &thread, m_queue.Pass(), m_resourceProvider.get())); | 396 scoped_ptr<FakeResourceUpdateController> controller(FakeResourceUpdateContro
ller::create(&client, &thread, m_queue.Pass(), m_resourceProvider.get())); |
| 394 | 397 |
| 395 controller->setNow( | 398 controller->setNow( |
| 396 controller->now() + base::TimeDelta::FromMilliseconds(1)); | 399 controller->now() + base::TimeDelta::FromMilliseconds(1)); |
| 397 controller->setUpdateMoreTexturesTime( | 400 controller->setUpdateMoreTexturesTime( |
| 398 base::TimeDelta::FromMilliseconds(100)); | 401 base::TimeDelta::FromMilliseconds(100)); |
| 399 controller->setUpdateMoreTexturesSize(1); | 402 controller->setUpdateMoreTexturesSize(1); |
| 400 // Not enough time for any updates. | 403 // Not enough time for any updates. |
| 401 controller->performMoreUpdates( | 404 controller->performMoreUpdates( |
| 402 controller->now() + base::TimeDelta::FromMilliseconds(90)); | 405 controller->now() + base::TimeDelta::FromMilliseconds(90)); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 429 TEST_F(ResourceUpdateControllerTest, NoMoreUpdates) | 432 TEST_F(ResourceUpdateControllerTest, NoMoreUpdates) |
| 430 { | 433 { |
| 431 FakeResourceUpdateControllerClient client; | 434 FakeResourceUpdateControllerClient client; |
| 432 FakeThread thread; | 435 FakeThread thread; |
| 433 | 436 |
| 434 setMaxUploadCountPerUpdate(1); | 437 setMaxUploadCountPerUpdate(1); |
| 435 appendFullUploadsToUpdateQueue(2); | 438 appendFullUploadsToUpdateQueue(2); |
| 436 appendPartialUploadsToUpdateQueue(0); | 439 appendPartialUploadsToUpdateQueue(0); |
| 437 | 440 |
| 438 DebugScopedSetImplThreadAndMainThreadBlocked | 441 DebugScopedSetImplThreadAndMainThreadBlocked |
| 439 implThreadAndMainThreadBlocked; | 442 implThreadAndMainThreadBlocked(&m_proxy); |
| 440 scoped_ptr<FakeResourceUpdateController> controller(FakeResourceUpdateContro
ller::create(&client, &thread, m_queue.Pass(), m_resourceProvider.get())); | 443 scoped_ptr<FakeResourceUpdateController> controller(FakeResourceUpdateContro
ller::create(&client, &thread, m_queue.Pass(), m_resourceProvider.get())); |
| 441 | 444 |
| 442 controller->setNow( | 445 controller->setNow( |
| 443 controller->now() + base::TimeDelta::FromMilliseconds(1)); | 446 controller->now() + base::TimeDelta::FromMilliseconds(1)); |
| 444 controller->setUpdateMoreTexturesTime( | 447 controller->setUpdateMoreTexturesTime( |
| 445 base::TimeDelta::FromMilliseconds(100)); | 448 base::TimeDelta::FromMilliseconds(100)); |
| 446 controller->setUpdateMoreTexturesSize(1); | 449 controller->setUpdateMoreTexturesSize(1); |
| 447 // Enough time for 3 updates but only 2 necessary. | 450 // Enough time for 3 updates but only 2 necessary. |
| 448 controller->performMoreUpdates( | 451 controller->performMoreUpdates( |
| 449 controller->now() + base::TimeDelta::FromMilliseconds(310)); | 452 controller->now() + base::TimeDelta::FromMilliseconds(310)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 468 TEST_F(ResourceUpdateControllerTest, UpdatesCompleteInFiniteTime) | 471 TEST_F(ResourceUpdateControllerTest, UpdatesCompleteInFiniteTime) |
| 469 { | 472 { |
| 470 FakeResourceUpdateControllerClient client; | 473 FakeResourceUpdateControllerClient client; |
| 471 FakeThread thread; | 474 FakeThread thread; |
| 472 | 475 |
| 473 setMaxUploadCountPerUpdate(1); | 476 setMaxUploadCountPerUpdate(1); |
| 474 appendFullUploadsToUpdateQueue(2); | 477 appendFullUploadsToUpdateQueue(2); |
| 475 appendPartialUploadsToUpdateQueue(0); | 478 appendPartialUploadsToUpdateQueue(0); |
| 476 | 479 |
| 477 DebugScopedSetImplThreadAndMainThreadBlocked | 480 DebugScopedSetImplThreadAndMainThreadBlocked |
| 478 implThreadAndMainThreadBlocked; | 481 implThreadAndMainThreadBlocked(&m_proxy); |
| 479 scoped_ptr<FakeResourceUpdateController> controller(FakeResourceUpdateContro
ller::create(&client, &thread, m_queue.Pass(), m_resourceProvider.get())); | 482 scoped_ptr<FakeResourceUpdateController> controller(FakeResourceUpdateContro
ller::create(&client, &thread, m_queue.Pass(), m_resourceProvider.get())); |
| 480 | 483 |
| 481 controller->setNow( | 484 controller->setNow( |
| 482 controller->now() + base::TimeDelta::FromMilliseconds(1)); | 485 controller->now() + base::TimeDelta::FromMilliseconds(1)); |
| 483 controller->setUpdateMoreTexturesTime( | 486 controller->setUpdateMoreTexturesTime( |
| 484 base::TimeDelta::FromMilliseconds(500)); | 487 base::TimeDelta::FromMilliseconds(500)); |
| 485 controller->setUpdateMoreTexturesSize(1); | 488 controller->setUpdateMoreTexturesSize(1); |
| 486 | 489 |
| 487 for (int i = 0; i < 100; i++) { | 490 for (int i = 0; i < 100; i++) { |
| 488 if (client.readyToFinalizeCalled()) | 491 if (client.readyToFinalizeCalled()) |
| 489 break; | 492 break; |
| 490 | 493 |
| 491 // Not enough time for any updates. | 494 // Not enough time for any updates. |
| 492 controller->performMoreUpdates( | 495 controller->performMoreUpdates( |
| 493 controller->now() + base::TimeDelta::FromMilliseconds(400)); | 496 controller->now() + base::TimeDelta::FromMilliseconds(400)); |
| 494 | 497 |
| 495 if (thread.hasPendingTask()) | 498 if (thread.hasPendingTask()) |
| 496 runPendingTask(&thread, controller.get()); | 499 runPendingTask(&thread, controller.get()); |
| 497 } | 500 } |
| 498 | 501 |
| 499 EXPECT_FALSE(thread.hasPendingTask()); | 502 EXPECT_FALSE(thread.hasPendingTask()); |
| 500 EXPECT_TRUE(client.readyToFinalizeCalled()); | 503 EXPECT_TRUE(client.readyToFinalizeCalled()); |
| 501 EXPECT_EQ(2, m_numTotalUploads); | 504 EXPECT_EQ(2, m_numTotalUploads); |
| 502 } | 505 } |
| 503 | 506 |
| 504 } // anonymous namespace | 507 } // anonymous namespace |
| OLD | NEW |