{
tdm_private_module *private_module;
tdm_func_output *func_output;
+ int sync = 0;
OUTPUT_FUNC_ENTRY();
if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_ASYNC_DPMS)) {
TDM_INFO("output(%d) dpms async '%s'", private_output->pipe, tdm_dpms_str(dpms_value));
- ret = func_output->output_set_dpms_async(private_output->output_backend, dpms_value);
+ ret = func_output->output_set_dpms_async(private_output->output_backend, dpms_value, &sync);
if (ret == TDM_ERROR_NONE) {
- private_output->waiting_dpms_change = 1;
- TDM_INFO("output(%d) dpms async '%s' waiting", private_output->pipe, tdm_dpms_str(dpms_value));
+ if (sync) {
+ tdm_output_dpms temp = TDM_OUTPUT_DPMS_OFF;
+
+ tdm_output_get_dpms_internal(output, &temp);
+ TDM_INFO("output(%d) dpms async '%s'(%s) done", private_output->pipe, tdm_dpms_str(dpms_value), tdm_dpms_str(temp));
+ } else {
+ private_output->waiting_dpms_change = 1;
+ TDM_INFO("output(%d) dpms async '%s' waiting", private_output->pipe, tdm_dpms_str(dpms_value));
+ }
} else {
tdm_output_dpms temp = TDM_OUTPUT_DPMS_OFF;
return TDM_ERROR_NONE;
}
-INTERN tdm_voutput *
-tdm_voutput_create(tdm_display *dpy, const char *name, tdm_error *error)
-{
- tdm_private_module *private_module = NULL;
- tdm_private_module *current_module = NULL;
- tdm_private_voutput *private_voutput = NULL;
- tdm_private_output *private_output = NULL;
- tdm_func_display *func_display = NULL;
- tdm_func_voutput *func_voutput = NULL;
- tdm_voutput *voutput_backend = NULL;
- tdm_output *output_backend = NULL;
- int output_find = 0;
- tdm_private_display *private_display;
- tdm_error ret = TDM_ERROR_NONE;
-
- TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(dpy != NULL, TDM_ERROR_INVALID_PARAMETER, NULL);
- private_display = (tdm_private_display*)dpy;
- private_module = private_display->virtual_module;
- TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(private_module != NULL, TDM_ERROR_BAD_MODULE, NULL);
-
- _pthread_mutex_lock(&private_display->lock);
-
- if (error) *error = TDM_ERROR_NONE;
-
- private_voutput = calloc(1, sizeof(tdm_private_voutput));
- if (!private_voutput) {
- if (error) *error = TDM_ERROR_OUT_OF_MEMORY;
- _pthread_mutex_unlock(&private_display->lock);
- return NULL;
- }
-
- func_display = &private_module->func_display;
- func_voutput = &private_module->func_voutput;
- current_module = private_display->current_module;
- private_display->current_module = private_module;
-
- voutput_backend = func_display->voutput_create(private_module->bdata, name, &ret);
-
- if (voutput_backend == NULL || ret != TDM_ERROR_NONE) {
- TDM_ERR("voutput_create fail");
- free(private_voutput);
- if (error) *error = ret;
- private_display->current_module = current_module;
- _pthread_mutex_unlock(&private_display->lock);
- return NULL;
- }
- private_voutput->voutput_backend = voutput_backend;
- private_voutput->private_display = private_display;
- private_voutput->private_module = private_module;
- LIST_INITHEAD(&private_voutput->voutput_commit_handler_list);
-
- output_backend = func_voutput->voutput_get_output(voutput_backend, &ret);
- if (output_backend == NULL || ret != TDM_ERROR_NONE) {
- TDM_ERR("voutput_get_output fail");
- free(private_voutput);
- if (error) *error = ret;
- if (func_voutput->voutput_destroy)
- func_voutput->voutput_destroy(voutput_backend);
- else
- TDM_ERR("no destroy function");
- private_display->current_module = current_module;
- _pthread_mutex_unlock(&private_display->lock);
- return NULL;
- }
-
- ret = tdm_display_update_output(private_display->current_module, output_backend);
- if (ret != TDM_ERROR_NONE) {
- TDM_ERR("tdm_display_update_output fail");
- free(private_voutput);
- if (func_voutput->voutput_destroy)
- func_voutput->voutput_destroy(voutput_backend);
- else
- TDM_ERR("no destroy function");
- if (error) *error = ret;
- private_display->current_module = current_module;
- _pthread_mutex_unlock(&private_display->lock);
- return NULL;
- }
-
- LIST_FOR_EACH_ENTRY(private_output, &private_module->output_list, link) {
- if (private_output->output_backend == output_backend) {
- output_find = 1;
- break;
- }
- }
-
- if (output_find != 1) {
- private_output = NULL;
- free(private_voutput);
- if (func_voutput->voutput_destroy)
- func_voutput->voutput_destroy(voutput_backend);
- else
- TDM_ERR("no destroy function");
- private_voutput = NULL;
- } else {
- strncpy(private_voutput->name, name, TDM_NAME_LEN - 1);
- private_voutput->name[TDM_NAME_LEN - 1] = '\0';
- strncpy(private_output->name, name, TDM_NAME_LEN - 1);
- private_output->name[TDM_NAME_LEN - 1] = '\0';
-
- private_voutput->private_output = private_output;
- private_output->private_voutput = private_voutput;
-
- /* do not use vblank */
- tdm_output_choose_commit_per_vblank_mode(private_output, 0);
-
- LIST_ADDTAIL(&private_voutput->link, &private_module->voutput_list);
- }
-
- private_display->current_module = current_module;
-
- _pthread_mutex_unlock(&private_display->lock);
-
- return private_voutput;
-}
-
INTERN tdm_error
tdm_voutput_destroy(tdm_voutput *voutput)
{