@@ -1184,6 +1184,41 @@ int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
11841184}
11851185EXPORT_SYMBOL (drm_atomic_helper_wait_for_fences );
11861186
1187+ /**
1188+ * drm_atomic_helper_framebuffer_changed - check if framebuffer has changed
1189+ * @dev: DRM device
1190+ * @old_state: atomic state object with old state structures
1191+ * @crtc: DRM crtc
1192+ *
1193+ * Checks whether the framebuffer used for this CRTC changes as a result of
1194+ * the atomic update. This is useful for drivers which cannot use
1195+ * drm_atomic_helper_wait_for_vblanks() and need to reimplement its
1196+ * functionality.
1197+ *
1198+ * Returns:
1199+ * true if the framebuffer changed.
1200+ */
1201+ bool drm_atomic_helper_framebuffer_changed (struct drm_device * dev ,
1202+ struct drm_atomic_state * old_state ,
1203+ struct drm_crtc * crtc )
1204+ {
1205+ struct drm_plane * plane ;
1206+ struct drm_plane_state * old_plane_state ;
1207+ int i ;
1208+
1209+ for_each_plane_in_state (old_state , plane , old_plane_state , i ) {
1210+ if (plane -> state -> crtc != crtc &&
1211+ old_plane_state -> crtc != crtc )
1212+ continue ;
1213+
1214+ if (plane -> state -> fb != old_plane_state -> fb )
1215+ return true;
1216+ }
1217+
1218+ return false;
1219+ }
1220+ EXPORT_SYMBOL (drm_atomic_helper_framebuffer_changed );
1221+
11871222/**
11881223 * drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs
11891224 * @dev: DRM device
@@ -1219,6 +1254,9 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
12191254 if (!new_crtc_state -> active || !new_crtc_state -> planes_changed )
12201255 continue ;
12211256
1257+ if (!drm_atomic_helper_framebuffer_changed (dev ,
1258+ old_state , crtc ))
1259+ continue ;
12221260 ret = drm_crtc_vblank_get (crtc );
12231261 if (ret != 0 )
12241262 continue ;
0 commit comments