Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Unified Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 1385543003: Have RenderWidgetHostViewAndroid own sync compositor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698