export ds_tdm_output_hwc_set_client_target_buffer 44/279744/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 16 Aug 2022 07:33:47 +0000 (16:33 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Wed, 17 Aug 2022 07:44:07 +0000 (16:44 +0900)
Change-Id: Ifb7fe17bb2b57357c059c716eb7593237039d61a

include/libds-tizen/backend/tdm_output_hwc.h
src/backend/tdm/output.c
src/backend/tdm/tdm_internal.h
src/backend/tdm/tdm_output_hwc.c
src/backend/tdm/tdm_output_hwc.h

index abde223..e04cdb3 100644 (file)
@@ -24,6 +24,10 @@ WL_EXPORT void
 ds_tdm_output_hwc_set_enabled(struct ds_tdm_output_hwc *hwc, bool enabled);
 
 WL_EXPORT bool
+ds_tdm_output_hwc_set_client_target_buffer(struct ds_tdm_output_hwc *hwc,
+        struct ds_buffer *buffer);
+
+WL_EXPORT bool
 ds_tdm_output_hwc_validate(struct ds_tdm_output_hwc *hwc,
         struct ds_tdm_output_hwc_window **composited_windows, uint32_t num_windows, uint32_t *num_changed);
 
index 1baefd2..4a236a8 100644 (file)
@@ -175,7 +175,7 @@ create_tdm_buffer(struct ds_tdm_backend *backend, struct ds_buffer *ds_buffer)
     return buffer;
 }
 
-static struct ds_tdm_buffer *
+struct ds_tdm_buffer *
 get_or_create_tdm_buffer(struct ds_tdm_backend *backend,
         struct ds_buffer *ds_buffer)
 {
@@ -347,7 +347,7 @@ output_init_hwc(struct ds_tdm_output *output)
         return;
     }
 
-    output->hwc = ds_tdm_output_hwc_create(output->tdm.hwc);
+    output->hwc = ds_tdm_output_hwc_create(output, output->tdm.hwc);
     if (!output->hwc) {
         ds_err("Could not create ds_dm_hwc: output(%p)", output);
         return;
@@ -379,31 +379,14 @@ static bool
 output_set_pending_fb(struct ds_tdm_output *output,
         struct ds_buffer *ds_buffer)
 {
-    struct ds_tdm_queue_buffer *queue_buffer;
-    struct ds_tdm_buffer *buffer;
-    tbm_surface_h surface = NULL;
-
-    if (output->queue) {
-        queue_buffer = buffer_queue_find_buffer(output->queue, ds_buffer);
-        if (queue_buffer) {
-            ds_buffer_lock(ds_buffer);
-            surface = queue_buffer->surface;
-        }
-    }
-
-    if (!surface) {
-        buffer = get_or_create_tdm_buffer(output->backend, ds_buffer);
-        if (!buffer)
+    if (!output->hwc->enabled) {
+        if (!ds_tdm_output_hwc_set_client_target_buffer(output->hwc, ds_buffer)) {
+            ds_err("Could not set hwc client target buffer");
             return false;
-
-        surface = buffer->surface;
+        }
     }
 
-    if (!ds_tdm_output_hwc_set_client_target_buffer(output->hwc, surface)) {
-        ds_err("Could not set hwc client target buffer");
-        ds_buffer_unlock(ds_buffer);
-        return false;
-    }
+    ds_buffer_lock(ds_buffer);
 
     output_attach_back_buffer(output, ds_buffer);
 
index ef7d88f..2faa979 100644 (file)
@@ -75,5 +75,7 @@ struct ds_tdm_output *create_tdm_output(struct ds_tdm_backend *tdm,
 
 void destroy_tdm_buffer(struct ds_tdm_buffer *buffer);
 
+struct ds_tdm_buffer *get_or_create_tdm_buffer(struct ds_tdm_backend *backend,
+        struct ds_buffer *ds_buffer);
 
 #endif
index 48aef1d..535fdef 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "tdm_internal.h"
 #include "tdm_output_hwc.h"
+#include "tdm_buffer_queue.h"
 
 static void
 hwc_window_update_front_buffer(struct ds_tdm_output_hwc_window *hwc_window)
@@ -159,7 +160,7 @@ get_composition(tdm_hwc_window_composition composition)
 }
 
 struct ds_tdm_output_hwc *
-ds_tdm_output_hwc_create(tdm_hwc *thwc)
+ds_tdm_output_hwc_create(struct ds_tdm_output *output, tdm_hwc *thwc)
 {
     struct ds_tdm_output_hwc *hwc;
 
@@ -168,6 +169,7 @@ ds_tdm_output_hwc_create(tdm_hwc *thwc)
         return NULL;
 
     hwc->thwc = thwc;
+    hwc->tdm_output = output;
 
     wl_list_init(&hwc->hwc_windows);
     wl_signal_init(&hwc->events.commit_handler);
@@ -185,29 +187,52 @@ ds_tdm_output_hwc_destroy(struct ds_tdm_output_hwc *hwc)
 }
 
 bool
-ds_tdm_output_hwc_set_client_target_buffer(struct ds_tdm_output_hwc *hwc, tbm_surface_h tsurface)
+ds_tdm_output_hwc_set_client_target_buffer(struct ds_tdm_output_hwc *hwc, struct ds_buffer *buffer)
 {
     tdm_error terr;
     tdm_region fb_damage;
+    tbm_surface_h tsurface = NULL;
+    struct ds_tdm_queue_buffer *tdm_queue_buffer;
+    struct ds_tdm_buffer *tdm_buffer;
+
+    if (buffer) {
+        if (hwc->tdm_output->queue) {
+            tdm_queue_buffer = buffer_queue_find_buffer(hwc->tdm_output->queue, buffer);
+            if (tdm_queue_buffer)
+                tsurface = tdm_queue_buffer->surface;
+        }
 
-    memset(&fb_damage, 0, sizeof(fb_damage));
-
-    hwc->target_buffer_info.src_config.pos.x = 0;
-    hwc->target_buffer_info.src_config.pos.y = 0;
-    hwc->target_buffer_info.src_config.pos.w = tbm_surface_get_width(tsurface);
-    hwc->target_buffer_info.src_config.pos.h = tbm_surface_get_height(tsurface);
-    hwc->target_buffer_info.src_config.size.h = get_horizontal_get(tsurface);
-    hwc->target_buffer_info.src_config.size.v = tbm_surface_get_height(tsurface);
-    hwc->target_buffer_info.src_config.format = tbm_surface_get_format(tsurface);
+        if (!tsurface) {
+            tdm_buffer = get_or_create_tdm_buffer(hwc->tdm_output->backend, buffer);
+            if (!tdm_buffer) {
+                ds_err("Could not get or create tdm buffer");
+                return false;
+            }
 
-    hwc->target_buffer_info.dst_pos.x = 0;
-    hwc->target_buffer_info.dst_pos.y = 0;
-    hwc->target_buffer_info.dst_pos.w = tbm_surface_get_width(tsurface);
-    hwc->target_buffer_info.dst_pos.h = tbm_surface_get_height(tsurface);
+            tsurface = tdm_buffer->surface;
+        }
+    }
 
-    hwc->target_buffer_info.transform = TDM_TRANSFORM_NORMAL;
+    memset(&fb_damage, 0, sizeof(fb_damage));
 
-    tdm_hwc_set_client_target_buffer_info(hwc->thwc, &hwc->target_buffer_info);
+    if (tsurface) {
+        hwc->target_buffer_info.src_config.pos.x = 0;
+        hwc->target_buffer_info.src_config.pos.y = 0;
+        hwc->target_buffer_info.src_config.pos.w = tbm_surface_get_width(tsurface);
+        hwc->target_buffer_info.src_config.pos.h = tbm_surface_get_height(tsurface);
+        hwc->target_buffer_info.src_config.size.h = get_horizontal_get(tsurface);
+        hwc->target_buffer_info.src_config.size.v = tbm_surface_get_height(tsurface);
+        hwc->target_buffer_info.src_config.format = tbm_surface_get_format(tsurface);
+
+        hwc->target_buffer_info.dst_pos.x = 0;
+        hwc->target_buffer_info.dst_pos.y = 0;
+        hwc->target_buffer_info.dst_pos.w = tbm_surface_get_width(tsurface);
+        hwc->target_buffer_info.dst_pos.h = tbm_surface_get_height(tsurface);
+
+        hwc->target_buffer_info.transform = TDM_TRANSFORM_NORMAL;
+
+        tdm_hwc_set_client_target_buffer_info(hwc->thwc, &hwc->target_buffer_info);
+    }
 
     terr = tdm_hwc_set_client_target_buffer(hwc->thwc, tsurface, fb_damage);
     if (terr != TDM_ERROR_NONE) {
index bb634d2..905e2ee 100644 (file)
@@ -52,16 +52,12 @@ struct ds_tdm_output_hwc {
 };
 
 struct ds_tdm_output_hwc *
-ds_tdm_output_hwc_create(tdm_hwc *thwc);
+ds_tdm_output_hwc_create(struct ds_tdm_output *output, tdm_hwc *thwc);
 
 void
 ds_tdm_output_hwc_destroy(struct ds_tdm_output_hwc *hwc);
 
 bool
-ds_tdm_output_hwc_set_client_target_buffer(struct ds_tdm_output_hwc *hwc,
-        tbm_surface_h tsurface);
-
-bool
 ds_tdm_output_hwc_commit(struct ds_tdm_output_hwc *hwc);
 
 void