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" | |
44 #include "cc/surfaces/direct_compositor_frame_sink.h" | 43 #include "cc/surfaces/direct_compositor_frame_sink.h" |
45 #include "cc/surfaces/display.h" | 44 #include "cc/surfaces/display.h" |
46 #include "cc/surfaces/display_scheduler.h" | 45 #include "cc/surfaces/display_scheduler.h" |
47 #include "cc/trees/layer_tree_host_in_process.h" | 46 #include "cc/trees/layer_tree_host_in_process.h" |
48 #include "cc/trees/layer_tree_settings.h" | 47 #include "cc/trees/layer_tree_settings.h" |
49 #include "components/display_compositor/compositor_overlay_candidate_validator_a
ndroid.h" | 48 #include "components/display_compositor/compositor_overlay_candidate_validator_a
ndroid.h" |
50 #include "components/display_compositor/gl_helper.h" | 49 #include "components/display_compositor/gl_helper.h" |
51 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" | 50 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" |
52 #include "content/browser/gpu/compositor_util.h" | 51 #include "content/browser/gpu/compositor_util.h" |
53 #include "content/browser/renderer_host/context_provider_factory_impl_android.h" | 52 #include "content/browser/renderer_host/context_provider_factory_impl_android.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 // -1. | 130 // -1. |
132 attributes.alpha_size = 0; | 131 attributes.alpha_size = 0; |
133 attributes.red_size = 5; | 132 attributes.red_size = 5; |
134 attributes.green_size = 6; | 133 attributes.green_size = 6; |
135 attributes.blue_size = 5; | 134 attributes.blue_size = 5; |
136 } | 135 } |
137 | 136 |
138 return attributes; | 137 return attributes; |
139 } | 138 } |
140 | 139 |
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 | |
213 class AndroidOutputSurface : public cc::OutputSurface { | 140 class AndroidOutputSurface : public cc::OutputSurface { |
214 public: | 141 public: |
215 explicit AndroidOutputSurface( | 142 explicit AndroidOutputSurface( |
216 scoped_refptr<ui::ContextProviderCommandBuffer> context_provider) | 143 scoped_refptr<ui::ContextProviderCommandBuffer> context_provider) |
217 : cc::OutputSurface(std::move(context_provider)), | 144 : cc::OutputSurface(std::move(context_provider)), |
218 overlay_candidate_validator_( | 145 overlay_candidate_validator_( |
219 new display_compositor:: | 146 new display_compositor:: |
220 CompositorOverlayCandidateValidatorAndroid()), | 147 CompositorOverlayCandidateValidatorAndroid()), |
221 weak_ptr_factory_(this) { | 148 weak_ptr_factory_(this) { |
222 capabilities_.max_frames_pending = kMaxDisplaySwapBuffers; | 149 capabilities_.max_frames_pending = kMaxDisplaySwapBuffers; |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 resource_manager_(root_window), | 326 resource_manager_(root_window), |
400 device_scale_factor_(1), | 327 device_scale_factor_(1), |
401 window_(NULL), | 328 window_(NULL), |
402 surface_handle_(gpu::kNullSurfaceHandle), | 329 surface_handle_(gpu::kNullSurfaceHandle), |
403 client_(client), | 330 client_(client), |
404 root_window_(root_window), | 331 root_window_(root_window), |
405 needs_animate_(false), | 332 needs_animate_(false), |
406 pending_swapbuffers_(0U), | 333 pending_swapbuffers_(0U), |
407 num_successive_context_creation_failures_(0), | 334 num_successive_context_creation_failures_(0), |
408 compositor_frame_sink_request_pending_(false), | 335 compositor_frame_sink_request_pending_(false), |
409 needs_begin_frames_(false), | |
410 weak_factory_(this) { | 336 weak_factory_(this) { |
411 ui::ContextProviderFactory::GetInstance() | 337 ui::ContextProviderFactory::GetInstance() |
412 ->GetSurfaceManager() | 338 ->GetSurfaceManager() |
413 ->RegisterFrameSinkId(frame_sink_id_); | 339 ->RegisterFrameSinkId(frame_sink_id_); |
414 DCHECK(client); | 340 DCHECK(client); |
415 DCHECK(root_window); | 341 DCHECK(root_window); |
416 DCHECK(root_window->GetLayer() == nullptr); | 342 DCHECK(root_window->GetLayer() == nullptr); |
417 root_window->SetLayer(cc::Layer::Create()); | 343 root_window->SetLayer(cc::Layer::Create()); |
418 readback_layer_tree_ = cc::Layer::Create(); | 344 readback_layer_tree_ = cc::Layer::Create(); |
419 readback_layer_tree_->SetHideLayerAndSubtree(true); | 345 readback_layer_tree_->SetHideLayerAndSubtree(true); |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 | 645 |
720 if (context_provider) { | 646 if (context_provider) { |
721 gpu_capabilities_ = context_provider->ContextCapabilities(); | 647 gpu_capabilities_ = context_provider->ContextCapabilities(); |
722 } else { | 648 } else { |
723 // TODO(danakj): Populate gpu_capabilities_ for VulkanContextProvider. | 649 // TODO(danakj): Populate gpu_capabilities_ for VulkanContextProvider. |
724 } | 650 } |
725 | 651 |
726 cc::SurfaceManager* manager = | 652 cc::SurfaceManager* manager = |
727 ui::ContextProviderFactory::GetInstance()->GetSurfaceManager(); | 653 ui::ContextProviderFactory::GetInstance()->GetSurfaceManager(); |
728 auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); | 654 auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); |
729 begin_frame_source_.reset(new ExternalBeginFrameSource(this)); | |
730 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( | 655 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( |
731 task_runner, display_output_surface->capabilities().max_frames_pending)); | 656 task_runner, display_output_surface->capabilities().max_frames_pending)); |
732 | 657 |
733 display_.reset(new cc::Display( | 658 display_.reset(new cc::Display( |
734 HostSharedBitmapManager::current(), | 659 HostSharedBitmapManager::current(), |
735 BrowserGpuMemoryBufferManager::current(), | 660 BrowserGpuMemoryBufferManager::current(), |
736 host_->GetSettings().renderer_settings, frame_sink_id_, | 661 host_->GetSettings().renderer_settings, frame_sink_id_, |
737 begin_frame_source_.get(), std::move(display_output_surface), | 662 root_window_->GetBeginFrameSource(), std::move(display_output_surface), |
738 std::move(scheduler), | 663 std::move(scheduler), |
739 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner))); | 664 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner))); |
740 | 665 |
741 auto compositor_frame_sink = | 666 auto compositor_frame_sink = |
742 vulkan_context_provider | 667 vulkan_context_provider |
743 ? base::MakeUnique<cc::DirectCompositorFrameSink>( | 668 ? base::MakeUnique<cc::DirectCompositorFrameSink>( |
744 frame_sink_id_, manager, display_.get(), | 669 frame_sink_id_, manager, display_.get(), |
745 vulkan_context_provider) | 670 vulkan_context_provider) |
746 : base::MakeUnique<cc::DirectCompositorFrameSink>( | 671 : base::MakeUnique<cc::DirectCompositorFrameSink>( |
747 frame_sink_id_, manager, display_.get(), context_provider, | 672 frame_sink_id_, manager, display_.get(), context_provider, |
748 nullptr, BrowserGpuMemoryBufferManager::current(), | 673 nullptr, BrowserGpuMemoryBufferManager::current(), |
749 HostSharedBitmapManager::current()); | 674 HostSharedBitmapManager::current()); |
750 | 675 |
751 display_->SetVisible(true); | 676 display_->SetVisible(true); |
752 display_->Resize(size_); | 677 display_->Resize(size_); |
753 host_->SetCompositorFrameSink(std::move(compositor_frame_sink)); | 678 host_->SetCompositorFrameSink(std::move(compositor_frame_sink)); |
754 } | 679 } |
755 | 680 |
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 | |
764 cc::UIResourceId CompositorImpl::CreateUIResource( | 681 cc::UIResourceId CompositorImpl::CreateUIResource( |
765 cc::UIResourceClient* client) { | 682 cc::UIResourceClient* client) { |
766 TRACE_EVENT0("compositor", "CompositorImpl::CreateUIResource"); | 683 TRACE_EVENT0("compositor", "CompositorImpl::CreateUIResource"); |
767 return host_->GetUIResourceManager()->CreateUIResource(client); | 684 return host_->GetUIResourceManager()->CreateUIResource(client); |
768 } | 685 } |
769 | 686 |
770 void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { | 687 void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { |
771 TRACE_EVENT0("compositor", "CompositorImpl::DeleteUIResource"); | 688 TRACE_EVENT0("compositor", "CompositorImpl::DeleteUIResource"); |
772 host_->GetUIResourceManager()->DeleteUIResource(resource_id); | 689 host_->GetUIResourceManager()->DeleteUIResource(resource_id); |
773 } | 690 } |
(...skipping 25 matching lines...) Expand all Loading... |
799 | 716 |
800 void CompositorImpl::AttachLayerForReadback(scoped_refptr<cc::Layer> layer) { | 717 void CompositorImpl::AttachLayerForReadback(scoped_refptr<cc::Layer> layer) { |
801 readback_layer_tree_->AddChild(layer); | 718 readback_layer_tree_->AddChild(layer); |
802 } | 719 } |
803 | 720 |
804 void CompositorImpl::RequestCopyOfOutputOnRootLayer( | 721 void CompositorImpl::RequestCopyOfOutputOnRootLayer( |
805 std::unique_ptr<cc::CopyOutputRequest> request) { | 722 std::unique_ptr<cc::CopyOutputRequest> request) { |
806 root_window_->GetLayer()->RequestCopyOfOutput(std::move(request)); | 723 root_window_->GetLayer()->RequestCopyOfOutput(std::move(request)); |
807 } | 724 } |
808 | 725 |
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 | |
826 void CompositorImpl::SetNeedsAnimate() { | 726 void CompositorImpl::SetNeedsAnimate() { |
827 needs_animate_ = true; | 727 needs_animate_ = true; |
828 if (!host_->IsVisible()) | 728 if (!host_->IsVisible()) |
829 return; | 729 return; |
830 | 730 |
831 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); | 731 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); |
832 host_->SetNeedsAnimate(); | 732 host_->SetNeedsAnimate(); |
833 } | 733 } |
834 | 734 |
835 cc::FrameSinkId CompositorImpl::GetFrameSinkId() { | 735 cc::FrameSinkId CompositorImpl::GetFrameSinkId() { |
836 return frame_sink_id_; | 736 return frame_sink_id_; |
837 } | 737 } |
838 | 738 |
839 bool CompositorImpl::HavePendingReadbacks() { | 739 bool CompositorImpl::HavePendingReadbacks() { |
840 return !readback_layer_tree_->children().empty(); | 740 return !readback_layer_tree_->children().empty(); |
841 } | 741 } |
842 | 742 |
843 } // namespace content | 743 } // namespace content |
OLD | NEW |