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

Side by Side Diff: cc/trees/thread_proxy.cc

Issue 17114008: cc: Remove cc::Thread and cc::ThreadImpl. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rm-thread: NULLrefptrs Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « cc/trees/thread_proxy.h ('k') | cc/trees/tree_synchronizer_unittest.cc » ('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 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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 "cc/trees/thread_proxy.h" 5 #include "cc/trees/thread_proxy.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/debug/trace_event.h" 11 #include "base/debug/trace_event.h"
12 #include "base/metrics/histogram.h" 12 #include "base/metrics/histogram.h"
13 #include "cc/base/thread.h"
14 #include "cc/input/input_handler.h" 13 #include "cc/input/input_handler.h"
15 #include "cc/output/context_provider.h" 14 #include "cc/output/context_provider.h"
16 #include "cc/output/output_surface.h" 15 #include "cc/output/output_surface.h"
17 #include "cc/quads/draw_quad.h" 16 #include "cc/quads/draw_quad.h"
18 #include "cc/resources/prioritized_resource_manager.h" 17 #include "cc/resources/prioritized_resource_manager.h"
19 #include "cc/scheduler/delay_based_time_source.h" 18 #include "cc/scheduler/delay_based_time_source.h"
20 #include "cc/scheduler/frame_rate_controller.h" 19 #include "cc/scheduler/frame_rate_controller.h"
21 #include "cc/scheduler/scheduler.h" 20 #include "cc/scheduler/scheduler.h"
22 #include "cc/trees/layer_tree_host.h" 21 #include "cc/trees/layer_tree_host.h"
23 #include "cc/trees/layer_tree_impl.h" 22 #include "cc/trees/layer_tree_impl.h"
(...skipping 24 matching lines...) Expand all
48 struct ThreadProxy::CommitPendingRequest { 47 struct ThreadProxy::CommitPendingRequest {
49 CompletionEvent completion; 48 CompletionEvent completion;
50 bool commit_pending; 49 bool commit_pending;
51 }; 50 };
52 51
53 struct ThreadProxy::SchedulerStateRequest { 52 struct ThreadProxy::SchedulerStateRequest {
54 CompletionEvent completion; 53 CompletionEvent completion;
55 std::string state; 54 std::string state;
56 }; 55 };
57 56
58 scoped_ptr<Proxy> ThreadProxy::Create(LayerTreeHost* layer_tree_host, 57 scoped_ptr<Proxy> ThreadProxy::Create(
59 scoped_ptr<Thread> impl_thread) { 58 LayerTreeHost* layer_tree_host,
59 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) {
60 return make_scoped_ptr( 60 return make_scoped_ptr(
61 new ThreadProxy(layer_tree_host, impl_thread.Pass())).PassAs<Proxy>(); 61 new ThreadProxy(layer_tree_host, impl_task_runner)).PassAs<Proxy>();
62 } 62 }
63 63
64 ThreadProxy::ThreadProxy(LayerTreeHost* layer_tree_host, 64 ThreadProxy::ThreadProxy(
65 scoped_ptr<Thread> impl_thread) 65 LayerTreeHost* layer_tree_host,
66 : Proxy(impl_thread.Pass()), 66 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner)
67 : Proxy(impl_task_runner),
67 animate_requested_(false), 68 animate_requested_(false),
68 commit_requested_(false), 69 commit_requested_(false),
69 commit_request_sent_to_impl_thread_(false), 70 commit_request_sent_to_impl_thread_(false),
70 created_offscreen_context_provider_(false), 71 created_offscreen_context_provider_(false),
71 layer_tree_host_(layer_tree_host), 72 layer_tree_host_(layer_tree_host),
72 started_(false), 73 started_(false),
73 textures_acquired_(true), 74 textures_acquired_(true),
74 in_composite_and_readback_(false), 75 in_composite_and_readback_(false),
75 manage_tiles_pending_(false), 76 manage_tiles_pending_(false),
76 weak_factory_on_impl_thread_(this), 77 weak_factory_on_impl_thread_(this),
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 111
111 if (!layer_tree_host_->InitializeOutputSurfaceIfNeeded()) { 112 if (!layer_tree_host_->InitializeOutputSurfaceIfNeeded()) {
112 TRACE_EVENT0("cc", "CompositeAndReadback_EarlyOut_LR_Uninitialized"); 113 TRACE_EVENT0("cc", "CompositeAndReadback_EarlyOut_LR_Uninitialized");
113 return false; 114 return false;
114 } 115 }
115 116
116 // Perform a synchronous commit. 117 // Perform a synchronous commit.
117 { 118 {
118 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 119 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
119 CompletionEvent begin_frame_sent_to_main_thread_completion; 120 CompletionEvent begin_frame_sent_to_main_thread_completion;
120 Proxy::ImplThread()->PostTask( 121 Proxy::ImplThreadTaskRunner()->PostTask(
122 FROM_HERE,
121 base::Bind(&ThreadProxy::ForceCommitOnImplThread, 123 base::Bind(&ThreadProxy::ForceCommitOnImplThread,
122 impl_thread_weak_ptr_, 124 impl_thread_weak_ptr_,
123 &begin_frame_sent_to_main_thread_completion)); 125 &begin_frame_sent_to_main_thread_completion));
124 begin_frame_sent_to_main_thread_completion.Wait(); 126 begin_frame_sent_to_main_thread_completion.Wait();
125 } 127 }
126 in_composite_and_readback_ = true; 128 in_composite_and_readback_ = true;
127 BeginFrameOnMainThread(scoped_ptr<BeginFrameAndCommitState>()); 129 BeginFrameOnMainThread(scoped_ptr<BeginFrameAndCommitState>());
128 in_composite_and_readback_ = false; 130 in_composite_and_readback_ = false;
129 131
130 // Perform a synchronous readback. 132 // Perform a synchronous readback.
131 ReadbackRequest request; 133 ReadbackRequest request;
132 request.rect = rect; 134 request.rect = rect;
133 request.pixels = pixels; 135 request.pixels = pixels;
134 { 136 {
135 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 137 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
136 Proxy::ImplThread()->PostTask( 138 Proxy::ImplThreadTaskRunner()->PostTask(
139 FROM_HERE,
137 base::Bind(&ThreadProxy::RequestReadbackOnImplThread, 140 base::Bind(&ThreadProxy::RequestReadbackOnImplThread,
138 impl_thread_weak_ptr_, 141 impl_thread_weak_ptr_,
139 &request)); 142 &request));
140 request.completion.Wait(); 143 request.completion.Wait();
141 } 144 }
142 return request.success; 145 return request.success;
143 } 146 }
144 147
145 void ThreadProxy::ForceCommitOnImplThread(CompletionEvent* completion) { 148 void ThreadProxy::ForceCommitOnImplThread(CompletionEvent* completion) {
146 TRACE_EVENT0("cc", "ThreadProxy::ForceCommitOnImplThread"); 149 TRACE_EVENT0("cc", "ThreadProxy::ForceCommitOnImplThread");
(...skipping 23 matching lines...) Expand all
170 scheduler_on_impl_thread_->SetNeedsForcedRedraw(); 173 scheduler_on_impl_thread_->SetNeedsForcedRedraw();
171 } 174 }
172 175
173 void ThreadProxy::FinishAllRendering() { 176 void ThreadProxy::FinishAllRendering() {
174 DCHECK(Proxy::IsMainThread()); 177 DCHECK(Proxy::IsMainThread());
175 DCHECK(!defer_commits_); 178 DCHECK(!defer_commits_);
176 179
177 // Make sure all GL drawing is finished on the impl thread. 180 // Make sure all GL drawing is finished on the impl thread.
178 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 181 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
179 CompletionEvent completion; 182 CompletionEvent completion;
180 Proxy::ImplThread()->PostTask( 183 Proxy::ImplThreadTaskRunner()->PostTask(
184 FROM_HERE,
181 base::Bind(&ThreadProxy::FinishAllRenderingOnImplThread, 185 base::Bind(&ThreadProxy::FinishAllRenderingOnImplThread,
182 impl_thread_weak_ptr_, 186 impl_thread_weak_ptr_,
183 &completion)); 187 &completion));
184 completion.Wait(); 188 completion.Wait();
185 } 189 }
186 190
187 bool ThreadProxy::IsStarted() const { 191 bool ThreadProxy::IsStarted() const {
188 DCHECK(Proxy::IsMainThread()); 192 DCHECK(Proxy::IsMainThread());
189 return started_; 193 return started_;
190 } 194 }
191 195
192 void ThreadProxy::SetLayerTreeHostClientReady() { 196 void ThreadProxy::SetLayerTreeHostClientReady() {
193 TRACE_EVENT0("cc", "ThreadProxy::SetLayerTreeHostClientReady"); 197 TRACE_EVENT0("cc", "ThreadProxy::SetLayerTreeHostClientReady");
194 Proxy::ImplThread()->PostTask(base::Bind( 198 Proxy::ImplThreadTaskRunner()->PostTask(
195 &ThreadProxy::SetLayerTreeHostClientReadyOnImplThread, 199 FROM_HERE,
196 impl_thread_weak_ptr_)); 200 base::Bind(&ThreadProxy::SetLayerTreeHostClientReadyOnImplThread,
201 impl_thread_weak_ptr_));
197 } 202 }
198 203
199 void ThreadProxy::SetLayerTreeHostClientReadyOnImplThread() { 204 void ThreadProxy::SetLayerTreeHostClientReadyOnImplThread() {
200 TRACE_EVENT0("cc", "ThreadProxy::SetLayerTreeHostClientReadyOnImplThread"); 205 TRACE_EVENT0("cc", "ThreadProxy::SetLayerTreeHostClientReadyOnImplThread");
201 scheduler_on_impl_thread_->SetCanStart(); 206 scheduler_on_impl_thread_->SetCanStart();
202 } 207 }
203 208
204 void ThreadProxy::SetVisible(bool visible) { 209 void ThreadProxy::SetVisible(bool visible) {
205 TRACE_EVENT0("cc", "ThreadProxy::SetVisible"); 210 TRACE_EVENT0("cc", "ThreadProxy::SetVisible");
206 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 211 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
207 CompletionEvent completion; 212 CompletionEvent completion;
208 Proxy::ImplThread()->PostTask(base::Bind(&ThreadProxy::SetVisibleOnImplThread, 213 Proxy::ImplThreadTaskRunner()->PostTask(
209 impl_thread_weak_ptr_, 214 FROM_HERE,
210 &completion, 215 base::Bind(&ThreadProxy::SetVisibleOnImplThread,
211 visible)); 216 impl_thread_weak_ptr_,
217 &completion,
218 visible));
212 completion.Wait(); 219 completion.Wait();
213 } 220 }
214 221
215 void ThreadProxy::SetVisibleOnImplThread(CompletionEvent* completion, 222 void ThreadProxy::SetVisibleOnImplThread(CompletionEvent* completion,
216 bool visible) { 223 bool visible) {
217 TRACE_EVENT0("cc", "ThreadProxy::SetVisibleOnImplThread"); 224 TRACE_EVENT0("cc", "ThreadProxy::SetVisibleOnImplThread");
218 layer_tree_host_impl_->SetVisible(visible); 225 layer_tree_host_impl_->SetVisible(visible);
219 scheduler_on_impl_thread_->SetVisible(visible); 226 scheduler_on_impl_thread_->SetVisible(visible);
220 completion->Signal(); 227 completion->Signal();
221 } 228 }
(...skipping 25 matching lines...) Expand all
247 } 254 }
248 255
249 success = false; 256 success = false;
250 { 257 {
251 // Make a blocking call to InitializeOutputSurfaceOnImplThread. The results 258 // Make a blocking call to InitializeOutputSurfaceOnImplThread. The results
252 // of that call are pushed into the success and capabilities local 259 // of that call are pushed into the success and capabilities local
253 // variables. 260 // variables.
254 CompletionEvent completion; 261 CompletionEvent completion;
255 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 262 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
256 263
257 Proxy::ImplThread()->PostTask( 264 Proxy::ImplThreadTaskRunner()->PostTask(
265 FROM_HERE,
258 base::Bind(&ThreadProxy::InitializeOutputSurfaceOnImplThread, 266 base::Bind(&ThreadProxy::InitializeOutputSurfaceOnImplThread,
259 impl_thread_weak_ptr_, 267 impl_thread_weak_ptr_,
260 &completion, 268 &completion,
261 base::Passed(&output_surface), 269 base::Passed(&output_surface),
262 offscreen_context_provider, 270 offscreen_context_provider,
263 &success, 271 &success,
264 &capabilities)); 272 &capabilities));
265 completion.Wait(); 273 completion.Wait();
266 } 274 }
267 275
268 OnOutputSurfaceInitializeAttempted(success, capabilities); 276 OnOutputSurfaceInitializeAttempted(success, capabilities);
269 } 277 }
270 278
271 void ThreadProxy::OnOutputSurfaceInitializeAttempted( 279 void ThreadProxy::OnOutputSurfaceInitializeAttempted(
272 bool success, 280 bool success,
273 const RendererCapabilities& capabilities) { 281 const RendererCapabilities& capabilities) {
274 DCHECK(IsMainThread()); 282 DCHECK(IsMainThread());
275 DCHECK(layer_tree_host_); 283 DCHECK(layer_tree_host_);
276 284
277 if (success) { 285 if (success) {
278 renderer_capabilities_main_thread_copy_ = capabilities; 286 renderer_capabilities_main_thread_copy_ = capabilities;
279 } 287 }
280 288
281 LayerTreeHost::CreateResult result = 289 LayerTreeHost::CreateResult result =
282 layer_tree_host_->OnCreateAndInitializeOutputSurfaceAttempted(success); 290 layer_tree_host_->OnCreateAndInitializeOutputSurfaceAttempted(success);
283 if (result == LayerTreeHost::CreateFailedButTryAgain) { 291 if (result == LayerTreeHost::CreateFailedButTryAgain) {
284 if (!output_surface_creation_callback_.callback().is_null()) { 292 if (!output_surface_creation_callback_.callback().is_null()) {
285 Proxy::MainThread()->PostTask( 293 Proxy::MainThreadTaskRunner()->PostTask(
286 output_surface_creation_callback_.callback()); 294 FROM_HERE, output_surface_creation_callback_.callback());
287 } 295 }
288 } else { 296 } else {
289 output_surface_creation_callback_.Cancel(); 297 output_surface_creation_callback_.Cancel();
290 } 298 }
291 } 299 }
292 300
293 const RendererCapabilities& ThreadProxy::GetRendererCapabilities() const { 301 const RendererCapabilities& ThreadProxy::GetRendererCapabilities() const {
294 DCHECK(IsMainThread()); 302 DCHECK(IsMainThread());
295 DCHECK(!layer_tree_host_->output_surface_lost()); 303 DCHECK(!layer_tree_host_->output_surface_lost());
296 return renderer_capabilities_main_thread_copy_; 304 return renderer_capabilities_main_thread_copy_;
297 } 305 }
298 306
299 void ThreadProxy::SetNeedsAnimate() { 307 void ThreadProxy::SetNeedsAnimate() {
300 DCHECK(IsMainThread()); 308 DCHECK(IsMainThread());
301 if (animate_requested_) 309 if (animate_requested_)
302 return; 310 return;
303 311
304 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsAnimate"); 312 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsAnimate");
305 animate_requested_ = true; 313 animate_requested_ = true;
306 314
307 if (commit_request_sent_to_impl_thread_) 315 if (commit_request_sent_to_impl_thread_)
308 return; 316 return;
309 commit_request_sent_to_impl_thread_ = true; 317 commit_request_sent_to_impl_thread_ = true;
310 Proxy::ImplThread()->PostTask(base::Bind( 318 Proxy::ImplThreadTaskRunner()->PostTask(
311 &ThreadProxy::SetNeedsCommitOnImplThread, impl_thread_weak_ptr_)); 319 FROM_HERE,
320 base::Bind(&ThreadProxy::SetNeedsCommitOnImplThread,
321 impl_thread_weak_ptr_));
312 } 322 }
313 323
314 void ThreadProxy::SetNeedsCommit() { 324 void ThreadProxy::SetNeedsCommit() {
315 DCHECK(IsMainThread()); 325 DCHECK(IsMainThread());
316 if (commit_requested_) 326 if (commit_requested_)
317 return; 327 return;
318 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsCommit"); 328 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsCommit");
319 commit_requested_ = true; 329 commit_requested_ = true;
320 330
321 if (commit_request_sent_to_impl_thread_) 331 if (commit_request_sent_to_impl_thread_)
322 return; 332 return;
323 commit_request_sent_to_impl_thread_ = true; 333 commit_request_sent_to_impl_thread_ = true;
324 Proxy::ImplThread()->PostTask(base::Bind( 334 Proxy::ImplThreadTaskRunner()->PostTask(
325 &ThreadProxy::SetNeedsCommitOnImplThread, impl_thread_weak_ptr_)); 335 FROM_HERE,
336 base::Bind(&ThreadProxy::SetNeedsCommitOnImplThread,
337 impl_thread_weak_ptr_));
326 } 338 }
327 339
328 void ThreadProxy::DidLoseOutputSurfaceOnImplThread() { 340 void ThreadProxy::DidLoseOutputSurfaceOnImplThread() {
329 DCHECK(IsImplThread()); 341 DCHECK(IsImplThread());
330 TRACE_EVENT0("cc", "ThreadProxy::DidLoseOutputSurfaceOnImplThread"); 342 TRACE_EVENT0("cc", "ThreadProxy::DidLoseOutputSurfaceOnImplThread");
331 Proxy::ImplThread()->PostTask( 343 Proxy::ImplThreadTaskRunner()->PostTask(
344 FROM_HERE,
332 base::Bind(&ThreadProxy::CheckOutputSurfaceStatusOnImplThread, 345 base::Bind(&ThreadProxy::CheckOutputSurfaceStatusOnImplThread,
333 impl_thread_weak_ptr_)); 346 impl_thread_weak_ptr_));
334 } 347 }
335 348
336 void ThreadProxy::CheckOutputSurfaceStatusOnImplThread() { 349 void ThreadProxy::CheckOutputSurfaceStatusOnImplThread() {
337 DCHECK(IsImplThread()); 350 DCHECK(IsImplThread());
338 TRACE_EVENT0("cc", "ThreadProxy::CheckOutputSurfaceStatusOnImplThread"); 351 TRACE_EVENT0("cc", "ThreadProxy::CheckOutputSurfaceStatusOnImplThread");
339 if (!layer_tree_host_impl_->IsContextLost()) 352 if (!layer_tree_host_impl_->IsContextLost())
340 return; 353 return;
341 cc::ContextProvider* offscreen_contexts = 354 cc::ContextProvider* offscreen_contexts =
342 layer_tree_host_impl_->resource_provider() ? 355 layer_tree_host_impl_->resource_provider() ?
343 layer_tree_host_impl_->resource_provider()-> 356 layer_tree_host_impl_->resource_provider()->
344 offscreen_context_provider() : NULL; 357 offscreen_context_provider() : NULL;
345 358
346 if (offscreen_contexts) 359 if (offscreen_contexts)
347 offscreen_contexts->VerifyContexts(); 360 offscreen_contexts->VerifyContexts();
348 scheduler_on_impl_thread_->DidLoseOutputSurface(); 361 scheduler_on_impl_thread_->DidLoseOutputSurface();
349 } 362 }
350 363
351 void ThreadProxy::OnSwapBuffersCompleteOnImplThread() { 364 void ThreadProxy::OnSwapBuffersCompleteOnImplThread() {
352 DCHECK(IsImplThread()); 365 DCHECK(IsImplThread());
353 TRACE_EVENT0("cc", "ThreadProxy::OnSwapBuffersCompleteOnImplThread"); 366 TRACE_EVENT0("cc", "ThreadProxy::OnSwapBuffersCompleteOnImplThread");
354 Proxy::MainThread()->PostTask( 367 Proxy::MainThreadTaskRunner()->PostTask(
368 FROM_HERE,
355 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_)); 369 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_));
356 } 370 }
357 371
358 void ThreadProxy::SetNeedsBeginFrameOnImplThread(bool enable) { 372 void ThreadProxy::SetNeedsBeginFrameOnImplThread(bool enable) {
359 DCHECK(IsImplThread()); 373 DCHECK(IsImplThread());
360 TRACE_EVENT1("cc", "ThreadProxy::SetNeedsBeginFrameOnImplThread", 374 TRACE_EVENT1("cc", "ThreadProxy::SetNeedsBeginFrameOnImplThread",
361 "enable", enable); 375 "enable", enable);
362 layer_tree_host_impl_->SetNeedsBeginFrame(enable); 376 layer_tree_host_impl_->SetNeedsBeginFrame(enable);
363 } 377 }
364 378
(...skipping 24 matching lines...) Expand all
389 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsCommitOnImplThread"); 403 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsCommitOnImplThread");
390 scheduler_on_impl_thread_->SetNeedsCommit(); 404 scheduler_on_impl_thread_->SetNeedsCommit();
391 } 405 }
392 406
393 void ThreadProxy::PostAnimationEventsToMainThreadOnImplThread( 407 void ThreadProxy::PostAnimationEventsToMainThreadOnImplThread(
394 scoped_ptr<AnimationEventsVector> events, 408 scoped_ptr<AnimationEventsVector> events,
395 base::Time wall_clock_time) { 409 base::Time wall_clock_time) {
396 DCHECK(IsImplThread()); 410 DCHECK(IsImplThread());
397 TRACE_EVENT0("cc", 411 TRACE_EVENT0("cc",
398 "ThreadProxy::PostAnimationEventsToMainThreadOnImplThread"); 412 "ThreadProxy::PostAnimationEventsToMainThreadOnImplThread");
399 Proxy::MainThread()->PostTask(base::Bind(&ThreadProxy::SetAnimationEvents, 413 Proxy::MainThreadTaskRunner()->PostTask(
400 main_thread_weak_ptr_, 414 FROM_HERE,
401 base::Passed(&events), 415 base::Bind(&ThreadProxy::SetAnimationEvents,
402 wall_clock_time)); 416 main_thread_weak_ptr_,
417 base::Passed(&events),
418 wall_clock_time));
403 } 419 }
404 420
405 bool ThreadProxy::ReduceContentsTextureMemoryOnImplThread(size_t limit_bytes, 421 bool ThreadProxy::ReduceContentsTextureMemoryOnImplThread(size_t limit_bytes,
406 int priority_cutoff) { 422 int priority_cutoff) {
407 DCHECK(IsImplThread()); 423 DCHECK(IsImplThread());
408 424
409 if (!layer_tree_host_->contents_texture_manager()) 425 if (!layer_tree_host_->contents_texture_manager())
410 return false; 426 return false;
411 if (!layer_tree_host_impl_->resource_provider()) 427 if (!layer_tree_host_impl_->resource_provider())
412 return false; 428 return false;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 layer_tree_host_->contents_texture_manager()-> 473 layer_tree_host_->contents_texture_manager()->
458 MemoryVisibleAndNearbyBytes(), 474 MemoryVisibleAndNearbyBytes(),
459 layer_tree_host_->contents_texture_manager()->MemoryUseBytes()); 475 layer_tree_host_->contents_texture_manager()->MemoryUseBytes());
460 } 476 }
461 477
462 bool ThreadProxy::IsInsideDraw() { return inside_draw_; } 478 bool ThreadProxy::IsInsideDraw() { return inside_draw_; }
463 479
464 void ThreadProxy::SetNeedsRedraw(gfx::Rect damage_rect) { 480 void ThreadProxy::SetNeedsRedraw(gfx::Rect damage_rect) {
465 DCHECK(IsMainThread()); 481 DCHECK(IsMainThread());
466 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsRedraw"); 482 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsRedraw");
467 Proxy::ImplThread()->PostTask(base::Bind( 483 Proxy::ImplThreadTaskRunner()->PostTask(
468 &ThreadProxy::SetNeedsRedrawRectOnImplThread, 484 FROM_HERE,
469 impl_thread_weak_ptr_, damage_rect)); 485 base::Bind(&ThreadProxy::SetNeedsRedrawRectOnImplThread,
486 impl_thread_weak_ptr_,
487 damage_rect));
470 } 488 }
471 489
472 void ThreadProxy::SetDeferCommits(bool defer_commits) { 490 void ThreadProxy::SetDeferCommits(bool defer_commits) {
473 DCHECK(IsMainThread()); 491 DCHECK(IsMainThread());
474 DCHECK_NE(defer_commits_, defer_commits); 492 DCHECK_NE(defer_commits_, defer_commits);
475 defer_commits_ = defer_commits; 493 defer_commits_ = defer_commits;
476 494
477 if (defer_commits_) 495 if (defer_commits_)
478 TRACE_EVENT_ASYNC_BEGIN0("cc", "ThreadProxy::SetDeferCommits", this); 496 TRACE_EVENT_ASYNC_BEGIN0("cc", "ThreadProxy::SetDeferCommits", this);
479 else 497 else
480 TRACE_EVENT_ASYNC_END0("cc", "ThreadProxy::SetDeferCommits", this); 498 TRACE_EVENT_ASYNC_END0("cc", "ThreadProxy::SetDeferCommits", this);
481 499
482 if (!defer_commits_ && pending_deferred_commit_) 500 if (!defer_commits_ && pending_deferred_commit_)
483 Proxy::MainThread()->PostTask( 501 Proxy::MainThreadTaskRunner()->PostTask(
502 FROM_HERE,
484 base::Bind(&ThreadProxy::BeginFrameOnMainThread, 503 base::Bind(&ThreadProxy::BeginFrameOnMainThread,
485 main_thread_weak_ptr_, 504 main_thread_weak_ptr_,
486 base::Passed(&pending_deferred_commit_))); 505 base::Passed(&pending_deferred_commit_)));
487 } 506 }
488 507
489 bool ThreadProxy::CommitRequested() const { 508 bool ThreadProxy::CommitRequested() const {
490 DCHECK(IsMainThread()); 509 DCHECK(IsMainThread());
491 return commit_requested_; 510 return commit_requested_;
492 } 511 }
493 512
(...skipping 16 matching lines...) Expand all
510 } 529 }
511 530
512 void ThreadProxy::DidInitializeVisibleTileOnImplThread() { 531 void ThreadProxy::DidInitializeVisibleTileOnImplThread() {
513 DCHECK(IsImplThread()); 532 DCHECK(IsImplThread());
514 TRACE_EVENT0("cc", "ThreadProxy::DidInitializeVisibleTileOnImplThread"); 533 TRACE_EVENT0("cc", "ThreadProxy::DidInitializeVisibleTileOnImplThread");
515 scheduler_on_impl_thread_->SetNeedsRedraw(); 534 scheduler_on_impl_thread_->SetNeedsRedraw();
516 } 535 }
517 536
518 void ThreadProxy::MainThreadHasStoppedFlinging() { 537 void ThreadProxy::MainThreadHasStoppedFlinging() {
519 DCHECK(IsMainThread()); 538 DCHECK(IsMainThread());
520 Proxy::ImplThread()->PostTask( 539 Proxy::ImplThreadTaskRunner()->PostTask(
540 FROM_HERE,
521 base::Bind(&ThreadProxy::MainThreadHasStoppedFlingingOnImplThread, 541 base::Bind(&ThreadProxy::MainThreadHasStoppedFlingingOnImplThread,
522 impl_thread_weak_ptr_)); 542 impl_thread_weak_ptr_));
523 } 543 }
524 544
525 void ThreadProxy::MainThreadHasStoppedFlingingOnImplThread() { 545 void ThreadProxy::MainThreadHasStoppedFlingingOnImplThread() {
526 DCHECK(IsImplThread()); 546 DCHECK(IsImplThread());
527 layer_tree_host_impl_->MainThreadHasStoppedFlinging(); 547 layer_tree_host_impl_->MainThreadHasStoppedFlinging();
528 } 548 }
529 549
530 void ThreadProxy::Start(scoped_ptr<OutputSurface> first_output_surface) { 550 void ThreadProxy::Start(scoped_ptr<OutputSurface> first_output_surface) {
531 DCHECK(IsMainThread()); 551 DCHECK(IsMainThread());
532 DCHECK(Proxy::ImplThread()); 552 DCHECK(Proxy::HasImplThread());
533 DCHECK(first_output_surface); 553 DCHECK(first_output_surface);
534 // Create LayerTreeHostImpl. 554 // Create LayerTreeHostImpl.
535 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 555 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
536 CompletionEvent completion; 556 CompletionEvent completion;
537 Proxy::ImplThread()->PostTask( 557 Proxy::ImplThreadTaskRunner()->PostTask(
558 FROM_HERE,
538 base::Bind(&ThreadProxy::InitializeImplOnImplThread, 559 base::Bind(&ThreadProxy::InitializeImplOnImplThread,
539 base::Unretained(this), 560 base::Unretained(this),
540 &completion)); 561 &completion));
541 completion.Wait(); 562 completion.Wait();
542 563
543 main_thread_weak_ptr_ = weak_factory_.GetWeakPtr(); 564 main_thread_weak_ptr_ = weak_factory_.GetWeakPtr();
544 first_output_surface_ = first_output_surface.Pass(); 565 first_output_surface_ = first_output_surface.Pass();
545 566
546 started_ = true; 567 started_ = true;
547 } 568 }
548 569
549 void ThreadProxy::Stop() { 570 void ThreadProxy::Stop() {
550 TRACE_EVENT0("cc", "ThreadProxy::Stop"); 571 TRACE_EVENT0("cc", "ThreadProxy::Stop");
551 DCHECK(IsMainThread()); 572 DCHECK(IsMainThread());
552 DCHECK(started_); 573 DCHECK(started_);
553 574
554 // Synchronously finishes pending GL operations and deletes the impl. 575 // Synchronously finishes pending GL operations and deletes the impl.
555 // The two steps are done as separate post tasks, so that tasks posted 576 // The two steps are done as separate post tasks, so that tasks posted
556 // by the GL implementation due to the Finish can be executed by the 577 // by the GL implementation due to the Finish can be executed by the
557 // renderer before shutting it down. 578 // renderer before shutting it down.
558 { 579 {
559 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 580 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
560 581
561 CompletionEvent completion; 582 CompletionEvent completion;
562 Proxy::ImplThread()->PostTask( 583 Proxy::ImplThreadTaskRunner()->PostTask(
584 FROM_HERE,
563 base::Bind(&ThreadProxy::FinishGLOnImplThread, 585 base::Bind(&ThreadProxy::FinishGLOnImplThread,
564 impl_thread_weak_ptr_, 586 impl_thread_weak_ptr_,
565 &completion)); 587 &completion));
566 completion.Wait(); 588 completion.Wait();
567 } 589 }
568 { 590 {
569 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 591 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
570 592
571 CompletionEvent completion; 593 CompletionEvent completion;
572 Proxy::ImplThread()->PostTask( 594 Proxy::ImplThreadTaskRunner()->PostTask(
595 FROM_HERE,
573 base::Bind(&ThreadProxy::LayerTreeHostClosedOnImplThread, 596 base::Bind(&ThreadProxy::LayerTreeHostClosedOnImplThread,
574 impl_thread_weak_ptr_, 597 impl_thread_weak_ptr_,
575 &completion)); 598 &completion));
576 completion.Wait(); 599 completion.Wait();
577 } 600 }
578 601
579 weak_factory_.InvalidateWeakPtrs(); 602 weak_factory_.InvalidateWeakPtrs();
580 603
581 DCHECK(!layer_tree_host_impl_.get()); // verify that the impl deleted. 604 DCHECK(!layer_tree_host_impl_.get()); // verify that the impl deleted.
582 layer_tree_host_ = NULL; 605 layer_tree_host_ = NULL;
583 started_ = false; 606 started_ = false;
584 } 607 }
585 608
586 void ThreadProxy::ForceSerializeOnSwapBuffers() { 609 void ThreadProxy::ForceSerializeOnSwapBuffers() {
587 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 610 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
588 CompletionEvent completion; 611 CompletionEvent completion;
589 Proxy::ImplThread()->PostTask( 612 Proxy::ImplThreadTaskRunner()->PostTask(
613 FROM_HERE,
590 base::Bind(&ThreadProxy::ForceSerializeOnSwapBuffersOnImplThread, 614 base::Bind(&ThreadProxy::ForceSerializeOnSwapBuffersOnImplThread,
591 impl_thread_weak_ptr_, 615 impl_thread_weak_ptr_,
592 &completion)); 616 &completion));
593 completion.Wait(); 617 completion.Wait();
594 } 618 }
595 619
596 void ThreadProxy::ForceSerializeOnSwapBuffersOnImplThread( 620 void ThreadProxy::ForceSerializeOnSwapBuffersOnImplThread(
597 CompletionEvent* completion) { 621 CompletionEvent* completion) {
598 if (layer_tree_host_impl_->renderer()) 622 if (layer_tree_host_impl_->renderer())
599 layer_tree_host_impl_->renderer()->DoNoOp(); 623 layer_tree_host_impl_->renderer()->DoNoOp();
(...skipping 11 matching lines...) Expand all
611 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionSendBeginFrameToMainThread"); 635 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionSendBeginFrameToMainThread");
612 scoped_ptr<BeginFrameAndCommitState> begin_frame_state( 636 scoped_ptr<BeginFrameAndCommitState> begin_frame_state(
613 new BeginFrameAndCommitState); 637 new BeginFrameAndCommitState);
614 begin_frame_state->monotonic_frame_begin_time = 638 begin_frame_state->monotonic_frame_begin_time =
615 layer_tree_host_impl_->CurrentPhysicalTimeTicks(); 639 layer_tree_host_impl_->CurrentPhysicalTimeTicks();
616 begin_frame_state->scroll_info = 640 begin_frame_state->scroll_info =
617 layer_tree_host_impl_->ProcessScrollDeltas(); 641 layer_tree_host_impl_->ProcessScrollDeltas();
618 DCHECK_GT(layer_tree_host_impl_->memory_allocation_limit_bytes(), 0u); 642 DCHECK_GT(layer_tree_host_impl_->memory_allocation_limit_bytes(), 0u);
619 begin_frame_state->memory_allocation_limit_bytes = 643 begin_frame_state->memory_allocation_limit_bytes =
620 layer_tree_host_impl_->memory_allocation_limit_bytes(); 644 layer_tree_host_impl_->memory_allocation_limit_bytes();
621 Proxy::MainThread()->PostTask( 645 Proxy::MainThreadTaskRunner()->PostTask(
646 FROM_HERE,
622 base::Bind(&ThreadProxy::BeginFrameOnMainThread, 647 base::Bind(&ThreadProxy::BeginFrameOnMainThread,
623 main_thread_weak_ptr_, 648 main_thread_weak_ptr_,
624 base::Passed(&begin_frame_state))); 649 base::Passed(&begin_frame_state)));
625 650
626 if (begin_frame_sent_to_main_thread_completion_event_on_impl_thread_) { 651 if (begin_frame_sent_to_main_thread_completion_event_on_impl_thread_) {
627 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_->Signal(); 652 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_->Signal();
628 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_ = NULL; 653 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_ = NULL;
629 } 654 }
630 } 655 }
631 656
(...skipping 25 matching lines...) Expand all
657 animate_requested_ = false; 682 animate_requested_ = false;
658 683
659 if (begin_frame_state) 684 if (begin_frame_state)
660 layer_tree_host_->ApplyScrollAndScale(*begin_frame_state->scroll_info); 685 layer_tree_host_->ApplyScrollAndScale(*begin_frame_state->scroll_info);
661 686
662 if (!in_composite_and_readback_ && !layer_tree_host_->visible()) { 687 if (!in_composite_and_readback_ && !layer_tree_host_->visible()) {
663 commit_requested_ = false; 688 commit_requested_ = false;
664 commit_request_sent_to_impl_thread_ = false; 689 commit_request_sent_to_impl_thread_ = false;
665 690
666 TRACE_EVENT0("cc", "EarlyOut_NotVisible"); 691 TRACE_EVENT0("cc", "EarlyOut_NotVisible");
667 Proxy::ImplThread()->PostTask(base::Bind( 692 Proxy::ImplThreadTaskRunner()->PostTask(
668 &ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread, 693 FROM_HERE,
669 impl_thread_weak_ptr_)); 694 base::Bind(&ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread,
695 impl_thread_weak_ptr_));
670 return; 696 return;
671 } 697 }
672 698
673 layer_tree_host_->WillBeginFrame(); 699 layer_tree_host_->WillBeginFrame();
674 700
675 if (begin_frame_state) { 701 if (begin_frame_state) {
676 layer_tree_host_->UpdateClientAnimations( 702 layer_tree_host_->UpdateClientAnimations(
677 begin_frame_state->monotonic_frame_begin_time); 703 begin_frame_state->monotonic_frame_begin_time);
678 layer_tree_host_->AnimateLayers( 704 layer_tree_host_->AnimateLayers(
679 begin_frame_state->monotonic_frame_begin_time); 705 begin_frame_state->monotonic_frame_begin_time);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 { 759 {
734 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnMainThread::commit"); 760 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnMainThread::commit");
735 761
736 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 762 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
737 763
738 RenderingStatsInstrumentation* stats_instrumentation = 764 RenderingStatsInstrumentation* stats_instrumentation =
739 layer_tree_host_->rendering_stats_instrumentation(); 765 layer_tree_host_->rendering_stats_instrumentation();
740 base::TimeTicks start_time = stats_instrumentation->StartRecording(); 766 base::TimeTicks start_time = stats_instrumentation->StartRecording();
741 767
742 CompletionEvent completion; 768 CompletionEvent completion;
743 Proxy::ImplThread()->PostTask( 769 Proxy::ImplThreadTaskRunner()->PostTask(
770 FROM_HERE,
744 base::Bind(&ThreadProxy::StartCommitOnImplThread, 771 base::Bind(&ThreadProxy::StartCommitOnImplThread,
745 impl_thread_weak_ptr_, 772 impl_thread_weak_ptr_,
746 &completion, 773 &completion,
747 queue.release(), 774 queue.release(),
748 offscreen_context_provider)); 775 offscreen_context_provider));
749 completion.Wait(); 776 completion.Wait();
750 777
751 base::TimeDelta duration = stats_instrumentation->EndRecording(start_time); 778 base::TimeDelta duration = stats_instrumentation->EndRecording(start_time);
752 stats_instrumentation->AddCommit(duration); 779 stats_instrumentation->AddCommit(duration);
753 } 780 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 821
795 layer_tree_host_->contents_texture_manager()-> 822 layer_tree_host_->contents_texture_manager()->
796 PushTexturePrioritiesToBackings(); 823 PushTexturePrioritiesToBackings();
797 } 824 }
798 825
799 commit_completion_event_on_impl_thread_ = completion; 826 commit_completion_event_on_impl_thread_ = completion;
800 if (layer_tree_host_impl_->resource_provider()) { 827 if (layer_tree_host_impl_->resource_provider()) {
801 current_resource_update_controller_on_impl_thread_ = 828 current_resource_update_controller_on_impl_thread_ =
802 ResourceUpdateController::Create( 829 ResourceUpdateController::Create(
803 this, 830 this,
804 Proxy::ImplThread()->TaskRunner(), 831 Proxy::ImplThreadTaskRunner(),
805 queue.Pass(), 832 queue.Pass(),
806 layer_tree_host_impl_->resource_provider()); 833 layer_tree_host_impl_->resource_provider());
807 current_resource_update_controller_on_impl_thread_->PerformMoreUpdates( 834 current_resource_update_controller_on_impl_thread_->PerformMoreUpdates(
808 scheduler_on_impl_thread_->AnticipatedDrawTime()); 835 scheduler_on_impl_thread_->AnticipatedDrawTime());
809 } else { 836 } else {
810 // Normally the ResourceUpdateController notifies when commit should 837 // Normally the ResourceUpdateController notifies when commit should
811 // finish, but in tile-free software rendering there is no resource 838 // finish, but in tile-free software rendering there is no resource
812 // update step so jump straight to the notification. 839 // update step so jump straight to the notification.
813 scheduler_on_impl_thread_->FinishCommit(); 840 scheduler_on_impl_thread_->FinishCommit();
814 } 841 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
870 } 897 }
871 898
872 void ThreadProxy::ScheduledActionActivatePendingTreeIfNeeded() { 899 void ThreadProxy::ScheduledActionActivatePendingTreeIfNeeded() {
873 DCHECK(IsImplThread()); 900 DCHECK(IsImplThread());
874 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionActivatePendingTreeIfNeeded"); 901 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionActivatePendingTreeIfNeeded");
875 layer_tree_host_impl_->ActivatePendingTreeIfNeeded(); 902 layer_tree_host_impl_->ActivatePendingTreeIfNeeded();
876 } 903 }
877 904
878 void ThreadProxy::ScheduledActionBeginOutputSurfaceCreation() { 905 void ThreadProxy::ScheduledActionBeginOutputSurfaceCreation() {
879 DCHECK(IsImplThread()); 906 DCHECK(IsImplThread());
880 Proxy::MainThread()->PostTask( 907 Proxy::MainThreadTaskRunner()->PostTask(
908 FROM_HERE,
881 base::Bind(&ThreadProxy::CreateAndInitializeOutputSurface, 909 base::Bind(&ThreadProxy::CreateAndInitializeOutputSurface,
882 main_thread_weak_ptr_)); 910 main_thread_weak_ptr_));
883 } 911 }
884 912
885 ScheduledActionDrawAndSwapResult 913 ScheduledActionDrawAndSwapResult
886 ThreadProxy::ScheduledActionDrawAndSwapInternal(bool forced_draw) { 914 ThreadProxy::ScheduledActionDrawAndSwapInternal(bool forced_draw) {
887 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionDrawAndSwap"); 915 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionDrawAndSwap");
888 916
889 ScheduledActionDrawAndSwapResult result; 917 ScheduledActionDrawAndSwapResult result;
890 result.did_draw = false; 918 result.did_draw = false;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 } else if (draw_frame) { 1001 } else if (draw_frame) {
974 result.did_swap = layer_tree_host_impl_->SwapBuffers(frame); 1002 result.did_swap = layer_tree_host_impl_->SwapBuffers(frame);
975 1003
976 if (frame.contains_incomplete_tile) 1004 if (frame.contains_incomplete_tile)
977 DidSwapUseIncompleteTileOnImplThread(); 1005 DidSwapUseIncompleteTileOnImplThread();
978 } 1006 }
979 1007
980 // Tell the main thread that the the newly-commited frame was drawn. 1008 // Tell the main thread that the the newly-commited frame was drawn.
981 if (next_frame_is_newly_committed_frame_on_impl_thread_) { 1009 if (next_frame_is_newly_committed_frame_on_impl_thread_) {
982 next_frame_is_newly_committed_frame_on_impl_thread_ = false; 1010 next_frame_is_newly_committed_frame_on_impl_thread_ = false;
983 Proxy::MainThread()->PostTask( 1011 Proxy::MainThreadTaskRunner()->PostTask(
1012 FROM_HERE,
984 base::Bind(&ThreadProxy::DidCommitAndDrawFrame, main_thread_weak_ptr_)); 1013 base::Bind(&ThreadProxy::DidCommitAndDrawFrame, main_thread_weak_ptr_));
985 } 1014 }
986 1015
987 if (draw_frame) { 1016 if (draw_frame) {
988 CheckOutputSurfaceStatusOnImplThread(); 1017 CheckOutputSurfaceStatusOnImplThread();
989 1018
990 base::TimeDelta draw_duration = base::TimeTicks::HighResNow() - start_time; 1019 base::TimeDelta draw_duration = base::TimeTicks::HighResNow() - start_time;
991 draw_duration_history_.InsertSample(draw_duration); 1020 draw_duration_history_.InsertSample(draw_duration);
992 base::TimeDelta draw_duration_overestimate; 1021 base::TimeDelta draw_duration_overestimate;
993 base::TimeDelta draw_duration_underestimate; 1022 base::TimeDelta draw_duration_underestimate;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 // previously committed frame that is still undrawn. This is necessary to 1057 // previously committed frame that is still undrawn. This is necessary to
1029 // ensure that the main thread does not monopolize access to the textures. 1058 // ensure that the main thread does not monopolize access to the textures.
1030 DCHECK(IsMainThread()); 1059 DCHECK(IsMainThread());
1031 1060
1032 if (textures_acquired_) 1061 if (textures_acquired_)
1033 return; 1062 return;
1034 1063
1035 TRACE_EVENT0("cc", "ThreadProxy::AcquireLayerTextures"); 1064 TRACE_EVENT0("cc", "ThreadProxy::AcquireLayerTextures");
1036 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 1065 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
1037 CompletionEvent completion; 1066 CompletionEvent completion;
1038 Proxy::ImplThread()->PostTask( 1067 Proxy::ImplThreadTaskRunner()->PostTask(
1068 FROM_HERE,
1039 base::Bind(&ThreadProxy::AcquireLayerTexturesForMainThreadOnImplThread, 1069 base::Bind(&ThreadProxy::AcquireLayerTexturesForMainThreadOnImplThread,
1040 impl_thread_weak_ptr_, 1070 impl_thread_weak_ptr_,
1041 &completion)); 1071 &completion));
1042 // Block until it is safe to write to layer textures from the main thread. 1072 // Block until it is safe to write to layer textures from the main thread.
1043 completion.Wait(); 1073 completion.Wait();
1044 1074
1045 textures_acquired_ = true; 1075 textures_acquired_ = true;
1046 } 1076 }
1047 1077
1048 void ThreadProxy::AcquireLayerTexturesForMainThreadOnImplThread( 1078 void ThreadProxy::AcquireLayerTexturesForMainThreadOnImplThread(
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1115 1145
1116 void ThreadProxy::CreateAndInitializeOutputSurface() { 1146 void ThreadProxy::CreateAndInitializeOutputSurface() {
1117 TRACE_EVENT0("cc", "ThreadProxy::CreateAndInitializeOutputSurface"); 1147 TRACE_EVENT0("cc", "ThreadProxy::CreateAndInitializeOutputSurface");
1118 DCHECK(IsMainThread()); 1148 DCHECK(IsMainThread());
1119 1149
1120 // Check that output surface has not been recreated by CompositeAndReadback 1150 // Check that output surface has not been recreated by CompositeAndReadback
1121 // after this task is posted but before it is run. 1151 // after this task is posted but before it is run.
1122 bool has_initialized_output_surface_on_impl_thread = true; 1152 bool has_initialized_output_surface_on_impl_thread = true;
1123 { 1153 {
1124 CompletionEvent completion; 1154 CompletionEvent completion;
1125 Proxy::ImplThread()->PostTask( 1155 Proxy::ImplThreadTaskRunner()->PostTask(
1156 FROM_HERE,
1126 base::Bind(&ThreadProxy::HasInitializedOutputSurfaceOnImplThread, 1157 base::Bind(&ThreadProxy::HasInitializedOutputSurfaceOnImplThread,
1127 impl_thread_weak_ptr_, 1158 impl_thread_weak_ptr_,
1128 &completion, 1159 &completion,
1129 &has_initialized_output_surface_on_impl_thread)); 1160 &has_initialized_output_surface_on_impl_thread));
1130 completion.Wait(); 1161 completion.Wait();
1131 } 1162 }
1132 if (has_initialized_output_surface_on_impl_thread) 1163 if (has_initialized_output_surface_on_impl_thread)
1133 return; 1164 return;
1134 1165
1135 layer_tree_host_->DidLoseOutputSurface(); 1166 layer_tree_host_->DidLoseOutputSurface();
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1241 1272
1242 ThreadProxy::BeginFrameAndCommitState::~BeginFrameAndCommitState() {} 1273 ThreadProxy::BeginFrameAndCommitState::~BeginFrameAndCommitState() {}
1243 1274
1244 scoped_ptr<base::Value> ThreadProxy::AsValue() const { 1275 scoped_ptr<base::Value> ThreadProxy::AsValue() const {
1245 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 1276 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
1246 1277
1247 CompletionEvent completion; 1278 CompletionEvent completion;
1248 { 1279 {
1249 DebugScopedSetMainThreadBlocked main_thread_blocked( 1280 DebugScopedSetMainThreadBlocked main_thread_blocked(
1250 const_cast<ThreadProxy*>(this)); 1281 const_cast<ThreadProxy*>(this));
1251 Proxy::ImplThread()->PostTask(base::Bind(&ThreadProxy::AsValueOnImplThread, 1282 Proxy::ImplThreadTaskRunner()->PostTask(
1252 impl_thread_weak_ptr_, 1283 FROM_HERE,
1253 &completion, 1284 base::Bind(&ThreadProxy::AsValueOnImplThread,
1254 state.get())); 1285 impl_thread_weak_ptr_,
1286 &completion,
1287 state.get()));
1255 completion.Wait(); 1288 completion.Wait();
1256 } 1289 }
1257 return state.PassAs<base::Value>(); 1290 return state.PassAs<base::Value>();
1258 } 1291 }
1259 1292
1260 void ThreadProxy::AsValueOnImplThread(CompletionEvent* completion, 1293 void ThreadProxy::AsValueOnImplThread(CompletionEvent* completion,
1261 base::DictionaryValue* state) const { 1294 base::DictionaryValue* state) const {
1262 state->Set("layer_tree_host_impl", 1295 state->Set("layer_tree_host_impl",
1263 layer_tree_host_impl_->AsValue().release()); 1296 layer_tree_host_impl_->AsValue().release());
1264 completion->Signal(); 1297 completion->Signal();
1265 } 1298 }
1266 1299
1267 bool ThreadProxy::CommitPendingForTesting() { 1300 bool ThreadProxy::CommitPendingForTesting() {
1268 DCHECK(IsMainThread()); 1301 DCHECK(IsMainThread());
1269 CommitPendingRequest commit_pending_request; 1302 CommitPendingRequest commit_pending_request;
1270 { 1303 {
1271 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 1304 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
1272 Proxy::ImplThread()->PostTask( 1305 Proxy::ImplThreadTaskRunner()->PostTask(
1306 FROM_HERE,
1273 base::Bind(&ThreadProxy::CommitPendingOnImplThreadForTesting, 1307 base::Bind(&ThreadProxy::CommitPendingOnImplThreadForTesting,
1274 impl_thread_weak_ptr_, 1308 impl_thread_weak_ptr_,
1275 &commit_pending_request)); 1309 &commit_pending_request));
1276 commit_pending_request.completion.Wait(); 1310 commit_pending_request.completion.Wait();
1277 } 1311 }
1278 return commit_pending_request.commit_pending; 1312 return commit_pending_request.commit_pending;
1279 } 1313 }
1280 1314
1281 void ThreadProxy::CommitPendingOnImplThreadForTesting( 1315 void ThreadProxy::CommitPendingOnImplThreadForTesting(
1282 CommitPendingRequest* request) { 1316 CommitPendingRequest* request) {
1283 DCHECK(IsImplThread()); 1317 DCHECK(IsImplThread());
1284 if (layer_tree_host_impl_->output_surface()) 1318 if (layer_tree_host_impl_->output_surface())
1285 request->commit_pending = scheduler_on_impl_thread_->CommitPending(); 1319 request->commit_pending = scheduler_on_impl_thread_->CommitPending();
1286 else 1320 else
1287 request->commit_pending = false; 1321 request->commit_pending = false;
1288 request->completion.Signal(); 1322 request->completion.Signal();
1289 } 1323 }
1290 1324
1291 std::string ThreadProxy::SchedulerStateAsStringForTesting() { 1325 std::string ThreadProxy::SchedulerStateAsStringForTesting() {
1292 if (IsImplThread()) 1326 if (IsImplThread())
1293 return scheduler_on_impl_thread_->StateAsStringForTesting(); 1327 return scheduler_on_impl_thread_->StateAsStringForTesting();
1294 1328
1295 SchedulerStateRequest scheduler_state_request; 1329 SchedulerStateRequest scheduler_state_request;
1296 { 1330 {
1297 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 1331 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
1298 Proxy::ImplThread()->PostTask( 1332 Proxy::ImplThreadTaskRunner()->PostTask(
1333 FROM_HERE,
1299 base::Bind(&ThreadProxy::SchedulerStateAsStringOnImplThreadForTesting, 1334 base::Bind(&ThreadProxy::SchedulerStateAsStringOnImplThreadForTesting,
1300 impl_thread_weak_ptr_, 1335 impl_thread_weak_ptr_,
1301 &scheduler_state_request)); 1336 &scheduler_state_request));
1302 scheduler_state_request.completion.Wait(); 1337 scheduler_state_request.completion.Wait();
1303 } 1338 }
1304 return scheduler_state_request.state; 1339 return scheduler_state_request.state;
1305 } 1340 }
1306 1341
1307 void ThreadProxy::SchedulerStateAsStringOnImplThreadForTesting( 1342 void ThreadProxy::SchedulerStateAsStringOnImplThreadForTesting(
1308 SchedulerStateRequest* request) { 1343 SchedulerStateRequest* request) {
1309 DCHECK(IsImplThread()); 1344 DCHECK(IsImplThread());
1310 request->state = scheduler_on_impl_thread_->StateAsStringForTesting(); 1345 request->state = scheduler_on_impl_thread_->StateAsStringForTesting();
1311 request->completion.Signal(); 1346 request->completion.Signal();
1312 } 1347 }
1313 1348
1314 skia::RefPtr<SkPicture> ThreadProxy::CapturePicture() { 1349 skia::RefPtr<SkPicture> ThreadProxy::CapturePicture() {
1315 DCHECK(IsMainThread()); 1350 DCHECK(IsMainThread());
1316 CompletionEvent completion; 1351 CompletionEvent completion;
1317 skia::RefPtr<SkPicture> picture; 1352 skia::RefPtr<SkPicture> picture;
1318 { 1353 {
1319 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 1354 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
1320 Proxy::ImplThread()->PostTask( 1355 Proxy::ImplThreadTaskRunner()->PostTask(
1356 FROM_HERE,
1321 base::Bind(&ThreadProxy::CapturePictureOnImplThread, 1357 base::Bind(&ThreadProxy::CapturePictureOnImplThread,
1322 impl_thread_weak_ptr_, 1358 impl_thread_weak_ptr_,
1323 &completion, 1359 &completion,
1324 &picture)); 1360 &picture));
1325 completion.Wait(); 1361 completion.Wait();
1326 } 1362 }
1327 return picture; 1363 return picture;
1328 } 1364 }
1329 1365
1330 void ThreadProxy::CapturePictureOnImplThread(CompletionEvent* completion, 1366 void ThreadProxy::CapturePictureOnImplThread(CompletionEvent* completion,
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1374 1410
1375 base::TimeDelta delay = smoothness_takes_priority_expiration_time_ - now; 1411 base::TimeDelta delay = smoothness_takes_priority_expiration_time_ - now;
1376 1412
1377 // Need to make sure a delayed task is posted when we have smoothness 1413 // Need to make sure a delayed task is posted when we have smoothness
1378 // takes priority expiration time in the future. 1414 // takes priority expiration time in the future.
1379 if (delay <= base::TimeDelta()) 1415 if (delay <= base::TimeDelta())
1380 return; 1416 return;
1381 if (renew_tree_priority_on_impl_thread_pending_) 1417 if (renew_tree_priority_on_impl_thread_pending_)
1382 return; 1418 return;
1383 1419
1384 Proxy::ImplThread()->PostDelayedTask( 1420 Proxy::ImplThreadTaskRunner()->PostDelayedTask(
1421 FROM_HERE,
1385 base::Bind(&ThreadProxy::RenewTreePriorityOnImplThread, 1422 base::Bind(&ThreadProxy::RenewTreePriorityOnImplThread,
1386 weak_factory_on_impl_thread_.GetWeakPtr()), 1423 weak_factory_on_impl_thread_.GetWeakPtr()),
1387 delay); 1424 delay);
1388 1425
1389 renew_tree_priority_on_impl_thread_pending_ = true; 1426 renew_tree_priority_on_impl_thread_pending_ = true;
1390 } 1427 }
1391 1428
1392 void ThreadProxy::RenewTreePriorityOnImplThread() { 1429 void ThreadProxy::RenewTreePriorityOnImplThread() {
1393 DCHECK(renew_tree_priority_on_impl_thread_pending_); 1430 DCHECK(renew_tree_priority_on_impl_thread_pending_);
1394 renew_tree_priority_on_impl_thread_pending_ = false; 1431 renew_tree_priority_on_impl_thread_pending_ = false;
1395 1432
1396 RenewTreePriority(); 1433 RenewTreePriority();
1397 } 1434 }
1398 1435
1399 void ThreadProxy::RequestScrollbarAnimationOnImplThread(base::TimeDelta delay) { 1436 void ThreadProxy::RequestScrollbarAnimationOnImplThread(base::TimeDelta delay) {
1400 Proxy::ImplThread()->PostDelayedTask( 1437 Proxy::ImplThreadTaskRunner()->PostDelayedTask(
1438 FROM_HERE,
1401 base::Bind(&ThreadProxy::StartScrollbarAnimationOnImplThread, 1439 base::Bind(&ThreadProxy::StartScrollbarAnimationOnImplThread,
1402 impl_thread_weak_ptr_), 1440 impl_thread_weak_ptr_),
1403 delay); 1441 delay);
1404 } 1442 }
1405 1443
1406 void ThreadProxy::StartScrollbarAnimationOnImplThread() { 1444 void ThreadProxy::StartScrollbarAnimationOnImplThread() {
1407 layer_tree_host_impl_->StartScrollbarAnimation(); 1445 layer_tree_host_impl_->StartScrollbarAnimation();
1408 } 1446 }
1409 1447
1410 void ThreadProxy::DidActivatePendingTree() { 1448 void ThreadProxy::DidActivatePendingTree() {
1411 DCHECK(IsImplThread()); 1449 DCHECK(IsImplThread());
1412 TRACE_EVENT0("cc", "ThreadProxy::DidActivatePendingTreeOnImplThread"); 1450 TRACE_EVENT0("cc", "ThreadProxy::DidActivatePendingTreeOnImplThread");
1413 1451
1414 if (completion_event_for_commit_held_on_tree_activation_ && 1452 if (completion_event_for_commit_held_on_tree_activation_ &&
1415 !layer_tree_host_impl_->pending_tree()) { 1453 !layer_tree_host_impl_->pending_tree()) {
1416 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", 1454 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation",
1417 TRACE_EVENT_SCOPE_THREAD); 1455 TRACE_EVENT_SCOPE_THREAD);
1418 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); 1456 DCHECK(layer_tree_host_impl_->settings().impl_side_painting);
1419 completion_event_for_commit_held_on_tree_activation_->Signal(); 1457 completion_event_for_commit_held_on_tree_activation_->Signal();
1420 completion_event_for_commit_held_on_tree_activation_ = NULL; 1458 completion_event_for_commit_held_on_tree_activation_ = NULL;
1421 } 1459 }
1422 } 1460 }
1423 1461
1424 } // namespace cc 1462 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/thread_proxy.h ('k') | cc/trees/tree_synchronizer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698