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 65a5fb4aa8113b24261f45143f3f2144ffe36e2d..9035d7d70adb1c281f2a9f2fbe3ab1f5280c049b 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc |
@@ -119,6 +119,11 @@ class MemoryHolder : public base::RefCounted<MemoryHolder> { |
namespace { |
+void MailboxReleaseCallback(scoped_ptr<base::SharedMemory> shared_memory, |
+ unsigned sync_point, bool lost_resource) { |
+ // NOTE: shared_memory will get released when we go out of scope. |
+} |
+ |
// In mouse lock mode, we need to prevent the (invisible) cursor from hitting |
// the border of the view, in order to get valid movement information. However, |
// forcing the cursor back to the center of the view after each mouse move |
@@ -2491,28 +2496,51 @@ bool RenderWidgetHostViewAura::HasHitTestMask() const { |
void RenderWidgetHostViewAura::GetHitTestMask(gfx::Path* mask) const { |
} |
-scoped_refptr<ui::Texture> RenderWidgetHostViewAura::CopyTexture() { |
- if (!host_->is_accelerated_compositing_active()) |
- return scoped_refptr<ui::Texture>(); |
- |
- ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
- GLHelper* gl_helper = factory->GetGLHelper(); |
- if (!gl_helper) |
- return scoped_refptr<ui::Texture>(); |
- |
- if (!current_surface_.get()) |
- return scoped_refptr<ui::Texture>(); |
- |
- WebKit::WebGLId texture_id = |
- gl_helper->CopyTexture(current_surface_->PrepareTexture(), |
- current_surface_->size()); |
- if (!texture_id) |
- return scoped_refptr<ui::Texture>(); |
- |
- return scoped_refptr<ui::Texture>( |
- factory->CreateOwnedTexture( |
+void RenderWidgetHostViewAura::DidRecreateLayer(ui::Layer *old_layer, |
+ ui::Layer *new_layer) { |
+ float mailbox_scale_factor; |
+ cc::TextureMailbox old_mailbox = |
+ old_layer->GetTextureMailbox(&mailbox_scale_factor); |
+ scoped_refptr<ui::Texture> old_texture = old_layer->external_texture(); |
+ // The new_layer is the one that will be used by our Window, so that's the one |
+ // that should keep our texture. old_layer will be returned to the |
+ // RecreateLayer caller, and should have a copy. |
+ if (old_texture.get()) { |
+ ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
+ GLHelper* gl_helper = factory->GetGLHelper(); |
+ scoped_refptr<ui::Texture> new_texture; |
+ if (host_->is_accelerated_compositing_active() && |
+ gl_helper && current_surface_.get()) { |
+ WebKit::WebGLId texture_id = |
+ gl_helper->CopyTexture(current_surface_->PrepareTexture(), |
+ current_surface_->size()); |
+ if (texture_id) { |
+ new_texture = factory->CreateOwnedTexture( |
current_surface_->size(), |
- current_surface_->device_scale_factor(), texture_id)); |
+ current_surface_->device_scale_factor(), texture_id); |
+ } |
+ } |
+ old_layer->SetExternalTexture(new_texture); |
+ new_layer->SetExternalTexture(old_texture); |
+ } else if (old_mailbox.IsSharedMemory()) { |
+ base::SharedMemory* old_buffer = old_mailbox.shared_memory(); |
+ const size_t size = old_mailbox.shared_memory_size_in_bytes(); |
+ |
+ scoped_ptr<base::SharedMemory> new_buffer(new base::SharedMemory); |
+ new_buffer->CreateAndMapAnonymous(size); |
+ |
+ if (old_buffer->memory() && new_buffer->memory()) { |
+ memcpy(new_buffer->memory(), old_buffer->memory(), size); |
+ base::SharedMemory* new_buffer_raw_ptr = new_buffer.get(); |
+ cc::TextureMailbox::ReleaseCallback callback = |
+ base::Bind(MailboxReleaseCallback, Passed(&new_buffer)); |
+ cc::TextureMailbox new_mailbox(new_buffer_raw_ptr, |
+ old_mailbox.shared_memory_size(), |
+ callback); |
+ new_layer->SetTextureMailbox(new_mailbox, mailbox_scale_factor); |
+ } |
+ } |
+ // TODO(piman): handle delegated frames. |
} |
//////////////////////////////////////////////////////////////////////////////// |