hwc: add vc4_hwc_window_add/remove_destroy_handler 58/298158/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 30 Aug 2023 10:27:56 +0000 (19:27 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Tue, 5 Sep 2023 02:38:20 +0000 (11:38 +0900)
Change-Id: I51932f9ce9ec4fad13def3e562ed0ab058ce8d0c

src/tdm_backend_vc4.h
src/tdm_backend_vc4_types.h
src/tdm_vc4_hwc.c
src/tdm_vc4_hwc_window.c

index fbb1173..75959c8 100644 (file)
@@ -145,4 +145,7 @@ hal_tdm_error  tdm_vc4_layer_set_hwc_window(tdm_vc4_layer *layer_data, tdm_vc4_h
 uint32_t    tdm_format_get_drm_format(tbm_format format);
 tbm_format  tdm_format_get_tbm_format(uint32_t format);
 
+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);
+void vc4_hwc_window_remove_destroy_handler(hal_tdm_hwc_window *hwc_window, vc4_hwc_window_destroy_handler_func func, void *user_data);
+
 #endif /* _TDM_VC4_H_ */
index a94b67e..9dd9aa5 100644 (file)
@@ -90,6 +90,9 @@ typedef struct _tdm_vc4_hwc tdm_vc4_hwc;
 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,
@@ -336,6 +339,15 @@ struct _tdm_vc4_hwc_window {
 
        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_ */
index 9022231..bfc3504 100644 (file)
@@ -680,6 +680,8 @@ _vc4_hwc_create_window(hal_tdm_hwc *hwc, hal_tdm_hwc_window_info *info, hal_tdm_
        hwc_window_data->hwc_data = hwc_data;
        hwc_window_data->acquire_fence = -1;
 
+       LIST_INITHEAD(&hwc_window_data->destroy_handler_list);
+
        if (info)
                memcpy(&hwc_window_data->info, info, sizeof(hal_tdm_hwc_window_info));
 
index 84100d6..011fb59 100644 (file)
@@ -38,9 +38,16 @@ void
 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);
 
@@ -202,3 +209,52 @@ vc4_hwc_window_set_acquire_fence(hal_tdm_hwc_window *hwc_window, int acquire_fen
 
        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;
+       }
+}