layer: add destroy handler of hwc_window 59/298159/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 30 Aug 2023 10:35:28 +0000 (19:35 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Tue, 5 Sep 2023 02:38:25 +0000 (11:38 +0900)
Change-Id: I70b0f6a9623a481480883e839217eb746e685bce

src/tdm_vc4_display.c

index 837470c..6665ed6 100644 (file)
@@ -2392,6 +2392,14 @@ tdm_vc4_layer_set_acquire_fence(tdm_vc4_layer *layer_data, int acquire_fence)
        return HAL_TDM_ERROR_NONE;
 }
 
+static void
+_tdm_vc4_layer_hwc_window_destroy_handler(hal_tdm_hwc_window *hwc_window, void *user_data)
+{
+       tdm_vc4_layer *layer_data = user_data;
+
+       layer_data->hwc_window_data = NULL;
+}
+
 hal_tdm_error
 tdm_vc4_layer_set_hwc_window(tdm_vc4_layer *layer_data, tdm_vc4_hwc_window *hwc_window_data)
 {
@@ -2399,7 +2407,18 @@ tdm_vc4_layer_set_hwc_window(tdm_vc4_layer *layer_data, tdm_vc4_hwc_window *hwc_
 
        TDM_BACKEND_DBG("layer_data[%p]zpos[%d] hwc_window_data:%p", layer_data, layer_data->zpos, hwc_window_data);
 
-       layer_data->hwc_window_data = hwc_window_data;
+       if (layer_data->hwc_window_data == hwc_window_data)
+               return HAL_TDM_ERROR_NONE;
+
+       if (layer_data->hwc_window_data) {
+               vc4_hwc_window_remove_destroy_handler(layer_data->hwc_window_data,_tdm_vc4_layer_hwc_window_destroy_handler, layer_data);
+               layer_data->hwc_window_data = NULL;
+       }
+
+       if (hwc_window_data) {
+               vc4_hwc_window_add_destroy_handler(hwc_window_data, _tdm_vc4_layer_hwc_window_destroy_handler, layer_data);
+               layer_data->hwc_window_data = hwc_window_data;
+       }
 
        return HAL_TDM_ERROR_NONE;
 }