add display_buffer_get_fd to TDM backend interface
authorBoram Park <boram1288.park@samsung.com>
Fri, 19 Feb 2016 04:39:53 +0000 (13:39 +0900)
committerBoram Park <boram1288.park@samsung.com>
Fri, 19 Feb 2016 09:03:18 +0000 (18:03 +0900)
Change-Id: I1069e5b799c3a0c5a3592668575b40125ad78157

include/tdm_backend.h
src/tdm.c
src/tdm_private.h

index f6b67ce..bb5b689 100644 (file)
@@ -286,6 +286,16 @@ typedef struct _tdm_func_display
     tdm_error    (*display_get_fd)(tdm_backend_data *bdata, int *fd);
 
     /**
+     * @brief Get the file descriptor for the memory-management framework of a backend module
+     * @param[in] bdata The backend module data
+     * @param[out] fd The fd of a backend module
+     * @return #TDM_ERROR_NONE if success. Otherwise, error value.
+     * @see display_handle_events() function of #tdm_func_display
+     * This buffer fd will be passed to tbm_bufmgr_init.
+     */
+    tdm_error    (*display_get_buffer_fd)(tdm_backend_data *bdata, int *fd);
+
+    /**
      * @brief Handle the events which happens on the fd of a backend module
      * @param[in] bdata The backend module data
      * @return #TDM_ERROR_NONE if success. Otherwise, error value.
index ac3f29f..17c2b2b 100644 (file)
--- a/src/tdm.c
+++ b/src/tdm.c
@@ -460,6 +460,35 @@ failed_update:
     return ret;
 }
 
+static tdm_error
+_tdm_display_init_bufmgr(tdm_private_display *private_display)
+{
+    tdm_func_display *func_display = &private_display->func_display;
+    int buffer_fd = -1;
+    tdm_error ret;
+
+    if (func_display->display_get_buffer_fd)
+    {
+        ret = func_display->display_get_buffer_fd(private_display->bdata, &buffer_fd);
+        if (ret != TDM_ERROR_NONE)
+        {
+            TDM_ERR("failed to get buffer fd");
+            return ret;
+        }
+    }
+
+    private_display->bufmgr = tbm_bufmgr_init(buffer_fd);
+    if (!private_display->bufmgr)
+    {
+        TDM_ERR("failed to init TBM bufmgr: fd(%d)", buffer_fd);
+        return TDM_ERROR_OUT_OF_MEMORY;
+    }
+
+    TDM_INFO("init TBM bufmgr: fd(%d)", buffer_fd);
+
+    return TDM_ERROR_NONE;
+}
+
 
 EXTERN tdm_error
 tdm_display_update(tdm_display *dpy)
@@ -738,6 +767,10 @@ tdm_display_init(tdm_error *error)
     if (ret != TDM_ERROR_NONE)
         goto failed_update;
 
+    ret = _tdm_display_init_bufmgr(private_display);
+    if (ret != TDM_ERROR_NONE)
+        goto failed_update;
+
     private_display->init_count = 1;
 
     g_private_display = private_display;
@@ -782,6 +815,9 @@ tdm_display_deinit(tdm_display *dpy)
 
     pthread_mutex_lock(&private_display->lock);
 
+    if (private_display->bufmgr)
+        tbm_bufmgr_deinit(private_display->bufmgr);
+
     _tdm_display_destroy_private_display(private_display);
     _tdm_display_unload_module(private_display);
 
index 2425059..ec46009 100644 (file)
@@ -180,6 +180,8 @@ struct _tdm_private_display
     struct list_head pp_list;
 
     void **outputs_ptr;
+
+    tbm_bufmgr bufmgr;
 };
 
 struct _tdm_private_output