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

Side by Side Diff: content/browser/android/synchronous_compositor_host.cc

Issue 2418383002: sync compositor: Signal async frame on IO thread (Closed)
Patch Set: typo 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/android/synchronous_compositor_host.h" 5 #include "content/browser/android/synchronous_compositor_host.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/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 63
64 SynchronousCompositorHost::SynchronousCompositorHost( 64 SynchronousCompositorHost::SynchronousCompositorHost(
65 RenderWidgetHostViewAndroid* rwhva, 65 RenderWidgetHostViewAndroid* rwhva,
66 SynchronousCompositorClient* client, 66 SynchronousCompositorClient* client,
67 bool use_in_proc_software_draw) 67 bool use_in_proc_software_draw)
68 : rwhva_(rwhva), 68 : rwhva_(rwhva),
69 client_(client), 69 client_(client),
70 ui_task_runner_(BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)), 70 ui_task_runner_(BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)),
71 process_id_(rwhva_->GetRenderWidgetHost()->GetProcess()->GetID()), 71 process_id_(rwhva_->GetRenderWidgetHost()->GetProcess()->GetID()),
72 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), 72 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()),
73 rph_observer_(SynchronousCompositorObserver::GetOrCreateFor(process_id_)),
74 sender_(rwhva_->GetRenderWidgetHost()), 73 sender_(rwhva_->GetRenderWidgetHost()),
75 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), 74 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw),
76 bytes_limit_(0u), 75 bytes_limit_(0u),
77 renderer_param_version_(0u), 76 renderer_param_version_(0u),
78 need_animate_scroll_(false), 77 need_animate_scroll_(false),
79 need_invalidate_count_(0u), 78 need_invalidate_count_(0u),
80 did_activate_pending_tree_count_(0u) { 79 did_activate_pending_tree_count_(0u) {
81 client_->DidInitializeCompositor(this, process_id_, routing_id_); 80 client_->DidInitializeCompositor(this, process_id_, routing_id_);
82 } 81 }
83 82
84 SynchronousCompositorHost::~SynchronousCompositorHost() { 83 SynchronousCompositorHost::~SynchronousCompositorHost() {
85 client_->DidDestroyCompositor(this, process_id_, routing_id_); 84 client_->DidDestroyCompositor(this, process_id_, routing_id_);
86 } 85 }
87 86
88 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) { 87 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) {
89 bool handled = true; 88 bool handled = true;
90 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message) 89 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message)
91 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_CompositorFrameSinkCreated, 90 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_CompositorFrameSinkCreated,
92 CompositorFrameSinkCreated) 91 CompositorFrameSinkCreated)
93 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams) 92 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams)
94 IPC_MESSAGE_HANDLER_GENERIC(SyncCompositorHostMsg_ReturnFrame,
95 DemandDrawHwReceiveFrame(message))
96 IPC_MESSAGE_UNHANDLED(handled = false) 93 IPC_MESSAGE_UNHANDLED(handled = false)
97 IPC_END_MESSAGE_MAP() 94 IPC_END_MESSAGE_MAP()
98 return handled; 95 return handled;
99 } 96 }
100 97
101 void SynchronousCompositorHost::DemandDrawHwAsync( 98 scoped_refptr<SynchronousCompositor::FrameFuture>
99 SynchronousCompositorHost::DemandDrawHwAsync(
102 const gfx::Size& viewport_size, 100 const gfx::Size& viewport_size,
103 const gfx::Rect& viewport_rect_for_tile_priority, 101 const gfx::Rect& viewport_rect_for_tile_priority,
104 const gfx::Transform& transform_for_tile_priority) { 102 const gfx::Transform& transform_for_tile_priority) {
105 SyncCompositorDemandDrawHwParams params(viewport_size, 103 SyncCompositorDemandDrawHwParams params(viewport_size,
106 viewport_rect_for_tile_priority, 104 viewport_rect_for_tile_priority,
107 transform_for_tile_priority); 105 transform_for_tile_priority);
108 sender_->Send(new SyncCompositorMsg_DemandDrawHwAsync(routing_id_, params)); 106 scoped_refptr<FrameFuture> frame_future = new FrameFuture();
107 if (SynchronousCompositorObserver* filter = GetFilter()) {
108 filter->SetFrameFuture(routing_id_, frame_future);
109 sender_->Send(new SyncCompositorMsg_DemandDrawHwAsync(routing_id_, params));
110 } else {
111 frame_future->setFrame(nullptr);
112 }
113 return frame_future;
109 } 114 }
110 115
111 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw( 116 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw(
112 const gfx::Size& viewport_size, 117 const gfx::Size& viewport_size,
113 const gfx::Rect& viewport_rect_for_tile_priority, 118 const gfx::Rect& viewport_rect_for_tile_priority,
114 const gfx::Transform& transform_for_tile_priority) { 119 const gfx::Transform& transform_for_tile_priority) {
115 SyncCompositorDemandDrawHwParams params(viewport_size, 120 SyncCompositorDemandDrawHwParams params(viewport_size,
116 viewport_rect_for_tile_priority, 121 viewport_rect_for_tile_priority,
117 transform_for_tile_priority); 122 transform_for_tile_priority);
118 uint32_t compositor_frame_sink_id; 123 uint32_t compositor_frame_sink_id;
119 cc::CompositorFrame compositor_frame; 124 cc::CompositorFrame compositor_frame;
120 SyncCompositorCommonRendererParams common_renderer_params; 125 SyncCompositorCommonRendererParams common_renderer_params;
121 126
122 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( 127 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw(
123 routing_id_, params, &common_renderer_params, 128 routing_id_, params, &common_renderer_params,
124 &compositor_frame_sink_id, &compositor_frame))) { 129 &compositor_frame_sink_id, &compositor_frame))) {
125 return SynchronousCompositor::Frame(); 130 return SynchronousCompositor::Frame();
126 } 131 }
127 132
128 ProcessCommonParams(common_renderer_params); 133 ProcessCommonParams(common_renderer_params);
129 134
130 return ProcessHardwareFrame(compositor_frame_sink_id, 135 return ProcessHardwareFrame(compositor_frame_sink_id,
131 std::move(compositor_frame)); 136 std::move(compositor_frame));
132 } 137 }
133 138
134 bool SynchronousCompositorHost::DemandDrawHwReceiveFrame(
135 const IPC::Message& message) {
136 SyncCompositorHostMsg_ReturnFrame::Param param;
137 if (!SyncCompositorHostMsg_ReturnFrame::Read(&message, &param))
138 return false;
139 uint32_t compositor_frame_sink_id = std::get<0>(param);
140 cc::CompositorFrame compositor_frame = std::move(std::get<1>(param));
141 scoped_refptr<SynchronousCompositor::FrameFuture> frame_future =
142 new FrameFuture();
143 SynchronousCompositor::Frame frame = ProcessHardwareFrame(
144 compositor_frame_sink_id, std::move(compositor_frame));
145 if (!frame.frame)
146 return true;
147 std::unique_ptr<SynchronousCompositor::Frame> frame_ptr =
148 base::MakeUnique<SynchronousCompositor::Frame>();
149 frame_ptr->frame = std::move(frame.frame);
150 frame_ptr->compositor_frame_sink_id = frame.compositor_frame_sink_id;
151 frame_future->setFrame(std::move(frame_ptr));
152 client_->OnDrawHardwareProcessFrameFuture(std::move(frame_future));
153 return true;
154 }
155
156 SynchronousCompositor::Frame SynchronousCompositorHost::ProcessHardwareFrame( 139 SynchronousCompositor::Frame SynchronousCompositorHost::ProcessHardwareFrame(
157 uint32_t compositor_frame_sink_id, 140 uint32_t compositor_frame_sink_id,
158 cc::CompositorFrame compositor_frame) { 141 cc::CompositorFrame compositor_frame) {
159 SynchronousCompositor::Frame frame; 142 SynchronousCompositor::Frame frame;
160 frame.frame.reset(new cc::CompositorFrame); 143 frame.frame.reset(new cc::CompositorFrame);
161 frame.compositor_frame_sink_id = compositor_frame_sink_id; 144 frame.compositor_frame_sink_id = compositor_frame_sink_id;
162 *frame.frame = std::move(compositor_frame); 145 *frame.frame = std::move(compositor_frame);
163 if (!frame.frame->delegated_frame_data) { 146 if (!frame.frame->delegated_frame_data) {
164 // This can happen if compositor did not swap in this draw. 147 // This can happen if compositor did not swap in this draw.
165 frame.frame.reset(); 148 frame.frame.reset();
166 } 149 }
167 if (frame.frame) { 150 if (frame.frame) {
168 UpdateFrameMetaData(frame.frame->metadata.Clone()); 151 UpdateFrameMetaData(frame.frame->metadata.Clone());
169 } 152 }
170 return frame; 153 return frame;
171 } 154 }
172 155
173 void SynchronousCompositorHost::UpdateFrameMetaData( 156 void SynchronousCompositorHost::UpdateFrameMetaData(
174 cc::CompositorFrameMetadata frame_metadata) { 157 cc::CompositorFrameMetadata frame_metadata) {
175 rwhva_->SynchronousFrameMetadata(std::move(frame_metadata)); 158 rwhva_->SynchronousFrameMetadata(std::move(frame_metadata));
176 } 159 }
177 160
161 SynchronousCompositorObserver* SynchronousCompositorHost::GetFilter() {
162 return static_cast<RenderProcessHostImpl*>(
163 rwhva_->GetRenderWidgetHost()->GetProcess())
164 ->synchronous_compositor_filter();
165 }
166
178 namespace { 167 namespace {
179 168
180 class ScopedSetSkCanvas { 169 class ScopedSetSkCanvas {
181 public: 170 public:
182 explicit ScopedSetSkCanvas(SkCanvas* canvas) { 171 explicit ScopedSetSkCanvas(SkCanvas* canvas) {
183 SynchronousCompositorSetSkCanvas(canvas); 172 SynchronousCompositorSetSkCanvas(canvas);
184 } 173 }
185 174
186 ~ScopedSetSkCanvas() { 175 ~ScopedSetSkCanvas() {
187 SynchronousCompositorSetSkCanvas(nullptr); 176 SynchronousCompositorSetSkCanvas(nullptr);
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 369
381 void SynchronousCompositorHost::DidOverscroll( 370 void SynchronousCompositorHost::DidOverscroll(
382 const ui::DidOverscrollParams& over_scroll_params) { 371 const ui::DidOverscrollParams& over_scroll_params) {
383 client_->DidOverscroll(this, over_scroll_params.accumulated_overscroll, 372 client_->DidOverscroll(this, over_scroll_params.accumulated_overscroll,
384 over_scroll_params.latest_overscroll_delta, 373 over_scroll_params.latest_overscroll_delta,
385 over_scroll_params.current_fling_velocity); 374 over_scroll_params.current_fling_velocity);
386 } 375 }
387 376
388 void SynchronousCompositorHost::DidSendBeginFrame( 377 void SynchronousCompositorHost::DidSendBeginFrame(
389 ui::WindowAndroid* window_android) { 378 ui::WindowAndroid* window_android) {
390 rph_observer_->SyncStateAfterVSync(window_android, this); 379 if (SynchronousCompositorObserver* filter = GetFilter())
380 filter->SyncStateAfterVSync(window_android, this);
391 } 381 }
392 382
393 void SynchronousCompositorHost::CompositorFrameSinkCreated() { 383 void SynchronousCompositorHost::CompositorFrameSinkCreated() {
394 // New CompositorFrameSink is not aware of state from Browser side. So need to 384 // New CompositorFrameSink is not aware of state from Browser side. So need to
395 // re-send all browser side state here. 385 // re-send all browser side state here.
396 sender_->Send( 386 sender_->Send(
397 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_)); 387 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_));
398 } 388 }
399 389
400 void SynchronousCompositorHost::ProcessCommonParams( 390 void SynchronousCompositorHost::ProcessCommonParams(
(...skipping 24 matching lines...) Expand all
425 if (params.page_scale_factor) { 415 if (params.page_scale_factor) {
426 client_->UpdateRootLayerState( 416 client_->UpdateRootLayerState(
427 this, gfx::ScrollOffsetToVector2dF(params.total_scroll_offset), 417 this, gfx::ScrollOffsetToVector2dF(params.total_scroll_offset),
428 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset), 418 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset),
429 params.scrollable_size, params.page_scale_factor, 419 params.scrollable_size, params.page_scale_factor,
430 params.min_page_scale_factor, params.max_page_scale_factor); 420 params.min_page_scale_factor, params.max_page_scale_factor);
431 } 421 }
432 } 422 }
433 423
434 } // namespace content 424 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/android/synchronous_compositor_host.h ('k') | content/browser/android/synchronous_compositor_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698