@@ -1330,6 +1330,41 @@ int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
13301330}
13311331EXPORT_SYMBOL (drm_atomic_helper_wait_for_fences );
13321332
1333+ /**
1334+ * drm_atomic_helper_framebuffer_changed - check if framebuffer has changed
1335+ * @dev: DRM device
1336+ * @old_state: atomic state object with old state structures
1337+ * @crtc: DRM crtc
1338+ *
1339+ * Checks whether the framebuffer used for this CRTC changes as a result of
1340+ * the atomic update. This is useful for drivers which cannot use
1341+ * drm_atomic_helper_wait_for_vblanks() and need to reimplement its
1342+ * functionality.
1343+ *
1344+ * Returns:
1345+ * true if the framebuffer changed.
1346+ */
1347+ bool drm_atomic_helper_framebuffer_changed (struct drm_device * dev ,
1348+ struct drm_atomic_state * old_state ,
1349+ struct drm_crtc * crtc )
1350+ {
1351+ struct drm_plane * plane ;
1352+ struct drm_plane_state * old_plane_state ;
1353+ int i ;
1354+
1355+ for_each_old_plane_in_state (old_state , plane , old_plane_state , i ) {
1356+ if (plane -> state -> crtc != crtc &&
1357+ old_plane_state -> crtc != crtc )
1358+ continue ;
1359+
1360+ if (plane -> state -> fb != old_plane_state -> fb )
1361+ return true;
1362+ }
1363+
1364+ return false;
1365+ }
1366+ EXPORT_SYMBOL (drm_atomic_helper_framebuffer_changed );
1367+
13331368/**
13341369 * drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs
13351370 * @dev: DRM device
@@ -1365,6 +1400,9 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
13651400 if (!new_crtc_state -> active )
13661401 continue ;
13671402
1403+ if (!drm_atomic_helper_framebuffer_changed (dev ,
1404+ old_state , crtc ))
1405+ continue ;
13681406 ret = drm_crtc_vblank_get (crtc );
13691407 if (ret != 0 )
13701408 continue ;
0 commit comments