typedef struct _tdm_vc4_hwc_window tdm_vc4_hwc_window;
typedef struct _tdm_vc4_event tdm_vc4_event;
typedef struct _tdm_vc4_display_buffer tdm_vc4_display_buffer;
+typedef struct _tdm_vc4_hwc_window_destroy_handler tdm_vc4_hwc_window_destroy_handler;
+
+typedef void (*vc4_hwc_window_destroy_handler_func)(hal_tdm_hwc_window *hwc_window, void *user_data);
typedef enum {
TDM_DRM_EVENT_TYPE_WAIT,
int acquire_fence;
int attach_buffer_changed;
+
+ struct list_head destroy_handler_list;
+};
+
+struct _tdm_vc4_hwc_window_destroy_handler {
+ struct list_head link;
+
+ vc4_hwc_window_destroy_handler_func func;
+ void *user_data;
};
#endif /* _TDM_VC4_TYPES_H_ */
vc4_hwc_window_destroy(hal_tdm_hwc_window *hwc_window)
{
tdm_vc4_hwc_window *hwc_window_data = hwc_window;
+ tdm_vc4_hwc_window_destroy_handler *destroy_handler = NULL, *temp = NULL;
TDM_BACKEND_RETURN_IF_FAIL(hwc_window_data != NULL);
+ LIST_FOR_EACH_ENTRY_SAFE(destroy_handler, temp, &hwc_window_data->destroy_handler_list, link) {
+ destroy_handler->func(hwc_window, destroy_handler->user_data);
+ LIST_DEL(&destroy_handler->link);
+ free(destroy_handler);
+ }
+
if (hwc_window_data->acquire_fence >= 0)
close(hwc_window_data->acquire_fence);
return HAL_TDM_ERROR_NONE;
}
+
+hal_tdm_error
+vc4_hwc_window_add_destroy_handler(hal_tdm_hwc_window *hwc_window, vc4_hwc_window_destroy_handler_func func, void *user_data)
+{
+ tdm_vc4_hwc_window *hwc_window_data = hwc_window;
+ tdm_vc4_hwc_window_destroy_handler *destroy_handler = NULL;
+
+ TDM_BACKEND_RETURN_VAL_IF_FAIL(hwc_window_data != NULL, HAL_TDM_ERROR_INVALID_PARAMETER);
+
+ LIST_FOR_EACH_ENTRY(destroy_handler, &hwc_window_data->destroy_handler_list, link) {
+ if (destroy_handler->func == func && destroy_handler->user_data == user_data) {
+ TDM_BACKEND_ERR("can't add twice");
+ return HAL_TDM_ERROR_BAD_REQUEST;
+ }
+ }
+
+ destroy_handler = calloc(1, sizeof(tdm_vc4_hwc_window_destroy_handler));
+ if (!destroy_handler) {
+ TDM_BACKEND_ERR("alloc failed");
+ return HAL_TDM_ERROR_OUT_OF_MEMORY;
+ }
+
+ destroy_handler->func = func;
+ destroy_handler->user_data = user_data;
+
+ LIST_ADDTAIL(&destroy_handler->link, &hwc_window_data->destroy_handler_list);
+
+ return HAL_TDM_ERROR_NONE;
+}
+
+void
+vc4_hwc_window_remove_destroy_handler(hal_tdm_hwc_window *hwc_window, vc4_hwc_window_destroy_handler_func func, void *user_data)
+{
+ tdm_vc4_hwc_window *hwc_window_data = hwc_window;
+ tdm_vc4_hwc_window_destroy_handler *destroy_handler = NULL, *temp = NULL;
+
+ TDM_BACKEND_RETURN_IF_FAIL(hwc_window_data != NULL);
+ TDM_BACKEND_RETURN_IF_FAIL(func != NULL);
+
+ LIST_FOR_EACH_ENTRY_SAFE(destroy_handler, temp, &hwc_window_data->destroy_handler_list, link) {
+ if (destroy_handler->func != func || destroy_handler->user_data != user_data)
+ continue;
+
+ LIST_DEL(&destroy_handler->link);
+ free(destroy_handler);
+
+ return;
+ }
+}