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