| Index: content/browser/android/in_process/synchronous_compositor_impl.cc
|
| diff --git a/content/browser/android/in_process/synchronous_compositor_impl.cc b/content/browser/android/in_process/synchronous_compositor_impl.cc
|
| index 347c3631ac617ba93f693049580faf8f0da83a45..a012b5083ec243c8f9e0c088d1b0c3eb37924671 100644
|
| --- a/content/browser/android/in_process/synchronous_compositor_impl.cc
|
| +++ b/content/browser/android/in_process/synchronous_compositor_impl.cc
|
| @@ -66,7 +66,8 @@ SynchronousCompositorImpl::SynchronousCompositorImpl(WebContents* contents)
|
| : compositor_client_(NULL),
|
| output_surface_(NULL),
|
| contents_(contents),
|
| - input_handler_(NULL) {
|
| + input_handler_(NULL),
|
| + weak_ptr_factory_(this) {
|
| DCHECK(contents);
|
| }
|
|
|
| @@ -115,19 +116,67 @@ bool SynchronousCompositorImpl::DemandDrawHw(
|
| const gfx::Transform& transform,
|
| gfx::Rect viewport,
|
| gfx::Rect clip,
|
| - bool stencil_enabled) {
|
| + bool stencil_enabled,
|
| + cc::CompositorFrame* frame) {
|
| DCHECK(CalledOnValidThread());
|
| DCHECK(output_surface_);
|
| + DCHECK(frame);
|
|
|
| - return output_surface_->DemandDrawHw(
|
| - surface_size, transform, viewport, clip, stencil_enabled);
|
| + bool result = output_surface_->DemandDrawHw(
|
| + surface_size, transform, viewport, clip, stencil_enabled, frame);
|
| + if (result)
|
| + UpdateFrameMetaData(frame->metadata);
|
| + return result;
|
| }
|
|
|
| -bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas) {
|
| +bool SynchronousCompositorImpl::DemandDrawDelegated(
|
| + const gfx::Transform& transform,
|
| + gfx::Rect viewport,
|
| + gfx::Rect clip,
|
| + cc::CompositorFrame* frame) {
|
| DCHECK(CalledOnValidThread());
|
| DCHECK(output_surface_);
|
| + DCHECK(frame);
|
|
|
| - return output_surface_->DemandDrawSw(canvas);
|
| + bool result =
|
| + output_surface_->DemandDrawDelegated(transform, viewport, clip, frame);
|
| + if (result)
|
| + UpdateFrameMetaData(frame->metadata);
|
| + return result;
|
| +}
|
| +
|
| +bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas,
|
| + cc::CompositorFrame* frame) {
|
| + DCHECK(CalledOnValidThread());
|
| + DCHECK(output_surface_);
|
| + DCHECK(frame);
|
| +
|
| + bool result = output_surface_->DemandDrawSw(canvas, frame);
|
| + if (result)
|
| + UpdateFrameMetaData(frame->metadata);
|
| + return result;
|
| +}
|
| +
|
| +void SynchronousCompositorImpl::ReturnResources(
|
| + const cc::CompositorFrameAck* frame_ack) {
|
| + output_surface_->ReturnResources(frame_ack);
|
| +}
|
| +
|
| +void SynchronousCompositorImpl::UpdateFrameMetaData(
|
| + const cc::CompositorFrameMetadata& frame_metadata) {
|
| + if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI,
|
| + FROM_HERE,
|
| + base::Bind(&SynchronousCompositorImpl::UpdateFrameMetaData,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + frame_metadata));
|
| + return;
|
| + }
|
| + RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>(
|
| + contents_->GetRenderWidgetHostView());
|
| + if (rwhv)
|
| + rwhv->SynchronousFrameMetadata(frame_metadata);
|
| }
|
|
|
| void SynchronousCompositorImpl::SetMemoryPolicy(
|
| @@ -207,14 +256,6 @@ InputEventAckState SynchronousCompositorImpl::HandleInputEvent(
|
| contents_->GetRoutingID(), input_event);
|
| }
|
|
|
| -void SynchronousCompositorImpl::UpdateFrameMetaData(
|
| - const cc::CompositorFrameMetadata& frame_metadata) {
|
| - RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>(
|
| - contents_->GetRenderWidgetHostView());
|
| - if (rwhv)
|
| - rwhv->SynchronousFrameMetadata(frame_metadata);
|
| -}
|
| -
|
| void SynchronousCompositorImpl::DidActivatePendingTree() {
|
| if (compositor_client_)
|
| compositor_client_->DidUpdateContent();
|
| @@ -274,4 +315,9 @@ void SynchronousCompositor::SetClientForWebContents(
|
| }
|
| }
|
|
|
| +// static
|
| +SynchronousCompositorFactoryImpl* SynchronousCompositor::GetFactory() {
|
| + return g_factory.Pointer();
|
| +}
|
| +
|
| } // namespace content
|
|
|