return TDM_ERROR_NONE;
}
-EXTERN tdm_backend *
-tdm_output_get_backend(tdm_output *output, tdm_error *error)
+EXTERN tdm_module *
+tdm_output_get_backend_module(tdm_output *output, tdm_error *error)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
OUTPUT_FUNC_ENTRY_ERROR();
_pthread_mutex_lock(&private_display->lock);
- private_backend = private_output->private_backend;
+ private_module = private_output->private_module;
if (error)
*error = TDM_ERROR_NONE;
_pthread_mutex_unlock(&private_display->lock);
- return private_backend;
+ return private_module;
}
EXTERN tdm_error
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_module, 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_change_handler func,
void *user_data)
{
- tdm_private_output_change_handler *change_handler;
+ tdm_private_output_change_handler *change_handler = NULL;
OUTPUT_FUNC_ENTRY();
TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER);
_pthread_mutex_lock(&private_display->lock);
+ LIST_FOR_EACH_ENTRY(change_handler, &private_output->change_handler_list, link) {
+ if (change_handler->func == func && change_handler->user_data == user_data) {
+ TDM_ERR("can't add twice");
+ _pthread_mutex_unlock(&private_display->lock);
+ return TDM_ERROR_BAD_REQUEST;
+ }
+ }
+
change_handler = calloc(1, sizeof(tdm_private_output_change_handler));
if (!change_handler) {
/* LCOV_EXCL_START */
_pthread_mutex_lock(&private_display->lock);
- if (!tdm_backend_check_module_abi(private_output->private_backend, 1, 5)) {
-
- if (min_w)
- *min_w = -1;
- if (min_h)
- *min_h = -1;
- if (max_w)
- *max_w = -1;
- if (max_h)
- *max_h = -1;
- if (preferred_align)
- *preferred_align = -1;
-
+ if (!tdm_module_check_abi(private_output->private_module, 1, 5)) {
_pthread_mutex_unlock(&private_display->lock);
-
return TDM_ERROR_BAD_REQUEST;
}
EXTERN tdm_error
tdm_output_set_property(tdm_output *output, unsigned int id, tdm_value value)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output;
OUTPUT_FUNC_ENTRY();
_pthread_mutex_lock(&private_display->lock);
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_set_property) {
/* LCOV_EXCL_START */
EXTERN tdm_error
tdm_output_get_property(tdm_output *output, unsigned int id, tdm_value *value)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output;
OUTPUT_FUNC_ENTRY();
_pthread_mutex_lock(&private_display->lock);
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_get_property) {
/* LCOV_EXCL_START */
tdm_output_vblank_handler func, void *user_data,
unsigned int add_front)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output;
tdm_private_output_vblank_handler *vblank_handler = NULL, *v = NULL;
unsigned int skip_request = 0;
pid_t tid = syscall(SYS_gettid);
tdm_error ret = TDM_ERROR_NONE;
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
/* interval SHOULD be at least 1 */
if (interval <= 0)
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);
tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handler func, void *user_data)
{
tdm_private_output *private_output;
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output;
tdm_private_output_commit_handler *output_commit_handler = NULL;
tdm_private_layer *private_layer = NULL;
TDM_RETURN_VAL_IF_FAIL(tdm_output_is_valid(output), TDM_ERROR_INVALID_PARAMETER);
private_output = (tdm_private_output*)output;
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_commit) {
/* LCOV_EXCL_START */
EXTERN tdm_error
tdm_output_set_mode(tdm_output *output, const tdm_output_mode *mode)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output;
OUTPUT_FUNC_ENTRY();
_pthread_mutex_lock(&private_display->lock);
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_set_mode) {
/* LCOV_EXCL_START */
EXTERN tdm_error
tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output;
OUTPUT_FUNC_ENTRY();
return TDM_ERROR_BAD_REQUEST;
}
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
TDM_INFO("output(%d) dpms '%s'", private_output->pipe, tdm_dpms_str(dpms_value));
EXTERN tdm_error
tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output;
OUTPUT_FUNC_ENTRY();
return TDM_ERROR_BAD_REQUEST;
}
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_set_dpms_handler) {
TDM_WRN("not implemented: output_set_dpms_handler");
_pthread_mutex_unlock(&private_display->lock);
tdm_output_get_dpms_internal(tdm_output *output, tdm_output_dpms *dpms_value)
{
tdm_private_output *private_output;
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output;
tdm_error ret = TDM_ERROR_NONE;
return TDM_ERROR_NONE;
}
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_get_dpms) {
/* LCOV_EXCL_START */
if (*dpms_value != private_output->current_dpms_value) {
tdm_value value;
TDM_ERR("output(%d) dpms changed suddenly: %s -> %s",
- private_output->pipe, private_output->current_dpms_value,
+ private_output->pipe, tdm_dpms_str(private_output->current_dpms_value),
tdm_dpms_str(*dpms_value));
private_output->current_dpms_value = *dpms_value;
value.u32 = *dpms_value;
tdm_output_hwc_validate(tdm_output *output, tdm_hwc_window **composited_wnds,
uint32_t num_wnds, uint32_t *num_types)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output = NULL;
tdm_private_hwc_window **composited_wnds_frontend = NULL;
tdm_hwc_window **composited_wnds_backend = NULL;
return TDM_ERROR_BAD_REQUEST;
}
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_hwc_validate) {
/* LCOV_EXCL_START */
tdm_hwc_window **hwc_window,
tdm_hwc_window_composition *composition_types)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output = NULL;
tdm_private_hwc_window * private_hwc_window = NULL;
int i = 0;
return TDM_ERROR_BAD_REQUEST;
}
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_hwc_get_changed_composition_types) {
/* LCOV_EXCL_START */
tdm_error
tdm_output_hwc_accept_changes(tdm_output *output)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output = NULL;
OUTPUT_FUNC_ENTRY();
return TDM_ERROR_BAD_REQUEST;
}
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_hwc_validate) {
/* LCOV_EXCL_START */
tbm_surface_queue_h
tdm_output_hwc_get_target_buffer_queue(tdm_output *output, tdm_error *error)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output = NULL;
tbm_surface_queue_h queue = NULL;
return NULL;
}
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_hwc_get_target_buffer_queue) {
/* LCOV_EXCL_START */
EXTERN tdm_error
tdm_output_hwc_set_client_target_buffer(tdm_output *output, tbm_surface_h target_buffer, tdm_hwc_region damage)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output = NULL;
OUTPUT_FUNC_ENTRY();
/* LCOV_EXCL_STOP */
}
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_hwc_set_client_target_buffer) {
/* LCOV_EXCL_START */
EXTERN tdm_error
tdm_output_hwc_unset_client_target_buffer(tdm_output *output)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output = NULL;
OUTPUT_FUNC_ENTRY();
return TDM_ERROR_BAD_REQUEST;
}
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_hwc_unset_client_target_buffer) {
/* LCOV_EXCL_START */
tdm_error
tdm_output_hwc_commit_client_target_buffer(tdm_output *output, tdm_output_hwc_target_buffer_commit_handler func, void *user_data)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output;
tdm_private_output_hwc_target_buffer_commit_handler *output_hwc_target_buffer_commit_handler;
tdm_layer *layer = NULL;
return TDM_ERROR_BAD_REQUEST;
}
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_hwc_get_client_target_buffer_layer) {
/* LCOV_EXCL_START */
if (ret != TDM_ERROR_NONE) {
/* LCOV_EXCL_START */
TDM_ERR("failed: layer set info(window)");
+ _pthread_mutex_unlock(&private_display->lock);
/* LCOV_EXCL_STOP */
return ret;
}
if (ret != TDM_ERROR_NONE) {
/* LCOV_EXCL_START */
TDM_ERR("failed: layer set info(window)");
+ _pthread_mutex_unlock(&private_display->lock);
/* LCOV_EXCL_STOP */
return ret;
}
if (!output_hwc_target_buffer_commit_handler) {
/* LCOV_EXCL_START */
TDM_ERR("failed: alloc memory");
+ _pthread_mutex_unlock(&private_display->lock);
return TDM_ERROR_OUT_OF_MEMORY;
/* LCOV_EXCL_STOP */
}
output_hwc_target_buffer_commit_handler->func = func;
output_hwc_target_buffer_commit_handler->user_data = user_data;
- ret = tdm_layer_commit_internal(private_layer, _tdm_output_hwc_layer_commit_handler, user_data);
+ ret = tdm_layer_commit_internal(private_layer, _tdm_output_hwc_layer_commit_handler, output_hwc_target_buffer_commit_handler);
if (ret != TDM_ERROR_NONE) {
/* LCOV_EXCL_START */
TDM_ERR("failed: commit layer(target buffer)");
free(output_hwc_target_buffer_commit_handler);
+ _pthread_mutex_unlock(&private_display->lock);
/* LCOV_EXCL_STOP */
return ret;
}
tdm_output_hwc_get_video_supported_formats(tdm_output *output, const tbm_format **formats,
int *count)
{
- tdm_private_backend *private_backend;
+ tdm_private_module *private_module;
tdm_func_output *func_output;
OUTPUT_FUNC_ENTRY();
_pthread_mutex_lock(&private_display->lock);
- private_backend = private_output->private_backend;
- func_output = &private_backend->func_output;
+ private_module = private_output->private_module;
+ func_output = &private_module->func_output;
if (!func_output->output_hwc_get_video_supported_formats) {
/* LCOV_EXCL_START */
static int
_is_hwc_output_still_existed(tdm_private_output *private_output)
{
- tdm_private_backend *private_backend = private_output->private_backend;
+ tdm_private_module *private_module = private_output->private_module;
tdm_private_output *o = NULL;
- LIST_FOR_EACH_ENTRY(o, &private_backend->output_list, link) {
+ LIST_FOR_EACH_ENTRY(o, &private_module->output_list, link) {
if (!(o->caps.capabilities & TDM_OUTPUT_CAPABILITY_HWC))
continue;