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 "cc/output/begin_frame_args.h" | 7 #include "cc/output/begin_frame_args.h" |
8 #include "cc/test/failure_output_surface.h" | 8 #include "cc/test/failure_output_surface.h" |
9 #include "cc/trees/layer_tree_host.h" | 9 #include "cc/trees/layer_tree_host.h" |
10 #include "content/public/test/mock_render_thread.h" | 10 #include "content/public/test/mock_render_thread.h" |
11 #include "content/renderer/render_widget.h" | 11 #include "content/renderer/render_widget.h" |
| 12 #include "content/renderer/scheduler/renderer_scheduler.h" |
| 13 #include "content/test/fake_compositor_dependencies.h" |
| 14 #include "content/test/fake_renderer_scheduler.h" |
12 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
14 #include "third_party/WebKit/public/platform/WebScreenInfo.h" | 17 #include "third_party/WebKit/public/platform/WebScreenInfo.h" |
15 | 18 |
16 using testing::AllOf; | 19 using testing::AllOf; |
17 using testing::Field; | 20 using testing::Field; |
18 | 21 |
19 namespace content { | 22 namespace content { |
| 23 namespace { |
20 | 24 |
21 class MockWebWidget : public blink::WebWidget { | 25 class MockWebWidget : public blink::WebWidget { |
22 public: | 26 public: |
23 MOCK_METHOD1(beginFrame, void(const blink::WebBeginFrameArgs& args)); | 27 MOCK_METHOD1(beginFrame, void(const blink::WebBeginFrameArgs& args)); |
24 }; | 28 }; |
25 | 29 |
26 class TestRenderWidget : public RenderWidget { | 30 class TestRenderWidget : public RenderWidget { |
27 public: | 31 public: |
28 TestRenderWidget() | 32 TestRenderWidget() |
29 : RenderWidget(blink::WebPopupTypeNone, | 33 : RenderWidget(blink::WebPopupTypeNone, |
30 blink::WebScreenInfo(), | 34 blink::WebScreenInfo(), |
31 true, | 35 true, |
32 false, | 36 false, |
33 false) { | 37 false) { |
34 webwidget_ = &mock_webwidget_; | 38 webwidget_ = &mock_webwidget_; |
35 } | 39 } |
36 | 40 |
37 MockWebWidget mock_webwidget_; | 41 MockWebWidget mock_webwidget_; |
38 | 42 |
39 protected: | 43 protected: |
40 ~TestRenderWidget() override { webwidget_ = NULL; } | 44 ~TestRenderWidget() override { webwidget_ = NULL; } |
41 | 45 |
42 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget); | 46 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget); |
43 }; | 47 }; |
44 | 48 |
45 class RenderWidgetCompositorTest : public testing::Test { | 49 class RenderWidgetCompositorTest : public testing::Test { |
46 public: | 50 public: |
47 RenderWidgetCompositorTest() | 51 RenderWidgetCompositorTest() |
48 : render_widget_(make_scoped_refptr(new TestRenderWidget())), | 52 : render_widget_(make_scoped_refptr(new TestRenderWidget())), |
| 53 compositor_deps_(make_scoped_ptr(new FakeCompositorDependencies)), |
49 render_widget_compositor_( | 54 render_widget_compositor_( |
50 RenderWidgetCompositor::Create(render_widget_.get(), false)) {} | 55 RenderWidgetCompositor::Create(render_widget_.get(), |
| 56 compositor_deps_.get())) {} |
51 ~RenderWidgetCompositorTest() override {} | 57 ~RenderWidgetCompositorTest() override {} |
52 | 58 |
53 protected: | 59 protected: |
54 MockRenderThread render_thread_; | 60 MockRenderThread render_thread_; |
55 scoped_refptr<TestRenderWidget> render_widget_; | 61 scoped_refptr<TestRenderWidget> render_widget_; |
| 62 scoped_ptr<FakeCompositorDependencies> compositor_deps_; |
56 scoped_ptr<RenderWidgetCompositor> render_widget_compositor_; | 63 scoped_ptr<RenderWidgetCompositor> render_widget_compositor_; |
57 | 64 |
58 private: | 65 private: |
59 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorTest); | 66 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorTest); |
60 }; | 67 }; |
61 | 68 |
62 TEST_F(RenderWidgetCompositorTest, BeginMainFrame) { | 69 TEST_F(RenderWidgetCompositorTest, BeginMainFrame) { |
63 base::TimeTicks frame_time(base::TimeTicks() + | 70 base::TimeTicks frame_time(base::TimeTicks() + |
64 base::TimeDelta::FromSeconds(1)); | 71 base::TimeDelta::FromSeconds(1)); |
65 base::TimeTicks deadline(base::TimeTicks() + base::TimeDelta::FromSeconds(2)); | 72 base::TimeTicks deadline(base::TimeTicks() + base::TimeDelta::FromSeconds(2)); |
(...skipping 30 matching lines...) Expand all Loading... |
96 }; | 103 }; |
97 | 104 |
98 // Verify that failing to create an output surface will cause the compositor | 105 // Verify that failing to create an output surface will cause the compositor |
99 // to attempt to repeatedly create another output surface. After enough | 106 // to attempt to repeatedly create another output surface. After enough |
100 // failures, verify that it attempts to create a fallback output surface. | 107 // failures, verify that it attempts to create a fallback output surface. |
101 // The use null output surface parameter allows testing whether failures | 108 // The use null output surface parameter allows testing whether failures |
102 // from RenderWidget (couldn't create an output surface) vs failures from | 109 // from RenderWidget (couldn't create an output surface) vs failures from |
103 // the compositor (couldn't bind the output surface) are handled identically. | 110 // the compositor (couldn't bind the output surface) are handled identically. |
104 class RenderWidgetCompositorOutputSurface : public RenderWidgetCompositor { | 111 class RenderWidgetCompositorOutputSurface : public RenderWidgetCompositor { |
105 public: | 112 public: |
106 RenderWidgetCompositorOutputSurface(RenderWidget* widget, bool threaded) | 113 RenderWidgetCompositorOutputSurface(RenderWidget* widget, |
107 : RenderWidgetCompositor(widget, threaded), | 114 CompositorDependencies* compositor_deps) |
| 115 : RenderWidgetCompositor(widget, compositor_deps), |
108 num_failures_before_success_(0), | 116 num_failures_before_success_(0), |
109 expected_successes_(0), | 117 expected_successes_(0), |
110 expected_fallback_successes_(0), | 118 expected_fallback_successes_(0), |
111 expected_requests_(0), | 119 expected_requests_(0), |
112 num_requests_(0), | 120 num_requests_(0), |
113 num_requests_since_last_success_(0), | 121 num_requests_since_last_success_(0), |
114 num_successes_(0), | 122 num_successes_(0), |
115 num_fallback_successes_(0), | 123 num_fallback_successes_(0), |
116 num_failures_(0), | 124 num_failures_(0), |
117 last_create_was_fallback_(false), | 125 last_create_was_fallback_(false), |
118 use_null_output_surface_(true) { | 126 use_null_output_surface_(true) {} |
119 cc::LayerTreeSettings settings; | 127 |
120 Initialize(settings); | 128 using RenderWidgetCompositor::Initialize; |
121 } | |
122 | 129 |
123 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) { | 130 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) { |
124 EXPECT_EQ(num_requests_since_last_success_ > | 131 EXPECT_EQ(num_requests_since_last_success_ > |
125 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 132 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
126 fallback); | 133 fallback); |
127 last_create_was_fallback_ = fallback; | 134 last_create_was_fallback_ = fallback; |
128 bool success = num_failures_ >= num_failures_before_success_; | 135 bool success = num_failures_ >= num_failures_before_success_; |
129 if (success) | 136 if (success) |
130 return cc::FakeOutputSurface::Create3d(); | 137 return cc::FakeOutputSurface::Create3d(); |
131 return use_null_output_surface_ | 138 return use_null_output_surface_ |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 bool last_create_was_fallback_; | 206 bool last_create_was_fallback_; |
200 bool use_null_output_surface_; | 207 bool use_null_output_surface_; |
201 | 208 |
202 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurface); | 209 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurface); |
203 }; | 210 }; |
204 | 211 |
205 class RenderWidgetCompositorOutputSurfaceTest : public testing::Test { | 212 class RenderWidgetCompositorOutputSurfaceTest : public testing::Test { |
206 public: | 213 public: |
207 RenderWidgetCompositorOutputSurfaceTest() | 214 RenderWidgetCompositorOutputSurfaceTest() |
208 : render_widget_(make_scoped_refptr(new RenderWidgetOutputSurface)), | 215 : render_widget_(make_scoped_refptr(new RenderWidgetOutputSurface)), |
| 216 compositor_deps_(make_scoped_ptr(new FakeCompositorDependencies)), |
209 render_widget_compositor_(make_scoped_ptr( | 217 render_widget_compositor_(make_scoped_ptr( |
210 new RenderWidgetCompositorOutputSurface(render_widget_.get(), | 218 new RenderWidgetCompositorOutputSurface(render_widget_.get(), |
211 false))) { | 219 compositor_deps_.get()))) { |
| 220 render_widget_compositor_->Initialize(); |
212 render_widget_->SetCompositor(render_widget_compositor_.get()); | 221 render_widget_->SetCompositor(render_widget_compositor_.get()); |
213 } | 222 } |
214 | 223 |
215 void RunTest(bool use_null_output_surface, | 224 void RunTest(bool use_null_output_surface, |
216 int num_failures_before_success, | 225 int num_failures_before_success, |
217 int expected_successes, | 226 int expected_successes, |
218 int expected_fallback_succeses) { | 227 int expected_fallback_succeses) { |
219 render_widget_compositor_->SetUp( | 228 render_widget_compositor_->SetUp( |
220 use_null_output_surface, num_failures_before_success, | 229 use_null_output_surface, num_failures_before_success, |
221 expected_successes, expected_fallback_succeses); | 230 expected_successes, expected_fallback_succeses); |
222 base::MessageLoop::current()->PostTask( | 231 base::MessageLoop::current()->PostTask( |
223 FROM_HERE, | 232 FROM_HERE, |
224 base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface, | 233 base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface, |
225 base::Unretained(render_widget_compositor_.get()))); | 234 base::Unretained(render_widget_compositor_.get()))); |
226 base::MessageLoop::current()->Run(); | 235 base::MessageLoop::current()->Run(); |
227 render_widget_compositor_->AfterTest(); | 236 render_widget_compositor_->AfterTest(); |
228 } | 237 } |
229 | 238 |
230 protected: | 239 protected: |
231 base::MessageLoop ye_olde_message_loope_; | 240 base::MessageLoop ye_olde_message_loope_; |
232 MockRenderThread render_thread_; | 241 MockRenderThread render_thread_; |
233 scoped_refptr<RenderWidgetOutputSurface> render_widget_; | 242 scoped_refptr<RenderWidgetOutputSurface> render_widget_; |
| 243 scoped_ptr<FakeCompositorDependencies> compositor_deps_; |
234 scoped_ptr<RenderWidgetCompositorOutputSurface> render_widget_compositor_; | 244 scoped_ptr<RenderWidgetCompositorOutputSurface> render_widget_compositor_; |
235 | 245 |
236 private: | 246 private: |
237 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurfaceTest); | 247 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurfaceTest); |
238 }; | 248 }; |
239 | 249 |
240 scoped_ptr<cc::OutputSurface> RenderWidgetOutputSurface::CreateOutputSurface( | 250 scoped_ptr<cc::OutputSurface> RenderWidgetOutputSurface::CreateOutputSurface( |
241 bool fallback) { | 251 bool fallback) { |
242 return compositor_->CreateOutputSurface(fallback); | 252 return compositor_->CreateOutputSurface(fallback); |
243 } | 253 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 288 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
279 0, 1); | 289 0, 1); |
280 } | 290 } |
281 | 291 |
282 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { | 292 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { |
283 // The first success is a fallback, but the next should not be a fallback. | 293 // The first success is a fallback, but the next should not be a fallback. |
284 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 294 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
285 1, 1); | 295 1, 1); |
286 } | 296 } |
287 | 297 |
| 298 } // namespace |
288 } // namespace content | 299 } // namespace content |
OLD | NEW |