| 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..35be7261cbb77677acc182272ab0192d96aa541f 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);
|
| }
|
|
|
| @@ -110,24 +111,60 @@ void SynchronousCompositorImpl::ReleaseHwDraw() {
|
| g_factory.Get().CompositorReleasedHardwareDraw();
|
| }
|
|
|
| -bool SynchronousCompositorImpl::DemandDrawHw(
|
| - gfx::Size surface_size,
|
| - const gfx::Transform& transform,
|
| - gfx::Rect viewport,
|
| - gfx::Rect clip,
|
| - bool stencil_enabled) {
|
| +gpu::GLInProcessContext* SynchronousCompositorImpl::GetShareContext() {
|
| + DCHECK(CalledOnValidThread());
|
| + return g_factory.Get().GetShareContext();
|
| +}
|
| +
|
| +bool SynchronousCompositorImpl::DemandDrawHw(gfx::Size surface_size,
|
| + const gfx::Transform& transform,
|
| + gfx::Rect viewport,
|
| + gfx::Rect clip,
|
| + 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;
|
| +}
|
| +
|
| +void SynchronousCompositorImpl::ReturnResources(
|
| + const cc::CompositorFrameAck& frame_ack) {
|
| + DCHECK(CalledOnValidThread());
|
| + output_surface_->ReturnResources(frame_ack);
|
| }
|
|
|
| bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas) {
|
| DCHECK(CalledOnValidThread());
|
| DCHECK(output_surface_);
|
|
|
| - return output_surface_->DemandDrawSw(canvas);
|
| + cc::CompositorFrame frame;
|
| + bool result = output_surface_->DemandDrawSw(canvas, &frame);
|
| + if (result)
|
| + UpdateFrameMetaData(frame.metadata);
|
| + return result;
|
| +}
|
| +
|
| +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 +244,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();
|
|
|