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 825c241d4ff0342db2bf39b405476684797a8def..b28bbe58d4c36ecef7ec614dffc5fd8b84165778 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -56,7 +56,8 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
content_view_core_(content_view_core), |
ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
texture_layer_(WebKit::WebExternalTextureLayer::create()), |
- texture_id_in_layer_(0) { |
+ texture_id_in_layer_(0), |
+ current_buffer_id_(0) { |
host_->SetView(this); |
// RenderWidgetHost is initialized as visible. If is_hidden_ is true, tell |
// RenderWidgetHost to hide. |
@@ -364,9 +365,30 @@ void RenderWidgetHostViewAndroid::OnAcceleratedCompositingStateChange() { |
void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped( |
const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, |
int gpu_host_id) { |
- texture_layer_->setTextureId(params.surface_handle); |
- texture_id_in_layer_ = params.surface_handle; |
+ DCHECK(id_to_texture_map_.find(params.surface_handle) != |
+ id_to_texture_map_.end()); |
+ // TODO(sievers): The compositor should do this on the impl thread. |
+ // And the release should happen after the next commit. |
+ |
+ TextureMap::const_iterator it = |
+ id_to_texture_map_.find(params.surface_handle); |
+ DCHECK(it != id_to_texture_map_.end()); |
+ const TextureInfo* texture = it->second; |
+ ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
+ texture->id, texture->mailbox_name.get()); |
+ texture_layer_->setTextureId(texture->id); |
texture_layer_->layer()->invalidate(); |
+ texture_id_in_layer_ = params.surface_handle; |
+ |
+ if (current_buffer_id_) { |
+ TextureMap::const_iterator it = id_to_texture_map_.find( |
+ current_buffer_id_); |
+ DCHECK(it != id_to_texture_map_.end()); |
+ ImageTransportFactoryAndroid::GetInstance()->ReleaseTexture( |
+ it->second->id, it->second->mailbox_name.get()); |
+ } |
+ |
+ current_buffer_id_ = params.surface_handle; |
// TODO(sievers): The view and layer should get sized proactively. |
if (((gfx::Size)texture_layer_->layer()->bounds()).IsEmpty()) |
texture_layer_->layer()->setBounds( |
@@ -392,6 +414,40 @@ void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { |
NOTREACHED(); |
} |
+void RenderWidgetHostViewAndroid::AcceleratedSurfaceNew( |
+ int32 width_in_pixel, int32 height_in_pixel, uint64 surface_id, |
+ const std::string& mailbox_name) { |
+ DCHECK(surface_id); |
+ if (id_to_texture_map_.find(surface_id) != id_to_texture_map_.end()) { |
+ // The buffer was reallocated (e.g. resize), but there is nothing we |
+ // need to do here. |
+ TextureInfo* texture = id_to_texture_map_[surface_id]; |
+ DCHECK(!memcmp(texture->mailbox_name.get(), |
+ mailbox_name.c_str(), |
+ mailbox_name.length())); |
+ } else { |
+ scoped_ptr<TextureInfo> texture(new TextureInfo); |
+ texture->id = ImageTransportFactoryAndroid::GetInstance()->CreateTexture(); |
+ texture->mailbox_name.reset(new signed char[mailbox_name.length()]); |
+ memcpy(texture->mailbox_name.get(), |
+ mailbox_name.c_str(), |
+ mailbox_name.length()); |
+ id_to_texture_map_[surface_id] = texture.release(); |
+ } |
+ |
+ // There should only ever be a front- and backbuffer. |
+ DCHECK(id_to_texture_map_.size() <= 2); |
+} |
+ |
+void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease(uint64 surface_id) { |
+ DCHECK(surface_id); |
+ TextureMap::iterator it = id_to_texture_map_.find(surface_id); |
+ DCHECK(it != id_to_texture_map_.end()); |
+ ImageTransportFactoryAndroid::GetInstance()->DeleteTexture(it->second->id); |
+ delete it->second; |
+ id_to_texture_map_.erase(it); |
+} |
+ |
bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( |
const gfx::Size& desired_size) { |
NOTREACHED(); |