Skip to content

Commit c0f8ed9

Browse files
committed
Merge branch 'at91-4.14-trunk/drm-fixes' into linux-4.14-at91
2 parents 013630d + af710f3 commit c0f8ed9

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

drivers/gpu/drm/drm_atomic_helper.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,6 +1184,41 @@ int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
11841184
}
11851185
EXPORT_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;

include/drm/drm_atomic_helper.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ void drm_atomic_helper_async_commit(struct drm_device *dev,
5555
int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
5656
struct drm_atomic_state *state,
5757
bool pre_swap);
58+
bool drm_atomic_helper_framebuffer_changed(struct drm_device *dev,
59+
struct drm_atomic_state *old_state,
60+
struct drm_crtc *crtc);
5861

5962
void drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
6063
struct drm_atomic_state *old_state);

0 commit comments

Comments
 (0)