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

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

Issue 2443003004: cc: Make OutputSurface::BindToClient pure virtual and not return bool (Closed)
Patch Set: bindtoclient-pure-virtual: . Created 4 years, 1 month 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>
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/renderer_host/compositor_impl_android.h ('k') | content/renderer/android/synchronous_compositor_frame_sink.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698