Chromium Code Reviews| 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()); |
|
no sievers
2014/05/20 20:48:26
So this is either on the UI thread (legacy) or on
boliu
2014/05/21 01:33:26
Ehh, exact opposite.
This is called on UI thread
|
| 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(); |