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(); |