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

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: Add comment Created 5 years, 11 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
« no previous file with comments | « content/renderer/gpu/render_widget_compositor.cc ('k') | content/renderer/render_thread_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/gpu/render_widget_compositor.cc ('k') | content/renderer/render_thread_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698