diff --git a/gpu/command_buffer/service/shared_image_interface_in_process.cc b/gpu/command_buffer/service/shared_image_interface_in_process.cc index cc66fbcd78393f..b4f7b5e827a9c5 100644 --- a/gpu/command_buffer/service/shared_image_interface_in_process.cc +++ b/gpu/command_buffer/service/shared_image_interface_in_process.cc @@ -706,7 +706,13 @@ void SharedImageInterfaceInProcess::DestroySharedImage( const SyncToken& sync_token, scoped_refptr client_shared_image) { CHECK(client_shared_image->HasOneRef()); - DestroySharedImage(sync_token, client_shared_image->mailbox()); + // Use sync token dependency to ensure that the destroy task does not run + // before sync token is released. + ScheduleGpuTask( + base::BindOnce( + &SharedImageInterfaceInProcess::DestroyClientSharedImageOnGpuThread, + base::Unretained(this), std::move(client_shared_image)), + {sync_token}); } void SharedImageInterfaceInProcess::DestroySharedImageOnGpuThread( @@ -726,6 +732,11 @@ void SharedImageInterfaceInProcess::DestroySharedImageOnGpuThread( } } +void SharedImageInterfaceInProcess::DestroyClientSharedImageOnGpuThread( + scoped_refptr client_shared_image) { + DestroySharedImageOnGpuThread(client_shared_image->mailbox()); +} + void SharedImageInterfaceInProcess::WaitSyncTokenOnGpuThread( const SyncToken& sync_token) { DCHECK_CALLED_ON_VALID_SEQUENCE(gpu_sequence_checker_); diff --git a/gpu/command_buffer/service/shared_image_interface_in_process.h b/gpu/command_buffer/service/shared_image_interface_in_process.h index 02096e00bbea2c..00bec023a29017 100644 --- a/gpu/command_buffer/service/shared_image_interface_in_process.h +++ b/gpu/command_buffer/service/shared_image_interface_in_process.h @@ -243,6 +243,8 @@ class GPU_GLES2_EXPORT SharedImageInterfaceInProcess void UpdateSharedImageOnGpuThread(const Mailbox& mailbox, const SyncToken& sync_token); void DestroySharedImageOnGpuThread(const Mailbox& mailbox); + void DestroyClientSharedImageOnGpuThread( + scoped_refptr client_shared_image); void WaitSyncTokenOnGpuThread(const SyncToken& sync_token); void WrapTaskWithGpuUrl(base::OnceClosure task); void GetCapabilitiesOnGpu(base::WaitableEvent* completion,