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

Side by Side Diff: content/renderer/android/synchronous_compositor_proxy.cc

Issue 1469773002: sync compositor: Software draw (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: safe_math Created 5 years 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/renderer/android/synchronous_compositor_proxy.h" 5 #include "content/renderer/android/synchronous_compositor_proxy.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/memory/shared_memory.h"
9 #include "base/numerics/safe_math.h"
8 #include "content/common/android/sync_compositor_messages.h" 10 #include "content/common/android/sync_compositor_messages.h"
9 #include "content/common/cc_messages.h" 11 #include "content/common/cc_messages.h"
10 #include "ipc/ipc_message.h" 12 #include "ipc/ipc_message.h"
11 #include "ipc/ipc_sender.h" 13 #include "ipc/ipc_sender.h"
14 #include "third_party/skia/include/core/SkBitmap.h"
15 #include "third_party/skia/include/core/SkCanvas.h"
16 #include "third_party/skia/include/core/SkImageInfo.h"
17 #include "third_party/skia/include/core/SkRegion.h"
12 #include "ui/events/latency_info.h" 18 #include "ui/events/latency_info.h"
19 #include "ui/gfx/skia_util.h"
13 20
14 namespace content { 21 namespace content {
15 22
16 SynchronousCompositorProxy::SynchronousCompositorProxy( 23 SynchronousCompositorProxy::SynchronousCompositorProxy(
17 int routing_id, 24 int routing_id,
18 IPC::Sender* sender, 25 IPC::Sender* sender,
19 SynchronousCompositorOutputSurface* output_surface, 26 SynchronousCompositorOutputSurface* output_surface,
20 SynchronousCompositorExternalBeginFrameSource* begin_frame_source, 27 SynchronousCompositorExternalBeginFrameSource* begin_frame_source,
21 SynchronousInputHandlerProxy* input_handler_proxy, 28 SynchronousInputHandlerProxy* input_handler_proxy,
22 InputHandlerManagerClient::Handler* handler) 29 InputHandlerManagerClient::Handler* handler)
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 147
141 void SynchronousCompositorProxy::OnMessageReceived( 148 void SynchronousCompositorProxy::OnMessageReceived(
142 const IPC::Message& message) { 149 const IPC::Message& message) {
143 DCHECK(!inside_receive_); 150 DCHECK(!inside_receive_);
144 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); 151 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true);
145 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) 152 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message)
146 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) 153 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent)
147 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) 154 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame)
148 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) 155 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll)
149 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) 156 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw)
157 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw)
150 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) 158 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams)
151 IPC_END_MESSAGE_MAP() 159 IPC_END_MESSAGE_MAP()
152 } 160 }
153 161
154 bool SynchronousCompositorProxy::Send(IPC::Message* message) { 162 bool SynchronousCompositorProxy::Send(IPC::Message* message) {
155 return sender_->Send(message); 163 return sender_->Send(message);
156 } 164 }
157 165
158 void SynchronousCompositorProxy::HandleInputEvent( 166 void SynchronousCompositorProxy::HandleInputEvent(
159 const SyncCompositorCommonBrowserParams& common_params, 167 const SyncCompositorCommonBrowserParams& common_params,
(...skipping 29 matching lines...) Expand all
189 params.surface_size, params.transform, params.viewport, params.clip, 197 params.surface_size, params.transform, params.viewport, params.clip,
190 params.viewport_rect_for_tile_priority, 198 params.viewport_rect_for_tile_priority,
191 params.transform_for_tile_priority); 199 params.transform_for_tile_priority);
192 if (frame_ptr) { 200 if (frame_ptr) {
193 frame_ptr->AssignTo(frame); 201 frame_ptr->AssignTo(frame);
194 DeliverMessages(); 202 DeliverMessages();
195 } 203 }
196 PopulateCommonParams(common_renderer_params); 204 PopulateCommonParams(common_renderer_params);
197 } 205 }
198 206
207 void SynchronousCompositorProxy::DemandDrawSw(
208 const SyncCompositorCommonBrowserParams& common_params,
209 const SyncCompositorDemandDrawSwParams& params,
210 bool* result,
211 SyncCompositorCommonRendererParams* common_renderer_params,
212 cc::CompositorFrame* frame) {
213 DCHECK(frame);
214 ProcessCommonParams(common_params);
215 *result = false; // Early out ok.
216 if (!base::SharedMemory::IsHandleValid(params.shm_handle))
217 return;
218
219 base::CheckedNumeric<size_t> stride = 4;
220 stride *= params.size.width();
221 if (!stride.IsValid())
no sievers 2015/11/24 23:38:40 you don't trust the browser :)
222 return;
223 base::CheckedNumeric<size_t> bytes(stride);
224 bytes *= params.size.height();
225 if (!bytes.IsValid())
226 return;
227
228 base::SharedMemory shm(params.shm_handle, false);
229 if (!shm.Map(bytes.ValueOrDie()))
230 return;
231 DCHECK(shm.memory());
232
233 SkImageInfo info =
234 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height());
235 SkBitmap bitmap;
236 if (!bitmap.installPixels(info, shm.memory(), stride.ValueOrDie()))
237 return;
238 SkCanvas canvas(bitmap);
239 canvas.setMatrix(params.transform.matrix());
240 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip)));
241
242 scoped_ptr<cc::CompositorFrame> frame_ptr =
243 output_surface_->DemandDrawSw(&canvas);
244 if (frame_ptr) {
245 *result = true;
246 frame_ptr->AssignTo(frame);
247 DeliverMessages();
248 }
249 PopulateCommonParams(common_renderer_params);
250 }
251
199 void SynchronousCompositorProxy::OnComputeScroll( 252 void SynchronousCompositorProxy::OnComputeScroll(
200 const SyncCompositorCommonBrowserParams& common_params, 253 const SyncCompositorCommonBrowserParams& common_params,
201 base::TimeTicks animation_time, 254 base::TimeTicks animation_time,
202 SyncCompositorCommonRendererParams* common_renderer_params) { 255 SyncCompositorCommonRendererParams* common_renderer_params) {
203 ProcessCommonParams(common_params); 256 ProcessCommonParams(common_params);
204 if (need_animate_scroll_) { 257 if (need_animate_scroll_) {
205 need_animate_scroll_ = false; 258 need_animate_scroll_ = false;
206 input_handler_proxy_->SynchronouslyAnimate(animation_time); 259 input_handler_proxy_->SynchronouslyAnimate(animation_time);
207 } 260 }
208 PopulateCommonParams(common_renderer_params); 261 PopulateCommonParams(common_renderer_params);
(...skipping 17 matching lines...) Expand all
226 total_scroll_offset_ = common_params.root_scroll_offset; 279 total_scroll_offset_ = common_params.root_scroll_offset;
227 input_handler_proxy_->SynchronouslySetRootScrollOffset( 280 input_handler_proxy_->SynchronouslySetRootScrollOffset(
228 total_scroll_offset_); 281 total_scroll_offset_);
229 } 282 }
230 if (!common_params.ack.resources.empty()) { 283 if (!common_params.ack.resources.empty()) {
231 output_surface_->ReturnResources(common_params.ack); 284 output_surface_->ReturnResources(common_params.ack);
232 } 285 }
233 } 286 }
234 287
235 } // namespace content 288 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698