Commit f3982a30 authored by Fady Samuel's avatar Fady Samuel Committed by Commit Bot

Surface synchronization: Simplify returned resources

This CL simplifies returned resources in RenderWidgetHostViewAndroid to
better match how resources are returned on other platforms. Android did
a lot of weird things that are incompatible with OOP-D and surface
synchronization that worked fine assuming synchronous operations.

Bug: 672962
Change-Id: Ibc980a0639752e126cbea9a44cb9df5ecc6e589a
Reviewed-on: https://chromium-review.googlesource.com/1101409Reviewed-by: default avatarSaman Sami <samans@chromium.org>
Reviewed-by: default avatarKhushal <khushalsagar@chromium.org>
Commit-Queue: Fady Samuel <fsamuel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#567399}
parent 3589d513
......@@ -228,7 +228,6 @@ RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
UpdateNativeViewTree(nullptr);
view_.set_event_handler(nullptr);
DCHECK(!ime_adapter_android_);
DCHECK(ack_callbacks_.empty());
DCHECK(!delegated_frame_host_);
}
......@@ -851,21 +850,9 @@ bool RenderWidgetHostViewAndroid::ShouldRouteEvents() const {
host()->delegate()->GetInputEventRouter();
}
void RenderWidgetHostViewAndroid::SendReclaimCompositorResources(
bool is_swap_ack) {
DCHECK(host());
if (is_swap_ack) {
renderer_compositor_frame_sink_->DidReceiveCompositorFrameAck(
surface_returned_resources_);
} else {
renderer_compositor_frame_sink_->ReclaimResources(
surface_returned_resources_);
}
surface_returned_resources_.clear();
}
void RenderWidgetHostViewAndroid::DidReceiveCompositorFrameAck() {
RunAckCallbacks();
void RenderWidgetHostViewAndroid::DidReceiveCompositorFrameAck(
const std::vector<viz::ReturnedResource>& resources) {
renderer_compositor_frame_sink_->DidReceiveCompositorFrameAck(resources);
}
void RenderWidgetHostViewAndroid::DidPresentCompositorFrame(
......@@ -878,12 +865,7 @@ void RenderWidgetHostViewAndroid::DidPresentCompositorFrame(
void RenderWidgetHostViewAndroid::ReclaimResources(
const std::vector<viz::ReturnedResource>& resources) {
if (resources.empty())
return;
std::copy(resources.begin(), resources.end(),
std::back_inserter(surface_returned_resources_));
if (ack_callbacks_.empty())
SendReclaimCompositorResources(false /* is_swap_ack */);
renderer_compositor_frame_sink_->ReclaimResources(resources);
}
void RenderWidgetHostViewAndroid::OnFrameTokenChanged(uint32_t frame_token) {
......@@ -906,9 +888,6 @@ void RenderWidgetHostViewAndroid::DidCreateNewRendererCompositorFrameSink(
}
delegated_frame_host_->CompositorFrameSinkChanged();
renderer_compositor_frame_sink_ = renderer_compositor_frame_sink;
// Accumulated resources belong to the old RendererCompositorFrameSink and
// should not be returned.
surface_returned_resources_.clear();
}
void RenderWidgetHostViewAndroid::EvictFrameIfNecessary() {
......@@ -947,19 +926,10 @@ void RenderWidgetHostViewAndroid::SubmitCompositorFrame(
viz::CompositorFrameMetadata metadata = frame.metadata.Clone();
base::Closure ack_callback =
base::Bind(&RenderWidgetHostViewAndroid::SendReclaimCompositorResources,
weak_ptr_factory_.GetWeakPtr(), true /* is_swap_ack */);
ack_callbacks_.push(ack_callback);
delegated_frame_host_->SubmitCompositorFrame(
local_surface_id, std::move(frame), std::move(hit_test_region_list));
AcknowledgeBeginFrame();
if (host()->is_hidden())
RunAckCallbacks();
// As the metadata update may trigger view invalidation, always call it after
// any potential compositor scheduling.
OnFrameMetadataUpdated(std::move(metadata), is_transparent);
......@@ -1464,8 +1434,6 @@ void RenderWidgetHostViewAndroid::HideInternal() {
if (overscroll_controller_)
overscroll_controller_->Disable();
RunAckCallbacks();
// Inform the renderer that we are being hidden so it can reduce its resource
// utilization.
host()->WasHidden();
......@@ -1994,7 +1962,6 @@ void RenderWidgetHostViewAndroid::UpdateNativeViewTree(
bool resize = false;
if (will_build_tree != has_view_tree) {
touch_selection_controller_.reset();
RunAckCallbacks();
if (has_view_tree) {
view_.RemoveObserver(this);
view_.RemoveFromParent();
......@@ -2052,13 +2019,6 @@ void RenderWidgetHostViewAndroid::EvictDelegatedFrame() {
current_surface_size_.SetSize(0, 0);
}
void RenderWidgetHostViewAndroid::RunAckCallbacks() {
while (!ack_callbacks_.empty()) {
ack_callbacks_.front().Run();
ack_callbacks_.pop();
}
}
TouchSelectionControllerClientManager*
RenderWidgetHostViewAndroid::GetTouchSelectionControllerClientManager() {
return touch_selection_controller_client_manager_.get();
......@@ -2170,7 +2130,6 @@ void RenderWidgetHostViewAndroid::OnAttachCompositor() {
void RenderWidgetHostViewAndroid::OnDetachCompositor() {
DCHECK(view_.parent());
RunAckCallbacks();
overscroll_controller_.reset();
if (using_browser_compositor_)
delegated_frame_host_->DetachFromCompositor();
......@@ -2267,7 +2226,6 @@ void RenderWidgetHostViewAndroid::OnActivityStarted() {
void RenderWidgetHostViewAndroid::OnLostResources() {
EvictDelegatedFrame();
DCHECK(ack_callbacks_.empty());
}
void RenderWidgetHostViewAndroid::SetTextHandlesHiddenForStylus(
......
......@@ -237,10 +237,11 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid
// DelegatedFrameHostAndroid::Client implementation.
void SetBeginFrameSource(viz::BeginFrameSource* begin_frame_source) override;
void DidReceiveCompositorFrameAck() override;
void DidPresentCompositorFrame(
uint32_t presentation_token,
const gfx::PresentationFeedback& feedback) override;
void DidReceiveCompositorFrameAck(
const std::vector<viz::ReturnedResource>& resources) override;
void ReclaimResources(
const std::vector<viz::ReturnedResource>& resources) override;
void OnFrameTokenChanged(uint32_t frame_token) override;
......@@ -346,10 +347,8 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid
MouseWheelPhaseHandler* GetMouseWheelPhaseHandler() override;
void EvictDelegatedFrame();
void RunAckCallbacks();
bool ShouldRouteEvents() const;
void SendReclaimCompositorResources(bool is_swap_ack);
void OnFrameMetadataUpdated(
const viz::CompositorFrameMetadata& frame_metadata,
......@@ -454,13 +453,9 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid
// Manages the Compositor Frames received from the renderer.
std::unique_ptr<ui::DelegatedFrameHostAndroid> delegated_frame_host_;
std::vector<viz::ReturnedResource> surface_returned_resources_;
// The most recent surface size that was pushed to the surface layer.
gfx::Size current_surface_size_;
base::queue<base::Closure> ack_callbacks_;
// Used to control and render overscroll-related effects.
std::unique_ptr<OverscrollControllerAndroid> overscroll_controller_;
......
......@@ -328,8 +328,7 @@ void DelegatedFrameHostAndroid::PixelSizeWillChange(
void DelegatedFrameHostAndroid::DidReceiveCompositorFrameAck(
const std::vector<viz::ReturnedResource>& resources) {
client_->ReclaimResources(resources);
client_->DidReceiveCompositorFrameAck();
client_->DidReceiveCompositorFrameAck(resources);
}
void DelegatedFrameHostAndroid::DidPresentCompositorFrame(
......
......@@ -43,12 +43,13 @@ class UI_ANDROID_EXPORT DelegatedFrameHostAndroid
public:
virtual void SetBeginFrameSource(
viz::BeginFrameSource* begin_frame_source) = 0;
virtual void DidReceiveCompositorFrameAck() = 0;
virtual void DidPresentCompositorFrame(
uint32_t presentation_token,
const gfx::PresentationFeedback& feedback) = 0;
virtual void DidReceiveCompositorFrameAck(
const std::vector<viz::ReturnedResource>& resources) = 0;
virtual void ReclaimResources(
const std::vector<viz::ReturnedResource>&) = 0;
const std::vector<viz::ReturnedResource>& resources) = 0;
virtual void OnFrameTokenChanged(uint32_t frame_token) = 0;
virtual void DidReceiveFirstFrameAfterNavigation() = 0;
};
......
......@@ -31,11 +31,12 @@ class MockDelegatedFrameHostAndroidClient
: public DelegatedFrameHostAndroid::Client {
public:
MOCK_METHOD1(SetBeginFrameSource, void(viz::BeginFrameSource*));
MOCK_METHOD0(DidReceiveCompositorFrameAck, void());
MOCK_METHOD2(DidPresentCompositorFrame,
void(uint32_t, const gfx::PresentationFeedback&));
MOCK_METHOD1(DidReceiveCompositorFrameAck,
void(const std::vector<viz::ReturnedResource>&));
MOCK_METHOD1(ReclaimResources,
void(const std::vector<viz::ReturnedResource>&));
MOCK_METHOD2(DidPresentCompositorFrame,
void(uint32_t, const gfx::PresentationFeedback&));
MOCK_METHOD1(OnFrameTokenChanged, void(uint32_t));
MOCK_METHOD0(DidReceiveFirstFrameAfterNavigation, void());
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment