layer: execute buffer unref if layer's display_buffer_force_unset flag set when unset... 30/196930/4
authorJunkyeong Kim <jk0430.kim@samsung.com>
Mon, 7 Jan 2019 10:28:24 +0000 (19:28 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 10 Jan 2019 11:34:15 +0000 (20:34 +0900)
if output is disconnected, primary layer buffer also has to be released.
so if output disconnected, set the display_buffer_force_unset flag to true to unref primary layer displaying buffer.

Change-Id: I9fde9546316d1ac65a0be544921e8c24286fb158
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/tdm_exynos_layer.c
src/tdm_exynos_output.c
src/tdm_exynos_types.h

index 3b226b287f9ab97e26a8ec3bfc7ca2b0f6cbaf0d..cb326e4956c12cf4acc13c0fec15a5fd28dca067 100644 (file)
@@ -305,7 +305,9 @@ exynos_layer_unset_buffer(tdm_layer *layer)
 
        RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
 
-       if (!(layer_data->capabilities & TDM_LAYER_CAPABILITY_PRIMARY) && layer_data->display_buffer) {
+       if (layer_data->display_buffer &&
+               (!(layer_data->capabilities & TDM_LAYER_CAPABILITY_PRIMARY) || layer_data->display_buffer_force_unset)) {
+               layer_data->display_buffer_force_unset = 0;
                tbm_surface_internal_unref(layer_data->display_buffer->buffer);
                layer_data->display_buffer = NULL;
        }
index 581c75843a510c12283d6af153e2870fec57b5e9..acf2a422d870998321f5f4be755943c3e3a57e93 100644 (file)
@@ -510,6 +510,8 @@ tdm_error
 tdm_exynos_output_update_status(tdm_exynos_output_data *output_data,
                                                                                tdm_output_conn_status status)
 {
+       tdm_exynos_layer_data *layer_data = NULL;
+
        RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
 
        if (output_data->status == status)
@@ -517,6 +519,14 @@ tdm_exynos_output_update_status(tdm_exynos_output_data *output_data,
 
        output_data->status = status;
 
+       LIST_FOR_EACH_ENTRY(layer_data, &output_data->layer_list, link) {
+               if (status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED) {
+                       if (layer_data->display_buffer)
+                               layer_data->display_buffer_force_unset = 1;
+               } else
+                       layer_data->display_buffer_force_unset = 0;
+       }
+
        if (output_data->status_func)
                output_data->status_func(output_data, status,
                                                                 output_data->status_user_data);
index 01b0af0db94399cec9238b737cfef6f81cab8399..93bc57ecfd6857567969de917381273a40ee7779 100644 (file)
@@ -166,6 +166,7 @@ struct _tdm_exynos_layer_data {
 
        tdm_exynos_display_buffer *display_buffer;
        int display_buffer_changed;
+       int display_buffer_force_unset;
 
        tbm_format *formats;
        int format_count;