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

Side by Side Diff: content/renderer/gpu/renderer_compositor_frame_sink.cc

Issue 2903853002: Make RendererCompositorFrameSink derive from ClientCompositorFrameSink (Closed)
Patch Set: Fixed dependency Created 3 years, 7 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/renderer/gpu/renderer_compositor_frame_sink.h" 5 #include "content/renderer/gpu/renderer_compositor_frame_sink.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 17 matching lines...) Expand all
28 28
29 RendererCompositorFrameSink::RendererCompositorFrameSink( 29 RendererCompositorFrameSink::RendererCompositorFrameSink(
30 int32_t routing_id, 30 int32_t routing_id,
31 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source, 31 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source,
32 scoped_refptr<cc::ContextProvider> context_provider, 32 scoped_refptr<cc::ContextProvider> context_provider,
33 scoped_refptr<cc::ContextProvider> worker_context_provider, 33 scoped_refptr<cc::ContextProvider> worker_context_provider,
34 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, 34 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
35 cc::SharedBitmapManager* shared_bitmap_manager, 35 cc::SharedBitmapManager* shared_bitmap_manager,
36 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info, 36 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info,
37 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request, 37 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request,
38 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) 38 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue)
Fady Samuel 2017/05/26 12:00:18 why do we hold on to this if we don't use it anymo
Saman Sami 2017/05/26 14:32:36 Good catch. Let me get rid of this in a separate C
39 : CompositorFrameSink(std::move(context_provider), 39 : ClientCompositorFrameSink(std::move(context_provider),
40 std::move(worker_context_provider), 40 std::move(worker_context_provider),
41 gpu_memory_buffer_manager, 41 gpu_memory_buffer_manager,
42 shared_bitmap_manager), 42 shared_bitmap_manager,
43 std::move(synthetic_begin_frame_source),
44 std::move(sink_info),
45 std::move(sink_client_request),
46 false /* enable_surface_synchronization */),
43 compositor_frame_sink_filter_( 47 compositor_frame_sink_filter_(
44 RenderThreadImpl::current()->compositor_message_filter()), 48 RenderThreadImpl::current()->compositor_message_filter()),
45 message_sender_(RenderThreadImpl::current()->sync_message_filter()), 49 message_sender_(RenderThreadImpl::current()->sync_message_filter()),
46 frame_swap_message_queue_(swap_frame_message_queue), 50 frame_swap_message_queue_(swap_frame_message_queue),
47 synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)),
48 external_begin_frame_source_(
49 synthetic_begin_frame_source_
50 ? nullptr
51 : base::MakeUnique<cc::ExternalBeginFrameSource>(this)),
52 routing_id_(routing_id), 51 routing_id_(routing_id),
53 sink_info_(std::move(sink_info)), 52 sink_info_(std::move(sink_info)),
54 sink_client_request_(std::move(sink_client_request)), 53 sink_client_request_(std::move(sink_client_request)),
55 sink_client_binding_(this) { 54 sink_client_binding_(this) {
56 DCHECK(compositor_frame_sink_filter_); 55 DCHECK(compositor_frame_sink_filter_);
57 DCHECK(frame_swap_message_queue_); 56 DCHECK(frame_swap_message_queue_);
58 DCHECK(message_sender_); 57 DCHECK(message_sender_);
59 thread_checker_.DetachFromThread();
60 } 58 }
61 59
62 RendererCompositorFrameSink::RendererCompositorFrameSink( 60 RendererCompositorFrameSink::RendererCompositorFrameSink(
63 int32_t routing_id, 61 int32_t routing_id,
64 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source, 62 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source,
65 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, 63 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider,
66 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info, 64 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info,
67 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request, 65 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request,
68 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) 66 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue)
69 : CompositorFrameSink(std::move(vulkan_context_provider)), 67 : ClientCompositorFrameSink(std::move(vulkan_context_provider),
68 std::move(synthetic_begin_frame_source),
69 std::move(sink_info),
70 std::move(sink_client_request),
71 false /* enable_surface_synchronization */),
70 compositor_frame_sink_filter_( 72 compositor_frame_sink_filter_(
71 RenderThreadImpl::current()->compositor_message_filter()), 73 RenderThreadImpl::current()->compositor_message_filter()),
72 message_sender_(RenderThreadImpl::current()->sync_message_filter()), 74 message_sender_(RenderThreadImpl::current()->sync_message_filter()),
73 frame_swap_message_queue_(swap_frame_message_queue), 75 frame_swap_message_queue_(swap_frame_message_queue),
74 synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)),
75 external_begin_frame_source_(
76 synthetic_begin_frame_source_
77 ? nullptr
78 : base::MakeUnique<cc::ExternalBeginFrameSource>(this)),
79 routing_id_(routing_id), 76 routing_id_(routing_id),
80 sink_info_(std::move(sink_info)), 77 sink_info_(std::move(sink_info)),
81 sink_client_request_(std::move(sink_client_request)), 78 sink_client_request_(std::move(sink_client_request)),
82 sink_client_binding_(this) { 79 sink_client_binding_(this) {
83 DCHECK(compositor_frame_sink_filter_); 80 DCHECK(compositor_frame_sink_filter_);
84 DCHECK(frame_swap_message_queue_); 81 DCHECK(frame_swap_message_queue_);
85 DCHECK(message_sender_); 82 DCHECK(message_sender_);
86 thread_checker_.DetachFromThread();
87 } 83 }
88 84
89 RendererCompositorFrameSink::~RendererCompositorFrameSink() = default; 85 RendererCompositorFrameSink::~RendererCompositorFrameSink() = default;
90 86
91 bool RendererCompositorFrameSink::BindToClient( 87 bool RendererCompositorFrameSink::BindToClient(
92 cc::CompositorFrameSinkClient* client) { 88 cc::CompositorFrameSinkClient* client) {
93 DCHECK(thread_checker_.CalledOnValidThread()); 89 if (!ui::ClientCompositorFrameSink::BindToClient(client))
94 if (!cc::CompositorFrameSink::BindToClient(client))
95 return false; 90 return false;
96 91
97 sink_.Bind(std::move(sink_info_));
98 sink_client_binding_.Bind(std::move(sink_client_request_));
99
100 if (synthetic_begin_frame_source_)
101 client_->SetBeginFrameSource(synthetic_begin_frame_source_.get());
102 else
103 client_->SetBeginFrameSource(external_begin_frame_source_.get());
104
105 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this); 92 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this);
106 compositor_frame_sink_filter_handler_ = 93 compositor_frame_sink_filter_handler_ =
107 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived, 94 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived,
108 compositor_frame_sink_proxy_); 95 compositor_frame_sink_proxy_);
109 compositor_frame_sink_filter_->AddHandlerOnCompositorThread( 96 compositor_frame_sink_filter_->AddHandlerOnCompositorThread(
110 routing_id_, compositor_frame_sink_filter_handler_); 97 routing_id_, compositor_frame_sink_filter_handler_);
98
111 return true; 99 return true;
112 } 100 }
113 101
114 void RendererCompositorFrameSink::DetachFromClient() { 102 void RendererCompositorFrameSink::DetachFromClient() {
115 DCHECK(thread_checker_.CalledOnValidThread());
116 client_->SetBeginFrameSource(nullptr);
117 // Destroy the begin frame source on the same thread it was bound on.
118 // The CompositorFrameSink itself is destroyed on the main thread.
119 external_begin_frame_source_ = nullptr;
120 synthetic_begin_frame_source_ = nullptr;
121 compositor_frame_sink_proxy_->ClearCompositorFrameSink(); 103 compositor_frame_sink_proxy_->ClearCompositorFrameSink();
122 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread( 104 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread(
123 routing_id_, compositor_frame_sink_filter_handler_); 105 routing_id_, compositor_frame_sink_filter_handler_);
124 sink_.reset(); 106 ui::ClientCompositorFrameSink::DetachFromClient();
125 sink_client_binding_.Close();
126 cc::CompositorFrameSink::DetachFromClient();
127 } 107 }
128 108
129 void RendererCompositorFrameSink::SubmitCompositorFrame( 109 void RendererCompositorFrameSink::SubmitCompositorFrame(
130 cc::CompositorFrame frame) { 110 cc::CompositorFrame frame) {
131 // We should only submit CompositorFrames with valid BeginFrameAcks. 111 // We should only submit CompositorFrames with valid BeginFrameAcks.
132 DCHECK(frame.metadata.begin_frame_ack.has_damage); 112 DCHECK(frame.metadata.begin_frame_ack.has_damage);
133 DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, 113 DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber,
134 frame.metadata.begin_frame_ack.sequence_number); 114 frame.metadata.begin_frame_ack.sequence_number);
135 auto new_surface_properties = 115 auto new_surface_properties =
136 RenderWidgetSurfaceProperties::FromCompositorFrame(frame); 116 RenderWidgetSurfaceProperties::FromCompositorFrame(frame);
137 if (!local_surface_id_.is_valid() || 117 if (!local_surface_id_.is_valid() ||
138 new_surface_properties != current_surface_properties_) { 118 new_surface_properties != current_surface_properties_) {
139 local_surface_id_ = id_allocator_.GenerateId(); 119 local_surface_id_ = id_allocator_.GenerateId();
140 current_surface_properties_ = new_surface_properties; 120 current_surface_properties_ = new_surface_properties;
141 } 121 }
142 122
143 { 123 {
144 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope> 124 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope>
145 send_message_scope = 125 send_message_scope =
146 frame_swap_message_queue_->AcquireSendMessageScope(); 126 frame_swap_message_queue_->AcquireSendMessageScope();
147 std::vector<std::unique_ptr<IPC::Message>> messages; 127 std::vector<std::unique_ptr<IPC::Message>> messages;
148 frame_swap_message_queue_->DrainMessages(&messages); 128 frame_swap_message_queue_->DrainMessages(&messages);
149 std::vector<IPC::Message> messages_to_send; 129 std::vector<IPC::Message> messages_to_send;
150 FrameSwapMessageQueue::TransferMessages(&messages, &messages_to_send); 130 FrameSwapMessageQueue::TransferMessages(&messages, &messages_to_send);
151 uint32_t frame_token = 0; 131 uint32_t frame_token = 0;
152 if (!messages_to_send.empty()) 132 if (!messages_to_send.empty())
153 frame_token = frame_swap_message_queue_->AllocateFrameToken(); 133 frame_token = frame_swap_message_queue_->AllocateFrameToken();
154 frame.metadata.frame_token = frame_token; 134 frame.metadata.frame_token = frame_token;
155 sink_->SubmitCompositorFrame(local_surface_id_, std::move(frame)); 135 sink()->SubmitCompositorFrame(local_surface_id_, std::move(frame));
156 if (frame_token) { 136 if (frame_token) {
157 message_sender_->Send(new ViewHostMsg_FrameSwapMessages( 137 message_sender_->Send(new ViewHostMsg_FrameSwapMessages(
158 routing_id_, frame_token, messages_to_send)); 138 routing_id_, frame_token, messages_to_send));
159 } 139 }
160 // ~send_message_scope. 140 // ~send_message_scope.
161 } 141 }
162 } 142 }
163 143
164 void RendererCompositorFrameSink::DidNotProduceFrame(
165 const cc::BeginFrameAck& ack) {
166 DCHECK(!ack.has_damage);
167 DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number);
168 sink_->DidNotProduceFrame(ack);
169 }
170
171 void RendererCompositorFrameSink::OnMessageReceived( 144 void RendererCompositorFrameSink::OnMessageReceived(
172 const IPC::Message& message) { 145 const IPC::Message& message) {
173 DCHECK(thread_checker_.CalledOnValidThread());
174 IPC_BEGIN_MESSAGE_MAP(RendererCompositorFrameSink, message) 146 IPC_BEGIN_MESSAGE_MAP(RendererCompositorFrameSink, message)
175 IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrameIPC) 147 IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrameIPC)
176 IPC_END_MESSAGE_MAP() 148 IPC_END_MESSAGE_MAP()
177 } 149 }
178 150
179 void RendererCompositorFrameSink::OnBeginFrameIPC( 151 void RendererCompositorFrameSink::OnBeginFrameIPC(
180 const cc::BeginFrameArgs& args) { 152 const cc::BeginFrameArgs& args) {
181 if (external_begin_frame_source_) 153 ui::ClientCompositorFrameSink::OnBeginFrame(args);
182 external_begin_frame_source_->OnBeginFrame(args);
183 }
184
185 void RendererCompositorFrameSink::DidReceiveCompositorFrameAck(
186 const cc::ReturnedResourceArray& resources) {
187 ReclaimResources(resources);
188 client_->DidReceiveCompositorFrameAck();
189 } 154 }
190 155
191 void RendererCompositorFrameSink::OnBeginFrame(const cc::BeginFrameArgs& args) { 156 void RendererCompositorFrameSink::OnBeginFrame(const cc::BeginFrameArgs& args) {
192 // See crbug.com/709689. 157 // See crbug.com/709689.
193 NOTREACHED() << "BeginFrames are delivered using Chrome IPC."; 158 NOTREACHED() << "BeginFrames are delivered using Chrome IPC.";
194 } 159 }
195 160
196 void RendererCompositorFrameSink::ReclaimResources(
197 const cc::ReturnedResourceArray& resources) {
198 client_->ReclaimResources(resources);
199 }
200
201 void RendererCompositorFrameSink::OnNeedsBeginFrames(bool needs_begin_frames) {
202 sink_->SetNeedsBeginFrame(needs_begin_frames);
203 }
204
205 } // namespace content 161 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/gpu/renderer_compositor_frame_sink.h ('k') | content/renderer/mus/renderer_window_tree_client.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698