OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/browser/renderer_host/compositor_impl_android.h" | 5 #include "content/browser/renderer_host/compositor_impl_android.h" |
6 | 6 |
7 #include <android/bitmap.h> | 7 #include <android/bitmap.h> |
8 #include <android/native_window_jni.h> | 8 #include <android/native_window_jni.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 #include <unordered_set> | 10 #include <unordered_set> |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 g_shared_vulkan_context_provider_android_.Pointer(); | 358 g_shared_vulkan_context_provider_android_.Pointer(); |
359 if (!*context_provider) | 359 if (!*context_provider) |
360 *context_provider = cc::VulkanInProcessContextProvider::Create(); | 360 *context_provider = cc::VulkanInProcessContextProvider::Create(); |
361 return *context_provider; | 361 return *context_provider; |
362 } | 362 } |
363 return nullptr; | 363 return nullptr; |
364 } | 364 } |
365 | 365 |
366 CompositorImpl::CompositorImpl(CompositorClient* client, | 366 CompositorImpl::CompositorImpl(CompositorClient* client, |
367 gfx::NativeWindow root_window) | 367 gfx::NativeWindow root_window) |
368 : root_layer_(cc::Layer::Create()), | 368 : surface_id_allocator_(CreateSurfaceIdAllocator()), |
369 surface_id_allocator_(CreateSurfaceIdAllocator()), | |
370 resource_manager_(root_window), | 369 resource_manager_(root_window), |
371 has_transparent_background_(false), | 370 has_transparent_background_(false), |
372 device_scale_factor_(1), | 371 device_scale_factor_(1), |
373 window_(NULL), | 372 window_(NULL), |
374 surface_handle_(gpu::kNullSurfaceHandle), | 373 surface_handle_(gpu::kNullSurfaceHandle), |
375 client_(client), | 374 client_(client), |
376 root_window_(root_window), | 375 root_window_(root_window), |
377 needs_animate_(false), | 376 needs_animate_(false), |
378 pending_swapbuffers_(0U), | 377 pending_swapbuffers_(0U), |
379 num_successive_context_creation_failures_(0), | 378 num_successive_context_creation_failures_(0), |
380 output_surface_request_pending_(false), | 379 output_surface_request_pending_(false), |
381 needs_begin_frames_(false), | 380 needs_begin_frames_(false), |
382 weak_factory_(this) { | 381 weak_factory_(this) { |
383 DCHECK(client); | 382 DCHECK(client); |
384 DCHECK(root_window); | 383 DCHECK(root_window); |
| 384 root_window->SetLayer(cc::Layer::Create()); |
385 root_window->AttachCompositor(this); | 385 root_window->AttachCompositor(this); |
386 CreateLayerTreeHost(); | 386 CreateLayerTreeHost(); |
387 resource_manager_.Init(host_.get()); | 387 resource_manager_.Init(host_.get()); |
388 } | 388 } |
389 | 389 |
390 CompositorImpl::~CompositorImpl() { | 390 CompositorImpl::~CompositorImpl() { |
391 root_window_->DetachCompositor(); | 391 root_window_->DetachCompositor(); |
| 392 root_window_->SetLayer(nullptr); |
392 // Clean-up any surface references. | 393 // Clean-up any surface references. |
393 SetSurface(NULL); | 394 SetSurface(NULL); |
394 } | 395 } |
395 | 396 |
396 ui::UIResourceProvider& CompositorImpl::GetUIResourceProvider() { | 397 ui::UIResourceProvider& CompositorImpl::GetUIResourceProvider() { |
397 return *this; | 398 return *this; |
398 } | 399 } |
399 | 400 |
400 ui::ResourceManager& CompositorImpl::GetResourceManager() { | 401 ui::ResourceManager& CompositorImpl::GetResourceManager() { |
401 return resource_manager_; | 402 return resource_manager_; |
402 } | 403 } |
403 | 404 |
404 void CompositorImpl::SetRootLayer(scoped_refptr<cc::Layer> root_layer) { | 405 void CompositorImpl::SetRootLayer(scoped_refptr<cc::Layer> root_layer) { |
405 if (subroot_layer_.get()) { | 406 if (subroot_layer_.get()) { |
406 subroot_layer_->RemoveFromParent(); | 407 subroot_layer_->RemoveFromParent(); |
407 subroot_layer_ = NULL; | 408 subroot_layer_ = NULL; |
408 } | 409 } |
409 if (root_layer.get()) { | 410 if (root_window_->GetLayer()) { |
410 subroot_layer_ = root_layer; | 411 subroot_layer_ = root_window_->GetLayer(); |
411 root_layer_->AddChild(root_layer); | 412 root_window_->GetLayer()->AddChild(root_layer); |
412 } | 413 } |
413 } | 414 } |
414 | 415 |
415 void CompositorImpl::SetSurface(jobject surface) { | 416 void CompositorImpl::SetSurface(jobject surface) { |
416 JNIEnv* env = base::android::AttachCurrentThread(); | 417 JNIEnv* env = base::android::AttachCurrentThread(); |
417 base::android::ScopedJavaLocalRef<jobject> j_surface(env, surface); | 418 base::android::ScopedJavaLocalRef<jobject> j_surface(env, surface); |
418 | 419 |
419 GpuSurfaceTracker* tracker = GpuSurfaceTracker::Get(); | 420 GpuSurfaceTracker* tracker = GpuSurfaceTracker::Get(); |
420 | 421 |
421 if (window_) { | 422 if (window_) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 cc::LayerTreeHost::InitParams params; | 468 cc::LayerTreeHost::InitParams params; |
468 params.client = this; | 469 params.client = this; |
469 params.shared_bitmap_manager = HostSharedBitmapManager::current(); | 470 params.shared_bitmap_manager = HostSharedBitmapManager::current(); |
470 params.gpu_memory_buffer_manager = BrowserGpuMemoryBufferManager::current(); | 471 params.gpu_memory_buffer_manager = BrowserGpuMemoryBufferManager::current(); |
471 params.task_graph_runner = g_task_graph_runner.Pointer(); | 472 params.task_graph_runner = g_task_graph_runner.Pointer(); |
472 params.main_task_runner = base::ThreadTaskRunnerHandle::Get(); | 473 params.main_task_runner = base::ThreadTaskRunnerHandle::Get(); |
473 params.settings = &settings; | 474 params.settings = &settings; |
474 params.animation_host = cc::AnimationHost::CreateMainInstance(); | 475 params.animation_host = cc::AnimationHost::CreateMainInstance(); |
475 host_ = cc::LayerTreeHost::CreateSingleThreaded(this, ¶ms); | 476 host_ = cc::LayerTreeHost::CreateSingleThreaded(this, ¶ms); |
476 DCHECK(!host_->visible()); | 477 DCHECK(!host_->visible()); |
477 host_->SetRootLayer(root_layer_); | 478 host_->SetRootLayer(root_window_->GetLayer()); |
478 host_->set_surface_id_namespace(surface_id_allocator_->id_namespace()); | 479 host_->set_surface_id_namespace(surface_id_allocator_->id_namespace()); |
479 host_->SetViewportSize(size_); | 480 host_->SetViewportSize(size_); |
480 host_->set_has_transparent_background(has_transparent_background_); | 481 host_->set_has_transparent_background(has_transparent_background_); |
481 host_->SetDeviceScaleFactor(device_scale_factor_); | 482 host_->SetDeviceScaleFactor(device_scale_factor_); |
482 | 483 |
483 if (needs_animate_) | 484 if (needs_animate_) |
484 host_->SetNeedsAnimate(); | 485 host_->SetNeedsAnimate(); |
485 } | 486 } |
486 | 487 |
487 void CompositorImpl::SetVisible(bool visible) { | 488 void CompositorImpl::SetVisible(bool visible) { |
(...skipping 21 matching lines...) Expand all Loading... |
509 | 510 |
510 void CompositorImpl::SetWindowBounds(const gfx::Size& size) { | 511 void CompositorImpl::SetWindowBounds(const gfx::Size& size) { |
511 if (size_ == size) | 512 if (size_ == size) |
512 return; | 513 return; |
513 | 514 |
514 size_ = size; | 515 size_ = size; |
515 if (host_) | 516 if (host_) |
516 host_->SetViewportSize(size); | 517 host_->SetViewportSize(size); |
517 if (display_) | 518 if (display_) |
518 display_->Resize(size); | 519 display_->Resize(size); |
519 root_layer_->SetBounds(size); | 520 root_window_->GetLayer()->SetBounds(size); |
520 } | 521 } |
521 | 522 |
522 void CompositorImpl::SetHasTransparentBackground(bool flag) { | 523 void CompositorImpl::SetHasTransparentBackground(bool flag) { |
523 has_transparent_background_ = flag; | 524 has_transparent_background_ = flag; |
524 if (host_) | 525 if (host_) |
525 host_->set_has_transparent_background(flag); | 526 host_->set_has_transparent_background(flag); |
526 } | 527 } |
527 | 528 |
528 void CompositorImpl::SetNeedsComposite() { | 529 void CompositorImpl::SetNeedsComposite() { |
529 if (!host_->visible()) | 530 if (!host_->visible()) |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
773 host_->SetNeedsCommit(); | 774 host_->SetNeedsCommit(); |
774 client_->OnSwapBuffersCompleted(0); | 775 client_->OnSwapBuffersCompleted(0); |
775 } | 776 } |
776 | 777 |
777 void CompositorImpl::DidCommit() { | 778 void CompositorImpl::DidCommit() { |
778 root_window_->OnCompositingDidCommit(); | 779 root_window_->OnCompositingDidCommit(); |
779 } | 780 } |
780 | 781 |
781 void CompositorImpl::RequestCopyOfOutputOnRootLayer( | 782 void CompositorImpl::RequestCopyOfOutputOnRootLayer( |
782 std::unique_ptr<cc::CopyOutputRequest> request) { | 783 std::unique_ptr<cc::CopyOutputRequest> request) { |
783 root_layer_->RequestCopyOfOutput(std::move(request)); | 784 root_window_->GetLayer()->RequestCopyOfOutput(std::move(request)); |
784 } | 785 } |
785 | 786 |
786 void CompositorImpl::OnVSync(base::TimeTicks frame_time, | 787 void CompositorImpl::OnVSync(base::TimeTicks frame_time, |
787 base::TimeDelta vsync_period) { | 788 base::TimeDelta vsync_period) { |
788 FOR_EACH_OBSERVER(VSyncObserver, observer_list_, | 789 FOR_EACH_OBSERVER(VSyncObserver, observer_list_, |
789 OnVSync(frame_time, vsync_period)); | 790 OnVSync(frame_time, vsync_period)); |
790 if (needs_begin_frames_) | 791 if (needs_begin_frames_) |
791 root_window_->RequestVSyncUpdate(); | 792 root_window_->RequestVSyncUpdate(); |
792 } | 793 } |
793 | 794 |
794 void CompositorImpl::OnNeedsBeginFramesChange(bool needs_begin_frames) { | 795 void CompositorImpl::OnNeedsBeginFramesChange(bool needs_begin_frames) { |
795 if (needs_begin_frames_ == needs_begin_frames) | 796 if (needs_begin_frames_ == needs_begin_frames) |
796 return; | 797 return; |
797 | 798 |
798 needs_begin_frames_ = needs_begin_frames; | 799 needs_begin_frames_ = needs_begin_frames; |
799 if (needs_begin_frames_) | 800 if (needs_begin_frames_) |
800 root_window_->RequestVSyncUpdate(); | 801 root_window_->RequestVSyncUpdate(); |
801 } | 802 } |
802 | 803 |
803 void CompositorImpl::SetNeedsAnimate() { | 804 void CompositorImpl::SetNeedsAnimate() { |
804 needs_animate_ = true; | 805 needs_animate_ = true; |
805 if (!host_->visible()) | 806 if (!host_->visible()) |
806 return; | 807 return; |
807 | 808 |
808 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); | 809 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); |
809 host_->SetNeedsAnimate(); | 810 host_->SetNeedsAnimate(); |
810 } | 811 } |
811 | 812 |
812 } // namespace content | 813 } // namespace content |
OLD | NEW |