| Index: gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc
|
| diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc b/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc
|
| index b44b4774046e9995963009cb5214b1e449f5a05f..b555ebb60bc7c638760dfdb235781ca6f66356d8 100644
|
| --- a/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc
|
| +++ b/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc
|
| @@ -32,9 +32,10 @@ class AsyncPixelTransferDelegateIdle
|
| : public AsyncPixelTransferDelegate,
|
| public base::SupportsWeakPtr<AsyncPixelTransferDelegateIdle> {
|
| public:
|
| + typedef base::Callback<GLuint()> TextureIdCallback;
|
| AsyncPixelTransferDelegateIdle(
|
| AsyncPixelTransferManagerIdle::SharedState* state,
|
| - GLuint texture_id,
|
| + const TextureIdCallback& texture_id_callback,
|
| const AsyncTexImage2DParams& define_params);
|
| ~AsyncPixelTransferDelegateIdle() override;
|
|
|
| @@ -55,7 +56,7 @@ class AsyncPixelTransferDelegateIdle
|
| AsyncMemoryParams mem_params);
|
|
|
| uint64 id_;
|
| - GLuint texture_id_;
|
| + TextureIdCallback texture_id_callback_;
|
| bool transfer_in_progress_;
|
| AsyncTexImage2DParams define_params_;
|
|
|
| @@ -68,10 +69,10 @@ class AsyncPixelTransferDelegateIdle
|
|
|
| AsyncPixelTransferDelegateIdle::AsyncPixelTransferDelegateIdle(
|
| AsyncPixelTransferManagerIdle::SharedState* shared_state,
|
| - GLuint texture_id,
|
| + const TextureIdCallback& texture_id_callback,
|
| const AsyncTexImage2DParams& define_params)
|
| : id_(g_next_pixel_transfer_state_id++),
|
| - texture_id_(texture_id),
|
| + texture_id_callback_(texture_id_callback),
|
| transfer_in_progress_(false),
|
| define_params_(define_params),
|
| shared_state_(shared_state) {}
|
| @@ -145,7 +146,8 @@ void AsyncPixelTransferDelegateIdle::PerformAsyncTexImage2D(
|
| void* data = mem_params.GetDataAddress();
|
|
|
| base::TimeTicks begin_time(base::TimeTicks::Now());
|
| - gfx::ScopedTextureBinder texture_binder(tex_params.target, texture_id_);
|
| + gfx::ScopedTextureBinder texture_binder(tex_params.target,
|
| + texture_id_callback_.Run());
|
|
|
| {
|
| TRACE_EVENT0("gpu", "glTexImage2D");
|
| @@ -181,7 +183,8 @@ void AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D(
|
| void* data = mem_params.GetDataAddress();
|
|
|
| base::TimeTicks begin_time(base::TimeTicks::Now());
|
| - gfx::ScopedTextureBinder texture_binder(tex_params.target, texture_id_);
|
| + gfx::ScopedTextureBinder texture_binder(tex_params.target,
|
| + texture_id_callback_.Run());
|
|
|
| if (shared_state_->use_teximage2d_over_texsubimage2d &&
|
| tex_params.xoffset == 0 &&
|
| @@ -317,9 +320,15 @@ AsyncPixelTransferDelegate*
|
| AsyncPixelTransferManagerIdle::CreatePixelTransferDelegateImpl(
|
| gles2::TextureRef* ref,
|
| const AsyncTexImage2DParams& define_params) {
|
| - return new AsyncPixelTransferDelegateIdle(&shared_state_,
|
| - ref->service_id(),
|
| - define_params);
|
| + return new AsyncPixelTransferDelegateIdle(
|
| + &shared_state_,
|
| + // Not directly passing texture_ref->service_id here because it can change
|
| + // if avoid_egl_image_target_texture_reuse workaround is in effect.
|
| + // Unretained is safe because AsyncPixelTransferManager observes
|
| + // TextureRef destruction and destroys the delegate before TextureRef
|
| + // is destroyed.
|
| + base::Bind(&gles2::TextureRef::service_id, base::Unretained(ref)),
|
| + define_params);
|
| }
|
|
|
| } // namespace gpu
|
|
|