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/scheduler/begin_frame_source.h" |
8 #include "cc/test/failure_output_surface.h" | 9 #include "cc/test/failure_output_surface.h" |
| 10 #include "cc/test/test_gpu_memory_buffer_manager.h" |
| 11 #include "cc/test/test_shared_bitmap_manager.h" |
9 #include "cc/trees/layer_tree_host.h" | 12 #include "cc/trees/layer_tree_host.h" |
10 #include "content/public/test/mock_render_thread.h" | 13 #include "content/public/test/mock_render_thread.h" |
11 #include "content/renderer/render_widget.h" | 14 #include "content/renderer/render_widget.h" |
| 15 #include "content/renderer/scheduler/renderer_scheduler.h" |
12 #include "testing/gmock/include/gmock/gmock.h" | 16 #include "testing/gmock/include/gmock/gmock.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
14 #include "third_party/WebKit/public/platform/WebScreenInfo.h" | 18 #include "third_party/WebKit/public/platform/WebScreenInfo.h" |
15 | 19 |
16 using testing::AllOf; | 20 using testing::AllOf; |
17 using testing::Field; | 21 using testing::Field; |
18 | 22 |
19 namespace content { | 23 namespace content { |
| 24 namespace { |
20 | 25 |
21 class MockWebWidget : public blink::WebWidget { | 26 class MockWebWidget : public blink::WebWidget { |
22 public: | 27 public: |
23 MOCK_METHOD1(beginFrame, void(const blink::WebBeginFrameArgs& args)); | 28 MOCK_METHOD1(beginFrame, void(const blink::WebBeginFrameArgs& args)); |
24 }; | 29 }; |
25 | 30 |
26 class TestRenderWidget : public RenderWidget { | 31 class TestRenderWidget : public RenderWidget { |
27 public: | 32 public: |
28 TestRenderWidget() | 33 TestRenderWidget() |
29 : RenderWidget(blink::WebPopupTypeNone, | 34 : RenderWidget(blink::WebPopupTypeNone, |
30 blink::WebScreenInfo(), | 35 blink::WebScreenInfo(), |
31 true, | 36 true, |
32 false, | 37 false, |
33 false) { | 38 false) { |
34 webwidget_ = &mock_webwidget_; | 39 webwidget_ = &mock_webwidget_; |
35 } | 40 } |
36 | 41 |
37 MockWebWidget mock_webwidget_; | 42 MockWebWidget mock_webwidget_; |
38 | 43 |
39 protected: | 44 protected: |
40 ~TestRenderWidget() override { webwidget_ = NULL; } | 45 ~TestRenderWidget() override { webwidget_ = NULL; } |
41 | 46 |
42 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget); | 47 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget); |
43 }; | 48 }; |
44 | 49 |
| 50 class FakeRendererScheduler : public RendererScheduler { |
| 51 public: |
| 52 FakeRendererScheduler() {} |
| 53 virtual ~FakeRendererScheduler() {} |
| 54 |
| 55 // RendererScheduler implementation. |
| 56 scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner() override { |
| 57 return nullptr; |
| 58 } |
| 59 scoped_refptr<base::SingleThreadTaskRunner> CompositorTaskRunner() override { |
| 60 return nullptr; |
| 61 } |
| 62 scoped_refptr<SingleThreadIdleTaskRunner> IdleTaskRunner() override { |
| 63 return nullptr; |
| 64 } |
| 65 void WillBeginFrame(const cc::BeginFrameArgs& args) override {} |
| 66 void DidCommitFrameToCompositor() override {} |
| 67 void DidReceiveInputEventOnCompositorThread( |
| 68 blink::WebInputEvent::Type type) override {} |
| 69 void DidAnimateForInputOnCompositorThread() override {} |
| 70 bool ShouldYieldForHighPriorityWork() override { return false; } |
| 71 void Shutdown() override {} |
| 72 }; |
| 73 |
| 74 class FakeCompositorDependencies : public CompositorDependencies { |
| 75 public: |
| 76 // CompositorDependencies implementation. |
| 77 bool IsImplSidePaintingEnabled() override { return true; } |
| 78 bool IsGpuRasterizationForced() override { return false; } |
| 79 bool IsGpuRasterizationEnabled() override { return false; } |
| 80 bool IsLcdTextEnabled() override { return false; } |
| 81 bool IsDistanceFieldTextEnabled() override { return false; } |
| 82 bool IsZeroCopyEnabled() override { return false; } |
| 83 bool IsOneCopyEnabled() override { return true; } |
| 84 uint32 GetImageTextureTarget() override { return GL_TEXTURE_2D; } |
| 85 scoped_refptr<base::SingleThreadTaskRunner> |
| 86 GetCompositorMainThreadTaskRunner() override { |
| 87 return base::MessageLoopProxy::current(); |
| 88 } |
| 89 scoped_refptr<base::SingleThreadTaskRunner> |
| 90 GetCompositorImplThreadTaskRunner() override { |
| 91 return nullptr; // Currently never threaded compositing in unit tests. |
| 92 } |
| 93 cc::SharedBitmapManager* GetSharedBitmapManager() override { |
| 94 return &shared_bitmap_manager_; |
| 95 } |
| 96 gpu::GpuMemoryBufferManager* GetGpuMemoryBufferManager() override { |
| 97 return &gpu_memory_buffer_manager_; |
| 98 } |
| 99 RendererScheduler* GetRendererScheduler() override { |
| 100 return &renderer_scheduler_; |
| 101 } |
| 102 cc::ContextProvider* GetSharedMainThreadContextProvider() override { |
| 103 NOTREACHED(); |
| 104 return nullptr; |
| 105 } |
| 106 scoped_ptr<cc::BeginFrameSource> CreateExternalBeginFrameSource( |
| 107 int routing_id) override { |
| 108 NOTREACHED(); |
| 109 return nullptr; |
| 110 } |
| 111 |
| 112 private: |
| 113 cc::TestSharedBitmapManager shared_bitmap_manager_; |
| 114 cc::TestGpuMemoryBufferManager gpu_memory_buffer_manager_; |
| 115 FakeRendererScheduler renderer_scheduler_; |
| 116 }; |
| 117 |
45 class RenderWidgetCompositorTest : public testing::Test { | 118 class RenderWidgetCompositorTest : public testing::Test { |
46 public: | 119 public: |
47 RenderWidgetCompositorTest() | 120 RenderWidgetCompositorTest() |
48 : render_widget_(make_scoped_refptr(new TestRenderWidget())), | 121 : render_widget_(make_scoped_refptr(new TestRenderWidget())), |
| 122 compositor_deps_(make_scoped_ptr(new FakeCompositorDependencies)), |
49 render_widget_compositor_( | 123 render_widget_compositor_( |
50 RenderWidgetCompositor::Create(render_widget_.get(), false)) {} | 124 RenderWidgetCompositor::Create(render_widget_.get(), |
| 125 compositor_deps_.get())) {} |
51 ~RenderWidgetCompositorTest() override {} | 126 ~RenderWidgetCompositorTest() override {} |
52 | 127 |
53 protected: | 128 protected: |
54 MockRenderThread render_thread_; | 129 MockRenderThread render_thread_; |
55 scoped_refptr<TestRenderWidget> render_widget_; | 130 scoped_refptr<TestRenderWidget> render_widget_; |
| 131 scoped_ptr<FakeCompositorDependencies> compositor_deps_; |
56 scoped_ptr<RenderWidgetCompositor> render_widget_compositor_; | 132 scoped_ptr<RenderWidgetCompositor> render_widget_compositor_; |
57 | 133 |
58 private: | 134 private: |
59 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorTest); | 135 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorTest); |
60 }; | 136 }; |
61 | 137 |
62 TEST_F(RenderWidgetCompositorTest, BeginMainFrame) { | 138 TEST_F(RenderWidgetCompositorTest, BeginMainFrame) { |
63 base::TimeTicks frame_time(base::TimeTicks() + | 139 base::TimeTicks frame_time(base::TimeTicks() + |
64 base::TimeDelta::FromSeconds(1)); | 140 base::TimeDelta::FromSeconds(1)); |
65 base::TimeTicks deadline(base::TimeTicks() + base::TimeDelta::FromSeconds(2)); | 141 base::TimeTicks deadline(base::TimeTicks() + base::TimeDelta::FromSeconds(2)); |
(...skipping 30 matching lines...) Expand all Loading... |
96 }; | 172 }; |
97 | 173 |
98 // Verify that failing to create an output surface will cause the compositor | 174 // Verify that failing to create an output surface will cause the compositor |
99 // to attempt to repeatedly create another output surface. After enough | 175 // to attempt to repeatedly create another output surface. After enough |
100 // failures, verify that it attempts to create a fallback output surface. | 176 // failures, verify that it attempts to create a fallback output surface. |
101 // The use null output surface parameter allows testing whether failures | 177 // The use null output surface parameter allows testing whether failures |
102 // from RenderWidget (couldn't create an output surface) vs failures from | 178 // from RenderWidget (couldn't create an output surface) vs failures from |
103 // the compositor (couldn't bind the output surface) are handled identically. | 179 // the compositor (couldn't bind the output surface) are handled identically. |
104 class RenderWidgetCompositorOutputSurface : public RenderWidgetCompositor { | 180 class RenderWidgetCompositorOutputSurface : public RenderWidgetCompositor { |
105 public: | 181 public: |
106 RenderWidgetCompositorOutputSurface(RenderWidget* widget, bool threaded) | 182 RenderWidgetCompositorOutputSurface(RenderWidget* widget, |
107 : RenderWidgetCompositor(widget, threaded), | 183 CompositorDependencies* compositor_deps) |
| 184 : RenderWidgetCompositor(widget, compositor_deps), |
108 num_failures_before_success_(0), | 185 num_failures_before_success_(0), |
109 expected_successes_(0), | 186 expected_successes_(0), |
110 expected_fallback_successes_(0), | 187 expected_fallback_successes_(0), |
111 expected_requests_(0), | 188 expected_requests_(0), |
112 num_requests_(0), | 189 num_requests_(0), |
113 num_requests_since_last_success_(0), | 190 num_requests_since_last_success_(0), |
114 num_successes_(0), | 191 num_successes_(0), |
115 num_fallback_successes_(0), | 192 num_fallback_successes_(0), |
116 num_failures_(0), | 193 num_failures_(0), |
117 last_create_was_fallback_(false), | 194 last_create_was_fallback_(false), |
118 use_null_output_surface_(true) { | 195 use_null_output_surface_(true) {} |
119 cc::LayerTreeSettings settings; | 196 |
120 Initialize(settings); | 197 using RenderWidgetCompositor::Initialize; |
121 } | |
122 | 198 |
123 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) { | 199 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) { |
124 EXPECT_EQ(num_requests_since_last_success_ > | 200 EXPECT_EQ(num_requests_since_last_success_ > |
125 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 201 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
126 fallback); | 202 fallback); |
127 last_create_was_fallback_ = fallback; | 203 last_create_was_fallback_ = fallback; |
128 bool success = num_failures_ >= num_failures_before_success_; | 204 bool success = num_failures_ >= num_failures_before_success_; |
129 if (success) | 205 if (success) |
130 return cc::FakeOutputSurface::Create3d(); | 206 return cc::FakeOutputSurface::Create3d(); |
131 return use_null_output_surface_ | 207 return use_null_output_surface_ |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 bool last_create_was_fallback_; | 275 bool last_create_was_fallback_; |
200 bool use_null_output_surface_; | 276 bool use_null_output_surface_; |
201 | 277 |
202 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurface); | 278 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurface); |
203 }; | 279 }; |
204 | 280 |
205 class RenderWidgetCompositorOutputSurfaceTest : public testing::Test { | 281 class RenderWidgetCompositorOutputSurfaceTest : public testing::Test { |
206 public: | 282 public: |
207 RenderWidgetCompositorOutputSurfaceTest() | 283 RenderWidgetCompositorOutputSurfaceTest() |
208 : render_widget_(make_scoped_refptr(new RenderWidgetOutputSurface)), | 284 : render_widget_(make_scoped_refptr(new RenderWidgetOutputSurface)), |
| 285 compositor_deps_(make_scoped_ptr(new FakeCompositorDependencies)), |
209 render_widget_compositor_(make_scoped_ptr( | 286 render_widget_compositor_(make_scoped_ptr( |
210 new RenderWidgetCompositorOutputSurface(render_widget_.get(), | 287 new RenderWidgetCompositorOutputSurface(render_widget_.get(), |
211 false))) { | 288 compositor_deps_.get()))) { |
| 289 render_widget_compositor_->Initialize(); |
212 render_widget_->SetCompositor(render_widget_compositor_.get()); | 290 render_widget_->SetCompositor(render_widget_compositor_.get()); |
213 } | 291 } |
214 | 292 |
215 void RunTest(bool use_null_output_surface, | 293 void RunTest(bool use_null_output_surface, |
216 int num_failures_before_success, | 294 int num_failures_before_success, |
217 int expected_successes, | 295 int expected_successes, |
218 int expected_fallback_succeses) { | 296 int expected_fallback_succeses) { |
219 render_widget_compositor_->SetUp( | 297 render_widget_compositor_->SetUp( |
220 use_null_output_surface, num_failures_before_success, | 298 use_null_output_surface, num_failures_before_success, |
221 expected_successes, expected_fallback_succeses); | 299 expected_successes, expected_fallback_succeses); |
222 base::MessageLoop::current()->PostTask( | 300 base::MessageLoop::current()->PostTask( |
223 FROM_HERE, | 301 FROM_HERE, |
224 base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface, | 302 base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface, |
225 base::Unretained(render_widget_compositor_.get()))); | 303 base::Unretained(render_widget_compositor_.get()))); |
226 base::MessageLoop::current()->Run(); | 304 base::MessageLoop::current()->Run(); |
227 render_widget_compositor_->AfterTest(); | 305 render_widget_compositor_->AfterTest(); |
228 } | 306 } |
229 | 307 |
230 protected: | 308 protected: |
231 base::MessageLoop ye_olde_message_loope_; | 309 base::MessageLoop ye_olde_message_loope_; |
232 MockRenderThread render_thread_; | 310 MockRenderThread render_thread_; |
233 scoped_refptr<RenderWidgetOutputSurface> render_widget_; | 311 scoped_refptr<RenderWidgetOutputSurface> render_widget_; |
| 312 scoped_ptr<FakeCompositorDependencies> compositor_deps_; |
234 scoped_ptr<RenderWidgetCompositorOutputSurface> render_widget_compositor_; | 313 scoped_ptr<RenderWidgetCompositorOutputSurface> render_widget_compositor_; |
235 | 314 |
236 private: | 315 private: |
237 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurfaceTest); | 316 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurfaceTest); |
238 }; | 317 }; |
239 | 318 |
240 scoped_ptr<cc::OutputSurface> RenderWidgetOutputSurface::CreateOutputSurface( | 319 scoped_ptr<cc::OutputSurface> RenderWidgetOutputSurface::CreateOutputSurface( |
241 bool fallback) { | 320 bool fallback) { |
242 return compositor_->CreateOutputSurface(fallback); | 321 return compositor_->CreateOutputSurface(fallback); |
243 } | 322 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 357 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
279 0, 1); | 358 0, 1); |
280 } | 359 } |
281 | 360 |
282 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { | 361 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { |
283 // The first success is a fallback, but the next should not be a fallback. | 362 // The first success is a fallback, but the next should not be a fallback. |
284 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 363 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
285 1, 1); | 364 1, 1); |
286 } | 365 } |
287 | 366 |
| 367 } // namespace |
288 } // namespace content | 368 } // namespace content |
OLD | NEW |