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 |