Index: content/browser/renderer_host/compositor_impl_android.cc |
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc |
index f4ae15040b2285108164a1c5076ed356efc13906..b554f9f76a4eba443840ff0860a51a07aa9fa97f 100644 |
--- a/content/browser/renderer_host/compositor_impl_android.cc |
+++ b/content/browser/renderer_host/compositor_impl_android.cc |
@@ -230,7 +230,7 @@ scoped_ptr<cc::SurfaceIdAllocator> CompositorImpl::CreateSurfaceIdAllocator() { |
CompositorImpl::CompositorImpl(CompositorClient* client, |
gfx::NativeWindow root_window) |
: root_layer_(cc::Layer::Create(Compositor::LayerSettings())), |
- resource_manager_(&ui_resource_provider_), |
+ resource_manager_, |
surface_id_allocator_(GetSurfaceManager() ? CreateSurfaceIdAllocator() |
: nullptr), |
has_transparent_background_(false), |
@@ -252,6 +252,8 @@ CompositorImpl::CompositorImpl(CompositorClient* client, |
DCHECK(client); |
DCHECK(root_window); |
root_window->AttachCompositor(this); |
+ CreateLayerTreeHost(); |
+ resource_manager_.Init(host_.get()); |
} |
CompositorImpl::~CompositorImpl() { |
@@ -324,7 +326,7 @@ void CompositorImpl::Composite(CompositingTrigger trigger) { |
if (trigger == COMPOSITE_IMMEDIATELY) |
will_composite_immediately_ = false; |
- DCHECK(host_); |
+ DCHECK(host_->visible()); |
DCHECK(trigger == COMPOSITE_IMMEDIATELY || trigger == COMPOSITE_EVENTUALLY); |
DCHECK(needs_composite_); |
DCHECK(!DidCompositeThisFrame()); |
@@ -369,7 +371,7 @@ void CompositorImpl::Composite(CompositingTrigger trigger) { |
} |
ui::UIResourceProvider& CompositorImpl::GetUIResourceProvider() { |
- return ui_resource_provider_; |
+ return *this; |
} |
ui::ResourceManager& CompositorImpl::GetResourceManager() { |
@@ -440,8 +442,6 @@ void CompositorImpl::SetSurface(jobject surface) { |
void CompositorImpl::CreateLayerTreeHost() { |
DCHECK(!host_); |
DCHECK(!WillCompositeThisFrame()); |
- needs_composite_ = false; |
- pending_swapbuffers_ = 0; |
cc::LayerTreeSettings settings; |
settings.renderer_settings.refresh_rate = 60.0; |
settings.renderer_settings.allow_antialiasing = false; |
@@ -469,8 +469,7 @@ void CompositorImpl::CreateLayerTreeHost() { |
params.settings = &settings; |
host_ = cc::LayerTreeHost::CreateSingleThreaded(this, ¶ms); |
host_->SetRootLayer(root_layer_); |
- |
- host_->SetVisible(true); |
+ host_->SetVisible(false); |
host_->SetLayerTreeHostClientReady(); |
host_->SetViewportSize(size_); |
host_->set_has_transparent_background(has_transparent_background_); |
@@ -483,7 +482,7 @@ void CompositorImpl::CreateLayerTreeHost() { |
void CompositorImpl::SetVisible(bool visible) { |
TRACE_EVENT1("cc", "CompositorImpl::SetVisible", "visible", visible); |
if (!visible) { |
- DCHECK(host_); |
+ DCHECK(host_->visible()); |
// Look for any layers that were attached to the root for readback |
// and are waiting for Composite() to happen. |
bool readback_pending = false; |
@@ -500,8 +499,10 @@ void CompositorImpl::SetVisible(bool visible) { |
} |
if (WillComposite()) |
CancelComposite(); |
- ui_resource_provider_.SetLayerTreeHost(NULL); |
- host_.reset(); |
+ host_->SetVisible(false); |
+ host_->ReleaseOutputSurface(); |
+ pending_swapbuffers_ = 0; |
+ needs_composite_ = false; |
establish_gpu_channel_timeout_.Stop(); |
output_surface_request_pending_ = false; |
display_client_.reset(); |
@@ -509,9 +510,9 @@ void CompositorImpl::SetVisible(bool visible) { |
current_composite_task_->Cancel(); |
current_composite_task_.reset(); |
} |
- } else if (!host_) { |
- CreateLayerTreeHost(); |
- ui_resource_provider_.SetLayerTreeHost(host_.get()); |
+ } else { |
+ host_->SetVisible(true); |
+ SetNeedsComposite(); |
} |
} |
@@ -540,7 +541,7 @@ void CompositorImpl::SetHasTransparentBackground(bool flag) { |
} |
void CompositorImpl::SetNeedsComposite() { |
- if (!host_.get()) |
+ if (!host_->visible()) |
return; |
DCHECK(!needs_composite_ || WillComposite()); |
@@ -686,8 +687,7 @@ void CompositorImpl::CreateOutputSurface() { |
void CompositorImpl::PopulateGpuCapabilities( |
gpu::Capabilities gpu_capabilities) { |
- ui_resource_provider_.SetSupportsETC1NonPowerOfTwo( |
- gpu_capabilities.texture_format_etc1_npot); |
+ gpu_capabilities_ = gpu_capabilities; |
} |
void CompositorImpl::AddObserver(VSyncObserver* observer) { |
@@ -698,11 +698,24 @@ void CompositorImpl::RemoveObserver(VSyncObserver* observer) { |
observer_list_.RemoveObserver(observer); |
} |
+cc::UIResourceId CompositorImpl::CreateUIResource( |
+ cc::UIResourceClient* client) { |
+ return host_->CreateUIResource(client); |
+} |
+ |
+void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { |
+ host_->DeleteUIResource(resource_id); |
+} |
+ |
+bool CompositorImpl::SupportsETC1NonPowerOfTwo() const { |
+ return gpu_capabilities_.texture_format_etc1_npot; |
+} |
+ |
void CompositorImpl::ScheduleComposite() { |
- DCHECK(!needs_composite_ || WillComposite()); |
- if (ignore_schedule_composite_) |
+ if (ignore_schedule_composite_ || !host_->visible()) |
return; |
+ DCHECK_IMPLIES(needs_composite_, WillComposite()); |
needs_composite_ = true; |
// We currently expect layer tree invalidations at most once per frame |
// during normal operation and therefore try to composite immediately |
@@ -711,7 +724,7 @@ void CompositorImpl::ScheduleComposite() { |
} |
void CompositorImpl::ScheduleAnimation() { |
- DCHECK(!needs_composite_ || WillComposite()); |
+ DCHECK_IMPLIES(needs_composite_, WillComposite()); |
needs_animate_ = true; |
if (needs_composite_) |
@@ -785,7 +798,7 @@ void CompositorImpl::OnVSync(base::TimeTicks frame_time, |
void CompositorImpl::SetNeedsAnimate() { |
needs_animate_ = true; |
- if (!host_) |
+ if (!host_->visible()) |
return; |
host_->SetNeedsAnimate(); |