Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / gpu / command_buffer / service / async_pixel_transfer_manager.cc
index 3084dd6..efc893a 100644 (file)
@@ -17,6 +17,12 @@ AsyncPixelTransferManager::AsyncPixelTransferManager() {}
 AsyncPixelTransferManager::~AsyncPixelTransferManager() {
   if (manager_)
     manager_->RemoveObserver(this);
+
+  for (TextureToDelegateMap::iterator ref = delegate_map_.begin();
+       ref != delegate_map_.end();
+       ref++) {
+    ref->first->RemoveObserver();
+  }
 }
 
 void AsyncPixelTransferManager::Initialize(gles2::TextureManager* manager) {
@@ -32,6 +38,7 @@ AsyncPixelTransferManager::CreatePixelTransferDelegate(
   AsyncPixelTransferDelegate* delegate =
       CreatePixelTransferDelegateImpl(ref, define_params);
   delegate_map_[ref] = make_linked_ptr(delegate);
+  ref->AddObserver();
   return delegate;
 }
 
@@ -49,8 +56,10 @@ AsyncPixelTransferManager::GetPixelTransferDelegate(
 void AsyncPixelTransferManager::ClearPixelTransferDelegateForTest(
     gles2::TextureRef* ref) {
   TextureToDelegateMap::iterator it = delegate_map_.find(ref);
-  if (it != delegate_map_.end())
+  if (it != delegate_map_.end()) {
     delegate_map_.erase(it);
+    ref->RemoveObserver();
+  }
 }
 
 bool AsyncPixelTransferManager::AsyncTransferIsInProgress(
@@ -69,8 +78,10 @@ void AsyncPixelTransferManager::OnTextureManagerDestroying(
 void AsyncPixelTransferManager::OnTextureRefDestroying(
     gles2::TextureRef* texture) {
   TextureToDelegateMap::iterator it = delegate_map_.find(texture);
-  if (it != delegate_map_.end())
+  if (it != delegate_map_.end()) {
     delegate_map_.erase(it);
+    texture->RemoveObserver();
+  }
 }
 
 }  // namespace gpu