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

Side by Side Diff: content/browser/renderer_host/compositor_impl_android.cc

Issue 2564403002: [android] Make RWHVAndroid a BeginFrameObserver. (Closed)
Patch Set: rebase Created 3 years, 12 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
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698