@@ -1460,7 +1460,42 @@ int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
14601460EXPORT_SYMBOL (drm_atomic_helper_wait_for_fences );
14611461
14621462/**
1463- * drm_atomic_helper_wait_for_vblanks - wait for vblank on CRTCs
1463+ * drm_atomic_helper_framebuffer_changed - check if framebuffer has changed
1464+ * @dev: DRM device
1465+ * @old_state: atomic state object with old state structures
1466+ * @crtc: DRM crtc
1467+ *
1468+ * Checks whether the framebuffer used for this CRTC changes as a result of
1469+ * the atomic update. This is useful for drivers which cannot use
1470+ * drm_atomic_helper_wait_for_vblanks() and need to reimplement its
1471+ * functionality.
1472+ *
1473+ * Returns:
1474+ * true if the framebuffer changed.
1475+ */
1476+ bool drm_atomic_helper_framebuffer_changed (struct drm_device * dev ,
1477+ struct drm_atomic_state * old_state ,
1478+ struct drm_crtc * crtc )
1479+ {
1480+ struct drm_plane * plane ;
1481+ struct drm_plane_state * old_plane_state ;
1482+ int i ;
1483+
1484+ for_each_old_plane_in_state (old_state , plane , old_plane_state , i ) {
1485+ if (plane -> state -> crtc != crtc &&
1486+ old_plane_state -> crtc != crtc )
1487+ continue ;
1488+
1489+ if (plane -> state -> fb != old_plane_state -> fb )
1490+ return true;
1491+ }
1492+
1493+ return false;
1494+ }
1495+ EXPORT_SYMBOL (drm_atomic_helper_framebuffer_changed );
1496+
1497+ /**
1498+ * drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs
14641499 * @dev: DRM device
14651500 * @old_state: atomic state object with old state structures
14661501 *
@@ -1494,6 +1529,9 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
14941529 if (!new_crtc_state -> active )
14951530 continue ;
14961531
1532+ if (!drm_atomic_helper_framebuffer_changed (dev ,
1533+ old_state , crtc ))
1534+ continue ;
14971535 ret = drm_crtc_vblank_get (crtc );
14981536 if (ret != 0 )
14991537 continue ;
0 commit comments