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

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

Issue 2174203002: OnDrawHardware() implementation with async messages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Further changes. Created 4 years, 4 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 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 RenderWidgetHostViewAndroid* rwhva, 63 RenderWidgetHostViewAndroid* rwhva,
64 SynchronousCompositorClient* client, 64 SynchronousCompositorClient* client,
65 bool use_in_proc_software_draw) 65 bool use_in_proc_software_draw)
66 : rwhva_(rwhva), 66 : rwhva_(rwhva),
67 client_(client), 67 client_(client),
68 ui_task_runner_(BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)), 68 ui_task_runner_(BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)),
69 process_id_(rwhva_->GetRenderWidgetHost()->GetProcess()->GetID()), 69 process_id_(rwhva_->GetRenderWidgetHost()->GetProcess()->GetID()),
70 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), 70 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()),
71 sender_(rwhva_->GetRenderWidgetHost()), 71 sender_(rwhva_->GetRenderWidgetHost()),
72 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), 72 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw),
73 // did_receive_first_frame_synchronously_(false),
74 sync_call_count_(0u),
73 bytes_limit_(0u), 75 bytes_limit_(0u),
74 renderer_param_version_(0u), 76 renderer_param_version_(0u),
75 need_animate_scroll_(false), 77 need_animate_scroll_(false),
76 need_invalidate_count_(0u), 78 need_invalidate_count_(0u),
77 did_activate_pending_tree_count_(0u) { 79 did_activate_pending_tree_count_(0u) {
78 client_->DidInitializeCompositor(this, process_id_, routing_id_); 80 client_->DidInitializeCompositor(this, process_id_, routing_id_);
79 } 81 }
80 82
81 SynchronousCompositorHost::~SynchronousCompositorHost() { 83 SynchronousCompositorHost::~SynchronousCompositorHost() {
82 client_->DidDestroyCompositor(this, process_id_, routing_id_); 84 client_->DidDestroyCompositor(this, process_id_, routing_id_);
83 } 85 }
84 86
85 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) { 87 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) {
86 bool handled = true; 88 bool handled = true;
87 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message) 89 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message)
88 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OutputSurfaceCreated, 90 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OutputSurfaceCreated,
89 OutputSurfaceCreated) 91 OutputSurfaceCreated)
90 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams) 92 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams)
93 IPC_MESSAGE_HANDLER(CompositorHostMsg_Frame, DemandDrawHwReceiveFrame)
91 IPC_MESSAGE_UNHANDLED(handled = false) 94 IPC_MESSAGE_UNHANDLED(handled = false)
92 IPC_END_MESSAGE_MAP() 95 IPC_END_MESSAGE_MAP()
93 return handled; 96 return handled;
94 } 97 }
95 98
96 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw( 99 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw_Sync(
97 const gfx::Size& surface_size, 100 const gfx::Size& surface_size,
98 const gfx::Transform& transform, 101 const gfx::Transform& transform,
99 const gfx::Rect& viewport, 102 const gfx::Rect& viewport,
100 const gfx::Rect& clip, 103 const gfx::Rect& clip,
101 const gfx::Rect& viewport_rect_for_tile_priority, 104 const gfx::Rect& viewport_rect_for_tile_priority,
102 const gfx::Transform& transform_for_tile_priority) { 105 const gfx::Transform& transform_for_tile_priority) {
103 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport, 106 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport,
104 clip, viewport_rect_for_tile_priority, 107 clip, viewport_rect_for_tile_priority,
105 transform_for_tile_priority); 108 transform_for_tile_priority);
106 SynchronousCompositor::Frame frame; 109 SynchronousCompositor::Frame frame;
107 frame.frame.reset(new cc::CompositorFrame); 110 frame.frame.reset(new cc::CompositorFrame);
108 SyncCompositorCommonRendererParams common_renderer_params; 111 SyncCompositorCommonRendererParams common_renderer_params;
109 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( 112 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw(
110 routing_id_, params, &common_renderer_params, 113 routing_id_, params, &common_renderer_params,
111 &frame.output_surface_id, frame.frame.get()))) { 114 &frame.output_surface_id, frame.frame.get()))) {
112 return SynchronousCompositor::Frame(); 115 return SynchronousCompositor::Frame();
113 } 116 }
114 ProcessCommonParams(common_renderer_params); 117 ProcessCommonParams(common_renderer_params);
115 if (!frame.frame->delegated_frame_data) { 118 if (!frame.frame->delegated_frame_data) {
116 // This can happen if compositor did not swap in this draw. 119 // This can happen if compositor did not swap in this draw.
117 frame.frame.reset(); 120 frame.frame.reset();
118 } 121 }
119 if (frame.frame) { 122 if (frame.frame) {
120 UpdateFrameMetaData(frame.frame->metadata.Clone()); 123 UpdateFrameMetaData(frame.frame->metadata.Clone());
121 } 124 }
122 return frame; 125 return frame;
123 } 126 }
124 127
128 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw(
129 const gfx::Size& surface_size,
130 const gfx::Transform& transform,
131 const gfx::Rect& viewport,
132 const gfx::Rect& clip,
133 const gfx::Rect& viewport_rect_for_tile_priority,
134 const gfx::Transform& transform_for_tile_priority) {
135 // if (!did_receive_first_frame_synchronously_)
136 if (sync_call_count_++ < 60) {
137 // did_receive_first_frame_synchronously_ = true;
138 return DemandDrawHw_Sync(surface_size, transform, viewport, clip,
139 viewport_rect_for_tile_priority,
140 transform_for_tile_priority);
141 }
142
143 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport,
144 clip, viewport_rect_for_tile_priority,
145 transform_for_tile_priority);
146 SynchronousCompositor::Frame frame;
147 frame.frame.reset(new cc::CompositorFrame);
boliu 2016/07/29 00:48:21 you are creating a CompositorFrame here that's emp
148 // SyncCompositorCommonRendererParams common_renderer_params;
149
150 /* Send an async message instead of a synchronous one.
151 * Currently not sure what to do in the analogous case
152 * when sending sync message returns false. */
153 // if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw(
154 // routing_id_, params, &common_renderer_params,
155 // &frame.output_surface_id, frame.frame.get()))) {
156 // return SynchronousCompositor::Frame();
157 // }
158
159 sender_->Send(new CompositorMsg_DemandDrawHw(routing_id_, params));
160
161 return frame;
162 }
163
164 void SynchronousCompositorHost::DemandDrawHwReceiveFrame(
165 uint32_t output_surface_id,
166 const cc::CompositorFrame& compositor_frame) {
167 // ProcessCommonParams(common_renderer_params);
168 SynchronousCompositor::Frame frame;
169 frame.frame.reset(new cc::CompositorFrame);
170 frame.output_surface_id = output_surface_id;
171 // *frame.frame.get() = compositor_frame;
172 // frame = compositor_frame;
173 // frame.frame.reset(&compositor_frame);
174 *frame.frame = std::move(const_cast<cc::CompositorFrame&>(compositor_frame));
175 frame.output_surface_id = output_surface_id;
176
177 if (!frame.frame->delegated_frame_data) {
178 // This can happen if compositor did not swap in this draw.
179 frame.frame.reset();
180 }
181 if (frame.frame) {
182 UpdateFrameMetaData(frame.frame->metadata.Clone());
183 }
184 // return frame;
185 client_->OnDrawHardwareProcessFrame(std::move(frame));
186 }
187
125 void SynchronousCompositorHost::UpdateFrameMetaData( 188 void SynchronousCompositorHost::UpdateFrameMetaData(
126 cc::CompositorFrameMetadata frame_metadata) { 189 cc::CompositorFrameMetadata frame_metadata) {
127 rwhva_->SynchronousFrameMetadata(std::move(frame_metadata)); 190 rwhva_->SynchronousFrameMetadata(std::move(frame_metadata));
128 } 191 }
129 192
130 namespace { 193 namespace {
131 194
132 class ScopedSetSkCanvas { 195 class ScopedSetSkCanvas {
133 public: 196 public:
134 explicit ScopedSetSkCanvas(SkCanvas* canvas) { 197 explicit ScopedSetSkCanvas(SkCanvas* canvas) {
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 if (params.page_scale_factor) { 444 if (params.page_scale_factor) {
382 client_->UpdateRootLayerState( 445 client_->UpdateRootLayerState(
383 this, gfx::ScrollOffsetToVector2dF(params.total_scroll_offset), 446 this, gfx::ScrollOffsetToVector2dF(params.total_scroll_offset),
384 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset), 447 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset),
385 params.scrollable_size, params.page_scale_factor, 448 params.scrollable_size, params.page_scale_factor,
386 params.min_page_scale_factor, params.max_page_scale_factor); 449 params.min_page_scale_factor, params.max_page_scale_factor);
387 } 450 }
388 } 451 }
389 452
390 } // namespace content 453 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698