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 22 matching lines...) Expand all Loading... |
33 #include "cc/layers/layer.h" | 33 #include "cc/layers/layer.h" |
34 #include "cc/output/compositor_frame.h" | 34 #include "cc/output/compositor_frame.h" |
35 #include "cc/output/context_provider.h" | 35 #include "cc/output/context_provider.h" |
36 #include "cc/output/output_surface.h" | 36 #include "cc/output/output_surface.h" |
37 #include "cc/output/output_surface_client.h" | 37 #include "cc/output/output_surface_client.h" |
38 #include "cc/output/output_surface_frame.h" | 38 #include "cc/output/output_surface_frame.h" |
39 #include "cc/output/texture_mailbox_deleter.h" | 39 #include "cc/output/texture_mailbox_deleter.h" |
40 #include "cc/output/vulkan_in_process_context_provider.h" | 40 #include "cc/output/vulkan_in_process_context_provider.h" |
41 #include "cc/raster/single_thread_task_graph_runner.h" | 41 #include "cc/raster/single_thread_task_graph_runner.h" |
42 #include "cc/resources/ui_resource_manager.h" | 42 #include "cc/resources/ui_resource_manager.h" |
| 43 #include "cc/scheduler/begin_frame_source.h" |
43 #include "cc/surfaces/direct_compositor_frame_sink.h" | 44 #include "cc/surfaces/direct_compositor_frame_sink.h" |
44 #include "cc/surfaces/display.h" | 45 #include "cc/surfaces/display.h" |
45 #include "cc/surfaces/display_scheduler.h" | 46 #include "cc/surfaces/display_scheduler.h" |
46 #include "cc/trees/layer_tree_host_in_process.h" | 47 #include "cc/trees/layer_tree_host_in_process.h" |
47 #include "cc/trees/layer_tree_settings.h" | 48 #include "cc/trees/layer_tree_settings.h" |
48 #include "components/display_compositor/compositor_overlay_candidate_validator_a
ndroid.h" | 49 #include "components/display_compositor/compositor_overlay_candidate_validator_a
ndroid.h" |
49 #include "components/display_compositor/gl_helper.h" | 50 #include "components/display_compositor/gl_helper.h" |
50 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" | 51 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" |
51 #include "content/browser/gpu/compositor_util.h" | 52 #include "content/browser/gpu/compositor_util.h" |
52 #include "content/browser/renderer_host/context_provider_factory_impl_android.h" | 53 #include "content/browser/renderer_host/context_provider_factory_impl_android.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 // -1. | 131 // -1. |
131 attributes.alpha_size = 0; | 132 attributes.alpha_size = 0; |
132 attributes.red_size = 5; | 133 attributes.red_size = 5; |
133 attributes.green_size = 6; | 134 attributes.green_size = 6; |
134 attributes.blue_size = 5; | 135 attributes.blue_size = 5; |
135 } | 136 } |
136 | 137 |
137 return attributes; | 138 return attributes; |
138 } | 139 } |
139 | 140 |
| 141 class ExternalBeginFrameSource : public cc::BeginFrameSource, |
| 142 public CompositorImpl::VSyncObserver { |
| 143 public: |
| 144 explicit ExternalBeginFrameSource(CompositorImpl* compositor) |
| 145 : compositor_(compositor) { |
| 146 compositor_->AddObserver(this); |
| 147 } |
| 148 ~ExternalBeginFrameSource() override { compositor_->RemoveObserver(this); } |
| 149 |
| 150 // cc::BeginFrameSource implementation. |
| 151 void AddObserver(cc::BeginFrameObserver* obs) override; |
| 152 void RemoveObserver(cc::BeginFrameObserver* obs) override; |
| 153 void DidFinishFrame(cc::BeginFrameObserver* obs, |
| 154 size_t remaining_frames) override {} |
| 155 bool IsThrottled() const override { return true; } |
| 156 |
| 157 // CompositorImpl::VSyncObserver implementation. |
| 158 void OnVSync(base::TimeTicks frame_time, |
| 159 base::TimeDelta vsync_period) override; |
| 160 |
| 161 private: |
| 162 CompositorImpl* const compositor_; |
| 163 std::unordered_set<cc::BeginFrameObserver*> observers_; |
| 164 cc::BeginFrameArgs last_begin_frame_args_; |
| 165 }; |
| 166 |
| 167 void ExternalBeginFrameSource::AddObserver(cc::BeginFrameObserver* obs) { |
| 168 DCHECK(obs); |
| 169 DCHECK(observers_.find(obs) == observers_.end()); |
| 170 |
| 171 observers_.insert(obs); |
| 172 obs->OnBeginFrameSourcePausedChanged(false); |
| 173 compositor_->OnNeedsBeginFramesChange(true); |
| 174 |
| 175 if (last_begin_frame_args_.IsValid()) { |
| 176 // Send a MISSED begin frame if necessary. |
| 177 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); |
| 178 if (!last_args.IsValid() || |
| 179 (last_begin_frame_args_.frame_time > last_args.frame_time)) { |
| 180 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; |
| 181 // TODO(crbug.com/602485): A deadline doesn't make too much sense |
| 182 // for a missed BeginFrame (the intention rather is 'immediately'), |
| 183 // but currently the retro frame logic is very strict in discarding |
| 184 // BeginFrames. |
| 185 last_begin_frame_args_.deadline = |
| 186 base::TimeTicks::Now() + last_begin_frame_args_.interval; |
| 187 obs->OnBeginFrame(last_begin_frame_args_); |
| 188 } |
| 189 } |
| 190 } |
| 191 |
| 192 void ExternalBeginFrameSource::RemoveObserver(cc::BeginFrameObserver* obs) { |
| 193 DCHECK(obs); |
| 194 DCHECK(observers_.find(obs) != observers_.end()); |
| 195 |
| 196 observers_.erase(obs); |
| 197 if (observers_.empty()) |
| 198 compositor_->OnNeedsBeginFramesChange(false); |
| 199 } |
| 200 |
| 201 void ExternalBeginFrameSource::OnVSync(base::TimeTicks frame_time, |
| 202 base::TimeDelta vsync_period) { |
| 203 // frame time is in the past, so give the next vsync period as the deadline. |
| 204 base::TimeTicks deadline = frame_time + vsync_period; |
| 205 last_begin_frame_args_ = |
| 206 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
| 207 vsync_period, cc::BeginFrameArgs::NORMAL); |
| 208 std::unordered_set<cc::BeginFrameObserver*> observers(observers_); |
| 209 for (auto* obs : observers) |
| 210 obs->OnBeginFrame(last_begin_frame_args_); |
| 211 } |
| 212 |
140 class AndroidOutputSurface : public cc::OutputSurface { | 213 class AndroidOutputSurface : public cc::OutputSurface { |
141 public: | 214 public: |
142 explicit AndroidOutputSurface( | 215 explicit AndroidOutputSurface( |
143 scoped_refptr<ContextProviderCommandBuffer> context_provider) | 216 scoped_refptr<ContextProviderCommandBuffer> context_provider) |
144 : cc::OutputSurface(std::move(context_provider)), | 217 : cc::OutputSurface(std::move(context_provider)), |
145 overlay_candidate_validator_( | 218 overlay_candidate_validator_( |
146 new display_compositor:: | 219 new display_compositor:: |
147 CompositorOverlayCandidateValidatorAndroid()), | 220 CompositorOverlayCandidateValidatorAndroid()), |
148 weak_ptr_factory_(this) { | 221 weak_ptr_factory_(this) { |
149 capabilities_.max_frames_pending = kMaxDisplaySwapBuffers; | 222 capabilities_.max_frames_pending = kMaxDisplaySwapBuffers; |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 resource_manager_(root_window), | 399 resource_manager_(root_window), |
327 device_scale_factor_(1), | 400 device_scale_factor_(1), |
328 window_(NULL), | 401 window_(NULL), |
329 surface_handle_(gpu::kNullSurfaceHandle), | 402 surface_handle_(gpu::kNullSurfaceHandle), |
330 client_(client), | 403 client_(client), |
331 root_window_(root_window), | 404 root_window_(root_window), |
332 needs_animate_(false), | 405 needs_animate_(false), |
333 pending_swapbuffers_(0U), | 406 pending_swapbuffers_(0U), |
334 num_successive_context_creation_failures_(0), | 407 num_successive_context_creation_failures_(0), |
335 compositor_frame_sink_request_pending_(false), | 408 compositor_frame_sink_request_pending_(false), |
| 409 needs_begin_frames_(false), |
336 weak_factory_(this) { | 410 weak_factory_(this) { |
337 ui::ContextProviderFactory::GetInstance() | 411 ui::ContextProviderFactory::GetInstance() |
338 ->GetSurfaceManager() | 412 ->GetSurfaceManager() |
339 ->RegisterFrameSinkId(frame_sink_id_); | 413 ->RegisterFrameSinkId(frame_sink_id_); |
340 DCHECK(client); | 414 DCHECK(client); |
341 DCHECK(root_window); | 415 DCHECK(root_window); |
342 DCHECK(root_window->GetLayer() == nullptr); | 416 DCHECK(root_window->GetLayer() == nullptr); |
343 root_window->SetLayer(cc::Layer::Create()); | 417 root_window->SetLayer(cc::Layer::Create()); |
344 readback_layer_tree_ = cc::Layer::Create(); | 418 readback_layer_tree_ = cc::Layer::Create(); |
345 readback_layer_tree_->SetHideLayerAndSubtree(true); | 419 readback_layer_tree_->SetHideLayerAndSubtree(true); |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 | 719 |
646 if (context_provider) { | 720 if (context_provider) { |
647 gpu_capabilities_ = context_provider->ContextCapabilities(); | 721 gpu_capabilities_ = context_provider->ContextCapabilities(); |
648 } else { | 722 } else { |
649 // TODO(danakj): Populate gpu_capabilities_ for VulkanContextProvider. | 723 // TODO(danakj): Populate gpu_capabilities_ for VulkanContextProvider. |
650 } | 724 } |
651 | 725 |
652 cc::SurfaceManager* manager = | 726 cc::SurfaceManager* manager = |
653 ui::ContextProviderFactory::GetInstance()->GetSurfaceManager(); | 727 ui::ContextProviderFactory::GetInstance()->GetSurfaceManager(); |
654 auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); | 728 auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); |
| 729 begin_frame_source_.reset(new ExternalBeginFrameSource(this)); |
655 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( | 730 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( |
656 task_runner, display_output_surface->capabilities().max_frames_pending)); | 731 task_runner, display_output_surface->capabilities().max_frames_pending)); |
657 | 732 |
658 display_.reset(new cc::Display( | 733 display_.reset(new cc::Display( |
659 HostSharedBitmapManager::current(), | 734 HostSharedBitmapManager::current(), |
660 BrowserGpuMemoryBufferManager::current(), | 735 BrowserGpuMemoryBufferManager::current(), |
661 host_->GetSettings().renderer_settings, frame_sink_id_, | 736 host_->GetSettings().renderer_settings, frame_sink_id_, |
662 root_window_->GetBeginFrameSource(), std::move(display_output_surface), | 737 begin_frame_source_.get(), std::move(display_output_surface), |
663 std::move(scheduler), | 738 std::move(scheduler), |
664 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner))); | 739 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner))); |
665 | 740 |
666 auto compositor_frame_sink = | 741 auto compositor_frame_sink = |
667 vulkan_context_provider | 742 vulkan_context_provider |
668 ? base::MakeUnique<cc::DirectCompositorFrameSink>( | 743 ? base::MakeUnique<cc::DirectCompositorFrameSink>( |
669 frame_sink_id_, manager, display_.get(), | 744 frame_sink_id_, manager, display_.get(), |
670 vulkan_context_provider) | 745 vulkan_context_provider) |
671 : base::MakeUnique<cc::DirectCompositorFrameSink>( | 746 : base::MakeUnique<cc::DirectCompositorFrameSink>( |
672 frame_sink_id_, manager, display_.get(), context_provider, | 747 frame_sink_id_, manager, display_.get(), context_provider, |
673 nullptr, BrowserGpuMemoryBufferManager::current(), | 748 nullptr, BrowserGpuMemoryBufferManager::current(), |
674 HostSharedBitmapManager::current()); | 749 HostSharedBitmapManager::current()); |
675 | 750 |
676 display_->SetVisible(true); | 751 display_->SetVisible(true); |
677 display_->Resize(size_); | 752 display_->Resize(size_); |
678 host_->SetCompositorFrameSink(std::move(compositor_frame_sink)); | 753 host_->SetCompositorFrameSink(std::move(compositor_frame_sink)); |
679 } | 754 } |
680 | 755 |
| 756 void CompositorImpl::AddObserver(VSyncObserver* observer) { |
| 757 observer_list_.AddObserver(observer); |
| 758 } |
| 759 |
| 760 void CompositorImpl::RemoveObserver(VSyncObserver* observer) { |
| 761 observer_list_.RemoveObserver(observer); |
| 762 } |
| 763 |
681 cc::UIResourceId CompositorImpl::CreateUIResource( | 764 cc::UIResourceId CompositorImpl::CreateUIResource( |
682 cc::UIResourceClient* client) { | 765 cc::UIResourceClient* client) { |
683 TRACE_EVENT0("compositor", "CompositorImpl::CreateUIResource"); | 766 TRACE_EVENT0("compositor", "CompositorImpl::CreateUIResource"); |
684 return host_->GetUIResourceManager()->CreateUIResource(client); | 767 return host_->GetUIResourceManager()->CreateUIResource(client); |
685 } | 768 } |
686 | 769 |
687 void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { | 770 void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { |
688 TRACE_EVENT0("compositor", "CompositorImpl::DeleteUIResource"); | 771 TRACE_EVENT0("compositor", "CompositorImpl::DeleteUIResource"); |
689 host_->GetUIResourceManager()->DeleteUIResource(resource_id); | 772 host_->GetUIResourceManager()->DeleteUIResource(resource_id); |
690 } | 773 } |
(...skipping 25 matching lines...) Expand all Loading... |
716 | 799 |
717 void CompositorImpl::AttachLayerForReadback(scoped_refptr<cc::Layer> layer) { | 800 void CompositorImpl::AttachLayerForReadback(scoped_refptr<cc::Layer> layer) { |
718 readback_layer_tree_->AddChild(layer); | 801 readback_layer_tree_->AddChild(layer); |
719 } | 802 } |
720 | 803 |
721 void CompositorImpl::RequestCopyOfOutputOnRootLayer( | 804 void CompositorImpl::RequestCopyOfOutputOnRootLayer( |
722 std::unique_ptr<cc::CopyOutputRequest> request) { | 805 std::unique_ptr<cc::CopyOutputRequest> request) { |
723 root_window_->GetLayer()->RequestCopyOfOutput(std::move(request)); | 806 root_window_->GetLayer()->RequestCopyOfOutput(std::move(request)); |
724 } | 807 } |
725 | 808 |
| 809 void CompositorImpl::OnVSync(base::TimeTicks frame_time, |
| 810 base::TimeDelta vsync_period) { |
| 811 for (auto& observer : observer_list_) |
| 812 observer.OnVSync(frame_time, vsync_period); |
| 813 if (needs_begin_frames_) |
| 814 root_window_->RequestVSyncUpdate(); |
| 815 } |
| 816 |
| 817 void CompositorImpl::OnNeedsBeginFramesChange(bool needs_begin_frames) { |
| 818 if (needs_begin_frames_ == needs_begin_frames) |
| 819 return; |
| 820 |
| 821 needs_begin_frames_ = needs_begin_frames; |
| 822 if (needs_begin_frames_) |
| 823 root_window_->RequestVSyncUpdate(); |
| 824 } |
| 825 |
726 void CompositorImpl::SetNeedsAnimate() { | 826 void CompositorImpl::SetNeedsAnimate() { |
727 needs_animate_ = true; | 827 needs_animate_ = true; |
728 if (!host_->IsVisible()) | 828 if (!host_->IsVisible()) |
729 return; | 829 return; |
730 | 830 |
731 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); | 831 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); |
732 host_->SetNeedsAnimate(); | 832 host_->SetNeedsAnimate(); |
733 } | 833 } |
734 | 834 |
735 cc::FrameSinkId CompositorImpl::GetFrameSinkId() { | 835 cc::FrameSinkId CompositorImpl::GetFrameSinkId() { |
736 return frame_sink_id_; | 836 return frame_sink_id_; |
737 } | 837 } |
738 | 838 |
739 bool CompositorImpl::HavePendingReadbacks() { | 839 bool CompositorImpl::HavePendingReadbacks() { |
740 return !readback_layer_tree_->children().empty(); | 840 return !readback_layer_tree_->children().empty(); |
741 } | 841 } |
742 | 842 |
743 } // namespace content | 843 } // namespace content |
OLD | NEW |