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 <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
| 11 #include "base/memory/ptr_util.h" |
11 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
12 #include "base/thread_task_runner_handle.h" | 13 #include "base/thread_task_runner_handle.h" |
13 #include "cc/output/begin_frame_args.h" | 14 #include "cc/output/begin_frame_args.h" |
14 #include "cc/test/failure_output_surface.h" | 15 #include "cc/test/failure_output_surface.h" |
15 #include "cc/trees/layer_tree_host.h" | 16 #include "cc/trees/layer_tree_host.h" |
16 #include "components/scheduler/renderer/renderer_scheduler.h" | 17 #include "components/scheduler/renderer/renderer_scheduler.h" |
17 #include "content/public/test/mock_render_thread.h" | 18 #include "content/public/test/mock_render_thread.h" |
18 #include "content/renderer/render_widget.h" | 19 #include "content/renderer/render_widget.h" |
19 #include "content/test/fake_compositor_dependencies.h" | 20 #include "content/test/fake_compositor_dependencies.h" |
20 #include "content/test/fake_renderer_scheduler.h" | 21 #include "content/test/fake_renderer_scheduler.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 render_widget_(new TestRenderWidget(compositor_deps_.get())), | 65 render_widget_(new TestRenderWidget(compositor_deps_.get())), |
65 render_widget_compositor_(RenderWidgetCompositor::Create( | 66 render_widget_compositor_(RenderWidgetCompositor::Create( |
66 render_widget_.get(), | 67 render_widget_.get(), |
67 1.f /* initial_device_scale_factor */, | 68 1.f /* initial_device_scale_factor */, |
68 compositor_deps_.get())) {} | 69 compositor_deps_.get())) {} |
69 ~RenderWidgetCompositorTest() override {} | 70 ~RenderWidgetCompositorTest() override {} |
70 | 71 |
71 protected: | 72 protected: |
72 base::MessageLoop loop_; | 73 base::MessageLoop loop_; |
73 MockRenderThread render_thread_; | 74 MockRenderThread render_thread_; |
74 scoped_ptr<FakeCompositorDependencies> compositor_deps_; | 75 std::unique_ptr<FakeCompositorDependencies> compositor_deps_; |
75 scoped_refptr<TestRenderWidget> render_widget_; | 76 scoped_refptr<TestRenderWidget> render_widget_; |
76 scoped_ptr<RenderWidgetCompositor> render_widget_compositor_; | 77 std::unique_ptr<RenderWidgetCompositor> render_widget_compositor_; |
77 | 78 |
78 private: | 79 private: |
79 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorTest); | 80 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorTest); |
80 }; | 81 }; |
81 | 82 |
82 TEST_F(RenderWidgetCompositorTest, BeginMainFrame) { | 83 TEST_F(RenderWidgetCompositorTest, BeginMainFrame) { |
83 base::TimeTicks frame_time(base::TimeTicks() + | 84 base::TimeTicks frame_time(base::TimeTicks() + |
84 base::TimeDelta::FromSeconds(1)); | 85 base::TimeDelta::FromSeconds(1)); |
85 base::TimeTicks deadline(base::TimeTicks() + base::TimeDelta::FromSeconds(2)); | 86 base::TimeTicks deadline(base::TimeTicks() + base::TimeDelta::FromSeconds(2)); |
86 base::TimeDelta interval(base::TimeDelta::FromSeconds(3)); | 87 base::TimeDelta interval(base::TimeDelta::FromSeconds(3)); |
87 cc::BeginFrameArgs args( | 88 cc::BeginFrameArgs args( |
88 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, | 89 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
89 interval, cc::BeginFrameArgs::NORMAL)); | 90 interval, cc::BeginFrameArgs::NORMAL)); |
90 | 91 |
91 EXPECT_CALL(render_widget_->mock_webwidget_, beginFrame(1)); | 92 EXPECT_CALL(render_widget_->mock_webwidget_, beginFrame(1)); |
92 | 93 |
93 render_widget_compositor_->BeginMainFrame(args); | 94 render_widget_compositor_->BeginMainFrame(args); |
94 } | 95 } |
95 | 96 |
96 class RenderWidgetCompositorOutputSurface; | 97 class RenderWidgetCompositorOutputSurface; |
97 | 98 |
98 class RenderWidgetOutputSurface : public TestRenderWidget { | 99 class RenderWidgetOutputSurface : public TestRenderWidget { |
99 public: | 100 public: |
100 explicit RenderWidgetOutputSurface(CompositorDependencies* compositor_deps) | 101 explicit RenderWidgetOutputSurface(CompositorDependencies* compositor_deps) |
101 : TestRenderWidget(compositor_deps), compositor_(NULL) {} | 102 : TestRenderWidget(compositor_deps), compositor_(NULL) {} |
102 void SetCompositor(RenderWidgetCompositorOutputSurface* compositor); | 103 void SetCompositor(RenderWidgetCompositorOutputSurface* compositor); |
103 | 104 |
104 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) override; | 105 std::unique_ptr<cc::OutputSurface> CreateOutputSurface( |
| 106 bool fallback) override; |
105 | 107 |
106 protected: | 108 protected: |
107 ~RenderWidgetOutputSurface() override {} | 109 ~RenderWidgetOutputSurface() override {} |
108 | 110 |
109 private: | 111 private: |
110 RenderWidgetCompositorOutputSurface* compositor_; | 112 RenderWidgetCompositorOutputSurface* compositor_; |
111 | 113 |
112 DISALLOW_COPY_AND_ASSIGN(RenderWidgetOutputSurface); | 114 DISALLOW_COPY_AND_ASSIGN(RenderWidgetOutputSurface); |
113 }; | 115 }; |
114 | 116 |
(...skipping 15 matching lines...) Expand all Loading... |
130 num_requests_(0), | 132 num_requests_(0), |
131 num_requests_since_last_success_(0), | 133 num_requests_since_last_success_(0), |
132 num_successes_(0), | 134 num_successes_(0), |
133 num_fallback_successes_(0), | 135 num_fallback_successes_(0), |
134 num_failures_(0), | 136 num_failures_(0), |
135 last_create_was_fallback_(false), | 137 last_create_was_fallback_(false), |
136 use_null_output_surface_(true) {} | 138 use_null_output_surface_(true) {} |
137 | 139 |
138 using RenderWidgetCompositor::Initialize; | 140 using RenderWidgetCompositor::Initialize; |
139 | 141 |
140 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) { | 142 std::unique_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) { |
141 EXPECT_EQ(num_requests_since_last_success_ > | 143 EXPECT_EQ(num_requests_since_last_success_ > |
142 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 144 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
143 fallback); | 145 fallback); |
144 last_create_was_fallback_ = fallback; | 146 last_create_was_fallback_ = fallback; |
145 bool success = num_failures_ >= num_failures_before_success_; | 147 bool success = num_failures_ >= num_failures_before_success_; |
146 if (success) { | 148 if (success) { |
147 scoped_ptr<cc::TestWebGraphicsContext3D> context = | 149 std::unique_ptr<cc::TestWebGraphicsContext3D> context = |
148 cc::TestWebGraphicsContext3D::Create(); | 150 cc::TestWebGraphicsContext3D::Create(); |
149 // Image support required for synchronous compositing. | 151 // Image support required for synchronous compositing. |
150 context->set_support_image(true); | 152 context->set_support_image(true); |
151 // Create delegating surface so that max_pending_frames = 1. | 153 // Create delegating surface so that max_pending_frames = 1. |
152 return cc::FakeOutputSurface::CreateDelegating3d(std::move(context)); | 154 return cc::FakeOutputSurface::CreateDelegating3d(std::move(context)); |
153 } | 155 } |
154 return use_null_output_surface_ | 156 return use_null_output_surface_ |
155 ? nullptr | 157 ? nullptr |
156 : make_scoped_ptr(new cc::FailureOutputSurface(true)); | 158 : base::WrapUnique(new cc::FailureOutputSurface(true)); |
157 } | 159 } |
158 | 160 |
159 // Force a new output surface to be created. | 161 // Force a new output surface to be created. |
160 void SynchronousComposite() { | 162 void SynchronousComposite() { |
161 layer_tree_host()->DidLoseOutputSurface(); | 163 layer_tree_host()->DidLoseOutputSurface(); |
162 | 164 |
163 base::TimeTicks some_time; | 165 base::TimeTicks some_time; |
164 layer_tree_host()->Composite(some_time); | 166 layer_tree_host()->Composite(some_time); |
165 } | 167 } |
166 | 168 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 FROM_HERE, | 263 FROM_HERE, |
262 base::Bind(&RenderWidgetCompositorOutputSurface::SynchronousComposite, | 264 base::Bind(&RenderWidgetCompositorOutputSurface::SynchronousComposite, |
263 base::Unretained(render_widget_compositor_.get()))); | 265 base::Unretained(render_widget_compositor_.get()))); |
264 base::MessageLoop::current()->Run(); | 266 base::MessageLoop::current()->Run(); |
265 render_widget_compositor_->AfterTest(); | 267 render_widget_compositor_->AfterTest(); |
266 } | 268 } |
267 | 269 |
268 protected: | 270 protected: |
269 base::MessageLoop ye_olde_message_loope_; | 271 base::MessageLoop ye_olde_message_loope_; |
270 MockRenderThread render_thread_; | 272 MockRenderThread render_thread_; |
271 scoped_ptr<FakeCompositorDependencies> compositor_deps_; | 273 std::unique_ptr<FakeCompositorDependencies> compositor_deps_; |
272 scoped_refptr<RenderWidgetOutputSurface> render_widget_; | 274 scoped_refptr<RenderWidgetOutputSurface> render_widget_; |
273 scoped_ptr<RenderWidgetCompositorOutputSurface> render_widget_compositor_; | 275 std::unique_ptr<RenderWidgetCompositorOutputSurface> |
| 276 render_widget_compositor_; |
274 | 277 |
275 private: | 278 private: |
276 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurfaceTest); | 279 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurfaceTest); |
277 }; | 280 }; |
278 | 281 |
279 scoped_ptr<cc::OutputSurface> RenderWidgetOutputSurface::CreateOutputSurface( | 282 std::unique_ptr<cc::OutputSurface> |
280 bool fallback) { | 283 RenderWidgetOutputSurface::CreateOutputSurface(bool fallback) { |
281 return compositor_->CreateOutputSurface(fallback); | 284 return compositor_->CreateOutputSurface(fallback); |
282 } | 285 } |
283 | 286 |
284 void RenderWidgetOutputSurface::SetCompositor( | 287 void RenderWidgetOutputSurface::SetCompositor( |
285 RenderWidgetCompositorOutputSurface* compositor) { | 288 RenderWidgetCompositorOutputSurface* compositor) { |
286 compositor_ = compositor; | 289 compositor_ = compositor; |
287 } | 290 } |
288 | 291 |
289 TEST_F(RenderWidgetCompositorOutputSurfaceTest, SucceedOnce) { | 292 TEST_F(RenderWidgetCompositorOutputSurfaceTest, SucceedOnce) { |
290 RunTest(false, 0, 1, 0); | 293 RunTest(false, 0, 1, 0); |
(...skipping 28 matching lines...) Expand all Loading... |
319 } | 322 } |
320 | 323 |
321 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { | 324 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { |
322 // The first success is a fallback, but the next should not be a fallback. | 325 // The first success is a fallback, but the next should not be a fallback. |
323 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 326 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
324 1, 1); | 327 1, 1); |
325 } | 328 } |
326 | 329 |
327 } // namespace | 330 } // namespace |
328 } // namespace content | 331 } // namespace content |
OLD | NEW |