display: ref/unref display_buffer by using buffer's user_data 80/204180/3
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 22 Apr 2019 04:39:37 +0000 (13:39 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Mon, 22 Apr 2019 09:11:41 +0000 (18:11 +0900)
Change-Id: I451f90841f92d9ab9e86773accb1b1d4707a4e1b

src/tdm_exynos.c
src/tdm_exynos_display.c

index 52ccae0b527c9331f7c09fdd8190a1cff389735c..a37c39886c212173ef54331cc6c4d706efb01b01 100644 (file)
@@ -100,8 +100,8 @@ tdm_exynos_deinit(tdm_backend_data *bdata)
                return;
 
        TDM_INFO("deinit");
-       tdm_exynos_display_destroy_buffer_list(exynos_data);
        tdm_exynos_display_destroy_output_list(exynos_data);
+       tdm_exynos_display_destroy_buffer_list(exynos_data);
        tdm_exynos_display_deinit_event_handling(exynos_data);
 
        if (exynos_data->drm_fd >= 0)
index 658f7125b619263869cb6f8e50cdac6b720d7295..035b482ec377bd8264f3b75a858a427cbe4e48fc 100644 (file)
@@ -709,6 +709,8 @@ tdm_exynos_display_destroy_output_list(tdm_exynos_data *exynos_data)
                        tdm_exynos_layer_data *l = NULL, *ll = NULL;
                        LIST_FOR_EACH_ENTRY_SAFE(l, ll, &o->layer_list, link) {
                                LIST_DEL(&l->link);
+                               if (l->display_buffer)
+                                       tbm_surface_internal_unref(l->display_buffer->buffer);
                                free(l);
                        }
                }
@@ -1769,7 +1771,11 @@ exynos_layer_set_buffer(tdm_layer *layer, tbm_surface_h surface)
        }
 
        if (layer_data->display_buffer != display_buffer) {
+               if (layer_data->display_buffer)
+                       tbm_surface_internal_unref(layer_data->display_buffer->buffer);
+
                layer_data->display_buffer = display_buffer;
+               tbm_surface_internal_ref(layer_data->display_buffer->buffer);
                layer_data->display_buffer_changed = 1;
        }
 
@@ -1787,7 +1793,12 @@ exynos_layer_unset_buffer(tdm_layer *layer)
        TDM_DBG("layer[%p]zpos[%d]", layer, layer_data->zpos);
 
        _tdm_exynos_display_layer_disable(layer);
+
+       if (layer_data->display_buffer)
+               tbm_surface_internal_unref(layer_data->display_buffer->buffer);
+
        layer_data->display_buffer = NULL;
+       layer_data->display_buffer_changed = 1;
 
        return TDM_ERROR_NONE;
 }