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