| 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 89c803e70fa5e8f2f407c775f96b0a8e53882e6f..6e4a899a622661bdb0e1c1db17a87d361bc9f259 100644
|
| --- a/content/renderer/android/synchronous_compositor_proxy.cc
|
| +++ b/content/renderer/android/synchronous_compositor_proxy.cc
|
| @@ -34,6 +34,7 @@ SynchronousCompositorProxy::SynchronousCompositorProxy(
|
| input_handler_(handler),
|
| inside_receive_(false),
|
| hardware_draw_reply_(nullptr),
|
| + software_draw_reply_(nullptr),
|
| bytes_limit_(0u),
|
| version_(0u),
|
| page_scale_factor_(0.f),
|
| @@ -154,7 +155,8 @@ void SynchronousCompositorProxy::OnMessageReceived(
|
| DemandDrawHw)
|
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory)
|
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory)
|
| - IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw)
|
| + IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawSw,
|
| + DemandDrawSw)
|
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams)
|
| IPC_END_MESSAGE_MAP()
|
| }
|
| @@ -281,16 +283,27 @@ void SynchronousCompositorProxy::ZeroSharedMemory() {
|
| void SynchronousCompositorProxy::DemandDrawSw(
|
| const SyncCompositorCommonBrowserParams& common_params,
|
| const SyncCompositorDemandDrawSwParams& params,
|
| - bool* result,
|
| - SyncCompositorCommonRendererParams* common_renderer_params,
|
| - cc::CompositorFrame* frame) {
|
| + IPC::Message* reply_message) {
|
| DCHECK(!inside_receive_);
|
| - base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true);
|
| -
|
| - DCHECK(frame);
|
| + inside_receive_ = true;
|
| ProcessCommonParams(common_params);
|
| - *result = false; // Early out ok.
|
| + {
|
| + base::AutoReset<IPC::Message*> scoped_software_draw_reply(
|
| + &software_draw_reply_, reply_message);
|
| + DoDemandDrawSw(params);
|
| + }
|
| + if (inside_receive_) {
|
| + // Did not swap.
|
| + cc::CompositorFrame empty_frame;
|
| + SendDemandDrawSwReply(false, &empty_frame, reply_message);
|
| + inside_receive_ = false;
|
| + } else {
|
| + DeliverMessages();
|
| + }
|
| +}
|
|
|
| +void SynchronousCompositorProxy::DoDemandDrawSw(
|
| + const SyncCompositorDemandDrawSwParams& params) {
|
| DCHECK(software_draw_shm_->zeroed);
|
| software_draw_shm_->zeroed = false;
|
|
|
| @@ -308,24 +321,38 @@ void SynchronousCompositorProxy::DemandDrawSw(
|
| canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip)));
|
|
|
| output_surface_->DemandDrawSw(&canvas);
|
| - if (software_frame_holder_) {
|
| - *result = true;
|
| - software_frame_holder_->AssignTo(frame);
|
| - software_frame_holder_.reset();
|
| - DeliverMessages();
|
| - }
|
| - PopulateCommonParams(common_renderer_params);
|
| +}
|
| +
|
| +void SynchronousCompositorProxy::SwapBuffersSw(cc::CompositorFrame* frame) {
|
| + DCHECK(inside_receive_);
|
| + DCHECK(software_draw_reply_);
|
| + DCHECK(frame);
|
| + SendDemandDrawSwReply(true, frame, software_draw_reply_);
|
| + inside_receive_ = false;
|
| +}
|
| +
|
| +void SynchronousCompositorProxy::SendDemandDrawSwReply(
|
| + bool success,
|
| + 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<bool>::Write(reply_message, success);
|
| + IPC::ParamTraits<SyncCompositorCommonRendererParams>::Write(
|
| + reply_message, common_renderer_params);
|
| + IPC::ParamTraits<cc::CompositorFrame>::Write(reply_message, *frame);
|
| + Send(reply_message);
|
| }
|
|
|
| void SynchronousCompositorProxy::SwapBuffers(cc::CompositorFrame* frame) {
|
| + DCHECK(hardware_draw_reply_ || software_draw_reply_);
|
| + DCHECK(!(hardware_draw_reply_ && software_draw_reply_));
|
| if (hardware_draw_reply_) {
|
| SwapBuffersHw(frame);
|
| - return;
|
| + } else if (software_draw_reply_) {
|
| + SwapBuffersSw(frame);
|
| }
|
| -
|
| - DCHECK(!software_frame_holder_);
|
| - software_frame_holder_.reset(new cc::CompositorFrame);
|
| - frame->AssignTo(software_frame_holder_.get());
|
| }
|
|
|
| void SynchronousCompositorProxy::OnComputeScroll(
|
|
|