From: David Francis <david.fran...@amd.com>

[Why]
The wait_for_vblank boolean in commit_tail was passed by reference
into each stream commit, and if that commit was an asynchronous
flip, it would disable vblank waits on all subsequent flips.

This made the behaviour depend on crtc order in a non-intuitive way,
although since the asynchronous pageflip flag is only used by the
legacy IOCTLs at the moment it is never an issue

[How]
Find wait_for_vblank before doing any stream commits

Signed-off-by: David Francis <david.fran...@amd.com>
Reviewed-by: Nicholas Kazlauskas <nicholas.kazlaus...@amd.com>
Acked-by: Leo Li <sunpeng...@amd.com>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 8cd6a82..fc39cd0 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4719,7 +4719,7 @@ static void amdgpu_dm_commit_planes(struct 
drm_atomic_state *state,
                                    struct drm_device *dev,
                                    struct amdgpu_display_manager *dm,
                                    struct drm_crtc *pcrtc,
-                                   bool *wait_for_vblank)
+                                   bool wait_for_vblank)
 {
        uint32_t i, r;
        uint64_t timestamp_ns;
@@ -4786,14 +4786,6 @@ static void amdgpu_dm_commit_planes(struct 
drm_atomic_state *state,
 
                if (pflip_needed) {
                        /*
-                        * Assume even ONE crtc with immediate flip means
-                        * entire can't wait for VBLANK
-                        * TODO Check if it's correct
-                        */
-                       if (new_pcrtc_state->pageflip_flags & 
DRM_MODE_PAGE_FLIP_ASYNC)
-                               *wait_for_vblank = false;
-
-                       /*
                         * TODO This might fail and hence better not used, wait
                         * explicitly on fences instead
                         * and in general should be called for
@@ -4888,7 +4880,7 @@ static void amdgpu_dm_commit_planes(struct 
drm_atomic_state *state,
         * hopefully eliminating dc_*_update structs in their entirety.
         */
        if (flip_count) {
-               target = (uint32_t)drm_crtc_vblank_count(pcrtc) + 
*wait_for_vblank;
+               target = (uint32_t)drm_crtc_vblank_count(pcrtc) + 
wait_for_vblank;
                /* Prepare wait for target vblank early - before the 
fence-waits */
                target_vblank = target - (uint32_t)drm_crtc_vblank_count(pcrtc) 
+
                                amdgpu_get_vblank_counter_kms(pcrtc->dev, 
acrtc_attach->crtc_id);
@@ -5266,13 +5258,17 @@ static void amdgpu_dm_atomic_commit_tail(struct 
drm_atomic_state *state)
 #endif
        }
 
+       for_each_new_crtc_in_state(state, crtc, new_crtc_state, j)
+               if (new_crtc_state->pageflip_flags & DRM_MODE_PAGE_FLIP_ASYNC)
+                       wait_for_vblank = false;
+
        /* update planes when needed per crtc*/
        for_each_new_crtc_in_state(state, crtc, new_crtc_state, j) {
                dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
 
                if (dm_new_crtc_state->stream)
                        amdgpu_dm_commit_planes(state, dc_state, dev,
-                                               dm, crtc, &wait_for_vblank);
+                                               dm, crtc, wait_for_vblank);
        }
 
 
-- 
2.7.4

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to