Index: content/renderer/android/synchronous_compositor_proxy.cc |
diff --git a/content/renderer/android/synchronous_compositor_proxy.cc b/content/renderer/android/synchronous_compositor_proxy.cc |
index d9f414cd894be9ec3a9072ed8ac458faf90b7eaf..d024785c6a30bd56c711d5e5ad27258c000f5d05 100644 |
--- a/content/renderer/android/synchronous_compositor_proxy.cc |
+++ b/content/renderer/android/synchronous_compositor_proxy.cc |
@@ -33,6 +33,7 @@ SynchronousCompositorProxy::SynchronousCompositorProxy( |
input_handler_proxy_(input_handler_proxy), |
input_handler_(handler), |
inside_receive_(false), |
+ hardware_draw_reply_(nullptr), |
bytes_limit_(0u), |
version_(0u), |
page_scale_factor_(0.f), |
@@ -145,13 +146,12 @@ void SynchronousCompositorProxy::PopulateCommonParams( |
void SynchronousCompositorProxy::OnMessageReceived( |
const IPC::Message& message) { |
- DCHECK(!inside_receive_); |
- base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); |
IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) |
IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) |
IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) |
IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) |
- IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) |
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawHw, |
+ DemandDrawHw) |
IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory) |
IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory) |
IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw) |
@@ -168,6 +168,9 @@ void SynchronousCompositorProxy::HandleInputEvent( |
const blink::WebInputEvent* event, |
SyncCompositorCommonRendererParams* common_renderer_params, |
InputEventAckState* ack) { |
+ DCHECK(!inside_receive_); |
+ base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); |
+ |
ProcessCommonParams(common_params); |
DCHECK(!input_handler_->is_null()); |
ui::LatencyInfo latency; |
@@ -179,6 +182,9 @@ void SynchronousCompositorProxy::BeginFrame( |
const SyncCompositorCommonBrowserParams& common_params, |
const cc::BeginFrameArgs& args, |
SyncCompositorCommonRendererParams* common_renderer_params) { |
+ DCHECK(!inside_receive_); |
+ base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); |
+ |
ProcessCommonParams(common_params); |
if (need_begin_frame_) { |
begin_frame_source_->BeginFrame(args); |
@@ -189,19 +195,48 @@ void SynchronousCompositorProxy::BeginFrame( |
void SynchronousCompositorProxy::DemandDrawHw( |
const SyncCompositorCommonBrowserParams& common_params, |
const SyncCompositorDemandDrawHwParams& params, |
- SyncCompositorCommonRendererParams* common_renderer_params, |
- cc::CompositorFrame* frame) { |
- DCHECK(frame); |
+ IPC::Message* reply_message) { |
+ DCHECK(!inside_receive_); |
+ DCHECK(reply_message); |
+ |
+ inside_receive_ = true; |
ProcessCommonParams(common_params); |
- scoped_ptr<cc::CompositorFrame> frame_ptr = output_surface_->DemandDrawHw( |
- params.surface_size, params.transform, params.viewport, params.clip, |
- params.viewport_rect_for_tile_priority, |
- params.transform_for_tile_priority); |
- if (frame_ptr) { |
- frame_ptr->AssignTo(frame); |
- DeliverMessages(); |
hush (inactive)
2015/12/29 21:10:28
When swap happened and output surface DemandDrawHw
boliu
2015/12/29 21:36:39
Barr, yep. Put it at end of DemandDrawHw though.
|
+ |
+ { |
+ base::AutoReset<IPC::Message*> scoped_hardware_draw_reply( |
+ &hardware_draw_reply_, reply_message); |
+ output_surface_->DemandDrawHw(params.surface_size, params.transform, |
+ params.viewport, params.clip, |
+ params.viewport_rect_for_tile_priority, |
+ params.transform_for_tile_priority); |
+ } |
+ |
+ if (inside_receive_) { |
+ // Did not swap. |
+ cc::CompositorFrame empty_frame; |
+ SendDemandDrawHwReply(&empty_frame, reply_message); |
+ inside_receive_ = false; |
} |
- PopulateCommonParams(common_renderer_params); |
+} |
+ |
+void SynchronousCompositorProxy::SwapBuffersHw(cc::CompositorFrame* frame) { |
+ DCHECK(inside_receive_); |
+ DCHECK(hardware_draw_reply_); |
+ DCHECK(frame); |
+ SendDemandDrawHwReply(frame, hardware_draw_reply_); |
+ inside_receive_ = false; |
+} |
+ |
+void SynchronousCompositorProxy::SendDemandDrawHwReply( |
+ cc::CompositorFrame* frame, |
+ IPC::Message* reply_message) { |
+ SyncCompositorCommonRendererParams common_renderer_params; |
+ PopulateCommonParams(&common_renderer_params); |
+ // Not using WriteParams because cc::CompositorFrame is not copy-able. |
+ IPC::ParamTraits<SyncCompositorCommonRendererParams>::Write( |
+ reply_message, common_renderer_params); |
+ IPC::ParamTraits<cc::CompositorFrame>::Write(reply_message, *frame); |
+ Send(reply_message); |
} |
struct SynchronousCompositorProxy::SharedMemoryWithSize { |
@@ -218,6 +253,9 @@ void SynchronousCompositorProxy::SetSharedMemory( |
const SyncCompositorSetSharedMemoryParams& params, |
bool* success, |
SyncCompositorCommonRendererParams* common_renderer_params) { |
+ DCHECK(!inside_receive_); |
+ base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); |
+ |
*success = false; |
ProcessCommonParams(common_params); |
if (!base::SharedMemory::IsHandleValid(params.shm_handle)) |
@@ -244,6 +282,9 @@ void SynchronousCompositorProxy::DemandDrawSw( |
bool* result, |
SyncCompositorCommonRendererParams* common_renderer_params, |
cc::CompositorFrame* frame) { |
+ DCHECK(!inside_receive_); |
+ base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); |
+ |
DCHECK(frame); |
ProcessCommonParams(common_params); |
*result = false; // Early out ok. |
@@ -264,20 +305,34 @@ void SynchronousCompositorProxy::DemandDrawSw( |
canvas.setMatrix(params.transform.matrix()); |
canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip))); |
- scoped_ptr<cc::CompositorFrame> frame_ptr = |
- output_surface_->DemandDrawSw(&canvas); |
- if (frame_ptr) { |
+ output_surface_->DemandDrawSw(&canvas); |
+ if (software_frame_holder_) { |
*result = true; |
- frame_ptr->AssignTo(frame); |
+ software_frame_holder_->AssignTo(frame); |
+ software_frame_holder_.reset(); |
DeliverMessages(); |
} |
PopulateCommonParams(common_renderer_params); |
} |
+void SynchronousCompositorProxy::SwapBuffers(cc::CompositorFrame* frame) { |
+ if (hardware_draw_reply_) { |
+ SwapBuffersHw(frame); |
+ return; |
+ } |
+ |
+ DCHECK(!software_frame_holder_); |
+ software_frame_holder_.reset(new cc::CompositorFrame); |
+ frame->AssignTo(software_frame_holder_.get()); |
+} |
+ |
void SynchronousCompositorProxy::OnComputeScroll( |
const SyncCompositorCommonBrowserParams& common_params, |
base::TimeTicks animation_time, |
SyncCompositorCommonRendererParams* common_renderer_params) { |
+ DCHECK(!inside_receive_); |
+ base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); |
+ |
ProcessCommonParams(common_params); |
if (need_animate_scroll_) { |
need_animate_scroll_ = false; |