| Index: cc/resources/resource_provider_unittest.cc
 | 
| diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc
 | 
| index 3d5adc0e7a42304e4a074ae7d699e0dbf3ea9dcc..136855847db72d82a8ea2ccd33be7fb3b16a3daa 100644
 | 
| --- a/cc/resources/resource_provider_unittest.cc
 | 
| +++ b/cc/resources/resource_provider_unittest.cc
 | 
| @@ -421,11 +421,11 @@
 | 
|      resource_provider_ = ResourceProvider::Create(
 | 
|          output_surface_.get(), shared_bitmap_manager_.get(),
 | 
|          gpu_memory_buffer_manager_.get(), main_thread_task_runner_.get(), 0,
 | 
| -        false, 1);
 | 
| +        false, 1, false);
 | 
|      child_resource_provider_ = ResourceProvider::Create(
 | 
|          child_output_surface_.get(), shared_bitmap_manager_.get(),
 | 
|          gpu_memory_buffer_manager_.get(), main_thread_task_runner_.get(), 0,
 | 
| -        false, 1);
 | 
| +        false, 1, false);
 | 
|    }
 | 
|  
 | 
|    ResourceProviderTest() : ResourceProviderTest(true) {}
 | 
| @@ -1367,7 +1367,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> child_resource_provider(ResourceProvider::Create(
 | 
|        child_output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    gfx::Size size(1, 1);
 | 
|    ResourceFormat format = RGBA_8888;
 | 
| @@ -1851,7 +1851,7 @@
 | 
|      scoped_ptr<ResourceProvider> child_resource_provider(
 | 
|          ResourceProvider::Create(child_output_surface.get(),
 | 
|                                   shared_bitmap_manager.get(), NULL, NULL, 0,
 | 
| -                                 false, 1));
 | 
| +                                 false, 1, false));
 | 
|  
 | 
|      scoped_ptr<TextureStateTrackingContext> parent_context_owned(
 | 
|          new TextureStateTrackingContext);
 | 
| @@ -1865,7 +1865,7 @@
 | 
|      scoped_ptr<ResourceProvider> parent_resource_provider(
 | 
|          ResourceProvider::Create(parent_output_surface.get(),
 | 
|                                   shared_bitmap_manager.get(), NULL, NULL, 0,
 | 
| -                                 false, 1));
 | 
| +                                 false, 1, false));
 | 
|  
 | 
|      gfx::Size size(1, 1);
 | 
|      ResourceFormat format = RGBA_8888;
 | 
| @@ -2497,7 +2497,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    gfx::Size size(1, 1);
 | 
|    ResourceFormat format = RGBA_8888;
 | 
| @@ -2579,7 +2579,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    gfx::Size size(1, 1);
 | 
|    ResourceFormat format = RGBA_8888;
 | 
| @@ -2626,7 +2626,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    gfx::Size size(1, 1);
 | 
|    ResourceFormat format = RGBA_8888;
 | 
| @@ -2676,7 +2676,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    gfx::Size size(1, 1);
 | 
|    ResourceFormat format = RGBA_8888;
 | 
| @@ -2741,7 +2741,7 @@
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
|        gpu_memory_buffer_manager_.get(), main_thread_task_runner_.get(), 0,
 | 
| -      false, 1));
 | 
| +      false, 1, false));
 | 
|  
 | 
|    uint32 release_sync_point = 0;
 | 
|    bool lost_resource = false;
 | 
| @@ -2790,7 +2790,7 @@
 | 
|  
 | 
|      scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|          output_surface.get(), shared_bitmap_manager, gpu_memory_buffer_manager,
 | 
| -        main_thread_task_runner, 0, false, 1));
 | 
| +        main_thread_task_runner, 0, false, 1, false));
 | 
|  
 | 
|      unsigned texture_id = 1;
 | 
|      uint32 sync_point = 30;
 | 
| @@ -2933,7 +2933,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    uint32 sync_point = 30;
 | 
|    unsigned target = GL_TEXTURE_EXTERNAL_OES;
 | 
| @@ -3002,7 +3002,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    uint32 sync_point = 30;
 | 
|    unsigned target = GL_TEXTURE_2D;
 | 
| @@ -3055,7 +3055,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    uint32 sync_point = 0;
 | 
|    unsigned target = GL_TEXTURE_2D;
 | 
| @@ -3175,7 +3175,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    gfx::Size size(2, 2);
 | 
|    gfx::Vector2d offset(0, 0);
 | 
| @@ -3249,7 +3249,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    gfx::Size size(2, 2);
 | 
|  
 | 
| @@ -3304,7 +3304,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    gfx::Size size(2, 2);
 | 
|    const ResourceFormat formats[2] = {RGBA_8888, BGRA_8888};
 | 
| @@ -3358,7 +3358,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    id = resource_provider->CreateResource(
 | 
|        size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format);
 | 
| @@ -3400,7 +3400,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    id = resource_provider->CreateResource(
 | 
|        size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format);
 | 
| @@ -3442,7 +3442,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    EXPECT_CALL(*context, NextTextureId()).WillRepeatedly(Return(texture_id));
 | 
|  
 | 
| @@ -3482,7 +3482,7 @@
 | 
|  
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|  
 | 
|    id = resource_provider->CreateResource(
 | 
|        size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format);
 | 
| @@ -3542,6 +3542,87 @@
 | 
|        .RetiresOnSaturation();
 | 
|  }
 | 
|  
 | 
| +TEST_P(ResourceProviderTest, CopyResource_GLTexture) {
 | 
| +  if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE)
 | 
| +    return;
 | 
| +  scoped_ptr<AllocationTrackingContext3D> context_owned(
 | 
| +      new StrictMock<AllocationTrackingContext3D>);
 | 
| +  AllocationTrackingContext3D* context = context_owned.get();
 | 
| +  context_owned->set_support_sync_query(true);
 | 
| +
 | 
| +  FakeOutputSurfaceClient output_surface_client;
 | 
| +  scoped_ptr<OutputSurface> output_surface(
 | 
| +      FakeOutputSurface::Create3d(context_owned.Pass()));
 | 
| +  ASSERT_TRUE(output_surface->BindToClient(&output_surface_client));
 | 
| +
 | 
| +  const int kWidth = 2;
 | 
| +  const int kHeight = 2;
 | 
| +  gfx::Size size(kWidth, kHeight);
 | 
| +  ResourceFormat format = RGBA_8888;
 | 
| +  ResourceId source_id = 0;
 | 
| +  ResourceId dest_id = 0;
 | 
| +  const unsigned kSourceTextureId = 123u;
 | 
| +  const unsigned kDestTextureId = 321u;
 | 
| +  const unsigned kImageId = 234u;
 | 
| +
 | 
| +  scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
| +      output_surface.get(), shared_bitmap_manager_.get(),
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
| +
 | 
| +  source_id = resource_provider->CreateResource(
 | 
| +      size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format);
 | 
| +
 | 
| +  EXPECT_CALL(*context, NextTextureId())
 | 
| +      .WillOnce(Return(kSourceTextureId))
 | 
| +      .RetiresOnSaturation();
 | 
| +  EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, kSourceTextureId))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +  EXPECT_CALL(*context, createImageCHROMIUM(_, kWidth, kHeight, GL_RGBA))
 | 
| +      .WillOnce(Return(kImageId))
 | 
| +      .RetiresOnSaturation();
 | 
| +  {
 | 
| +    ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock(
 | 
| +        resource_provider.get(), source_id);
 | 
| +    EXPECT_TRUE(lock.GetGpuMemoryBuffer());
 | 
| +  }
 | 
| +  Mock::VerifyAndClearExpectations(context);
 | 
| +
 | 
| +  dest_id = resource_provider->CreateResource(
 | 
| +      size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format);
 | 
| +
 | 
| +  EXPECT_CALL(*context, NextTextureId())
 | 
| +      .WillOnce(Return(kDestTextureId))
 | 
| +      .RetiresOnSaturation();
 | 
| +  EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, kDestTextureId))
 | 
| +      .Times(2)
 | 
| +      .RetiresOnSaturation();
 | 
| +  EXPECT_CALL(*context, texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA,
 | 
| +                                   GL_UNSIGNED_BYTE, nullptr))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +  EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, kSourceTextureId))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +  EXPECT_CALL(*context, bindTexImage2DCHROMIUM(GL_TEXTURE_2D, kImageId))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +  resource_provider->CopyResource(source_id, dest_id, gfx::Rect(size));
 | 
| +  Mock::VerifyAndClearExpectations(context);
 | 
| +
 | 
| +  EXPECT_CALL(*context, destroyImageCHROMIUM(kImageId))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +  EXPECT_CALL(*context, RetireTextureId(kSourceTextureId))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +  EXPECT_CALL(*context, RetireTextureId(kDestTextureId))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +  resource_provider->DeleteResource(source_id);
 | 
| +  resource_provider->DeleteResource(dest_id);
 | 
| +}
 | 
| +
 | 
|  TEST_P(ResourceProviderTest, CompressedTextureETC1Allocate) {
 | 
|    if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE)
 | 
|      return;
 | 
| @@ -3559,7 +3640,7 @@
 | 
|    gfx::Size size(4, 4);
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|    int texture_id = 123;
 | 
|  
 | 
|    ResourceId id = resource_provider->CreateResource(
 | 
| @@ -3590,7 +3671,7 @@
 | 
|    gfx::Size size(4, 4);
 | 
|    scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|        output_surface.get(), shared_bitmap_manager_.get(),
 | 
| -      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1));
 | 
| +      gpu_memory_buffer_manager_.get(), NULL, 0, false, 1, false));
 | 
|    int texture_id = 123;
 | 
|    uint8_t pixels[8];
 | 
|  
 | 
| @@ -3646,7 +3727,7 @@
 | 
|      size_t kTextureAllocationChunkSize = 1;
 | 
|      scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|          output_surface.get(), shared_bitmap_manager.get(), NULL, NULL, 0, false,
 | 
| -        kTextureAllocationChunkSize));
 | 
| +        kTextureAllocationChunkSize, false));
 | 
|  
 | 
|      ResourceId id = resource_provider->CreateResource(
 | 
|          size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
 | 
| @@ -3662,7 +3743,7 @@
 | 
|      size_t kTextureAllocationChunkSize = 8;
 | 
|      scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
 | 
|          output_surface.get(), shared_bitmap_manager.get(), NULL, NULL, 0, false,
 | 
| -        kTextureAllocationChunkSize));
 | 
| +        kTextureAllocationChunkSize, false));
 | 
|  
 | 
|      ResourceId id = resource_provider->CreateResource(
 | 
|          size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
 | 
| 
 |