Chromium Code Reviews| 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 8b4b59fc8c65f0719fcc2dd287354d9d4697dbeb..801f77d2ad901eb2466c6fca03130948f3d15a58 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
| @@ -57,7 +57,8 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
| content_view_core_(NULL), |
| ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
| cached_background_color_(SK_ColorWHITE), |
| - texture_id_in_layer_(0) { |
| + texture_id_in_layer_(0), |
| + current_buffer_id_(0) { |
| if (CompositorImpl::UsesDirectGL()) { |
| surface_texture_transport_.reset(new SurfaceTextureTransportClient()); |
| layer_ = surface_texture_transport_->Initialize(); |
| @@ -83,6 +84,9 @@ RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
| ImageTransportFactoryAndroid::GetInstance()->DestroySharedSurfaceHandle( |
| shared_surface_); |
| } |
| + if (texture_id_in_layer_) |
|
piman
2012/11/30 03:54:32
nit: braces around body
|
| + ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( |
| + texture_id_in_layer_); |
| } |
| void RenderWidgetHostViewAndroid::InitAsChild(gfx::NativeView parent_view) { |
| @@ -391,19 +395,42 @@ void RenderWidgetHostViewAndroid::OnAcceleratedCompositingStateChange() { |
| void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped( |
| const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, |
| int gpu_host_id) { |
| - texture_layer_->setTextureId(params.surface_handle); |
| - DCHECK(texture_layer_->layer() == layer_); |
| - layer_->setBounds(params.size); |
| - texture_id_in_layer_ = params.surface_handle; |
| - texture_size_in_layer_ = params.size; |
| + ImageTransportFactoryAndroid* factory = |
| + ImageTransportFactoryAndroid::GetInstance(); |
| // TODO(sievers): When running the impl thread in the browser we |
| - // need to delay the ACK until after commit. |
| + // need to delay the ACK until after commit and use more than a single |
| + // texture. |
| DCHECK(!CompositorImpl::CompositorSupport()->isThreadingEnabled()); |
| + |
| + uint64 previous_buffer = current_buffer_id_; |
| + if (previous_buffer && texture_id_in_layer_) { |
| + DCHECK(id_to_mailbox_.find(previous_buffer) != id_to_mailbox_.end()); |
| + ImageTransportFactoryAndroid::GetInstance()->ReleaseTexture( |
| + texture_id_in_layer_, |
| + reinterpret_cast<const signed char*>( |
| + id_to_mailbox_[previous_buffer].c_str())); |
| + } |
| + |
| + current_buffer_id_ = params.surface_handle; |
| + if (!texture_id_in_layer_) { |
| + texture_id_in_layer_ = factory->CreateTexture(); |
| + texture_layer_->setTextureId(texture_id_in_layer_); |
| + } |
| + |
| + DCHECK(id_to_mailbox_.find(current_buffer_id_) != id_to_mailbox_.end()); |
| + ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
| + texture_id_in_layer_, |
| + reinterpret_cast<const signed char*>( |
| + id_to_mailbox_[current_buffer_id_].c_str())); |
| + texture_layer_->layer()->invalidate(); |
| + texture_layer_->layer()->setBounds(params.size); |
| + texture_size_in_layer_ = params.size; |
| + |
| uint32 sync_point = |
| ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint(); |
| RenderWidgetHostImpl::AcknowledgeBufferPresent( |
| - params.route_id, gpu_host_id, true, sync_point); |
| + params.route_id, gpu_host_id, previous_buffer, sync_point); |
| } |
| void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( |
| @@ -416,6 +443,23 @@ 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 == 1 || surface_id == 2); |
| + id_to_mailbox_[surface_id] = mailbox_name; |
| +} |
| + |
| +void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease(uint64 surface_id) { |
| + // This tells us we should free the frontbuffer. |
| + if (texture_id_in_layer_) { |
| + texture_layer_->setTextureId(0); |
| + ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( |
| + texture_id_in_layer_); |
| + texture_id_in_layer_ = 0; |
| + } |
| +} |
| + |
| bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( |
| const gfx::Size& desired_size) { |
| NOTREACHED(); |