Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: content/renderer/gpu/render_widget_compositor_unittest.cc

Issue 871743002: cc: Fix multiple outstanding output surface requests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix content_unittests Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698