hwc: referencing target buffer 71/210371/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 18 Jul 2019 11:42:22 +0000 (20:42 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 18 Jul 2019 11:42:30 +0000 (20:42 +0900)
while showing the target buffer, increase ref count to prevent buffer destroy.

Change-Id: I2aa715d1649e16fa91b38767411349e59b8c3d6f
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/tdm.c
src/tdm_hwc.c
src/tdm_private_types.h

index 81e653a..f20bfa4 100644 (file)
--- a/src/tdm.c
+++ b/src/tdm.c
@@ -335,6 +335,8 @@ tdm_display_destroy_private_output(tdm_private_output *private_output)
                private_hwc = private_output->private_hwc;
                LIST_FOR_EACH_ENTRY_SAFE(hw, hww, &private_hwc->hwc_window_list, link)
                        tdm_hwc_window_destroy_internal(hw);
+               if (private_hwc->display_target_buffer)
+                       tbm_surface_internal_unref(private_hwc->display_target_buffer);
                free(private_hwc);
        } else {
                LIST_FOR_EACH_ENTRY_SAFE(l, ll, &private_output->layer_list, link)
index 0589bc1..65f232c 100644 (file)
@@ -357,6 +357,20 @@ tdm_hwc_set_client_target_buffer(tdm_hwc *hwc, tbm_surface_h target_buffer, tdm_
 
        ret = func_hwc->hwc_set_client_target_buffer(private_hwc->hwc_backend, target_buffer, damage);
 
+       if (private_hwc->display_target_buffer) {
+               if (private_hwc->display_target_buffer != target_buffer) {
+                       tbm_surface_internal_unref(private_hwc->display_target_buffer);
+                       private_hwc->display_target_buffer = target_buffer;
+                       if (target_buffer)
+                               tbm_surface_internal_ref(private_hwc->display_target_buffer);
+               }
+       } else {
+               if (target_buffer) {
+                       private_hwc->display_target_buffer = target_buffer;
+                       tbm_surface_internal_ref(private_hwc->display_target_buffer);
+               }
+       }
+
        _pthread_mutex_unlock(&private_display->lock);
 
        return ret;
index 80d867f..dfea22a 100644 (file)
@@ -327,6 +327,8 @@ struct _tdm_private_hwc {
        int regist_commit_cb;
 
        tdm_hwc *hwc_backend;
+
+       tbm_surface_h display_target_buffer;
 };
 
 struct _tdm_private_hwc_window {