Index: content/browser/renderer_host/render_widget_host_view_android.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc |
index c182e2982a386ead45fdc64039a74409dc498795..43982902d11c29ab23fb175fa9063b4da3f276f8 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -328,7 +328,6 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
ui::GestureProviderConfigType::CURRENT_PLATFORM), |
this), |
stylus_text_selector_(this), |
- using_browser_compositor_(CompositorImpl::IsInitialized()), |
frame_evictor_(new DelegatedFrameEvictor(this)), |
locks_on_frame_count_(0), |
observing_root_window_(false), |
@@ -872,7 +871,7 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( |
return; |
} |
base::TimeTicks start_time = base::TimeTicks::Now(); |
- if (using_browser_compositor_ && !IsSurfaceAvailableForCopy()) { |
+ if (!sync_compositor_ && !IsSurfaceAvailableForCopy()) { |
no sievers
2015/10/07 18:52:58
nit: Actually even better would be to remove the s
boliu
2015/10/08 03:14:44
Done.
|
callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); |
return; |
} |
@@ -884,7 +883,7 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( |
gfx::Rect src_subrect_in_pixel = |
gfx::ConvertRectToPixel(device_scale_factor, src_subrect); |
- if (!using_browser_compositor_) { |
+ if (sync_compositor_) { |
SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback, |
preferred_color_type); |
UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous", |
@@ -1176,6 +1175,11 @@ void RenderWidgetHostViewAndroid::RetainFrame( |
last_frame_info_.reset(new LastFrameInfo(output_surface_id, frame.Pass())); |
} |
+SynchronousCompositorImpl* |
+RenderWidgetHostViewAndroid::GetSynchronousCompositorImpl() { |
+ return sync_compositor_.get(); |
+} |
+ |
void RenderWidgetHostViewAndroid::SynchronousFrameMetadata( |
const cc::CompositorFrameMetadata& frame_metadata) { |
if (!content_view_core_) |
@@ -1208,12 +1212,12 @@ void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) { |
bool RenderWidgetHostViewAndroid::SupportsAnimation() const { |
// The synchronous (WebView) compositor does not have a proper browser |
// compositor with which to drive animations. |
- return using_browser_compositor_; |
+ return !sync_compositor_; |
} |
void RenderWidgetHostViewAndroid::SetNeedsAnimate() { |
DCHECK(content_view_core_window_android_); |
- DCHECK(using_browser_compositor_); |
+ DCHECK(!sync_compositor_); |
content_view_core_window_android_->SetNeedsAnimate(); |
} |
@@ -1251,7 +1255,7 @@ void RenderWidgetHostViewAndroid::OnSelectionEvent( |
scoped_ptr<ui::TouchHandleDrawable> |
RenderWidgetHostViewAndroid::CreateDrawable() { |
DCHECK(content_view_core_); |
- if (!using_browser_compositor_) |
+ if (sync_compositor_) |
return PopupTouchHandleDrawable::Create(content_view_core_); |
return scoped_ptr<ui::TouchHandleDrawable>(new CompositedTouchHandleDrawable( |
@@ -1267,6 +1271,7 @@ void RenderWidgetHostViewAndroid::SynchronousCopyContents( |
const gfx::Size& dst_size_in_pixel, |
const ReadbackRequestCallback& callback, |
const SkColorType color_type) { |
+ DCHECK(sync_compositor_); |
gfx::Size input_size_in_pixel; |
if (src_subrect_in_pixel.IsEmpty()) |
input_size_in_pixel = texture_size_in_layer_; |
@@ -1281,14 +1286,6 @@ void RenderWidgetHostViewAndroid::SynchronousCopyContents( |
int output_width = output_size_in_pixel.width(); |
int output_height = output_size_in_pixel.height(); |
- SynchronousCompositor* compositor = |
- SynchronousCompositorImpl::FromID(host_->GetProcess()->GetID(), |
- host_->GetRoutingID()); |
- if (!compositor) { |
- callback.Run(SkBitmap(), READBACK_FAILED); |
- return; |
- } |
- |
SkBitmap bitmap; |
bitmap.allocPixels(SkImageInfo::Make(output_width, |
output_height, |
@@ -1298,7 +1295,7 @@ void RenderWidgetHostViewAndroid::SynchronousCopyContents( |
canvas.scale( |
(float)output_width / (float)input_size_in_pixel.width(), |
(float)output_height / (float)input_size_in_pixel.height()); |
- compositor->DemandDrawSw(&canvas); |
+ sync_compositor_->DemandDrawSw(&canvas); |
callback.Run(bitmap, READBACK_SUCCESS); |
} |
@@ -1473,7 +1470,7 @@ void RenderWidgetHostViewAndroid::SendBeginFrame(base::TimeTicks frame_time, |
TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::SendBeginFrame", |
"frame_time_us", frame_time.ToInternalValue()); |
- if (using_browser_compositor_) { |
+ if (!sync_compositor_) { |
// TODO(brianderson): Replace this hardcoded deadline after Android |
// switches to Surfaces and the Browser's commit isn't in the critcal path. |
base::TimeTicks deadline = frame_time + (vsync_period * 0.6); |
@@ -1483,15 +1480,11 @@ void RenderWidgetHostViewAndroid::SendBeginFrame(base::TimeTicks frame_time, |
cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
vsync_period, cc::BeginFrameArgs::NORMAL))); |
} else { |
- SynchronousCompositorImpl* compositor = SynchronousCompositorImpl::FromID( |
- host_->GetProcess()->GetID(), host_->GetRoutingID()); |
- if (compositor) { |
- // The synchronous compositor synchronously does it's work in this call. |
- // It does not use a deadline. |
- compositor->BeginFrame(cc::BeginFrameArgs::Create( |
- BEGINFRAME_FROM_HERE, frame_time, base::TimeTicks(), vsync_period, |
- cc::BeginFrameArgs::NORMAL)); |
- } |
+ // The synchronous compositor synchronously does it's work in this call. |
+ // It does not use a deadline. |
+ sync_compositor_->BeginFrame(cc::BeginFrameArgs::Create( |
+ BEGINFRAME_FROM_HERE, frame_time, base::TimeTicks(), vsync_period, |
+ cc::BeginFrameArgs::NORMAL)); |
} |
} |
@@ -1609,11 +1602,8 @@ InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent( |
shim->Send(new GpuMsg_WakeUpGpu); |
} |
- SynchronousCompositorImpl* compositor = |
- SynchronousCompositorImpl::FromID(host_->GetProcess()->GetID(), |
- host_->GetRoutingID()); |
- if (compositor) |
- return compositor->HandleInputEvent(input_event); |
+ if (sync_compositor_.get()) |
+ return sync_compositor_->HandleInputEvent(input_event); |
return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; |
} |
@@ -1745,6 +1735,9 @@ uint32_t RenderWidgetHostViewAndroid::GetSurfaceIdNamespace() { |
void RenderWidgetHostViewAndroid::SetContentViewCore( |
ContentViewCoreImpl* content_view_core) { |
+ // Android webview does not currently support switching ContentViewCoreImpl. |
+ DCHECK_IMPLIES(sync_compositor_, |
+ !content_view_core || !content_view_core_); |
no sievers
2015/10/07 18:52:58
So this is what I think we support here:
- settin
boliu
2015/10/08 03:14:44
That case sounds the same as normally creating CVC
no sievers
2015/10/08 22:39:29
Maybe splitting up this function into AttachToCont
boliu
2015/10/09 02:22:16
Yes. But that never happens (yet) in webview, sinc
|
RemoveLayers(); |
StopObservingRootWindow(); |
@@ -1772,9 +1765,10 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
} |
AttachLayers(); |
- |
- if (!content_view_core_) |
+ if (!content_view_core_) { |
+ sync_compositor_.reset(); |
no sievers
2015/10/07 18:52:57
Actually I missed that if you do this, then some o
boliu
2015/10/08 03:14:44
Hmm, you are right. CVC can be set much later afte
no sievers
2015/10/08 22:39:29
Ok. Maybe we can revisit later. For example, maybe
boliu
2015/10/09 02:22:16
Maybe don't need that. I think most RVHWA is creat
|
return; |
+ } |
if (is_showing_) |
StartObservingRootWindow(); |
@@ -1789,6 +1783,11 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
content_view_core_window_android_->GetCompositor()) { |
overscroll_controller_ = CreateOverscrollController(content_view_core_); |
} |
+ |
+ if (!sync_compositor_) { |
+ sync_compositor_ = SynchronousCompositorImpl::Create( |
+ this, content_view_core_->GetWebContents()); |
+ } |
} |
void RenderWidgetHostViewAndroid::RunAckCallbacks( |
@@ -1837,7 +1836,7 @@ void RenderWidgetHostViewAndroid::OnAttachCompositor() { |
void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
DCHECK(content_view_core_); |
- DCHECK(using_browser_compositor_); |
+ DCHECK(!sync_compositor_); |
RunAckCallbacks(cc::SurfaceDrawStatus::DRAW_SKIPPED); |
overscroll_controller_.reset(); |
} |