tdm_vblank: Add TDM_OUTPUT_CAPABILITY_NO_HW_VBLANK 55/315855/3
authorChangyeon Lee <cyeon.lee@samsung.com>
Thu, 5 Dec 2024 07:50:19 +0000 (16:50 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Thu, 5 Dec 2024 08:07:04 +0000 (17:07 +0900)
if hal tdm backend set HAL_TDM_OUTPUT_CAPABILITY_NO_HW_VBLANK,
tdm_vblank use SW_FAKE vblank.

Change-Id: I28ed488857cfdc3dff03663a2dc8cfbbb886f845

include/tdm_common.h
src/tdm_vblank.c

index 48192ab46031ce08709312037ff3f2b78618123c..9406a1cfdd248ab63e0c31a4cfc63cba1ff7d2c6 100644 (file)
@@ -100,6 +100,7 @@ typedef enum {
        TDM_OUTPUT_CAPABILITY_HWC                = (1 << 1), /**< if a outupt supports hwc operation @since 2.0.0*/
        TDM_OUTPUT_CAPABILITY_EXTENDED_DPMS      = (1 << 2), /**< if a outupt supports extended DPMS operation @since 2.0.0 */
        TDM_OUTPUT_CAPABILITY_MIRROR             = (1 << 3), /**< if a outupt supports the displying mirror image of the src_output @since 2.9.0 */
+       TDM_OUTPUT_CAPABILITY_NO_HW_VBLANK       = (1 << 4), /**< if a outupt doesn't support hw vblank */
 } tdm_output_capability;
 
 /**
index d2523f6ddaeda15ede78127f8c69eb20628935e6..5af89a4ef942c43986a0d736b3e53d54367406e1 100644 (file)
@@ -97,6 +97,7 @@ typedef struct _tdm_private_vblank {
        tdm_output *output;
        tdm_output_conn_status connection;
        unsigned int vrefresh;
+       int HW_vblank_supported;
 
        tdm_vblank_event_type last_type;
        unsigned int check_HW_or_SW;
@@ -782,6 +783,7 @@ EXTERN tdm_vblank *
 tdm_vblank_create(tdm_display *dpy, tdm_output *output, tdm_error *error)
 {
        tdm_private_vblank *private_vblank;
+       tdm_output_capability capabilities = 0;
        tdm_error ret;
 
        TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(dpy != NULL, TDM_ERROR_INVALID_PARAMETER, NULL);
@@ -817,6 +819,12 @@ tdm_vblank_create(tdm_display *dpy, tdm_output *output, tdm_error *error)
        private_vblank->fps_changeable = 1;
        private_vblank->last_interval = -1;
 
+       tdm_output_get_capabilities(output, &capabilities);
+       if (capabilities & TDM_OUTPUT_CAPABILITY_NO_HW_VBLANK)
+               private_vblank->HW_vblank_supported = 0;
+       else
+               private_vblank->HW_vblank_supported = 1;
+
        _tdm_vblank_update_output_info(private_vblank);
 
        strncpy(private_vblank->name, TDM_VBLANK_DEFAULT_NAME, TDM_NAME_LEN - 1);
@@ -1462,9 +1470,10 @@ _tdm_vblank_wait_SW(tdm_vblank_wait_info *wait_info)
 
                tdm_output_get_dpms(private_vblank->output, &dpms);
 
-               TDM_INFO("Use SW vblank. connection(%s), dpms(%s), vrefresh(%d), fps(%d), offset(%d)",
+               TDM_INFO("Use SW vblank. connection(%s), dpms(%s), vrefresh(%d), fps(%d), offset(%d), HW(%d)",
                        tdm_status_str(private_vblank->connection), tdm_dpms_str(dpms),
-                       private_vblank->vrefresh, private_vblank->fps, private_vblank->offset);
+                       private_vblank->vrefresh, private_vblank->fps, private_vblank->offset,
+                       private_vblank->HW_vblank_supported);
                private_vblank->last_type = VBLANK_EVENT_TYPE_SW;
        }
 
@@ -1610,7 +1619,8 @@ 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) || dpms_changing ||
-                        private_vblank->connection != TDM_OUTPUT_CONN_STATUS_MODE_SETTED)
+                        private_vblank->connection != TDM_OUTPUT_CONN_STATUS_MODE_SETTED ||
+                        !private_vblank->HW_vblank_supported)
                wait_info->type = VBLANK_TYPE_SW_FAKE;
        else if (private_vblank->offset == 0)
                wait_info->type = VBLANK_TYPE_HW;