output: update caps only in case of changing status between connection and disconnection 06/171006/2
authorBoram Park <boram1288.park@samsung.com>
Sun, 25 Feb 2018 22:55:23 +0000 (07:55 +0900)
committerBoram Park <boram1288.park@samsung.com>
Sun, 25 Feb 2018 23:30:39 +0000 (08:30 +0900)
Change-Id: I63126a368331b494b3a4aa9c17a7e2abbc75a058

src/tdm.c
src/tdm_output.c
src/tdm_private.h

index 3a0ecad..6b796ea 100644 (file)
--- a/src/tdm.c
+++ b/src/tdm.c
@@ -375,32 +375,27 @@ _tdm_display_update_layer(tdm_private_output *private_output,
                TDM_RETURN_VAL_IF_FAIL(private_layer != NULL, TDM_ERROR_OUT_OF_MEMORY);
 
                LIST_ADDTAIL(&private_layer->link, &private_output->layer_list);
+               LIST_INITHEAD(&private_layer->capture_list);
+
                private_layer->index = index;
                private_layer->private_backend = private_output->private_backend;
                private_layer->private_display = private_output->private_display;
                private_layer->private_output = private_output;
                private_layer->layer_backend = layer_backend;
-
-               LIST_INITHEAD(&private_layer->capture_list);
-
                private_layer->usable = 1;
-       } else
-               _tdm_display_destroy_caps_layer(&private_layer->caps);
+       }
 
-       ret = _tdm_display_update_caps_layer(private_layer->private_backend, layer_backend,
-                                                                                &private_layer->caps);
-       if (ret != TDM_ERROR_NONE)
-               goto failed_update;
+       _tdm_display_destroy_caps_layer(&private_layer->caps);
+
+       ret = _tdm_display_update_caps_layer(private_output->private_backend, layer_backend, &private_layer->caps);
+       TDM_RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret);
 
        return TDM_ERROR_NONE;
-failed_update:
-       _tdm_display_destroy_private_layer(private_layer);
-       return ret;
 }
 
 INTERN tdm_error
 tdm_display_update_output(tdm_private_backend *private_backend,
-                                                 tdm_output *output_backend, int pipe)
+                                                 tdm_output *output_backend, int pipe, unsigned int need_new_caps)
 {
        tdm_func_output *func_output = &private_backend->func_output;
        tdm_private_output *private_output = NULL;
@@ -441,54 +436,35 @@ tdm_display_update_output(tdm_private_backend *private_backend,
                                                                                                   private_output);
                        private_output->regist_change_cb = 1;
                }
+       }
 
-               ret = _tdm_display_update_caps_output(private_backend, pipe, output_backend,
-                                                                                         &private_output->caps);
-               if (ret != TDM_ERROR_NONE)
-                       return ret;
-       } else {
-               tdm_caps_output new_caps;
-
-               ret = _tdm_display_update_caps_output(private_backend, pipe, output_backend,
-                                                                                         &new_caps);
-               if (ret != TDM_ERROR_NONE)
-                       return ret;
+       /* need_new_caps will be true only in case of "disconnected -> connected" and "connected -> disconnected"
+        * because we have to get new modes.
+        */
+       if (need_new_caps) {
+               _tdm_display_destroy_caps_output(&private_output->caps);
 
-               /* FIXME: This is very ugly. need to fix after the TDM ABI is changed. */
-               if (private_output->caps.status != new_caps.status) {
-                       _tdm_display_destroy_caps_output(&private_output->caps);
-                       private_output->caps = new_caps;
-                       private_output->current_mode = NULL;
-               } else {
-                       tdm_output_mode *old_modes = private_output->caps.modes;
-                       unsigned int old_mode_count = private_output->caps.mode_count;
-                       if (new_caps.modes)
-                               free(new_caps.modes);
-                       new_caps.modes = old_modes;
-                       new_caps.mode_count = old_mode_count;
-                       if (private_output->caps.props)
-                               free(private_output->caps.props);
-                       private_output->caps = new_caps;
-               }
+               ret = _tdm_display_update_caps_output(private_backend, pipe, output_backend, &private_output->caps);
+               TDM_RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret);
        }
 
        layers = func_output->output_get_layers(output_backend, &layer_count, &ret);
-       if (ret != TDM_ERROR_NONE)
-               goto failed_update;
+       if (ret != TDM_ERROR_NONE) {
+               free(layers);
+               return ret;
+       }
 
        for (i = 0; i < layer_count; i++) {
                ret = _tdm_display_update_layer(private_output, layers[i], i);
-               if (ret != TDM_ERROR_NONE)
-                       goto failed_update;
+               if (ret != TDM_ERROR_NONE) {
+                       free(layers);
+                       return ret;
+               }
        }
 
        free(layers);
 
        return TDM_ERROR_NONE;
-failed_update:
-       _tdm_display_destroy_private_output(private_output);
-       free(layers);
-       return ret;
 }
 
 static tdm_output **
@@ -657,7 +633,7 @@ _tdm_display_update(tdm_private_display *private_display)
                        goto failed_update;
 
                for (i = 0; i < output_count; i++) {
-                       ret = tdm_display_update_output(private_backend, outputs[i], index++);
+                       ret = tdm_display_update_output(private_backend, outputs[i], index++, 1);
                        if (ret != TDM_ERROR_NONE)
                                goto failed_update;
                }
index ed860d3..115cb9d 100644 (file)
@@ -222,20 +222,6 @@ tdm_output_get_conn_status(tdm_output *output, tdm_output_conn_status *status)
        return ret;
 }
 
-/* LCOV_EXCL_START */
-static void
-_tdm_output_update(tdm_output *output_backend, void *user_data)
-{
-       tdm_private_output *private_output = user_data;
-       tdm_error ret;
-
-       TDM_RETURN_IF_FAIL(private_output);
-
-       ret = tdm_display_update_output(private_output->private_backend, output_backend, private_output->pipe);
-       TDM_RETURN_IF_FAIL(ret == TDM_ERROR_NONE);
-}
-/* LCOV_EXCL_STOP */
-
 INTERN void
 tdm_output_thread_cb_change(tdm_private_display *private_display, void *object, tdm_thread_cb_base *cb_base, void *user_data)
 {
@@ -280,9 +266,17 @@ tdm_output_cb_status(tdm_output *output_backend, tdm_output_conn_status status,
        tdm_value value;
        tdm_error ret;
 
-       TDM_INFO("output(%d) main %s", private_output->pipe, tdm_status_str(status));
+       TDM_RETURN_IF_FAIL(private_output);
 
-       _tdm_output_update(output_backend, user_data);
+       TDM_INFO("output(%d) %s", private_output->pipe, tdm_status_str(status));
+
+       if ((private_output->caps.status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED && status != TDM_OUTPUT_CONN_STATUS_DISCONNECTED) ||
+               (private_output->caps.status != TDM_OUTPUT_CONN_STATUS_DISCONNECTED && status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED)) {
+               ret = tdm_display_update_output(private_output->private_backend, output_backend, private_output->pipe, 1);
+               TDM_RETURN_IF_FAIL(ret == TDM_ERROR_NONE);
+       } else {
+               private_output->caps.status = status;
+       }
 
        value.u32 = status;
 
@@ -954,6 +948,7 @@ tdm_output_wait_vblank(tdm_output *output, int interval, int sync,
                                           tdm_output_vblank_handler func, void *user_data)
 {
        OUTPUT_FUNC_ENTRY();
+       TDM_RETURN_VAL_IF_FAIL(interval > 0, TDM_ERROR_INVALID_PARAMETER);
 
        _pthread_mutex_lock(&private_display->lock);
 
index 45b1bab..458ae3c 100644 (file)
@@ -229,7 +229,7 @@ extern char *tdm_debug_dump_dir;
 
 tdm_error
 tdm_display_update_output(tdm_private_backend *private_backend,
-                                                 tdm_output *output_backend, int pipe);
+                                                 tdm_output *output_backend, int pipe, unsigned int need_new_caps);
 tdm_error
 tdm_display_enable_debug_module(const char*modules);
 tdm_error