OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "base/test/test_simple_task_runner.h" | 5 #include "base/test/test_simple_task_runner.h" |
6 #include "cc/output/managed_memory_policy.h" | 6 #include "cc/output/managed_memory_policy.h" |
7 #include "cc/output/output_surface.h" | 7 #include "cc/output/output_surface.h" |
8 #include "cc/output/output_surface_client.h" | 8 #include "cc/output/output_surface_client.h" |
9 #include "cc/output/software_output_device.h" | 9 #include "cc/output/software_output_device.h" |
10 #include "cc/test/scheduler_test_common.h" | 10 #include "cc/test/scheduler_test_common.h" |
11 #include "cc/test/test_web_graphics_context_3d.h" | 11 #include "cc/test/test_web_graphics_context_3d.h" |
12 #include "gpu/GLES2/gl2extchromium.h" | 12 #include "gpu/GLES2/gl2extchromium.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
14 | 14 |
15 using WebKit::WebGraphicsMemoryAllocation; | 15 using WebKit::WebGraphicsMemoryAllocation; |
16 | 16 |
17 namespace cc { | 17 namespace cc { |
18 namespace { | 18 namespace { |
19 | 19 |
20 class TestOutputSurface : public OutputSurface { | 20 class TestOutputSurface : public OutputSurface { |
21 public: | 21 public: |
22 explicit TestOutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D> context3d) | 22 explicit TestOutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D> context3d) |
23 : OutputSurface(context3d.Pass()) {} | 23 : OutputSurface(context3d.Pass()), |
| 24 retroactive_begin_frame_deadline_enabled_(false) {} |
24 | 25 |
25 explicit TestOutputSurface( | 26 explicit TestOutputSurface( |
26 scoped_ptr<cc::SoftwareOutputDevice> software_device) | 27 scoped_ptr<cc::SoftwareOutputDevice> software_device) |
27 : OutputSurface(software_device.Pass()) {} | 28 : OutputSurface(software_device.Pass()), |
| 29 retroactive_begin_frame_deadline_enabled_(false) {} |
28 | 30 |
29 TestOutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D> context3d, | 31 TestOutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D> context3d, |
30 scoped_ptr<cc::SoftwareOutputDevice> software_device) | 32 scoped_ptr<cc::SoftwareOutputDevice> software_device) |
31 : OutputSurface(context3d.Pass(), software_device.Pass()) {} | 33 : OutputSurface(context3d.Pass(), software_device.Pass()), |
| 34 retroactive_begin_frame_deadline_enabled_(false) {} |
32 | 35 |
33 bool InitializeNewContext3D( | 36 bool InitializeNewContext3D( |
34 scoped_ptr<WebKit::WebGraphicsContext3D> new_context3d) { | 37 scoped_ptr<WebKit::WebGraphicsContext3D> new_context3d) { |
35 return InitializeAndSetContext3D(new_context3d.Pass(), | 38 return InitializeAndSetContext3D(new_context3d.Pass(), |
36 scoped_refptr<ContextProvider>()); | 39 scoped_refptr<ContextProvider>()); |
37 } | 40 } |
38 | 41 |
39 bool HasClientForTesting() { | 42 bool HasClientForTesting() { |
40 return HasClient(); | 43 return HasClient(); |
41 } | 44 } |
(...skipping 12 matching lines...) Expand all Loading... |
54 } | 57 } |
55 | 58 |
56 int pending_swap_buffers() { | 59 int pending_swap_buffers() { |
57 return pending_swap_buffers_; | 60 return pending_swap_buffers_; |
58 } | 61 } |
59 | 62 |
60 void OnSwapBuffersCompleteForTesting() { | 63 void OnSwapBuffersCompleteForTesting() { |
61 OnSwapBuffersComplete(NULL); | 64 OnSwapBuffersComplete(NULL); |
62 } | 65 } |
63 | 66 |
64 void SetRetroactiveBeginFramePeriod(base::TimeDelta period) { | 67 void EnableRetroactiveBeginFrameDeadline(bool enable) { |
65 retroactive_begin_frame_period_ = period; | 68 retroactive_begin_frame_deadline_enabled_ = enable; |
66 } | 69 } |
67 | 70 |
68 protected: | 71 protected: |
69 virtual void PostCheckForRetroactiveBeginFrame() OVERRIDE { | 72 virtual void PostCheckForRetroactiveBeginFrame() OVERRIDE { |
70 // For testing purposes, we check immediately rather than posting a task. | 73 // For testing purposes, we check immediately rather than posting a task. |
71 CheckForRetroactiveBeginFrame(); | 74 CheckForRetroactiveBeginFrame(); |
72 } | 75 } |
73 | 76 |
74 virtual base::TimeDelta RetroactiveBeginFramePeriod() OVERRIDE { | 77 virtual base::TimeTicks RetroactiveBeginFrameDeadline() OVERRIDE { |
75 return retroactive_begin_frame_period_; | 78 if (retroactive_begin_frame_deadline_enabled_) |
| 79 return OutputSurface::RetroactiveBeginFrameDeadline(); |
| 80 return base::TimeTicks(); |
76 } | 81 } |
77 | 82 |
78 base::TimeDelta retroactive_begin_frame_period_; | 83 bool retroactive_begin_frame_deadline_enabled_; |
79 }; | 84 }; |
80 | 85 |
81 class FakeOutputSurfaceClient : public OutputSurfaceClient { | 86 class FakeOutputSurfaceClient : public OutputSurfaceClient { |
82 public: | 87 public: |
83 FakeOutputSurfaceClient() | 88 FakeOutputSurfaceClient() |
84 : begin_frame_count_(0), | 89 : begin_frame_count_(0), |
85 deferred_initialize_result_(true), | 90 deferred_initialize_result_(true), |
86 deferred_initialize_called_(false), | 91 deferred_initialize_called_(false), |
87 did_lose_output_surface_called_(false), | 92 did_lose_output_surface_called_(false), |
88 memory_policy_(0), | 93 memory_policy_(0), |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 bool throttle_frame_production = true; | 254 bool throttle_frame_production = true; |
250 const base::TimeDelta display_refresh_interval = | 255 const base::TimeDelta display_refresh_interval = |
251 BeginFrameArgs::DefaultInterval(); | 256 BeginFrameArgs::DefaultInterval(); |
252 | 257 |
253 output_surface.InitializeBeginFrameEmulation( | 258 output_surface.InitializeBeginFrameEmulation( |
254 task_runner.get(), | 259 task_runner.get(), |
255 throttle_frame_production, | 260 throttle_frame_production, |
256 display_refresh_interval); | 261 display_refresh_interval); |
257 | 262 |
258 output_surface.SetMaxFramesPending(2); | 263 output_surface.SetMaxFramesPending(2); |
259 output_surface.SetRetroactiveBeginFramePeriod( | 264 output_surface.EnableRetroactiveBeginFrameDeadline(false); |
260 base::TimeDelta::FromSeconds(-1)); | |
261 | 265 |
262 // We should start off with 0 BeginFrames | 266 // We should start off with 0 BeginFrames |
263 EXPECT_EQ(client.begin_frame_count(), 0); | 267 EXPECT_EQ(client.begin_frame_count(), 0); |
264 EXPECT_EQ(output_surface.pending_swap_buffers(), 0); | 268 EXPECT_EQ(output_surface.pending_swap_buffers(), 0); |
265 | 269 |
266 // We should not have a pending task until a BeginFrame has been requested. | 270 // We should not have a pending task until a BeginFrame has been requested. |
267 EXPECT_FALSE(task_runner->HasPendingTask()); | 271 EXPECT_FALSE(task_runner->HasPendingTask()); |
268 output_surface.SetNeedsBeginFrame(true); | 272 output_surface.SetNeedsBeginFrame(true); |
269 EXPECT_TRUE(task_runner->HasPendingTask()); | 273 EXPECT_TRUE(task_runner->HasPendingTask()); |
270 | 274 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 TestOutputSurface output_surface( | 328 TestOutputSurface output_surface( |
325 context3d.PassAs<WebKit::WebGraphicsContext3D>()); | 329 context3d.PassAs<WebKit::WebGraphicsContext3D>()); |
326 EXPECT_FALSE(output_surface.HasClientForTesting()); | 330 EXPECT_FALSE(output_surface.HasClientForTesting()); |
327 | 331 |
328 FakeOutputSurfaceClient client; | 332 FakeOutputSurfaceClient client; |
329 EXPECT_TRUE(output_surface.BindToClient(&client)); | 333 EXPECT_TRUE(output_surface.BindToClient(&client)); |
330 EXPECT_TRUE(output_surface.HasClientForTesting()); | 334 EXPECT_TRUE(output_surface.HasClientForTesting()); |
331 EXPECT_FALSE(client.deferred_initialize_called()); | 335 EXPECT_FALSE(client.deferred_initialize_called()); |
332 | 336 |
333 output_surface.SetMaxFramesPending(2); | 337 output_surface.SetMaxFramesPending(2); |
334 | 338 output_surface.EnableRetroactiveBeginFrameDeadline(true); |
335 // Enable retroactive BeginFrames. | |
336 output_surface.SetRetroactiveBeginFramePeriod( | |
337 base::TimeDelta::FromSeconds(100000)); | |
338 | 339 |
339 // Optimistically injected BeginFrames should be throttled if | 340 // Optimistically injected BeginFrames should be throttled if |
340 // SetNeedsBeginFrame is false... | 341 // SetNeedsBeginFrame is false... |
341 output_surface.SetNeedsBeginFrame(false); | 342 output_surface.SetNeedsBeginFrame(false); |
342 output_surface.BeginFrameForTesting(); | 343 output_surface.BeginFrameForTesting(); |
343 EXPECT_EQ(client.begin_frame_count(), 0); | 344 EXPECT_EQ(client.begin_frame_count(), 0); |
344 // ...and retroactively triggered by a SetNeedsBeginFrame. | 345 // ...and retroactively triggered by a SetNeedsBeginFrame. |
345 output_surface.SetNeedsBeginFrame(true); | 346 output_surface.SetNeedsBeginFrame(true); |
346 EXPECT_EQ(client.begin_frame_count(), 1); | 347 EXPECT_EQ(client.begin_frame_count(), 1); |
347 | 348 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 WebGraphicsMemoryAllocation::PriorityCutoffAllowVisibleAndNearby; | 412 WebGraphicsMemoryAllocation::PriorityCutoffAllowVisibleAndNearby; |
412 context->SetMemoryAllocation(allocation); | 413 context->SetMemoryAllocation(allocation); |
413 EXPECT_EQ(ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING, | 414 EXPECT_EQ(ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING, |
414 client.memory_policy().priority_cutoff_when_visible); | 415 client.memory_policy().priority_cutoff_when_visible); |
415 EXPECT_EQ(ManagedMemoryPolicy::CUTOFF_ALLOW_NICE_TO_HAVE, | 416 EXPECT_EQ(ManagedMemoryPolicy::CUTOFF_ALLOW_NICE_TO_HAVE, |
416 client.memory_policy().priority_cutoff_when_not_visible); | 417 client.memory_policy().priority_cutoff_when_not_visible); |
417 } | 418 } |
418 | 419 |
419 } // namespace | 420 } // namespace |
420 } // namespace cc | 421 } // namespace cc |
OLD | NEW |