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);
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;
+ }
}
}