| 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 |