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_; | |
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(); | |
Khushal
2016/10/25 01:10:02
Btw, do we mean to do any fallbacks here? IIUC whe
Khushal
2016/10/25 01:28:35
Nvm, just remembered that the context with the Fra
danakj
2016/10/25 18:58:39
We don't check that the context is not dead-on-arr
Khushal
2016/10/25 20:45:06
Ohhh. Right CompositorFrameSink will still check t
| |
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 |