prevent vblank set while dpms set executing 21/233521/2
authorJunkyeong Kim <jk0430.kim@samsung.com>
Fri, 15 May 2020 06:55:48 +0000 (15:55 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Wed, 20 May 2020 08:02:47 +0000 (08:02 +0000)
Change-Id: Icfbc5f0eb17db65809ef954e8afe55c84aa028d5
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/tdm_output.c
src/tdm_vblank.c

index 2786020..13163e0 100644 (file)
@@ -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);
index fe72c64..fd3d08a 100644 (file)
@@ -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)