| OLD | NEW |
| 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/single_thread_proxy.h" | 5 #include "cc/trees/single_thread_proxy.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "cc/base/thread.h" | 9 #include "cc/base/thread.h" |
| 10 #include "cc/output/context_provider.h" | 10 #include "cc/output/context_provider.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 TRACE_EVENT0("cc", "SingleThreadProxy::~SingleThreadProxy"); | 48 TRACE_EVENT0("cc", "SingleThreadProxy::~SingleThreadProxy"); |
| 49 DCHECK(Proxy::IsMainThread()); | 49 DCHECK(Proxy::IsMainThread()); |
| 50 DCHECK(!layer_tree_host_impl_.get() && | 50 DCHECK(!layer_tree_host_impl_.get() && |
| 51 !layer_tree_host_); // make sure Stop() got called. | 51 !layer_tree_host_); // make sure Stop() got called. |
| 52 } | 52 } |
| 53 | 53 |
| 54 bool SingleThreadProxy::CompositeAndReadback(void* pixels, gfx::Rect rect) { | 54 bool SingleThreadProxy::CompositeAndReadback(void* pixels, gfx::Rect rect) { |
| 55 TRACE_EVENT0("cc", "SingleThreadProxy::CompositeAndReadback"); | 55 TRACE_EVENT0("cc", "SingleThreadProxy::CompositeAndReadback"); |
| 56 DCHECK(Proxy::IsMainThread()); | 56 DCHECK(Proxy::IsMainThread()); |
| 57 | 57 |
| 58 if (!CommitAndComposite(base::TimeTicks::Now())) | 58 gfx::Rect device_viewport_damage_rect = rect; |
| 59 |
| 60 LayerTreeHostImpl::FrameData frame; |
| 61 if (!CommitAndComposite(base::TimeTicks::Now(), |
| 62 device_viewport_damage_rect, |
| 63 &frame)) |
| 59 return false; | 64 return false; |
| 60 | 65 |
| 61 { | 66 { |
| 62 DebugScopedSetImplThread impl(this); | 67 DebugScopedSetImplThread impl(this); |
| 63 layer_tree_host_impl_->Readback(pixels, rect); | 68 layer_tree_host_impl_->Readback(pixels, rect); |
| 64 | 69 |
| 65 if (layer_tree_host_impl_->IsContextLost()) | 70 if (layer_tree_host_impl_->IsContextLost()) |
| 66 return false; | 71 return false; |
| 67 | 72 |
| 68 layer_tree_host_impl_->SwapBuffers(); | 73 layer_tree_host_impl_->SwapBuffers(frame); |
| 69 } | 74 } |
| 70 DidSwapFrame(); | 75 DidSwapFrame(); |
| 71 | 76 |
| 72 return true; | 77 return true; |
| 73 } | 78 } |
| 74 | 79 |
| 75 void SingleThreadProxy::StartPageScaleAnimation(gfx::Vector2d target_offset, | 80 void SingleThreadProxy::StartPageScaleAnimation(gfx::Vector2d target_offset, |
| 76 bool use_anchor, | 81 bool use_anchor, |
| 77 float scale, | 82 float scale, |
| 78 base::TimeDelta duration) { | 83 base::TimeDelta duration) { |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 bool SingleThreadProxy::IsInsideDraw() { return inside_draw_; } | 332 bool SingleThreadProxy::IsInsideDraw() { return inside_draw_; } |
| 328 | 333 |
| 329 void SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() { | 334 void SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() { |
| 330 // Cause a commit so we can notice the lost context. | 335 // Cause a commit so we can notice the lost context. |
| 331 SetNeedsCommitOnImplThread(); | 336 SetNeedsCommitOnImplThread(); |
| 332 } | 337 } |
| 333 | 338 |
| 334 // Called by the legacy scheduling path (e.g. where render_widget does the | 339 // Called by the legacy scheduling path (e.g. where render_widget does the |
| 335 // scheduling) | 340 // scheduling) |
| 336 void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) { | 341 void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) { |
| 337 if (CommitAndComposite(frame_begin_time)) { | 342 gfx::Rect device_viewport_damage_rect; |
| 338 layer_tree_host_impl_->SwapBuffers(); | 343 |
| 344 LayerTreeHostImpl::FrameData frame; |
| 345 if (CommitAndComposite(frame_begin_time, |
| 346 device_viewport_damage_rect, |
| 347 &frame)) { |
| 348 layer_tree_host_impl_->SwapBuffers(frame); |
| 339 DidSwapFrame(); | 349 DidSwapFrame(); |
| 340 } | 350 } |
| 341 } | 351 } |
| 342 | 352 |
| 343 scoped_ptr<base::Value> SingleThreadProxy::AsValue() const { | 353 scoped_ptr<base::Value> SingleThreadProxy::AsValue() const { |
| 344 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 354 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
| 345 { | 355 { |
| 346 // The following line casts away const modifiers because it is just | 356 // The following line casts away const modifiers because it is just |
| 347 // setting debug state. We still want the AsValue() function and its | 357 // setting debug state. We still want the AsValue() function and its |
| 348 // call chain to be const throughout. | 358 // call chain to be const throughout. |
| 349 DebugScopedSetImplThread impl(const_cast<SingleThreadProxy*>(this)); | 359 DebugScopedSetImplThread impl(const_cast<SingleThreadProxy*>(this)); |
| 350 | 360 |
| 351 state->Set("layer_tree_host_impl", | 361 state->Set("layer_tree_host_impl", |
| 352 layer_tree_host_impl_->AsValue().release()); | 362 layer_tree_host_impl_->AsValue().release()); |
| 353 } | 363 } |
| 354 return state.PassAs<base::Value>(); | 364 return state.PassAs<base::Value>(); |
| 355 } | 365 } |
| 356 | 366 |
| 357 void SingleThreadProxy::ForceSerializeOnSwapBuffers() { | 367 void SingleThreadProxy::ForceSerializeOnSwapBuffers() { |
| 358 { | 368 { |
| 359 DebugScopedSetImplThread impl(this); | 369 DebugScopedSetImplThread impl(this); |
| 360 if (renderer_initialized_) | 370 if (renderer_initialized_) |
| 361 layer_tree_host_impl_->renderer()->DoNoOp(); | 371 layer_tree_host_impl_->renderer()->DoNoOp(); |
| 362 } | 372 } |
| 363 } | 373 } |
| 364 | 374 |
| 365 void SingleThreadProxy::OnSwapBuffersCompleteOnImplThread() { NOTREACHED(); } | 375 void SingleThreadProxy::OnSwapBuffersCompleteOnImplThread() { NOTREACHED(); } |
| 366 | 376 |
| 367 bool SingleThreadProxy::CommitAndComposite(base::TimeTicks frame_begin_time) { | 377 bool SingleThreadProxy::CommitAndComposite( |
| 378 base::TimeTicks frame_begin_time, |
| 379 gfx::Rect device_viewport_damage_rect, |
| 380 LayerTreeHostImpl::FrameData* frame) { |
| 368 DCHECK(Proxy::IsMainThread()); | 381 DCHECK(Proxy::IsMainThread()); |
| 369 | 382 |
| 370 if (!layer_tree_host_->InitializeRendererIfNeeded()) | 383 if (!layer_tree_host_->InitializeRendererIfNeeded()) |
| 371 return false; | 384 return false; |
| 372 | 385 |
| 373 scoped_refptr<cc::ContextProvider> offscreen_context_provider; | 386 scoped_refptr<cc::ContextProvider> offscreen_context_provider; |
| 374 if (renderer_capabilities_for_main_thread_.using_offscreen_context3d && | 387 if (renderer_capabilities_for_main_thread_.using_offscreen_context3d && |
| 375 layer_tree_host_->needs_offscreen_context()) { | 388 layer_tree_host_->needs_offscreen_context()) { |
| 376 offscreen_context_provider = | 389 offscreen_context_provider = |
| 377 layer_tree_host_->client()->OffscreenContextProviderForMainThread(); | 390 layer_tree_host_->client()->OffscreenContextProviderForMainThread(); |
| 378 if (offscreen_context_provider) | 391 if (offscreen_context_provider) |
| 379 created_offscreen_context_provider_ = true; | 392 created_offscreen_context_provider_ = true; |
| 380 } | 393 } |
| 381 | 394 |
| 382 layer_tree_host_->contents_texture_manager()->UnlinkAndClearEvictedBackings(); | 395 layer_tree_host_->contents_texture_manager()->UnlinkAndClearEvictedBackings(); |
| 383 | 396 |
| 384 scoped_ptr<ResourceUpdateQueue> queue = | 397 scoped_ptr<ResourceUpdateQueue> queue = |
| 385 make_scoped_ptr(new ResourceUpdateQueue); | 398 make_scoped_ptr(new ResourceUpdateQueue); |
| 386 layer_tree_host_->UpdateLayers( | 399 layer_tree_host_->UpdateLayers( |
| 387 queue.get(), layer_tree_host_impl_->memory_allocation_limit_bytes()); | 400 queue.get(), layer_tree_host_impl_->memory_allocation_limit_bytes()); |
| 388 | 401 |
| 389 layer_tree_host_->WillCommit(); | 402 layer_tree_host_->WillCommit(); |
| 390 DoCommit(queue.Pass()); | 403 DoCommit(queue.Pass()); |
| 391 bool result = DoComposite(offscreen_context_provider, frame_begin_time); | 404 bool result = DoComposite(offscreen_context_provider, |
| 405 frame_begin_time, |
| 406 device_viewport_damage_rect, |
| 407 frame); |
| 392 layer_tree_host_->DidBeginFrame(); | 408 layer_tree_host_->DidBeginFrame(); |
| 393 return result; | 409 return result; |
| 394 } | 410 } |
| 395 | 411 |
| 396 bool SingleThreadProxy::DoComposite( | 412 bool SingleThreadProxy::DoComposite( |
| 397 scoped_refptr<cc::ContextProvider> offscreen_context_provider, | 413 scoped_refptr<cc::ContextProvider> offscreen_context_provider, |
| 398 base::TimeTicks frame_begin_time) { | 414 base::TimeTicks frame_begin_time, |
| 415 gfx::Rect device_viewport_damage_rect, |
| 416 LayerTreeHostImpl::FrameData* frame) { |
| 399 DCHECK(!output_surface_lost_); | 417 DCHECK(!output_surface_lost_); |
| 400 { | 418 { |
| 401 DebugScopedSetImplThread impl(this); | 419 DebugScopedSetImplThread impl(this); |
| 402 base::AutoReset<bool> mark_inside(&inside_draw_, true); | 420 base::AutoReset<bool> mark_inside(&inside_draw_, true); |
| 403 | 421 |
| 404 layer_tree_host_impl_->resource_provider()-> | 422 layer_tree_host_impl_->resource_provider()-> |
| 405 set_offscreen_context_provider(offscreen_context_provider); | 423 set_offscreen_context_provider(offscreen_context_provider); |
| 406 | 424 |
| 407 if (!layer_tree_host_impl_->visible()) | 425 if (!layer_tree_host_impl_->visible()) |
| 408 return false; | 426 return false; |
| 409 | 427 |
| 410 layer_tree_host_impl_->Animate(base::TimeTicks::Now(), base::Time::Now()); | 428 layer_tree_host_impl_->Animate(base::TimeTicks::Now(), base::Time::Now()); |
| 411 | 429 |
| 412 // We guard prepareToDraw() with canDraw() because it always returns a valid | 430 // We guard prepareToDraw() with canDraw() because it always returns a valid |
| 413 // frame, so can only be used when such a frame is possible. Since | 431 // frame, so can only be used when such a frame is possible. Since |
| 414 // drawLayers() depends on the result of prepareToDraw(), it is guarded on | 432 // drawLayers() depends on the result of prepareToDraw(), it is guarded on |
| 415 // canDraw() as well. | 433 // canDraw() as well. |
| 416 if (!layer_tree_host_impl_->CanDraw()) | 434 if (!layer_tree_host_impl_->CanDraw()) |
| 417 return false; | 435 return false; |
| 418 | 436 |
| 419 LayerTreeHostImpl::FrameData frame; | 437 layer_tree_host_impl_->PrepareToDraw(frame, device_viewport_damage_rect); |
| 420 layer_tree_host_impl_->PrepareToDraw(&frame); | 438 layer_tree_host_impl_->DrawLayers(frame, frame_begin_time); |
| 421 layer_tree_host_impl_->DrawLayers(&frame, frame_begin_time); | 439 layer_tree_host_impl_->DidDrawAllLayers(*frame); |
| 422 layer_tree_host_impl_->DidDrawAllLayers(frame); | |
| 423 output_surface_lost_ = layer_tree_host_impl_->IsContextLost(); | 440 output_surface_lost_ = layer_tree_host_impl_->IsContextLost(); |
| 424 | 441 |
| 425 layer_tree_host_impl_->BeginNextFrame(); | 442 layer_tree_host_impl_->BeginNextFrame(); |
| 426 } | 443 } |
| 427 | 444 |
| 428 if (output_surface_lost_) { | 445 if (output_surface_lost_) { |
| 429 cc::ContextProvider* offscreen_contexts = layer_tree_host_impl_-> | 446 cc::ContextProvider* offscreen_contexts = layer_tree_host_impl_-> |
| 430 resource_provider()->offscreen_context_provider(); | 447 resource_provider()->offscreen_context_provider(); |
| 431 if (offscreen_contexts) | 448 if (offscreen_contexts) |
| 432 offscreen_contexts->VerifyContexts(); | 449 offscreen_contexts->VerifyContexts(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 446 | 463 |
| 447 bool SingleThreadProxy::CommitPendingForTesting() { return false; } | 464 bool SingleThreadProxy::CommitPendingForTesting() { return false; } |
| 448 | 465 |
| 449 skia::RefPtr<SkPicture> SingleThreadProxy::CapturePicture() { | 466 skia::RefPtr<SkPicture> SingleThreadProxy::CapturePicture() { |
| 450 // Impl-side painting only. | 467 // Impl-side painting only. |
| 451 NOTREACHED(); | 468 NOTREACHED(); |
| 452 return skia::RefPtr<SkPicture>(); | 469 return skia::RefPtr<SkPicture>(); |
| 453 } | 470 } |
| 454 | 471 |
| 455 } // namespace cc | 472 } // namespace cc |
| OLD | NEW |