return aligned_width;
}
+static int
+_e_comp_wl_tbm_gbm_bo_fd_get(void *gbo, Eina_Bool *need_close)
+{
+ int fd1 = -1, fd2 = -1;
+
+ fd1 = gbm_bo_get_fd(gbo);
+ if (fd1 < 0)
+ return -1;
+
+ fd2 = gbm_bo_get_fd(gbo);
+ if (fd2 < 0)
+ {
+ close(fd1);
+ return -1;
+ }
+
+ if (fd1 == fd2)
+ {
+ *need_close = EINA_FALSE;
+ }
+ else
+ {
+ *need_close = EINA_TRUE;
+ close(fd2);
+ }
+
+ return fd1;
+}
+
EINTERN tbm_surface_h
e_comp_wl_tbm_import_gbm_bo(void *gbo)
{
tbm_surface_h tsurface = NULL;
tbm_bo tbo = NULL;
int fd = -1;
+ Eina_Bool need_close = EINA_FALSE;
int i;
EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp, NULL);
info.planes[i].offset = gbm_bo_get_offset(gbo, i);
}
- /* do not close fd, gbm backend doesn't return new fd */
- fd = gbm_bo_get_fd(gbo);
+ fd = _e_comp_wl_tbm_gbm_bo_fd_get(gbo, &need_close);
EINA_SAFETY_ON_FALSE_GOTO(fd >= 0, end);
tbo = tbm_bo_import_fd(e_comp->e_comp_screen->bufmgr, fd);
EINA_SAFETY_ON_NULL_GOTO(tsurface, end);
end:
+ if ((fd >=0) && (need_close)) close(fd);
if (tbo) tbm_bo_unref(tbo);
return tsurface;
}