From bf853aa2f5d22e40ab9ca9ab5689cb291474d15e Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Tue, 16 Feb 2021 18:48:15 +0900 Subject: [PATCH] hal: deal with master_drm_fd 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 | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index 3b6c1b8..963bc44 100644 --- 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; } -- 2.7.4