OSDN Git Service

drm_hwcomposer: reimplement Dump for DrmDisplayCompositor
[android-x86/external-drm_hwcomposer.git] / nvimporter.cpp
index 93b9129..71b3b7f 100644 (file)
@@ -121,7 +121,7 @@ int NvImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) {
   return 0;
 }
 
-int NvImporter::ReleaseBuffer(hwc_drm_bo_t * bo) {
+int NvImporter::ReleaseBuffer(hwc_drm_bo_t *bo) {
   NvBuffer_t *buf = (NvBuffer_t *)bo->priv;
   if (!buf) {
     ALOGE("Freeing bo %ld, buf is NULL!", bo->fb_id);
@@ -157,10 +157,15 @@ void NvImporter::ReleaseBufferImpl(hwc_drm_bo_t *bo) {
 
     gem_close.handle = bo->gem_handles[i];
     int ret = drmIoctl(drm_->fd(), DRM_IOCTL_GEM_CLOSE, &gem_close);
-    if (ret)
+    if (ret) {
       ALOGE("Failed to close gem handle %d %d", i, ret);
-    else
+    } else {
+      /* Clear any duplicate gem handle as well but don't close again */
+      for(int j = i + 1; j < num_gem_handles; j++)
+        if(bo->gem_handles[j] == bo->gem_handles[i])
+          bo->gem_handles[j] = 0;
       bo->gem_handles[i] = 0;
+    }
   }
 }