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

Unified Diff: android_webview/browser/browser_view_renderer.cc

Issue 2036023002: Rewire Android WebView's compositor changed signal. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use web_contents_ Created 4 years, 6 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
« no previous file with comments | « android_webview/browser/browser_view_renderer.h ('k') | android_webview/browser/child_frame.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: android_webview/browser/browser_view_renderer.cc
diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc
index a1d981e4eba9861699382aafa06155458b2b460c..d82d963a85e496e7eb61bae51399d6d6dbbc2ed9 100644
--- a/android_webview/browser/browser_view_renderer.cc
+++ b/android_webview/browser/browser_view_renderer.cc
@@ -19,6 +19,8 @@
#include "base/trace_event/trace_event_argument.h"
#include "cc/output/compositor_frame.h"
#include "cc/output/compositor_frame_ack.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
#include "gpu/command_buffer/service/gpu_switches.h"
@@ -93,7 +95,7 @@ BrowserViewRenderer::BrowserViewRenderer(
: client_(client),
ui_task_runner_(ui_task_runner),
current_compositor_frame_consumer_(nullptr),
- compositor_(NULL),
+ compositor_(nullptr),
is_paused_(false),
view_visible_(false),
window_visible_(false),
@@ -105,8 +107,7 @@ BrowserViewRenderer::BrowserViewRenderer(
max_page_scale_factor_(0.f),
on_new_picture_enable_(false),
clear_view_(false),
- offscreen_pre_raster_(false),
- next_compositor_id_(1) {}
+ offscreen_pre_raster_(false) {}
BrowserViewRenderer::~BrowserViewRenderer() {
DCHECK(compositor_map_.empty());
@@ -247,10 +248,9 @@ bool BrowserViewRenderer::OnDrawHardware() {
}
std::unique_ptr<ChildFrame> child_frame = base::WrapUnique(new ChildFrame(
- frame.output_surface_id, std::move(frame.frame),
- GetCompositorID(compositor_), viewport_rect_for_tile_priority.IsEmpty(),
- transform_for_tile_priority, offscreen_pre_raster_,
- external_draw_constraints_.is_layer));
+ frame.output_surface_id, std::move(frame.frame), compositor_id_,
+ viewport_rect_for_tile_priority.IsEmpty(), transform_for_tile_priority,
+ offscreen_pre_raster_, external_draw_constraints_.is_layer));
ReturnUnusedResource(
current_compositor_frame_consumer_->PassUncommittedFrameOnUI());
@@ -304,16 +304,14 @@ void BrowserViewRenderer::ReturnResourceFromParent(
CompositorFrameConsumer* compositor_frame_consumer) {
CompositorFrameConsumer::ReturnedResourcesMap returned_resource_map;
compositor_frame_consumer->SwapReturnedResourcesOnUI(&returned_resource_map);
- for (auto iterator = returned_resource_map.begin();
- iterator != returned_resource_map.end(); iterator++) {
- uint32_t compositor_id = iterator->first;
+ for (auto& pair : returned_resource_map) {
+ CompositorID compositor_id = pair.first;
content::SynchronousCompositor* compositor = compositor_map_[compositor_id];
cc::CompositorFrameAck frame_ack;
- frame_ack.resources.swap(iterator->second.resources);
+ frame_ack.resources.swap(pair.second.resources);
if (compositor && !frame_ack.resources.empty()) {
- compositor->ReturnResources(iterator->second.output_surface_id,
- frame_ack);
+ compositor->ReturnResources(pair.second.output_surface_id, frame_ack);
}
}
}
@@ -467,54 +465,53 @@ gfx::Rect BrowserViewRenderer::GetScreenRect() const {
return gfx::Rect(client_->GetLocationOnScreen(), size_);
}
-uint32_t BrowserViewRenderer::GetCompositorID(
- content::SynchronousCompositor* compositor) {
- for (auto iterator = compositor_map_.begin();
- iterator != compositor_map_.end(); iterator++) {
- if (iterator->second == compositor) {
- return iterator->first;
- }
- }
-
- DCHECK(false);
- // Return an invalid ID (0), because ID starts with 1.
- return 0;
-}
-
void BrowserViewRenderer::DidInitializeCompositor(
- content::SynchronousCompositor* compositor) {
+ content::SynchronousCompositor* compositor,
+ int process_id,
+ int routing_id) {
TRACE_EVENT_INSTANT0("android_webview",
"BrowserViewRenderer::DidInitializeCompositor",
TRACE_EVENT_SCOPE_THREAD);
DCHECK(compositor);
- // This happens when id overflows to 0, unlikely in practice.
- if (next_compositor_id_ == 0)
- ++next_compositor_id_;
+ CompositorID compositor_id(process_id, routing_id);
+ // This assumes that a RenderViewHost has at most 1 synchronous compositor
+ // througout its lifetime.
+ DCHECK(compositor_map_.count(compositor_id) == 0);
+ compositor_map_[compositor_id] = compositor;
- DCHECK(compositor_map_.find(next_compositor_id_) == compositor_map_.end());
- compositor_map_[next_compositor_id_] = compositor;
- next_compositor_id_++;
+ // At this point, the RVHChanged event for the new RVH that contains the
+ // |compositor| might have been fired already, in which case just set the
+ // current compositor with the new compositor.
+ if (!compositor_ && compositor_id.Equals(compositor_id_))
+ compositor_ = compositor;
}
void BrowserViewRenderer::DidDestroyCompositor(
- content::SynchronousCompositor* compositor) {
+ content::SynchronousCompositor* compositor,
+ int process_id,
+ int routing_id) {
TRACE_EVENT_INSTANT0("android_webview",
"BrowserViewRenderer::DidDestroyCompositor",
TRACE_EVENT_SCOPE_THREAD);
- DCHECK(compositor_);
- if (compositor_ == compositor)
+ CompositorID compositor_id(process_id, routing_id);
+ DCHECK(compositor_map_.count(compositor_id));
+ if (compositor_ == compositor) {
compositor_ = nullptr;
- compositor_map_.erase(GetCompositorID(compositor));
+ }
+
+ compositor_map_.erase(compositor_id);
}
-void BrowserViewRenderer::DidBecomeCurrent(
- content::SynchronousCompositor* compositor) {
- TRACE_EVENT_INSTANT0("android_webview",
- "BrowserViewRenderer::DidBecomeCurrent",
- TRACE_EVENT_SCOPE_THREAD);
- DCHECK(compositor);
- DCHECK(GetCompositorID(compositor));
- compositor_ = compositor;
+void BrowserViewRenderer::SetActiveCompositorID(
+ const CompositorID& compositor_id) {
+ if (compositor_map_.count(compositor_id)) {
+ compositor_ = compositor_map_[compositor_id];
+ // TODO(hush): Now transfer states to the new compositor, like memory policy
+ // and root layer scroll offset.
+ } else {
+ compositor_ = nullptr;
+ }
+ compositor_id_ = compositor_id;
}
void BrowserViewRenderer::SetDipScale(float dip_scale) {
« no previous file with comments | « android_webview/browser/browser_view_renderer.h ('k') | android_webview/browser/child_frame.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698