From 09dfd820a68d7a373b1632f581b600fbab3985f6 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Fri, 15 May 2020 15:55:48 +0900 Subject: [PATCH] prevent vblank set while dpms set executing Change-Id: Icfbc5f0eb17db65809ef954e8afe55c84aa028d5 Signed-off-by: Junkyeong Kim --- src/tdm_output.c | 14 ++++++++++++++ src/tdm_vblank.c | 9 ++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/tdm_output.c b/src/tdm_output.c index 2786020..13163e0 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1270,6 +1270,13 @@ tdm_output_wait_vblank(tdm_output *output, int interval, int sync, return TDM_ERROR_DPMS_OFF; } + if (private_output->waiting_dpms_change) { + TDM_WRN("output(%d) dpms is changing: %s", private_output->pipe, + tdm_dpms_str(private_output->current_dpms_value)); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_DPMS_OFF; + } + ret = _tdm_output_wait_vblank(private_output, interval, sync, func, user_data, 0); _pthread_mutex_unlock(&private_display->lock); @@ -1293,6 +1300,13 @@ tdm_output_wait_vblank_add_front(tdm_output *output, int interval, int sync, return TDM_ERROR_DPMS_OFF; } + if (private_output->waiting_dpms_change) { + TDM_WRN("output(%d) dpms is changing: %s", private_output->pipe, + tdm_dpms_str(private_output->current_dpms_value)); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_DPMS_OFF; + } + ret = _tdm_output_wait_vblank(private_output, interval, sync, func, user_data, 1); _pthread_mutex_unlock(&private_display->lock); diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index fe72c64..fd3d08a 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -1509,6 +1509,7 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, tdm_vblank_wait_info *wait_info; tdm_output_dpms dpms = TDM_OUTPUT_DPMS_OFF; unsigned int fps; + int dpms_changing = 0; tdm_error ret; TDM_RETURN_VAL_IF_FAIL(tdm_vblank_is_valid(vblank), TDM_ERROR_INVALID_PARAMETER); @@ -1526,6 +1527,7 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, } tdm_output_get_dpms(private_vblank->output, &dpms); + tdm_output_get_dpms_changing(private_vblank->output, &dpms_changing); if (!private_vblank->enable_fake) { if (private_vblank->connection == TDM_OUTPUT_CONN_STATUS_DISCONNECTED) { @@ -1536,6 +1538,11 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, VER("can't wait a vblank: DPMS %s", tdm_dpms_str(dpms)); return TDM_ERROR_DPMS_OFF; } + + if (dpms_changing) { + VER("can't wait a vblank: DPMS is changing"); + return TDM_ERROR_DPMS_OFF; + } } wait_info = calloc(1, sizeof * wait_info); @@ -1587,7 +1594,7 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, */ if (private_vblank->vrefresh % fps) wait_info->type = VBLANK_TYPE_SW; - else if (TDM_OUTPUT_DPMS_VSYNC_IS_OFF(dpms) || + else if (TDM_OUTPUT_DPMS_VSYNC_IS_OFF(dpms) || dpms_changing || private_vblank->connection != TDM_OUTPUT_CONN_STATUS_MODE_SETTED) wait_info->type = VBLANK_TYPE_SW_FAKE; else if (private_vblank->offset == 0) -- 2.7.4