+
+INTERN tdm_hwc_window *
+tdm_hwc_window_create_internal(tdm_private_hwc *private_hwc, tdm_error *error)
+{
+ tdm_private_output *private_output = private_hwc->private_output;
+ tdm_private_module *private_module = private_output->private_module;
+ tdm_func_hwc *func_hwc = &private_module->func_hwc;
+ tdm_private_hwc_window *private_hwc_window = NULL;
+ tdm_hwc_window *hwc_window_backend = NULL;
+ tdm_error ret = TDM_ERROR_NONE;
+
+ TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), NULL);
+
+ if (!func_hwc->hwc_create_window) {
+ /* LCOV_EXCL_START */
+ if (error)
+ *error = TDM_ERROR_BAD_MODULE;
+ return NULL;
+ /* LCOV_EXCL_STOP */
+ }
+
+ private_hwc_window = calloc(1, sizeof(tdm_private_hwc_window));
+ if (!private_hwc_window) {
+ /* LCOV_EXCL_START */
+ TDM_ERR("failed: alloc memory");
+ if (error)
+ *error = TDM_ERROR_OUT_OF_MEMORY;
+ return NULL;
+ /* LCOV_EXCL_STOP */
+ }
+
+ hwc_window_backend = func_hwc->hwc_create_window(private_hwc->hwc_backend, &ret);
+ if (ret != TDM_ERROR_NONE) {
+ free(private_hwc_window);
+ if (error)
+ *error = ret;
+ return NULL;
+ }
+
+ LIST_ADD(&private_hwc_window->link, &private_hwc->hwc_window_list);
+
+ private_hwc_window->private_hwc = private_hwc;
+ private_hwc_window->hwc_window_backend = hwc_window_backend;
+
+ TDM_DBG("hwc_window(%p) create", private_hwc_window);
+
+ if (error)
+ *error = TDM_ERROR_NONE;
+
+ return private_hwc_window;
+}
+
+INTERN void
+tdm_hwc_window_destroy_internal(tdm_private_hwc_window *private_hwc_window)
+{
+ tdm_private_output *private_output;
+ tdm_private_module *private_module;
+ tdm_private_hwc *private_hwc;
+ tdm_func_hwc_window *func_hwc_window;
+
+ TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
+
+ if (!private_hwc_window)
+ return;
+
+ private_hwc = private_hwc_window->private_hwc;
+ private_output = private_hwc->private_output;
+ private_module = private_output->private_module;
+ func_hwc_window = &private_module->func_hwc_window;
+
+ LIST_DEL(&private_hwc_window->link);
+
+ func_hwc_window = &private_module->func_hwc_window;
+ func_hwc_window->hwc_window_destroy(private_hwc_window->hwc_window_backend);
+
+ free(private_hwc_window);
+}
+
+EXTERN void
+tdm_hwc_window_destroy(tdm_hwc_window *hwc_window)
+{
+ tdm_private_display *private_display;
+ tdm_private_output *private_output;
+ tdm_private_hwc *private_hwc;
+ tdm_private_hwc_window *private_hwc_window;
+
+ if (!hwc_window)
+ return;
+
+ private_hwc_window = (tdm_private_hwc_window *)hwc_window;
+ private_hwc = private_hwc_window->private_hwc;
+ private_output = private_hwc->private_output;
+ private_display = private_output->private_display;
+
+ _pthread_mutex_lock(&private_display->lock);
+
+ tdm_hwc_window_destroy_internal(hwc_window);
+
+ _pthread_mutex_unlock(&private_display->lock);
+}
+
+EXTERN tbm_surface_queue_h
+tdm_hwc_window_acquire_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error)