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;
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;
}
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;
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++) {
}
}
- 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;
}