| 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" |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 use_null_output_surface_(true) {} | 126 use_null_output_surface_(true) {} |
| 127 | 127 |
| 128 using RenderWidgetCompositor::Initialize; | 128 using RenderWidgetCompositor::Initialize; |
| 129 | 129 |
| 130 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) { | 130 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) { |
| 131 EXPECT_EQ(num_requests_since_last_success_ > | 131 EXPECT_EQ(num_requests_since_last_success_ > |
| 132 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 132 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
| 133 fallback); | 133 fallback); |
| 134 last_create_was_fallback_ = fallback; | 134 last_create_was_fallback_ = fallback; |
| 135 bool success = num_failures_ >= num_failures_before_success_; | 135 bool success = num_failures_ >= num_failures_before_success_; |
| 136 if (success) | 136 if (success) { |
| 137 return cc::FakeOutputSurface::Create3d(); | 137 scoped_ptr<cc::TestWebGraphicsContext3D> context = |
| 138 cc::TestWebGraphicsContext3D::Create(); |
| 139 // Image support required for synchronous compositing. |
| 140 context->set_support_image(true); |
| 141 return cc::FakeOutputSurface::Create3d(context.Pass()); |
| 142 } |
| 138 return use_null_output_surface_ | 143 return use_null_output_surface_ |
| 139 ? nullptr | 144 ? nullptr |
| 140 : make_scoped_ptr(new cc::FailureOutputSurface(false)); | 145 : make_scoped_ptr(new cc::FailureOutputSurface(false)); |
| 141 } | 146 } |
| 142 | 147 |
| 148 // Force a new output surface to be created. |
| 149 void SynchronousComposite() { |
| 150 layer_tree_host()->DidLoseOutputSurface(); |
| 151 |
| 152 base::TimeTicks some_time; |
| 153 layer_tree_host()->Composite(some_time); |
| 154 } |
| 155 |
| 143 void RequestNewOutputSurface() override { | 156 void RequestNewOutputSurface() override { |
| 144 ++num_requests_; | 157 ++num_requests_; |
| 145 ++num_requests_since_last_success_; | 158 ++num_requests_since_last_success_; |
| 146 RenderWidgetCompositor::RequestNewOutputSurface(); | 159 RenderWidgetCompositor::RequestNewOutputSurface(); |
| 147 } | 160 } |
| 148 | 161 |
| 149 void DidInitializeOutputSurface() override { | 162 void DidInitializeOutputSurface() override { |
| 150 if (last_create_was_fallback_) | 163 if (last_create_was_fallback_) |
| 151 ++num_fallback_successes_; | 164 ++num_fallback_successes_; |
| 152 else | 165 else |
| 153 ++num_successes_; | 166 ++num_successes_; |
| 154 | 167 |
| 155 if (num_requests_ == expected_requests_) { | 168 if (num_requests_ == expected_requests_) { |
| 156 EndTest(); | 169 EndTest(); |
| 157 } else { | 170 } else { |
| 158 num_requests_since_last_success_ = 0; | 171 num_requests_since_last_success_ = 0; |
| 159 RenderWidgetCompositor::DidInitializeOutputSurface(); | 172 RenderWidgetCompositor::DidInitializeOutputSurface(); |
| 160 layer_tree_host()->DidLoseOutputSurface(); | 173 // Post the synchronous composite task so that it is not called |
| 161 RequestNewOutputSurface(); | 174 // reentrantly as a part of RequestNewOutputSurface. |
| 175 base::MessageLoop::current()->PostTask( |
| 176 FROM_HERE, |
| 177 base::Bind(&RenderWidgetCompositorOutputSurface::SynchronousComposite, |
| 178 base::Unretained(this))); |
| 162 } | 179 } |
| 163 } | 180 } |
| 164 | 181 |
| 165 void DidFailToInitializeOutputSurface() override { | 182 void DidFailToInitializeOutputSurface() override { |
| 166 ++num_failures_; | 183 ++num_failures_; |
| 167 if (num_requests_ == expected_requests_) { | 184 if (num_requests_ == expected_requests_) { |
| 168 EndTest(); | 185 EndTest(); |
| 169 return; | 186 return; |
| 170 } | 187 } |
| 171 | 188 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 bool last_create_was_fallback_; | 223 bool last_create_was_fallback_; |
| 207 bool use_null_output_surface_; | 224 bool use_null_output_surface_; |
| 208 | 225 |
| 209 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurface); | 226 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurface); |
| 210 }; | 227 }; |
| 211 | 228 |
| 212 class RenderWidgetCompositorOutputSurfaceTest : public testing::Test { | 229 class RenderWidgetCompositorOutputSurfaceTest : public testing::Test { |
| 213 public: | 230 public: |
| 214 RenderWidgetCompositorOutputSurfaceTest() | 231 RenderWidgetCompositorOutputSurfaceTest() |
| 215 : render_widget_(make_scoped_refptr(new RenderWidgetOutputSurface)), | 232 : render_widget_(make_scoped_refptr(new RenderWidgetOutputSurface)), |
| 216 compositor_deps_(make_scoped_ptr(new FakeCompositorDependencies)), | 233 compositor_deps_(make_scoped_ptr(new FakeCompositorDependencies)) { |
| 217 render_widget_compositor_(make_scoped_ptr( | 234 // Required in order to call the synchronous LayerTreeHost::Composite. |
| 218 new RenderWidgetCompositorOutputSurface(render_widget_.get(), | 235 compositor_deps_->set_use_single_thread_scheduler(false); |
| 219 compositor_deps_.get()))) { | 236 render_widget_compositor_.reset(new RenderWidgetCompositorOutputSurface( |
| 237 render_widget_.get(), compositor_deps_.get())); |
| 220 render_widget_compositor_->Initialize(); | 238 render_widget_compositor_->Initialize(); |
| 221 render_widget_->SetCompositor(render_widget_compositor_.get()); | 239 render_widget_->SetCompositor(render_widget_compositor_.get()); |
| 222 } | 240 } |
| 223 | 241 |
| 224 void RunTest(bool use_null_output_surface, | 242 void RunTest(bool use_null_output_surface, |
| 225 int num_failures_before_success, | 243 int num_failures_before_success, |
| 226 int expected_successes, | 244 int expected_successes, |
| 227 int expected_fallback_succeses) { | 245 int expected_fallback_succeses) { |
| 228 render_widget_compositor_->SetUp( | 246 render_widget_compositor_->SetUp( |
| 229 use_null_output_surface, num_failures_before_success, | 247 use_null_output_surface, num_failures_before_success, |
| 230 expected_successes, expected_fallback_succeses); | 248 expected_successes, expected_fallback_succeses); |
| 249 render_widget_compositor_->StartCompositor(); |
| 231 base::MessageLoop::current()->PostTask( | 250 base::MessageLoop::current()->PostTask( |
| 232 FROM_HERE, | 251 FROM_HERE, |
| 233 base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface, | 252 base::Bind(&RenderWidgetCompositorOutputSurface::SynchronousComposite, |
| 234 base::Unretained(render_widget_compositor_.get()))); | 253 base::Unretained(render_widget_compositor_.get()))); |
| 235 base::MessageLoop::current()->Run(); | 254 base::MessageLoop::current()->Run(); |
| 236 render_widget_compositor_->AfterTest(); | 255 render_widget_compositor_->AfterTest(); |
| 237 } | 256 } |
| 238 | 257 |
| 239 protected: | 258 protected: |
| 240 base::MessageLoop ye_olde_message_loope_; | 259 base::MessageLoop ye_olde_message_loope_; |
| 241 MockRenderThread render_thread_; | 260 MockRenderThread render_thread_; |
| 242 scoped_refptr<RenderWidgetOutputSurface> render_widget_; | 261 scoped_refptr<RenderWidgetOutputSurface> render_widget_; |
| 243 scoped_ptr<FakeCompositorDependencies> compositor_deps_; | 262 scoped_ptr<FakeCompositorDependencies> compositor_deps_; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 } | 309 } |
| 291 | 310 |
| 292 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { | 311 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { |
| 293 // The first success is a fallback, but the next should not be a fallback. | 312 // The first success is a fallback, but the next should not be a fallback. |
| 294 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 313 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
| 295 1, 1); | 314 1, 1); |
| 296 } | 315 } |
| 297 | 316 |
| 298 } // namespace | 317 } // namespace |
| 299 } // namespace content | 318 } // namespace content |
| OLD | NEW |