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;
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 **
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;
}
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)
{
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;
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);