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 |