Chromium Code Reviews| 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 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 120 num_requests_(0), | 120 num_requests_(0), |
| 121 num_requests_since_last_success_(0), | 121 num_requests_since_last_success_(0), |
| 122 num_successes_(0), | 122 num_successes_(0), |
| 123 num_fallback_successes_(0), | 123 num_fallback_successes_(0), |
| 124 num_failures_(0), | 124 num_failures_(0), |
| 125 last_create_was_fallback_(false), | 125 last_create_was_fallback_(false), |
| 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 void FinalizeSettings(cc::LayerTreeSettings* settings) const override { | |
| 131 // Required in order to call the synchronous LayerTreeHost::Composite. | |
| 132 settings->single_thread_proxy_scheduler = false; | |
|
danakj
2015/01/27 01:46:37
You could add a function to CompositorDependencies
enne (OOO)
2015/01/27 01:59:42
Done. PTAL.
| |
| 133 } | |
| 134 | |
| 130 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) { | 135 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) { |
| 131 EXPECT_EQ(num_requests_since_last_success_ > | 136 EXPECT_EQ(num_requests_since_last_success_ > |
| 132 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 137 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
| 133 fallback); | 138 fallback); |
| 134 last_create_was_fallback_ = fallback; | 139 last_create_was_fallback_ = fallback; |
| 135 bool success = num_failures_ >= num_failures_before_success_; | 140 bool success = num_failures_ >= num_failures_before_success_; |
| 136 if (success) | 141 if (success) { |
| 137 return cc::FakeOutputSurface::Create3d(); | 142 scoped_ptr<cc::TestWebGraphicsContext3D> context = |
| 143 cc::TestWebGraphicsContext3D::Create(); | |
| 144 // Image support required for synchronous compositing. | |
| 145 context->set_support_image(true); | |
| 146 return cc::FakeOutputSurface::Create3d(context.Pass()); | |
| 147 } | |
| 138 return use_null_output_surface_ | 148 return use_null_output_surface_ |
| 139 ? nullptr | 149 ? nullptr |
| 140 : make_scoped_ptr(new cc::FailureOutputSurface(false)); | 150 : make_scoped_ptr(new cc::FailureOutputSurface(false)); |
| 141 } | 151 } |
| 142 | 152 |
| 153 // Force a new output surface to be created. | |
| 154 void SynchronousComposite() { | |
| 155 layer_tree_host()->DidLoseOutputSurface(); | |
| 156 | |
| 157 base::TimeTicks some_time; | |
| 158 layer_tree_host()->Composite(some_time); | |
| 159 } | |
| 160 | |
| 143 void RequestNewOutputSurface() override { | 161 void RequestNewOutputSurface() override { |
| 144 ++num_requests_; | 162 ++num_requests_; |
| 145 ++num_requests_since_last_success_; | 163 ++num_requests_since_last_success_; |
| 146 RenderWidgetCompositor::RequestNewOutputSurface(); | 164 RenderWidgetCompositor::RequestNewOutputSurface(); |
| 147 } | 165 } |
| 148 | 166 |
| 149 void DidInitializeOutputSurface() override { | 167 void DidInitializeOutputSurface() override { |
| 150 if (last_create_was_fallback_) | 168 if (last_create_was_fallback_) |
| 151 ++num_fallback_successes_; | 169 ++num_fallback_successes_; |
| 152 else | 170 else |
| 153 ++num_successes_; | 171 ++num_successes_; |
| 154 | 172 |
| 155 if (num_requests_ == expected_requests_) { | 173 if (num_requests_ == expected_requests_) { |
| 156 EndTest(); | 174 EndTest(); |
| 157 } else { | 175 } else { |
| 158 num_requests_since_last_success_ = 0; | 176 num_requests_since_last_success_ = 0; |
| 159 RenderWidgetCompositor::DidInitializeOutputSurface(); | 177 RenderWidgetCompositor::DidInitializeOutputSurface(); |
| 160 layer_tree_host()->DidLoseOutputSurface(); | 178 // Post the synchronous composite task so that it is not called |
| 161 RequestNewOutputSurface(); | 179 // reentrantly as a part of RequestNewOutputSurface. |
| 180 base::MessageLoop::current()->PostTask( | |
| 181 FROM_HERE, | |
| 182 base::Bind(&RenderWidgetCompositorOutputSurface::SynchronousComposite, | |
| 183 base::Unretained(this))); | |
| 162 } | 184 } |
| 163 } | 185 } |
| 164 | 186 |
| 165 void DidFailToInitializeOutputSurface() override { | 187 void DidFailToInitializeOutputSurface() override { |
| 166 ++num_failures_; | 188 ++num_failures_; |
| 167 if (num_requests_ == expected_requests_) { | 189 if (num_requests_ == expected_requests_) { |
| 168 EndTest(); | 190 EndTest(); |
| 169 return; | 191 return; |
| 170 } | 192 } |
| 171 | 193 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 221 render_widget_->SetCompositor(render_widget_compositor_.get()); | 243 render_widget_->SetCompositor(render_widget_compositor_.get()); |
| 222 } | 244 } |
| 223 | 245 |
| 224 void RunTest(bool use_null_output_surface, | 246 void RunTest(bool use_null_output_surface, |
| 225 int num_failures_before_success, | 247 int num_failures_before_success, |
| 226 int expected_successes, | 248 int expected_successes, |
| 227 int expected_fallback_succeses) { | 249 int expected_fallback_succeses) { |
| 228 render_widget_compositor_->SetUp( | 250 render_widget_compositor_->SetUp( |
| 229 use_null_output_surface, num_failures_before_success, | 251 use_null_output_surface, num_failures_before_success, |
| 230 expected_successes, expected_fallback_succeses); | 252 expected_successes, expected_fallback_succeses); |
| 253 render_widget_compositor_->StartCompositor(); | |
| 231 base::MessageLoop::current()->PostTask( | 254 base::MessageLoop::current()->PostTask( |
| 232 FROM_HERE, | 255 FROM_HERE, |
| 233 base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface, | 256 base::Bind(&RenderWidgetCompositorOutputSurface::SynchronousComposite, |
| 234 base::Unretained(render_widget_compositor_.get()))); | 257 base::Unretained(render_widget_compositor_.get()))); |
| 235 base::MessageLoop::current()->Run(); | 258 base::MessageLoop::current()->Run(); |
| 236 render_widget_compositor_->AfterTest(); | 259 render_widget_compositor_->AfterTest(); |
| 237 } | 260 } |
| 238 | 261 |
| 239 protected: | 262 protected: |
| 240 base::MessageLoop ye_olde_message_loope_; | 263 base::MessageLoop ye_olde_message_loope_; |
| 241 MockRenderThread render_thread_; | 264 MockRenderThread render_thread_; |
| 242 scoped_refptr<RenderWidgetOutputSurface> render_widget_; | 265 scoped_refptr<RenderWidgetOutputSurface> render_widget_; |
| 243 scoped_ptr<FakeCompositorDependencies> compositor_deps_; | 266 scoped_ptr<FakeCompositorDependencies> compositor_deps_; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 290 } | 313 } |
| 291 | 314 |
| 292 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { | 315 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { |
| 293 // The first success is a fallback, but the next should not be a fallback. | 316 // The first success is a fallback, but the next should not be a fallback. |
| 294 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, | 317 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, |
| 295 1, 1); | 318 1, 1); |
| 296 } | 319 } |
| 297 | 320 |
| 298 } // namespace | 321 } // namespace |
| 299 } // namespace content | 322 } // namespace content |
| OLD | NEW |