Chromium Code Reviews| 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> |
| 11 #include <utility> | 11 #include <utility> |
| 12 | 12 |
| 13 #include "base/android/jni_android.h" | 13 #include "base/android/jni_android.h" |
| 14 #include "base/android/scoped_java_ref.h" | 14 #include "base/android/scoped_java_ref.h" |
| 15 #include "base/auto_reset.h" | 15 #include "base/auto_reset.h" |
| 16 #include "base/bind.h" | 16 #include "base/bind.h" |
| 17 #include "base/cancelable_callback.h" | |
| 18 #include "base/command_line.h" | 17 #include "base/command_line.h" |
| 19 #include "base/containers/hash_tables.h" | 18 #include "base/containers/hash_tables.h" |
| 20 #include "base/lazy_instance.h" | 19 #include "base/lazy_instance.h" |
| 21 #include "base/logging.h" | 20 #include "base/logging.h" |
| 22 #include "base/memory/ptr_util.h" | 21 #include "base/memory/ptr_util.h" |
| 23 #include "base/memory/weak_ptr.h" | 22 #include "base/memory/weak_ptr.h" |
| 24 #include "base/single_thread_task_runner.h" | 23 #include "base/single_thread_task_runner.h" |
| 25 #include "base/synchronization/lock.h" | 24 #include "base/synchronization/lock.h" |
| 26 #include "base/sys_info.h" | 25 #include "base/sys_info.h" |
| 27 #include "base/threading/simple_thread.h" | 26 #include "base/threading/simple_thread.h" |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 206 last_begin_frame_args_ = | 205 last_begin_frame_args_ = |
| 207 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, | 206 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
| 208 vsync_period, cc::BeginFrameArgs::NORMAL); | 207 vsync_period, cc::BeginFrameArgs::NORMAL); |
| 209 std::unordered_set<cc::BeginFrameObserver*> observers(observers_); | 208 std::unordered_set<cc::BeginFrameObserver*> observers(observers_); |
| 210 for (auto* obs : observers) | 209 for (auto* obs : observers) |
| 211 obs->OnBeginFrame(last_begin_frame_args_); | 210 obs->OnBeginFrame(last_begin_frame_args_); |
| 212 } | 211 } |
| 213 | 212 |
| 214 class AndroidOutputSurface : public cc::OutputSurface { | 213 class AndroidOutputSurface : public cc::OutputSurface { |
| 215 public: | 214 public: |
| 216 AndroidOutputSurface( | 215 explicit AndroidOutputSurface( |
| 217 scoped_refptr<ContextProviderCommandBuffer> context_provider, | 216 scoped_refptr<ContextProviderCommandBuffer> context_provider) |
| 218 const base::Callback<void(gpu::Capabilities)>& | |
| 219 populate_gpu_capabilities_callback) | |
| 220 : cc::OutputSurface(std::move(context_provider)), | 217 : cc::OutputSurface(std::move(context_provider)), |
| 221 populate_gpu_capabilities_callback_(populate_gpu_capabilities_callback), | |
| 222 swap_buffers_completion_callback_( | |
| 223 base::Bind(&AndroidOutputSurface::OnSwapBuffersCompleted, | |
| 224 base::Unretained(this))), | |
| 225 overlay_candidate_validator_( | 218 overlay_candidate_validator_( |
| 226 new display_compositor:: | 219 new display_compositor:: |
| 227 CompositorOverlayCandidateValidatorAndroid()) { | 220 CompositorOverlayCandidateValidatorAndroid()), |
| 221 weak_ptr_factory_(this) { | |
| 228 capabilities_.max_frames_pending = kMaxDisplaySwapBuffers; | 222 capabilities_.max_frames_pending = kMaxDisplaySwapBuffers; |
| 229 } | 223 } |
| 230 | 224 |
| 231 ~AndroidOutputSurface() override = default; | 225 ~AndroidOutputSurface() override = default; |
| 232 | 226 |
| 233 void SwapBuffers(cc::OutputSurfaceFrame frame) override { | 227 void SwapBuffers(cc::OutputSurfaceFrame frame) override { |
| 234 GetCommandBufferProxy()->SetLatencyInfo(frame.latency_info); | 228 GetCommandBufferProxy()->SetLatencyInfo(frame.latency_info); |
| 235 if (frame.sub_buffer_rect.IsEmpty()) { | 229 if (frame.sub_buffer_rect.IsEmpty()) { |
| 236 context_provider_->ContextSupport()->CommitOverlayPlanes(); | 230 context_provider_->ContextSupport()->CommitOverlayPlanes(); |
| 237 } else { | 231 } else { |
| 238 DCHECK(frame.sub_buffer_rect == gfx::Rect(frame.size)); | 232 DCHECK(frame.sub_buffer_rect == gfx::Rect(frame.size)); |
| 239 context_provider_->ContextSupport()->Swap(); | 233 context_provider_->ContextSupport()->Swap(); |
| 240 } | 234 } |
| 241 } | 235 } |
| 242 | 236 |
| 243 bool BindToClient(cc::OutputSurfaceClient* client) override { | 237 void BindToClient(cc::OutputSurfaceClient* client) override { |
| 244 if (!OutputSurface::BindToClient(client)) | 238 DCHECK(client); |
| 245 return false; | 239 DCHECK(!client_); |
| 246 | 240 client_ = client; |
| 247 GetCommandBufferProxy()->SetSwapBuffersCompletionCallback( | 241 GetCommandBufferProxy()->SetSwapBuffersCompletionCallback( |
| 248 swap_buffers_completion_callback_.callback()); | 242 base::Bind(&AndroidOutputSurface::OnSwapBuffersCompleted, |
| 249 | 243 weak_ptr_factory_.GetWeakPtr())); |
| 250 populate_gpu_capabilities_callback_.Run( | |
| 251 context_provider_->ContextCapabilities()); | |
| 252 return true; | |
| 253 } | 244 } |
| 254 | 245 |
| 255 void EnsureBackbuffer() override {} | 246 void EnsureBackbuffer() override {} |
| 256 | 247 |
| 257 void DiscardBackbuffer() override { | 248 void DiscardBackbuffer() override { |
| 258 context_provider()->ContextGL()->DiscardBackbufferCHROMIUM(); | 249 context_provider()->ContextGL()->DiscardBackbufferCHROMIUM(); |
| 259 } | 250 } |
| 260 | 251 |
| 261 void BindFramebuffer() override { | 252 void BindFramebuffer() override { |
| 262 context_provider()->ContextGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); | 253 context_provider()->ContextGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 298 | 289 |
| 299 void OnSwapBuffersCompleted( | 290 void OnSwapBuffersCompleted( |
| 300 const std::vector<ui::LatencyInfo>& latency_info, | 291 const std::vector<ui::LatencyInfo>& latency_info, |
| 301 gfx::SwapResult result, | 292 gfx::SwapResult result, |
| 302 const gpu::GpuProcessHostedCALayerTreeParamsMac* params_mac) { | 293 const gpu::GpuProcessHostedCALayerTreeParamsMac* params_mac) { |
| 303 RenderWidgetHostImpl::CompositorFrameDrawn(latency_info); | 294 RenderWidgetHostImpl::CompositorFrameDrawn(latency_info); |
| 304 client_->DidReceiveSwapBuffersAck(); | 295 client_->DidReceiveSwapBuffersAck(); |
| 305 } | 296 } |
| 306 | 297 |
| 307 private: | 298 private: |
| 308 base::Callback<void(gpu::Capabilities)> populate_gpu_capabilities_callback_; | 299 cc::OutputSurfaceClient* client_ = nullptr; |
| 309 base::CancelableCallback<void( | |
| 310 const std::vector<ui::LatencyInfo>&, | |
| 311 gfx::SwapResult, | |
| 312 const gpu::GpuProcessHostedCALayerTreeParamsMac* params_mac)> | |
| 313 swap_buffers_completion_callback_; | |
| 314 std::unique_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator_; | 300 std::unique_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator_; |
| 301 base::WeakPtrFactory<AndroidOutputSurface> weak_ptr_factory_; | |
|
piman
2016/10/25 00:47:44
I /think/ it's not necessary because AndroidOutput
danakj
2016/10/25 00:50:19
Ya I agree, but refptrs scare me.
| |
| 315 }; | 302 }; |
| 316 | 303 |
| 317 #if defined(ENABLE_VULKAN) | 304 #if defined(ENABLE_VULKAN) |
| 318 class VulkanOutputSurface : public cc::OutputSurface { | 305 class VulkanOutputSurface : public cc::OutputSurface { |
| 319 public: | 306 public: |
| 320 explicit VulkanOutputSurface( | 307 explicit VulkanOutputSurface( |
| 321 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, | 308 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, |
| 322 scoped_refptr<base::SingleThreadTaskRunner> task_runner) | 309 scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
| 323 : OutputSurface(std::move(vulkan_context_provider)), | 310 : OutputSurface(std::move(vulkan_context_provider)), |
| 324 task_runner_(std::move(task_runner)), | 311 task_runner_(std::move(task_runner)), |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 692 ->CreateDisplayContextProvider( | 679 ->CreateDisplayContextProvider( |
| 693 surface_handle_, GetCompositorContextSharedMemoryLimits(), | 680 surface_handle_, GetCompositorContextSharedMemoryLimits(), |
| 694 GetCompositorContextAttributes(has_transparent_background_), | 681 GetCompositorContextAttributes(has_transparent_background_), |
| 695 false /*support_locking*/, false /*automatic_flushes*/, | 682 false /*support_locking*/, false /*automatic_flushes*/, |
| 696 std::move(gpu_channel_host)); | 683 std::move(gpu_channel_host)); |
| 697 | 684 |
| 698 scoped_refptr<ContextProviderCommandBuffer> | 685 scoped_refptr<ContextProviderCommandBuffer> |
| 699 context_provider_command_buffer = | 686 context_provider_command_buffer = |
| 700 static_cast<ContextProviderCommandBuffer*>( | 687 static_cast<ContextProviderCommandBuffer*>( |
| 701 context_provider.get()); | 688 context_provider.get()); |
| 689 context_provider_command_buffer->BindToCurrentThread(); | |
| 690 gpu_capabilities_ = | |
| 691 context_provider_command_buffer->ContextCapabilities(); | |
| 692 | |
| 702 auto display_output_surface = base::MakeUnique<AndroidOutputSurface>( | 693 auto display_output_surface = base::MakeUnique<AndroidOutputSurface>( |
| 703 context_provider_command_buffer, | 694 std::move(context_provider_command_buffer)); |
| 704 base::Bind(&CompositorImpl::PopulateGpuCapabilities, | |
| 705 base::Unretained(this))); | |
| 706 InitializeDisplay(std::move(display_output_surface), nullptr, | 695 InitializeDisplay(std::move(display_output_surface), nullptr, |
| 707 std::move(context_provider)); | 696 std::move(context_provider)); |
| 708 break; | 697 break; |
| 709 } | 698 } |
| 710 } | 699 } |
| 711 | 700 |
| 712 void CompositorImpl::InitializeDisplay( | 701 void CompositorImpl::InitializeDisplay( |
| 713 std::unique_ptr<cc::OutputSurface> display_output_surface, | 702 std::unique_ptr<cc::OutputSurface> display_output_surface, |
| 714 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, | 703 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, |
| 715 scoped_refptr<cc::ContextProvider> context_provider) { | 704 scoped_refptr<cc::ContextProvider> context_provider) { |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 739 vulkan_context_provider) | 728 vulkan_context_provider) |
| 740 : base::MakeUnique<cc::DirectCompositorFrameSink>( | 729 : base::MakeUnique<cc::DirectCompositorFrameSink>( |
| 741 frame_sink_id_, manager, display_.get(), | 730 frame_sink_id_, manager, display_.get(), |
| 742 context_provider, nullptr); | 731 context_provider, nullptr); |
| 743 | 732 |
| 744 display_->SetVisible(true); | 733 display_->SetVisible(true); |
| 745 display_->Resize(size_); | 734 display_->Resize(size_); |
| 746 host_->SetCompositorFrameSink(std::move(compositor_frame_sink)); | 735 host_->SetCompositorFrameSink(std::move(compositor_frame_sink)); |
| 747 } | 736 } |
| 748 | 737 |
| 749 void CompositorImpl::PopulateGpuCapabilities( | |
| 750 gpu::Capabilities gpu_capabilities) { | |
| 751 gpu_capabilities_ = gpu_capabilities; | |
| 752 } | |
| 753 | |
| 754 void CompositorImpl::AddObserver(VSyncObserver* observer) { | 738 void CompositorImpl::AddObserver(VSyncObserver* observer) { |
| 755 observer_list_.AddObserver(observer); | 739 observer_list_.AddObserver(observer); |
| 756 } | 740 } |
| 757 | 741 |
| 758 void CompositorImpl::RemoveObserver(VSyncObserver* observer) { | 742 void CompositorImpl::RemoveObserver(VSyncObserver* observer) { |
| 759 observer_list_.RemoveObserver(observer); | 743 observer_list_.RemoveObserver(observer); |
| 760 } | 744 } |
| 761 | 745 |
| 762 cc::UIResourceId CompositorImpl::CreateUIResource( | 746 cc::UIResourceId CompositorImpl::CreateUIResource( |
| 763 cc::UIResourceClient* client) { | 747 cc::UIResourceClient* client) { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 832 | 816 |
| 833 cc::FrameSinkId CompositorImpl::GetFrameSinkId() { | 817 cc::FrameSinkId CompositorImpl::GetFrameSinkId() { |
| 834 return frame_sink_id_; | 818 return frame_sink_id_; |
| 835 } | 819 } |
| 836 | 820 |
| 837 bool CompositorImpl::HavePendingReadbacks() { | 821 bool CompositorImpl::HavePendingReadbacks() { |
| 838 return !readback_layer_tree_->children().empty(); | 822 return !readback_layer_tree_->children().empty(); |
| 839 } | 823 } |
| 840 | 824 |
| 841 } // namespace content | 825 } // namespace content |
| OLD | NEW |