| Index: cc/layers/video_layer_impl.cc
 | 
| diff --git a/cc/layers/video_layer_impl.cc b/cc/layers/video_layer_impl.cc
 | 
| index 1db6856a45b276941a8b63a7a62cc33f654d2b8b..7f2769504d27e3c2f0624863fb83d35cf178b959 100644
 | 
| --- a/cc/layers/video_layer_impl.cc
 | 
| +++ b/cc/layers/video_layer_impl.cc
 | 
| @@ -37,7 +37,8 @@ scoped_ptr<VideoLayerImpl> VideoLayerImpl::Create(
 | 
|  
 | 
|  VideoLayerImpl::VideoLayerImpl(LayerTreeImpl* tree_impl, int id)
 | 
|      : LayerImpl(tree_impl, id),
 | 
| -      frame_(NULL) {}
 | 
| +      frame_(NULL),
 | 
| +      hardware_resource_(0) {}
 | 
|  
 | 
|  VideoLayerImpl::~VideoLayerImpl() {
 | 
|    if (!provider_client_impl_->Stopped()) {
 | 
| @@ -68,8 +69,6 @@ void VideoLayerImpl::DidBecomeActive() {
 | 
|    provider_client_impl_->set_active_video_layer(this);
 | 
|  }
 | 
|  
 | 
| -static void EmptyCallback(unsigned sync_point, bool lost_resource) {}
 | 
| -
 | 
|  void VideoLayerImpl::WillDraw(ResourceProvider* resource_provider) {
 | 
|    LayerImpl::WillDraw(resource_provider);
 | 
|  
 | 
| @@ -94,16 +93,10 @@ void VideoLayerImpl::WillDraw(ResourceProvider* resource_provider) {
 | 
|      updater_.reset(new VideoResourceUpdater(resource_provider));
 | 
|  
 | 
|    VideoFrameExternalResources external_resources;
 | 
| -  if (frame_->format() == media::VideoFrame::NATIVE_TEXTURE) {
 | 
| -    // TODO(danakj): To make this work for ubercomp, push this code out to
 | 
| -    // WebMediaPlayer and have it set a callback so it knows it can reuse the
 | 
| -    // texture.
 | 
| -    TextureMailbox::ReleaseCallback empty_callback = base::Bind(&EmptyCallback);
 | 
| -    external_resources = updater_->CreateForHardwarePlanes(
 | 
| -        frame_, empty_callback);
 | 
| -  } else {
 | 
| +  if (frame_->format() == media::VideoFrame::NATIVE_TEXTURE)
 | 
| +    external_resources = updater_->CreateForHardwarePlanes(frame_);
 | 
| +  else
 | 
|      external_resources = updater_->CreateForSoftwarePlanes(frame_);
 | 
| -  }
 | 
|  
 | 
|    frame_resource_type_ = external_resources.type;
 | 
|  
 | 
| @@ -115,6 +108,13 @@ void VideoLayerImpl::WillDraw(ResourceProvider* resource_provider) {
 | 
|      return;
 | 
|    }
 | 
|  
 | 
| +  if (external_resources.hardware_resource) {
 | 
| +    hardware_resource_ = external_resources.hardware_resource;
 | 
| +    hardware_release_callback_ =
 | 
| +        external_resources.hardware_release_callback;
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
|    for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) {
 | 
|      frame_resources_.push_back(
 | 
|          resource_provider->CreateResourceFromTextureMailbox(
 | 
| @@ -184,9 +184,11 @@ void VideoLayerImpl::AppendQuads(QuadSink* quad_sink,
 | 
|        break;
 | 
|      }
 | 
|      case VideoFrameExternalResources::RGB_RESOURCE: {
 | 
| -      DCHECK_EQ(frame_resources_.size(), 1u);
 | 
| -      if (frame_resources_.size() < 1u)
 | 
| -        break;
 | 
| +      if (!hardware_resource_) {
 | 
| +        DCHECK_EQ(frame_resources_.size(), 1u);
 | 
| +        if (frame_resources_.size() < 1u)
 | 
| +          break;
 | 
| +      }
 | 
|        bool premultiplied_alpha = true;
 | 
|        gfx::PointF uv_top_left(0.f, 0.f);
 | 
|        gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale);
 | 
| @@ -196,7 +198,8 @@ void VideoLayerImpl::AppendQuads(QuadSink* quad_sink,
 | 
|        texture_quad->SetNew(shared_quad_state,
 | 
|                             quad_rect,
 | 
|                             opaque_rect,
 | 
| -                           frame_resources_[0],
 | 
| +                           hardware_resource_ ? hardware_resource_
 | 
| +                                              : frame_resources_[0],
 | 
|                             premultiplied_alpha,
 | 
|                             uv_top_left,
 | 
|                             uv_bottom_right,
 | 
| @@ -206,9 +209,11 @@ void VideoLayerImpl::AppendQuads(QuadSink* quad_sink,
 | 
|        break;
 | 
|      }
 | 
|      case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: {
 | 
| -      DCHECK_EQ(frame_resources_.size(), 1u);
 | 
| -      if (frame_resources_.size() < 1u)
 | 
| -        break;
 | 
| +      if (!hardware_resource_) {
 | 
| +        DCHECK_EQ(frame_resources_.size(), 1u);
 | 
| +        if (frame_resources_.size() < 1u)
 | 
| +          break;
 | 
| +      }
 | 
|        gfx::Transform transform(
 | 
|            provider_client_impl_->stream_texture_matrix());
 | 
|        transform.Scale(tex_width_scale, tex_height_scale);
 | 
| @@ -217,16 +222,19 @@ void VideoLayerImpl::AppendQuads(QuadSink* quad_sink,
 | 
|        stream_video_quad->SetNew(shared_quad_state,
 | 
|                                  quad_rect,
 | 
|                                  opaque_rect,
 | 
| -                                frame_resources_[0],
 | 
| +                                hardware_resource_ ? hardware_resource_
 | 
| +                                                   : frame_resources_[0],
 | 
|                                  transform);
 | 
|        quad_sink->Append(stream_video_quad.PassAs<DrawQuad>(),
 | 
|                          append_quads_data);
 | 
|        break;
 | 
|      }
 | 
|      case VideoFrameExternalResources::IO_SURFACE: {
 | 
| -      DCHECK_EQ(frame_resources_.size(), 1u);
 | 
| -      if (frame_resources_.size() < 1u)
 | 
| -        break;
 | 
| +      if (!hardware_resource_) {
 | 
| +        DCHECK_EQ(frame_resources_.size(), 1u);
 | 
| +        if (frame_resources_.size() < 1u)
 | 
| +          break;
 | 
| +      }
 | 
|        gfx::Size visible_size(visible_rect.width(), visible_rect.height());
 | 
|        scoped_ptr<IOSurfaceDrawQuad> io_surface_quad =
 | 
|            IOSurfaceDrawQuad::Create();
 | 
| @@ -234,7 +242,8 @@ void VideoLayerImpl::AppendQuads(QuadSink* quad_sink,
 | 
|                                quad_rect,
 | 
|                                opaque_rect,
 | 
|                                visible_size,
 | 
| -                              frame_resources_[0],
 | 
| +                              hardware_resource_ ? hardware_resource_
 | 
| +                                                 : frame_resources_[0],
 | 
|                                IOSurfaceDrawQuad::UNFLIPPED);
 | 
|        quad_sink->Append(io_surface_quad.PassAs<DrawQuad>(),
 | 
|                          append_quads_data);
 | 
| @@ -280,6 +289,10 @@ void VideoLayerImpl::DidDraw(ResourceProvider* resource_provider) {
 | 
|  
 | 
|      software_resources_.clear();
 | 
|      software_release_callback_.Reset();
 | 
| +  } else if (hardware_resource_) {
 | 
| +    hardware_release_callback_.Run(0, false);
 | 
| +    hardware_resource_ = 0;
 | 
| +    hardware_release_callback_.Reset();
 | 
|    } else {
 | 
|      for (size_t i = 0; i < frame_resources_.size(); ++i)
 | 
|        resource_provider->DeleteResource(frame_resources_[i]);
 | 
| 
 |