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

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

Issue 2133873004: content: Move Surfaces related code out of RWHVA. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: missed overscroll change Created 4 years, 4 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 | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | ui/android/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 0f9ae4ad03bd48c1523a0dc6d50863fa6ccd0b60..9beb71ae6b3ba8be94c3a433d3873df99d657f21 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -15,7 +15,6 @@
#include "base/location.h"
#include "base/logging.h"
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/metrics/histogram.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/utf_string_conversions.h"
@@ -75,7 +74,7 @@
#include "third_party/khronos/GLES2/gl2.h"
#include "third_party/khronos/GLES2/gl2ext.h"
#include "third_party/skia/include/core/SkCanvas.h"
-#include "ui/android/context_provider_factory.h"
+#include "ui/android/delegated_frame_host_android.h"
#include "ui/android/window_android.h"
#include "ui/android/window_android_compositor.h"
#include "ui/base/layout.h"
@@ -95,24 +94,6 @@ namespace content {
namespace {
-void SatisfyCallback(cc::SurfaceManager* manager,
- const cc::SurfaceSequence& sequence) {
- std::vector<uint32_t> sequences;
- sequences.push_back(sequence.sequence);
- manager->DidSatisfySequences(sequence.client_id, &sequences);
-}
-
-void RequireCallback(cc::SurfaceManager* manager,
- const cc::SurfaceId& id,
- const cc::SurfaceSequence& sequence) {
- cc::Surface* surface = manager->GetSurfaceForId(id);
- if (!surface) {
- LOG(ERROR) << "Attempting to require callback on nonexistent surface";
- return;
- }
- surface->AddDestructionDependency(sequence);
-}
-
const int kUndefinedOutputSurfaceId = -1;
static const char kAsyncReadBackString[] = "Compositing.CopyFromSurfaceTime";
@@ -286,25 +267,6 @@ gfx::RectF GetSelectionRect(const ui::TouchSelectionController& controller) {
return rect;
}
-scoped_refptr<cc::SurfaceLayer> CreateSurfaceLayer(
- const cc::SurfaceId& surface_id,
- const gfx::Size& size) {
- DCHECK(!surface_id.is_null());
- cc::SurfaceManager* manager =
- ui::ContextProviderFactory::GetInstance()->GetSurfaceManager();
- DCHECK(manager);
- // manager must outlive compositors using it.
- scoped_refptr<cc::SurfaceLayer> surface_layer = cc::SurfaceLayer::Create(
- base::Bind(&SatisfyCallback, base::Unretained(manager)),
- base::Bind(&RequireCallback, base::Unretained(manager)));
- surface_layer->SetSurfaceId(surface_id, 1.f, size);
- surface_layer->SetBounds(size);
- surface_layer->SetIsDrawable(true);
- surface_layer->SetContentsOpaque(true);
-
- return surface_layer;
-}
-
} // anonymous namespace
RenderWidgetHostViewAndroid::LastFrameInfo::LastFrameInfo(
@@ -346,12 +308,14 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
locks_on_frame_count_(0),
observing_root_window_(false),
weak_ptr_factory_(this) {
+ // Set the layer which will hold the content layer for this view. The content
+ // layer is managed by the DelegatedFrameHost.
+ view_.SetLayer(cc::Layer::Create());
if (using_browser_compositor_) {
- id_allocator_.reset(new cc::SurfaceIdAllocator(
- ui::ContextProviderFactory::GetInstance()->AllocateSurfaceClientId()));
- ui::ContextProviderFactory::GetInstance()
- ->GetSurfaceManager()
- ->RegisterSurfaceClientId(id_allocator_->client_id());
+ delegated_frame_host_.reset(new ui::DelegatedFrameHostAndroid(
+ &view_, cached_background_color_,
+ base::Bind(&RenderWidgetHostViewAndroid::ReturnResources,
+ weak_ptr_factory_.GetWeakPtr())));
}
host_->SetView(this);
@@ -363,8 +327,7 @@ RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
content_view_core_->RemoveObserver(this);
SetContentViewCore(NULL);
DCHECK(ack_callbacks_.empty());
- DCHECK(!surface_factory_);
- DCHECK(surface_id_.is_null());
+ DCHECK(!delegated_frame_host_);
}
void RenderWidgetHostViewAndroid::Blur() {
@@ -418,6 +381,8 @@ RenderWidgetHostViewAndroid::GetRenderWidgetHost() const {
}
void RenderWidgetHostViewAndroid::WasResized() {
+ if (delegated_frame_host_)
+ delegated_frame_host_->UpdateContainerSizeinDIP(GetVisibleViewportSize());
host_->WasResized();
}
@@ -440,7 +405,7 @@ void RenderWidgetHostViewAndroid::GetScaledContentBitmap(
result_callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE);
return;
}
- gfx::Size bounds = view_.GetLayer()->bounds();
+ gfx::Size bounds = current_surface_size_;
if (src_subrect.IsEmpty())
src_subrect = gfx::Rect(bounds);
DCHECK_LE(src_subrect.width() + src_subrect.x(), bounds.width());
@@ -460,15 +425,15 @@ void RenderWidgetHostViewAndroid::GetScaledContentBitmap(
bool RenderWidgetHostViewAndroid::HasValidFrame() const {
if (!content_view_core_)
return false;
- if (!view_.GetLayer())
- return false;
- if (texture_size_in_layer_.IsEmpty())
+ if (current_surface_size_.IsEmpty())
return false;
// This tell us whether a valid frame has arrived or not.
if (!frame_evictor_->HasFrame())
return false;
+ DCHECK(!delegated_frame_host_ ||
+ delegated_frame_host_->HasDelegatedContent());
return true;
}
@@ -506,8 +471,7 @@ bool RenderWidgetHostViewAndroid::HasFocus() const {
}
bool RenderWidgetHostViewAndroid::IsSurfaceAvailableForCopy() const {
- return !using_browser_compositor_ ||
- (HasValidFrame() && surface_factory_.get());
+ return !using_browser_compositor_ || HasValidFrame();
}
void RenderWidgetHostViewAndroid::Show() {
@@ -558,8 +522,7 @@ void RenderWidgetHostViewAndroid::UnlockCompositingSurface() {
last_frame_info_.reset();
}
- if (!is_showing_ && view_.GetLayer())
- view_.GetLayer()->SetHideLayerAndSubtree(true);
+ view_.GetLayer()->SetHideLayerAndSubtree(!is_showing_);
}
}
@@ -662,6 +625,10 @@ void RenderWidgetHostViewAndroid::UpdateBackgroundColor(SkColor color) {
return;
cached_background_color_ = color;
+
+ if (delegated_frame_host_)
+ delegated_frame_host_->UpdateBackgroundColor(color);
+
if (content_view_core_)
content_view_core_->OnBackgroundColorChanged(color);
}
@@ -794,20 +761,8 @@ void RenderWidgetHostViewAndroid::RenderProcessGone(
void RenderWidgetHostViewAndroid::Destroy() {
host_->ViewDestroyed();
- RemoveLayers();
SetContentViewCore(NULL);
-
- if (!surface_id_.is_null()) {
- DCHECK(surface_factory_.get());
- surface_factory_->Destroy(surface_id_);
- surface_id_ = cc::SurfaceId();
- }
- surface_factory_.reset();
- if (id_allocator_) {
- ui::ContextProviderFactory::GetInstance()
- ->GetSurfaceManager()
- ->InvalidateSurfaceClientId(id_allocator_->client_id());
- }
+ delegated_frame_host_.reset();
// The RenderWidgetHost's destruction led here, so don't call it.
host_ = NULL;
@@ -893,21 +848,11 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface(
ui::WindowAndroidCompositor* compositor =
content_view_core_->GetWindowAndroid()->GetCompositor();
DCHECK(compositor);
- DCHECK(!surface_id_.is_null());
- scoped_refptr<cc::Layer> layer =
- CreateSurfaceLayer(surface_id_, texture_size_in_layer_);
- layer->SetHideLayerAndSubtree(true);
- compositor->AttachLayerForReadback(layer);
-
- std::unique_ptr<cc::CopyOutputRequest> request =
- cc::CopyOutputRequest::CreateRequest(
- base::Bind(&PrepareTextureCopyOutputResult,
- weak_ptr_factory_.GetWeakPtr(), layer, dst_size_in_pixel,
- preferred_color_type, start_time, callback));
-
- if (!src_subrect_in_pixel.IsEmpty())
- request->set_area(src_subrect_in_pixel);
- surface_factory_->RequestCopyOfSurface(surface_id_, std::move(request));
+ DCHECK(delegated_frame_host_);
+ delegated_frame_host_->RequestCopyOfSurface(
+ compositor, src_subrect_in_pixel,
+ base::Bind(&PrepareTextureCopyOutputResult, dst_size_in_pixel,
+ preferred_color_type, start_time, callback));
}
void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame(
@@ -958,28 +903,13 @@ void RenderWidgetHostViewAndroid::ReturnResources(
false /* is_swap_ack */);
}
-void RenderWidgetHostViewAndroid::SetBeginFrameSource(
- cc::BeginFrameSource* begin_frame_source) {
- // TODO(tansell): Hook this up.
-}
-
-void RenderWidgetHostViewAndroid::DestroyDelegatedContent() {
- RemoveLayers();
- if (!surface_id_.is_null()) {
- DCHECK(surface_factory_.get());
- cc::SurfaceId surface_id;
- std::swap(surface_id, surface_id_);
- surface_factory_->Destroy(surface_id);
- }
- view_.SetLayer(nullptr);
-}
-
void RenderWidgetHostViewAndroid::CheckOutputSurfaceChanged(
uint32_t output_surface_id) {
if (output_surface_id == last_output_surface_id_)
return;
- DestroyDelegatedContent();
- surface_factory_.reset();
+
+ delegated_frame_host_->OutputSurfaceChanged();
+
if (!surface_returned_resources_.empty())
SendReclaimCompositorResources(last_output_surface_id_,
false /* is_swap_ack */);
@@ -987,46 +917,12 @@ void RenderWidgetHostViewAndroid::CheckOutputSurfaceChanged(
last_output_surface_id_ = output_surface_id;
}
-void RenderWidgetHostViewAndroid::SubmitCompositorFrame(
- cc::CompositorFrame frame) {
- cc::SurfaceManager* manager =
- ui::ContextProviderFactory::GetInstance()->GetSurfaceManager();
- if (!surface_factory_) {
- surface_factory_ = base::WrapUnique(new cc::SurfaceFactory(manager, this));
- }
- if (surface_id_.is_null() ||
- texture_size_in_layer_ != current_surface_size_ ||
- location_bar_content_translation_ !=
- frame.metadata.location_bar_content_translation ||
- current_viewport_selection_ != frame.metadata.selection) {
- RemoveLayers();
- if (!surface_id_.is_null())
- surface_factory_->Destroy(surface_id_);
- surface_id_ = id_allocator_->GenerateId();
- surface_factory_->Create(surface_id_);
- view_.SetLayer(CreateSurfaceLayer(surface_id_, texture_size_in_layer_));
-
- DCHECK(view_.GetLayer());
-
- current_surface_size_ = texture_size_in_layer_;
- location_bar_content_translation_ =
- frame.metadata.location_bar_content_translation;
- current_viewport_selection_ = frame.metadata.selection;
- AttachLayers();
- }
-
- cc::SurfaceFactory::DrawCallback ack_callback =
- base::Bind(&RenderWidgetHostViewAndroid::RunAckCallbacks,
- weak_ptr_factory_.GetWeakPtr());
- surface_factory_->SubmitCompositorFrame(surface_id_, std::move(frame),
- ack_callback);
-}
-
void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame(
uint32_t output_surface_id,
cc::CompositorFrame frame) {
last_scroll_offset_ = frame.metadata.root_scroll_offset;
DCHECK(frame.delegated_frame_data);
+ DCHECK(delegated_frame_host_);
if (locks_on_frame_count_ > 0) {
DCHECK(HasValidFrame());
@@ -1038,12 +934,12 @@ void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame(
cc::RenderPass* root_pass =
frame.delegated_frame_data->render_pass_list.back().get();
- texture_size_in_layer_ = root_pass->output_rect.size();
+ current_surface_size_ = root_pass->output_rect.size();
cc::CompositorFrameMetadata metadata = frame.metadata.Clone();
CheckOutputSurfaceChanged(output_surface_id);
- bool has_content = !texture_size_in_layer_.IsEmpty();
+ bool has_content = !current_surface_size_.IsEmpty();
base::Closure ack_callback =
base::Bind(&RenderWidgetHostViewAndroid::SendReclaimCompositorResources,
@@ -1053,12 +949,13 @@ void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame(
ack_callbacks_.push(ack_callback);
if (!has_content) {
- DestroyDelegatedContent();
+ delegated_frame_host_->DestroyDelegatedContent();
} else {
- SubmitCompositorFrame(std::move(frame));
- view_.GetLayer()->SetIsDrawable(true);
- view_.GetLayer()->SetContentsOpaque(true);
- view_.GetLayer()->SetBounds(texture_size_in_layer_);
+ cc::SurfaceFactory::DrawCallback ack_callback =
+ base::Bind(&RenderWidgetHostViewAndroid::RunAckCallbacks,
+ weak_ptr_factory_.GetWeakPtr());
+ delegated_frame_host_->SubmitCompositorFrame(std::move(frame),
+ ack_callback);
}
if (host_->is_hidden())
@@ -1077,7 +974,8 @@ void RenderWidgetHostViewAndroid::OnSwapCompositorFrame(
}
void RenderWidgetHostViewAndroid::ClearCompositorFrame() {
- DestroyDelegatedContent();
+ if (delegated_frame_host_)
+ delegated_frame_host_->DestroyDelegatedContent();
}
void RenderWidgetHostViewAndroid::RetainFrame(uint32_t output_surface_id,
@@ -1126,8 +1024,8 @@ void RenderWidgetHostViewAndroid::SynchronousFrameMetadata(
}
void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) {
- if (view_.GetLayer())
- view_.GetLayer()->SetContentsOpaque(!enabled);
+ if (delegated_frame_host_)
+ delegated_frame_host_->SetContentsOpaque(!enabled);
}
bool RenderWidgetHostViewAndroid::SupportsAnimation() const {
@@ -1198,7 +1096,7 @@ void RenderWidgetHostViewAndroid::SynchronousCopyContents(
const SkColorType color_type) {
gfx::Size input_size_in_pixel;
if (src_subrect_in_pixel.IsEmpty())
- input_size_in_pixel = texture_size_in_layer_;
+ input_size_in_pixel = current_surface_size_;
else
input_size_in_pixel = src_subrect_in_pixel.size();
@@ -1291,8 +1189,7 @@ void RenderWidgetHostViewAndroid::ShowInternal() {
if (!host_ || !host_->is_hidden())
return;
- if (view_.GetLayer())
- view_.GetLayer()->SetHideLayerAndSubtree(false);
+ view_.GetLayer()->SetHideLayerAndSubtree(false);
frame_evictor_->SetVisible(true);
@@ -1322,7 +1219,7 @@ void RenderWidgetHostViewAndroid::HideInternal() {
bool stop_observing_root_window = !is_showing_ && hide_frontbuffer;
if (hide_frontbuffer) {
- if (view_.GetLayer() && locks_on_frame_count_ == 0)
+ if (locks_on_frame_count_ == 0)
view_.GetLayer()->SetHideLayerAndSubtree(true);
frame_evictor_->SetVisible(false);
@@ -1346,26 +1243,6 @@ void RenderWidgetHostViewAndroid::HideInternal() {
host_->WasHidden();
}
-void RenderWidgetHostViewAndroid::AttachLayers() {
- if (!content_view_core_)
- return;
- if (!view_.GetLayer())
- return;
-
- content_view_core_->AttachLayer(view_.GetLayer());
- view_.GetLayer()->SetHideLayerAndSubtree(!is_showing_);
-}
-
-void RenderWidgetHostViewAndroid::RemoveLayers() {
- if (!content_view_core_)
- return;
-
- if (!view_.GetLayer())
- return;
-
- content_view_core_->RemoveLayer(view_.GetLayer());
-}
-
void RenderWidgetHostViewAndroid::RequestVSyncUpdate(uint32_t requests) {
bool should_request_vsync = !outstanding_vsync_requests_ && requests;
outstanding_vsync_requests_ |= requests;
@@ -1452,8 +1329,8 @@ void RenderWidgetHostViewAndroid::RequestDisallowInterceptTouchEvent() {
void RenderWidgetHostViewAndroid::EvictDelegatedFrame() {
DCHECK_EQ(locks_on_frame_count_, 0u);
frame_evictor_->DiscardedFrame();
- if (view_.GetLayer())
- DestroyDelegatedContent();
+ if (delegated_frame_host_)
+ delegated_frame_host_->DestroyDelegatedContent();
}
bool RenderWidgetHostViewAndroid::HasAcceleratedSurface(
@@ -1658,7 +1535,7 @@ void RenderWidgetHostViewAndroid::DidOverscroll(
if (sync_compositor_)
sync_compositor_->DidOverscroll(params);
- if (!content_view_core_ || !view_.GetLayer() || !is_showing_)
+ if (!content_view_core_ || !is_showing_)
return;
if (overscroll_controller_)
@@ -1671,16 +1548,16 @@ void RenderWidgetHostViewAndroid::DidStopFlinging() {
}
uint32_t RenderWidgetHostViewAndroid::GetSurfaceClientId() {
- if (id_allocator_)
- return id_allocator_->client_id();
- return 0;
+ if (!delegated_frame_host_)
+ return 0;
+
+ return delegated_frame_host_->GetSurfaceClientId();
}
void RenderWidgetHostViewAndroid::SetContentViewCore(
ContentViewCoreImpl* content_view_core) {
DCHECK(!content_view_core || !content_view_core_ ||
(content_view_core_ == content_view_core));
- RemoveLayers();
StopObservingRootWindow();
bool resize = false;
@@ -1698,10 +1575,13 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
if (content_view_core_) {
content_view_core_->RemoveObserver(this);
view_.RemoveFromParent();
+ view_.GetLayer()->RemoveFromParent();
}
if (content_view_core) {
content_view_core->AddObserver(this);
- content_view_core->GetViewAndroid()->AddChild(&view_);
+ ui::ViewAndroid* parent_view = content_view_core->GetViewAndroid();
+ parent_view->AddChild(&view_);
+ parent_view->GetLayer()->AddChild(view_.GetLayer());
}
content_view_core_ = content_view_core;
}
@@ -1716,7 +1596,6 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj);
}
- AttachLayers();
if (!content_view_core_) {
sync_compositor_.reset();
return;
@@ -1861,8 +1740,8 @@ void RenderWidgetHostViewAndroid::OnActivityStarted() {
void RenderWidgetHostViewAndroid::OnLostResources() {
ReleaseLocksOnSurface();
- if (view_.GetLayer())
- DestroyDelegatedContent();
+ if (delegated_frame_host_)
+ delegated_frame_host_->DestroyDelegatedContent();
DCHECK(ack_callbacks_.empty());
}
@@ -1873,8 +1752,6 @@ void RenderWidgetHostViewAndroid::OnLostResources() {
// static
void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
- base::WeakPtr<RenderWidgetHostViewAndroid> rwhva,
- scoped_refptr<cc::Layer> readback_layer,
const gfx::Size& dst_size_in_pixel,
SkColorType color_type,
const base::TimeTicks& start_time,
@@ -1884,7 +1761,6 @@ void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
base::Bind(callback, SkBitmap(), READBACK_FAILED));
TRACE_EVENT0("cc",
"RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult");
- readback_layer->RemoveFromParent();
if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty())
return;
cc::TextureMailbox texture_mailbox;
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | ui/android/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698