OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/renderer/gpu/render_widget_compositor.h" | 5 #include "content/renderer/gpu/render_widget_compositor.h" |
6 | 6 |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/single_thread_task_runner.h" | 8 #include "base/single_thread_task_runner.h" |
9 #include "base/thread_task_runner_handle.h" | 9 #include "base/thread_task_runner_handle.h" |
10 #include "cc/output/begin_frame_args.h" | 10 #include "cc/output/begin_frame_args.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 namespace content { | 25 namespace content { |
26 namespace { | 26 namespace { |
27 | 27 |
28 class MockWebWidget : public blink::WebWidget { | 28 class MockWebWidget : public blink::WebWidget { |
29 public: | 29 public: |
30 MOCK_METHOD1(beginFrame, void(const blink::WebBeginFrameArgs& args)); | 30 MOCK_METHOD1(beginFrame, void(const blink::WebBeginFrameArgs& args)); |
31 }; | 31 }; |
32 | 32 |
33 class TestRenderWidget : public RenderWidget { | 33 class TestRenderWidget : public RenderWidget { |
34 public: | 34 public: |
35 TestRenderWidget() | 35 explicit TestRenderWidget(CompositorDependencies* compositor_deps) |
36 : RenderWidget(blink::WebPopupTypeNone, | 36 : RenderWidget(compositor_deps, |
| 37 blink::WebPopupTypeNone, |
37 blink::WebScreenInfo(), | 38 blink::WebScreenInfo(), |
38 true, | 39 true, |
39 false, | 40 false, |
40 false) { | 41 false) { |
41 webwidget_ = &mock_webwidget_; | 42 webwidget_ = &mock_webwidget_; |
42 } | 43 } |
43 | 44 |
44 MockWebWidget mock_webwidget_; | 45 MockWebWidget mock_webwidget_; |
45 | 46 |
46 protected: | 47 protected: |
47 ~TestRenderWidget() override { webwidget_ = NULL; } | 48 ~TestRenderWidget() override { webwidget_ = NULL; } |
48 | 49 |
49 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget); | 50 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget); |
50 }; | 51 }; |
51 | 52 |
52 class RenderWidgetCompositorTest : public testing::Test { | 53 class RenderWidgetCompositorTest : public testing::Test { |
53 public: | 54 public: |
54 RenderWidgetCompositorTest() | 55 RenderWidgetCompositorTest() |
55 : render_widget_(new TestRenderWidget()), | 56 : compositor_deps_(new FakeCompositorDependencies), |
56 compositor_deps_(new FakeCompositorDependencies), | 57 render_widget_(new TestRenderWidget(compositor_deps_.get())), |
57 render_widget_compositor_( | 58 render_widget_compositor_( |
58 RenderWidgetCompositor::Create(render_widget_.get(), | 59 RenderWidgetCompositor::Create(render_widget_.get(), |
59 compositor_deps_.get())) {} | 60 compositor_deps_.get())) {} |
60 ~RenderWidgetCompositorTest() override {} | 61 ~RenderWidgetCompositorTest() override {} |
61 | 62 |
62 protected: | 63 protected: |
63 base::MessageLoop loop_; | 64 base::MessageLoop loop_; |
64 MockRenderThread render_thread_; | 65 MockRenderThread render_thread_; |
| 66 scoped_ptr<FakeCompositorDependencies> compositor_deps_; |
65 scoped_refptr<TestRenderWidget> render_widget_; | 67 scoped_refptr<TestRenderWidget> render_widget_; |
66 scoped_ptr<FakeCompositorDependencies> compositor_deps_; | |
67 scoped_ptr<RenderWidgetCompositor> render_widget_compositor_; | 68 scoped_ptr<RenderWidgetCompositor> render_widget_compositor_; |
68 | 69 |
69 private: | 70 private: |
70 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorTest); | 71 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorTest); |
71 }; | 72 }; |
72 | 73 |
73 TEST_F(RenderWidgetCompositorTest, BeginMainFrame) { | 74 TEST_F(RenderWidgetCompositorTest, BeginMainFrame) { |
74 base::TimeTicks frame_time(base::TimeTicks() + | 75 base::TimeTicks frame_time(base::TimeTicks() + |
75 base::TimeDelta::FromSeconds(1)); | 76 base::TimeDelta::FromSeconds(1)); |
76 base::TimeTicks deadline(base::TimeTicks() + base::TimeDelta::FromSeconds(2)); | 77 base::TimeTicks deadline(base::TimeTicks() + base::TimeDelta::FromSeconds(2)); |
77 base::TimeDelta interval(base::TimeDelta::FromSeconds(3)); | 78 base::TimeDelta interval(base::TimeDelta::FromSeconds(3)); |
78 cc::BeginFrameArgs args( | 79 cc::BeginFrameArgs args( |
79 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, | 80 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
80 interval, cc::BeginFrameArgs::NORMAL)); | 81 interval, cc::BeginFrameArgs::NORMAL)); |
81 | 82 |
82 EXPECT_CALL(render_widget_->mock_webwidget_, | 83 EXPECT_CALL(render_widget_->mock_webwidget_, |
83 beginFrame(AllOf( | 84 beginFrame(AllOf( |
84 Field(&blink::WebBeginFrameArgs::lastFrameTimeMonotonic, 1), | 85 Field(&blink::WebBeginFrameArgs::lastFrameTimeMonotonic, 1), |
85 Field(&blink::WebBeginFrameArgs::deadline, 2), | 86 Field(&blink::WebBeginFrameArgs::deadline, 2), |
86 Field(&blink::WebBeginFrameArgs::interval, 3)))); | 87 Field(&blink::WebBeginFrameArgs::interval, 3)))); |
87 | 88 |
88 render_widget_compositor_->BeginMainFrame(args); | 89 render_widget_compositor_->BeginMainFrame(args); |
89 } | 90 } |
90 | 91 |
91 class RenderWidgetCompositorOutputSurface; | 92 class RenderWidgetCompositorOutputSurface; |
92 | 93 |
93 class RenderWidgetOutputSurface : public TestRenderWidget { | 94 class RenderWidgetOutputSurface : public TestRenderWidget { |
94 public: | 95 public: |
95 RenderWidgetOutputSurface() : compositor_(NULL) {} | 96 explicit RenderWidgetOutputSurface(CompositorDependencies* compositor_deps) |
| 97 : TestRenderWidget(compositor_deps), compositor_(NULL) {} |
96 void SetCompositor(RenderWidgetCompositorOutputSurface* compositor); | 98 void SetCompositor(RenderWidgetCompositorOutputSurface* compositor); |
97 | 99 |
98 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) override; | 100 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) override; |
99 | 101 |
100 protected: | 102 protected: |
101 ~RenderWidgetOutputSurface() override {} | 103 ~RenderWidgetOutputSurface() override {} |
102 | 104 |
103 private: | 105 private: |
104 RenderWidgetCompositorOutputSurface* compositor_; | 106 RenderWidgetCompositorOutputSurface* compositor_; |
105 | 107 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 int num_failures_; | 229 int num_failures_; |
228 bool last_create_was_fallback_; | 230 bool last_create_was_fallback_; |
229 bool use_null_output_surface_; | 231 bool use_null_output_surface_; |
230 | 232 |
231 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurface); | 233 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurface); |
232 }; | 234 }; |
233 | 235 |
234 class RenderWidgetCompositorOutputSurfaceTest : public testing::Test { | 236 class RenderWidgetCompositorOutputSurfaceTest : public testing::Test { |
235 public: | 237 public: |
236 RenderWidgetCompositorOutputSurfaceTest() | 238 RenderWidgetCompositorOutputSurfaceTest() |
237 : render_widget_(new RenderWidgetOutputSurface), | 239 : compositor_deps_(new FakeCompositorDependencies), |
238 compositor_deps_(new FakeCompositorDependencies) { | 240 render_widget_(new RenderWidgetOutputSurface(compositor_deps_.get())) { |
239 render_widget_compositor_.reset(new RenderWidgetCompositorOutputSurface( | 241 render_widget_compositor_.reset(new RenderWidgetCompositorOutputSurface( |
240 render_widget_.get(), compositor_deps_.get())); | 242 render_widget_.get(), compositor_deps_.get())); |
241 render_widget_compositor_->Initialize(); | 243 render_widget_compositor_->Initialize(); |
242 render_widget_->SetCompositor(render_widget_compositor_.get()); | 244 render_widget_->SetCompositor(render_widget_compositor_.get()); |
243 } | 245 } |
244 | 246 |
245 void RunTest(bool use_null_output_surface, | 247 void RunTest(bool use_null_output_surface, |
246 int num_failures_before_success, | 248 int num_failures_before_success, |
247 int expected_successes, | 249 int expected_successes, |
248 int expected_fallback_succeses) { | 250 int expected_fallback_succeses) { |
249 render_widget_compositor_->SetUp( | 251 render_widget_compositor_->SetUp( |
250 use_null_output_surface, num_failures_before_success, | 252 use_null_output_surface, num_failures_before_success, |
251 expected_successes, expected_fallback_succeses); | 253 expected_successes, expected_fallback_succeses); |
252 render_widget_compositor_->StartCompositor(); | 254 render_widget_compositor_->StartCompositor(); |
253 base::ThreadTaskRunnerHandle::Get()->PostTask( | 255 base::ThreadTaskRunnerHandle::Get()->PostTask( |
254 FROM_HERE, | 256 FROM_HERE, |
255 base::Bind(&RenderWidgetCompositorOutputSurface::SynchronousComposite, | 257 base::Bind(&RenderWidgetCompositorOutputSurface::SynchronousComposite, |
256 base::Unretained(render_widget_compositor_.get()))); | 258 base::Unretained(render_widget_compositor_.get()))); |
257 base::MessageLoop::current()->Run(); | 259 base::MessageLoop::current()->Run(); |
258 render_widget_compositor_->AfterTest(); | 260 render_widget_compositor_->AfterTest(); |
259 } | 261 } |
260 | 262 |
261 protected: | 263 protected: |
262 base::MessageLoop ye_olde_message_loope_; | 264 base::MessageLoop ye_olde_message_loope_; |
263 MockRenderThread render_thread_; | 265 MockRenderThread render_thread_; |
| 266 scoped_ptr<FakeCompositorDependencies> compositor_deps_; |
264 scoped_refptr<RenderWidgetOutputSurface> render_widget_; | 267 scoped_refptr<RenderWidgetOutputSurface> render_widget_; |
265 scoped_ptr<FakeCompositorDependencies> compositor_deps_; | |
266 scoped_ptr<RenderWidgetCompositorOutputSurface> render_widget_compositor_; | 268 scoped_ptr<RenderWidgetCompositorOutputSurface> render_widget_compositor_; |
267 | 269 |
268 private: | 270 private: |
269 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurfaceTest); | 271 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurfaceTest); |
270 }; | 272 }; |
271 | 273 |
272 scoped_ptr<cc::OutputSurface> RenderWidgetOutputSurface::CreateOutputSurface( | 274 scoped_ptr<cc::OutputSurface> RenderWidgetOutputSurface::CreateOutputSurface( |
273 bool fallback) { | 275 bool fallback) { |
274 return compositor_->CreateOutputSurface(fallback); | 276 return compositor_->CreateOutputSurface(fallback); |
275 } | 277 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 } | 314 } |
313 | 315 |
314 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { | 316 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { |
315 // The first success is a fallback, but the next should not be a fallback. | 317 // The first success is a fallback, but the next should not be a fallback. |
316 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 318 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
317 1, 1); | 319 1, 1); |
318 } | 320 } |
319 | 321 |
320 } // namespace | 322 } // namespace |
321 } // namespace content | 323 } // namespace content |
OLD | NEW |