e_comp_wl: reference gbm_bo until imported tbm_surface is destroyed 00/282200/1 accepted/tizen/unified/20220929.080320
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 28 Sep 2022 03:51:40 +0000 (12:51 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 28 Sep 2022 05:31:48 +0000 (14:31 +0900)
imported tbm_surface can have invalid buffer handle
if buffer handle of gbm_bo is closed when gbm_bo is destroyed.

we do not destroy gbm_bo until imported tbm_surface is destroyed.

Change-Id: Ibbfbeb84aa8e6c17af6471e64571f7dd9f2423e5

src/bin/e_comp_wl.c
src/bin/e_comp_wl_tbm.c
src/bin/e_comp_wl_tbm.h

index 3892d66..e5fb033 100644 (file)
@@ -4661,7 +4661,12 @@ _e_comp_wl_buffer_tbm_type_get(E_Comp_Wl_Buffer *buffer, struct wl_resource *res
              return EINA_FALSE;
           }
 
-        gbm_bo_destroy(gbo);
+        if (!e_comp_wl_tbm_gbm_bo_user_data_set(tsurface, gbo))
+          {
+             tbm_surface_destroy(tsurface);
+             gbm_bo_destroy(gbo);
+             return EINA_FALSE;
+          }
      }
 
    if ((ec) && (ec->comp_data->video_client))
index fc588dd..2b590fe 100644 (file)
@@ -4,6 +4,9 @@
 #include <tbm_surface_internal.h>
 #include <gbm.h>
 
+static uint64_t e_comp_wl_tbm_gbm_bo_key;
+#define E_COMP_WL_TBM_GBM_BO_KEY  (unsigned long)(&e_comp_wl_tbm_gbm_bo_key)
+
 static E_Comp_Wl_Tbm_Funcs *_e_comp_wl_tbm_funcs = NULL;
 
 typedef struct {
@@ -374,3 +377,32 @@ end:
    if (tbo) tbm_bo_unref(tbo);
    return tsurface;
 }
+
+static void
+_e_comp_wl_tbm_gbm_bo_cb_tbm_surface_destroy(void *data)
+{
+   struct gbm_bo *gbo;
+
+   gbo = (struct gbm_bo *)data;
+   if (!gbo) return;
+
+   gbm_bo_destroy(gbo);
+}
+
+EINTERN Eina_Bool
+e_comp_wl_tbm_gbm_bo_user_data_set(tbm_surface_h tsurface, void *gbo)
+{
+   int ret;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tsurface, EINA_FALSE);
+
+   ret = tbm_surface_internal_add_user_data(tsurface, E_COMP_WL_TBM_GBM_BO_KEY,
+                                            _e_comp_wl_tbm_gbm_bo_cb_tbm_surface_destroy);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EINA_FALSE);
+
+   ret = tbm_surface_internal_set_user_data(tsurface, E_COMP_WL_TBM_GBM_BO_KEY,
+                                            gbo);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EINA_FALSE);
+
+   return EINA_TRUE;
+}
index f9d852e..96f8ec4 100644 (file)
@@ -36,5 +36,7 @@ E_API   Eina_Bool e_comp_wl_tbm_module_func_unset(void);
 E_API   tbm_surface_h e_comp_wl_tbm_capturable_buffer_get(tbm_surface_h tsurface);
 EINTERN tbm_surface_h e_comp_wl_tbm_egl_image_buffer_get(int width, int height, tbm_format format);
 
+EINTERN Eina_Bool e_comp_wl_tbm_gbm_bo_user_data_set(tbm_surface_h tsurface, void *gbo);
+
 # endif
 #endif