Index: content/browser/renderer_host/render_widget_host_view_aura.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc |
index f7b6dd4bab4bc7905212ba216be02c7ec3a3100b..dc6a9b337ef76dfc3ee517ea809c7da891901a2e 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc |
@@ -1299,7 +1299,7 @@ void RenderWidgetHostViewAura::UpdateExternalTexture() { |
mailbox.shared_memory_size()); |
CheckResizeLock(); |
} else { |
- window_->layer()->SetExternalTexture(NULL); |
+ window_->layer()->SetShowPaintedContent(); |
resize_lock_.reset(); |
host_->WasResized(); |
framebuffer_holder_ = NULL; |
@@ -1430,7 +1430,8 @@ void RenderWidgetHostViewAura::SwapDelegatedFrame( |
gfx::Rect damage_rect; |
gfx::Rect damage_rect_in_dip; |
- if (!frame_data->render_pass_list.empty()) { |
+ bool has_content = !frame_data->render_pass_list.empty(); |
+ if (has_content) { |
cc::RenderPass* root_pass = frame_data->render_pass_list.back(); |
frame_size = root_pass->output_rect.size(); |
@@ -1472,12 +1473,15 @@ void RenderWidgetHostViewAura::SwapDelegatedFrame( |
// indicates the renderer's output surface may have been recreated, in which |
// case we should recreate the DelegatedRendererLayer, to avoid matching |
// resources from the old one with resources from the new one which would |
- // have the same id. |
- window_->layer()->SetDelegatedFrame(scoped_ptr<cc::DelegatedFrameData>(), |
- frame_size_in_dip); |
+ // have the same id. Changing the layer to showing painted content destroys |
+ // the DelegatedRendererLayer. |
+ window_->layer()->SetShowPaintedContent(); |
last_output_surface_id_ = output_surface_id; |
} |
- window_->layer()->SetDelegatedFrame(frame_data.Pass(), frame_size_in_dip); |
+ if (has_content) |
+ window_->layer()->SetDelegatedFrame(frame_data.Pass(), frame_size_in_dip); |
+ else |
+ window_->layer()->SetShowPaintedContent(); |
released_front_lock_ = NULL; |
current_frame_size_ = frame_size_in_dip; |
CheckResizeLock(); |
@@ -2592,8 +2596,11 @@ void RenderWidgetHostViewAura::DidRecreateLayer(ui::Layer *old_layer, |
current_surface_->device_scale_factor(), texture_id); |
} |
} |
- old_layer->SetExternalTexture(new_texture); |
- new_layer->SetExternalTexture(old_texture); |
+ if (new_texture.get()) |
+ old_layer->SetExternalTexture(new_texture.get()); |
+ else |
+ old_layer->SetShowPaintedContent(); |
+ new_layer->SetExternalTexture(old_texture.get()); |
} else if (old_mailbox.IsSharedMemory()) { |
base::SharedMemory* old_buffer = old_mailbox.shared_memory(); |
const size_t size = old_mailbox.shared_memory_size_in_bytes(); |
@@ -3348,9 +3355,10 @@ void RenderWidgetHostViewAura::RemovingFromRootWindow() { |
ui::Compositor* compositor = GetCompositor(); |
// We can't get notification for commits after this point, which would |
// guarantee that the compositor isn't using an old texture any more, so |
- // instead we force the texture to NULL which synchronizes with the compositor |
- // thread, and makes it safe to run the callback. |
- window_->layer()->SetExternalTexture(NULL); |
+ // instead we force the layer to stop using any external resources which |
+ // synchronizes with the compositor thread, and makes it safe to run the |
+ // callback. |
+ window_->layer()->SetShowPaintedContent(); |
RunOnCommitCallbacks(); |
resize_lock_.reset(); |
host_->WasResized(); |