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 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 attributes.red_size = 5; | 179 attributes.red_size = 5; |
180 attributes.green_size = 6; | 180 attributes.green_size = 6; |
181 attributes.blue_size = 5; | 181 attributes.blue_size = 5; |
182 } | 182 } |
183 | 183 |
184 return attributes; | 184 return attributes; |
185 } | 185 } |
186 | 186 |
187 class AndroidOutputSurface : public cc::OutputSurface { | 187 class AndroidOutputSurface : public cc::OutputSurface { |
188 public: | 188 public: |
189 AndroidOutputSurface( | 189 explicit AndroidOutputSurface( |
190 scoped_refptr<ui::ContextProviderCommandBuffer> context_provider, | 190 scoped_refptr<ui::ContextProviderCommandBuffer> context_provider) |
191 base::Closure swap_buffers_callback) | |
192 : cc::OutputSurface(std::move(context_provider)), | 191 : cc::OutputSurface(std::move(context_provider)), |
193 swap_buffers_callback_(std::move(swap_buffers_callback)), | |
194 overlay_candidate_validator_( | 192 overlay_candidate_validator_( |
195 new display_compositor:: | 193 new display_compositor:: |
196 CompositorOverlayCandidateValidatorAndroid()), | 194 CompositorOverlayCandidateValidatorAndroid()), |
197 weak_ptr_factory_(this) { | 195 weak_ptr_factory_(this) { |
198 capabilities_.max_frames_pending = kMaxDisplaySwapBuffers; | 196 capabilities_.max_frames_pending = kMaxDisplaySwapBuffers; |
199 } | 197 } |
200 | 198 |
201 ~AndroidOutputSurface() override = default; | 199 ~AndroidOutputSurface() override = default; |
202 | 200 |
203 void SwapBuffers(cc::OutputSurfaceFrame frame) override { | 201 void SwapBuffers(cc::OutputSurfaceFrame frame) override { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 DCHECK(command_buffer_proxy); | 261 DCHECK(command_buffer_proxy); |
264 return command_buffer_proxy; | 262 return command_buffer_proxy; |
265 } | 263 } |
266 | 264 |
267 void OnSwapBuffersCompleted( | 265 void OnSwapBuffersCompleted( |
268 const std::vector<ui::LatencyInfo>& latency_info, | 266 const std::vector<ui::LatencyInfo>& latency_info, |
269 gfx::SwapResult result, | 267 gfx::SwapResult result, |
270 const gpu::GpuProcessHostedCALayerTreeParamsMac* params_mac) { | 268 const gpu::GpuProcessHostedCALayerTreeParamsMac* params_mac) { |
271 RenderWidgetHostImpl::CompositorFrameDrawn(latency_info); | 269 RenderWidgetHostImpl::CompositorFrameDrawn(latency_info); |
272 client_->DidReceiveSwapBuffersAck(); | 270 client_->DidReceiveSwapBuffersAck(); |
273 swap_buffers_callback_.Run(); | |
274 } | 271 } |
275 | 272 |
276 private: | 273 private: |
277 cc::OutputSurfaceClient* client_ = nullptr; | 274 cc::OutputSurfaceClient* client_ = nullptr; |
278 base::Closure swap_buffers_callback_; | |
279 std::unique_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator_; | 275 std::unique_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator_; |
280 base::WeakPtrFactory<AndroidOutputSurface> weak_ptr_factory_; | 276 base::WeakPtrFactory<AndroidOutputSurface> weak_ptr_factory_; |
281 }; | 277 }; |
282 | 278 |
283 #if defined(ENABLE_VULKAN) | 279 #if defined(ENABLE_VULKAN) |
284 class VulkanOutputSurface : public cc::OutputSurface { | 280 class VulkanOutputSurface : public cc::OutputSurface { |
285 public: | 281 public: |
286 explicit VulkanOutputSurface( | 282 explicit VulkanOutputSurface( |
287 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, | 283 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, |
288 scoped_refptr<base::SingleThreadTaskRunner> task_runner) | 284 scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 GetCompositorContextAttributes(has_transparent_background_), | 675 GetCompositorContextAttributes(has_transparent_background_), |
680 shared_context, | 676 shared_context, |
681 ui::command_buffer_metrics::DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT); | 677 ui::command_buffer_metrics::DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT); |
682 if (!context_provider->BindToCurrentThread()) { | 678 if (!context_provider->BindToCurrentThread()) { |
683 LOG(ERROR) << "Failed to init ContextProvider for compositor."; | 679 LOG(ERROR) << "Failed to init ContextProvider for compositor."; |
684 LOG_IF(FATAL, ++num_successive_context_creation_failures_ >= 2) | 680 LOG_IF(FATAL, ++num_successive_context_creation_failures_ >= 2) |
685 << "Too many context creation failures. Giving up... "; | 681 << "Too many context creation failures. Giving up... "; |
686 HandlePendingCompositorFrameSinkRequest(); | 682 HandlePendingCompositorFrameSinkRequest(); |
687 } | 683 } |
688 | 684 |
689 // Unretained is safe this owns cc::Display which owns OutputSurface. | 685 auto display_output_surface = |
690 InitializeDisplay( | 686 base::MakeUnique<AndroidOutputSurface>(context_provider); |
691 base::MakeUnique<AndroidOutputSurface>( | 687 InitializeDisplay(std::move(display_output_surface), nullptr, |
692 context_provider, | 688 std::move(context_provider)); |
693 base::Bind(&CompositorImpl::DidSwapBuffers, base::Unretained(this))), | |
694 nullptr, std::move(context_provider)); | |
695 } | 689 } |
696 | 690 |
697 void CompositorImpl::InitializeDisplay( | 691 void CompositorImpl::InitializeDisplay( |
698 std::unique_ptr<cc::OutputSurface> display_output_surface, | 692 std::unique_ptr<cc::OutputSurface> display_output_surface, |
699 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, | 693 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, |
700 scoped_refptr<cc::ContextProvider> context_provider) { | 694 scoped_refptr<cc::ContextProvider> context_provider) { |
701 DCHECK(compositor_frame_sink_request_pending_); | 695 DCHECK(compositor_frame_sink_request_pending_); |
702 | 696 |
703 pending_frames_ = 0; | 697 pending_frames_ = 0; |
704 num_successive_context_creation_failures_ = 0; | 698 num_successive_context_creation_failures_ = 0; |
(...skipping 25 matching lines...) Expand all Loading... |
730 : base::MakeUnique<cc::DirectCompositorFrameSink>( | 724 : base::MakeUnique<cc::DirectCompositorFrameSink>( |
731 frame_sink_id_, manager, display_.get(), context_provider, | 725 frame_sink_id_, manager, display_.get(), context_provider, |
732 nullptr, BrowserGpuMemoryBufferManager::current(), | 726 nullptr, BrowserGpuMemoryBufferManager::current(), |
733 HostSharedBitmapManager::current()); | 727 HostSharedBitmapManager::current()); |
734 | 728 |
735 display_->SetVisible(true); | 729 display_->SetVisible(true); |
736 display_->Resize(size_); | 730 display_->Resize(size_); |
737 host_->SetCompositorFrameSink(std::move(compositor_frame_sink)); | 731 host_->SetCompositorFrameSink(std::move(compositor_frame_sink)); |
738 } | 732 } |
739 | 733 |
740 void CompositorImpl::DidSwapBuffers() { | |
741 client_->DidSwapBuffers(); | |
742 } | |
743 | |
744 cc::UIResourceId CompositorImpl::CreateUIResource( | 734 cc::UIResourceId CompositorImpl::CreateUIResource( |
745 cc::UIResourceClient* client) { | 735 cc::UIResourceClient* client) { |
746 TRACE_EVENT0("compositor", "CompositorImpl::CreateUIResource"); | 736 TRACE_EVENT0("compositor", "CompositorImpl::CreateUIResource"); |
747 return host_->GetUIResourceManager()->CreateUIResource(client); | 737 return host_->GetUIResourceManager()->CreateUIResource(client); |
748 } | 738 } |
749 | 739 |
750 void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { | 740 void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { |
751 TRACE_EVENT0("compositor", "CompositorImpl::DeleteUIResource"); | 741 TRACE_EVENT0("compositor", "CompositorImpl::DeleteUIResource"); |
752 host_->GetUIResourceManager()->DeleteUIResource(resource_id); | 742 host_->GetUIResourceManager()->DeleteUIResource(resource_id); |
753 } | 743 } |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
818 } | 808 } |
819 GetSurfaceManager()->UnregisterFrameSinkHierarchy(frame_sink_id_, | 809 GetSurfaceManager()->UnregisterFrameSinkHierarchy(frame_sink_id_, |
820 frame_sink_id); | 810 frame_sink_id); |
821 } | 811 } |
822 | 812 |
823 bool CompositorImpl::HavePendingReadbacks() { | 813 bool CompositorImpl::HavePendingReadbacks() { |
824 return !readback_layer_tree_->children().empty(); | 814 return !readback_layer_tree_->children().empty(); |
825 } | 815 } |
826 | 816 |
827 } // namespace content | 817 } // namespace content |
OLD | NEW |