backend/tdm: Update output mode 45/278145/1
authorSeunghun Lee <shiin.lee@samsung.com>
Thu, 3 Mar 2022 09:02:49 +0000 (18:02 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 18 Jul 2022 05:58:13 +0000 (14:58 +0900)
Change-Id: I1c23428392249f74376dc40aae5da89011165b17

src/libds/backend/tdm/output.c

index d3317f3..06edbf6 100644 (file)
@@ -10,6 +10,7 @@ static const struct ds_output_interface tdm_output_iface;
 static bool tdm_output_init_modes(struct ds_tdm_output *output);
 static void tdm_output_destroy(struct ds_tdm_output *output);
 static void tdm_output_init_hwc(struct ds_tdm_output *output);
+static bool tdm_output_update_mode(struct ds_tdm_output *output);
 
 struct ds_tdm_output *
 create_tdm_output(struct ds_tdm_backend *tdm, tdm_output *tdm_output)
@@ -188,6 +189,13 @@ tdm_output_iface_commit(struct ds_output *ds_output)
 
     output = tdm_output_from_output(ds_output);
 
+    if (ds_output->pending.committed & DS_OUTPUT_STATE_MODE) {
+        if (!tdm_output_update_mode(output)) {
+            ds_err("Could not update TDM mode");
+            return false;
+        }
+    }
+
     ds_buffer = ds_output->pending.buffer;
     buffer = get_or_create_tdm_buffer(output->backend, ds_buffer);
     if (!buffer)
@@ -221,7 +229,8 @@ tdm_output_iface_commit(struct ds_output *ds_output)
             return false;
         }
 
-        err = tdm_hwc_commit(output->tdm.hwc, 0, tdm_output_hwc_commit_handler, output);
+        err = tdm_hwc_commit(output->tdm.hwc, 0, tdm_output_hwc_commit_handler,
+                output);
         if (err != TDM_ERROR_NONE) {
             ds_err("Could not hwc commit");
             ds_buffer_unlock(buffer->buffer);
@@ -295,7 +304,7 @@ tdm_output_init_modes(struct ds_tdm_output *output)
         if (tdm_mode->type & TDM_OUTPUT_MODE_TYPE_PREFERRED)
             mode->base.preferred = true;
 
-        ds_inf("  %dx%d@%d %s", mode->base.width, mode->base.height,
+        ds_dbg("  %dx%d@%d %s", mode->base.width, mode->base.height,
                 mode->base.refresh,
                 mode->base.preferred ? "(preferred)" : "");
 
@@ -303,14 +312,6 @@ tdm_output_init_modes(struct ds_tdm_output *output)
             wl_list_insert(&output->base.modes, &mode->base.link);
         else
             wl_list_insert(output->base.modes.prev, &mode->base.link);
-
-        // FIXME
-        if (mode->base.preferred) {
-            err = tdm_output_set_mode(output->tdm.output, tdm_mode);
-            if (err != TDM_ERROR_NONE) {
-                ds_err("Could not set mode");
-            }
-        }
     }
 
     return true;
@@ -327,3 +328,21 @@ tdm_output_init_hwc(struct ds_tdm_output *output)
         return;
     }
 }
+
+static bool
+tdm_output_update_mode(struct ds_tdm_output *output)
+{
+    const struct ds_tdm_output_mode *mode;
+    tdm_error err;
+
+    mode = (struct ds_tdm_output_mode *)output->base.pending.mode;
+
+    ds_inf("TDM output(%p) set mode %dx%d %d mHz", output,
+            mode->base.width, mode->base.height, mode->base.refresh);
+
+    err = tdm_output_set_mode(output->tdm.output, mode->tdm_mode);
+    if (err != TDM_ERROR_NONE)
+        return false;
+
+    return true;
+}