hal: deal with master_drm_fd
authorSooChan Lim <sc1.lim@samsung.com>
Tue, 16 Feb 2021 09:48:15 +0000 (18:48 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 17 Feb 2021 06:52:06 +0000 (15:52 +0900)
tdm backend must have the master drm_fd when it has a drm_device.
If the tdm backend does not have a master drm_fd, libtdm must has
the master drm_fd from libtbm.

Change-Id: Ia70c54c76d3492d7638579563890798dbe39aa11

src/tdm.c

index 3b6c1b8..963bc44 100644 (file)
--- a/src/tdm.c
+++ b/src/tdm.c
@@ -907,7 +907,7 @@ static pthread_mutex_t gLock = PTHREAD_MUTEX_INITIALIZER;
 static tdm_error
 _tdm_display_load_hal_backend(tdm_private_display *private_display)
 {
-       hal_tdm_backend *hal_tdm = NULL;
+       hal_tdm_backend *tdm_backend = NULL;
        hal_tdm_display *hal_tdm_dpy = NULL;
        tdm_private_module *private_module = NULL;
        hal_tdm_event_source **event_sources = NULL;
@@ -915,11 +915,12 @@ _tdm_display_load_hal_backend(tdm_private_display *private_display)
        hal_tdm_caps_pp pp_caps;
        hal_tdm_caps_capture capture_caps;
        hal_tdm_error hret;
+       hal_tdm_fd master_drm_fd = -1;
        tdm_error error;
        int num = 0;
 
-       hal_tdm = hal_tdm_get_backend(&hret);
-       if (hal_tdm == NULL || hret != HAL_TDM_ERROR_NONE) {
+       tdm_backend = hal_tdm_get_backend(&hret);
+       if (tdm_backend == NULL || hret != HAL_TDM_ERROR_NONE) {
                TDM_ERR("failed hal_tdm_get_backend");
                return TDM_ERROR_NO_MODULE;
        }
@@ -927,23 +928,48 @@ _tdm_display_load_hal_backend(tdm_private_display *private_display)
        private_module = calloc(1, sizeof *private_module);
        if (private_module == NULL) {
                TDM_ERR("failed: alloc");
-               hal_tdm_put_backend(hal_tdm);
+               hal_tdm_put_backend(tdm_backend);
                return TDM_ERROR_OUT_OF_MEMORY;
        }
 
-       hal_tdm_dpy = hal_tdm_backend_get_display(hal_tdm, &hret);
+       hal_tdm_dpy = hal_tdm_backend_get_display(tdm_backend, &hret);
        if (hal_tdm_dpy == NULL || hret != HAL_TDM_ERROR_NONE) {
                TDM_ERR("failed hal_tdm_backend_get_display");
                goto fail;
        }
 
+       if (hal_tdm_backend_has_drm_device(tdm_backend, &hret)) {
+               master_drm_fd = hal_tdm_backend_get_master_drm_fd(tdm_backend, &hret);
+               if (master_drm_fd < 0) {
+                       TDM_INFO("tdm_backend has no master drm_fd.");
+
+                       master_drm_fd = tbm_drm_helper_get_master_fd();
+                       if (master_drm_fd < 0) {
+                               TDM_ERR("failed to get master_drm_fd");
+                               goto fail;
+                       }
+                       TDM_INFO("libtbm gets a master drm_fd from libtbm via tbm_drm_helper.");
+
+                       TDM_INFO("libtdm sends a master drm_fd to tdm_backend.");
+                       hret = hal_tdm_backend_set_master_drm_fd(tdm_backend, master_drm_fd);
+                       if (hret != HAL_TDM_ERROR_NONE) {
+                               TDM_ERR("failed hal_tdm_backend_get_display");
+                               goto fail;
+                       }
+               } else {
+                       TDM_INFO("tdm_backend has a master drm_fd.");
+
+                       tbm_drm_helper_set_tbm_master_fd(master_drm_fd);
+               }
+       }
+
        if (hal_tdm_display_get_capability(hal_tdm_dpy, &caps) != HAL_TDM_ERROR_NONE) {
                TDM_ERR("failed hal_tdm_display_get_capability");
                goto fail;
        }
 
        private_module->use_hal_tdm = 1;
-       private_module->htdm_backend = hal_tdm;
+       private_module->htdm_backend = tdm_backend;
        private_module->htdm_dpy = hal_tdm_dpy;
        private_module->private_display = private_display;
        private_display->current_module = private_module;
@@ -981,7 +1007,7 @@ _tdm_display_load_hal_backend(tdm_private_display *private_display)
 
        LIST_ADDTAIL(&private_module->link, &private_display->module_list);
 
-       event_sources = hal_tdm_backend_get_event_sources(hal_tdm, &num, &hret);
+       event_sources = hal_tdm_backend_get_event_sources(tdm_backend, &num, &hret);
        if (num != 0 && hret == HAL_TDM_ERROR_NONE) {
                private_module->event_source_num = num;
                for (int i = 0; i < num; i++) {
@@ -992,12 +1018,14 @@ _tdm_display_load_hal_backend(tdm_private_display *private_display)
                }
        }
 
-       TDM_INIT_INFO("use hal tdm");
+       TDM_INIT_INFO("use HAL-TDM_API");
 
        return TDM_ERROR_NONE;
 
 fail:
-       hal_tdm_put_backend(hal_tdm);
+       if (master_drm_fd >= 0)
+               close(master_drm_fd);
+       hal_tdm_put_backend(tdm_backend);
        free(private_module);
        return TDM_ERROR_NO_MODULE;
 }