Skip to content

Commit e2083e4

Browse files
committed
Merge branch 'at91-4.19-trunk/drm-fixes' into linux-4.19-at91
2 parents a5703c7 + de7b172 commit e2083e4

2 files changed

Lines changed: 41 additions & 0 deletions

File tree

drivers/gpu/drm/drm_atomic_helper.c

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

include/drm/drm_atomic_helper.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ void drm_atomic_helper_async_commit(struct drm_device *dev,
6161
int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
6262
struct drm_atomic_state *state,
6363
bool pre_swap);
64+
bool drm_atomic_helper_framebuffer_changed(struct drm_device *dev,
65+
struct drm_atomic_state *old_state,
66+
struct drm_crtc *crtc);
6467

6568
void drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
6669
struct drm_atomic_state *old_state);

0 commit comments

Comments
 (0)