@@ -303,12 +303,11 @@ static void dm_pflip_high_irq(void *interrupt_params)
303
303
return ;
304
304
}
305
305
306
+ /* Update to correct count(s) if racing with vblank irq */
307
+ amdgpu_crtc -> last_flip_vblank = drm_crtc_accurate_vblank_count (& amdgpu_crtc -> base );
306
308
307
309
/* wake up userspace */
308
310
if (amdgpu_crtc -> event ) {
309
- /* Update to correct count(s) if racing with vblank irq */
310
- drm_crtc_accurate_vblank_count (& amdgpu_crtc -> base );
311
-
312
311
drm_crtc_send_vblank_event (& amdgpu_crtc -> base , amdgpu_crtc -> event );
313
312
314
313
/* page flip completed. clean up */
@@ -4828,6 +4827,8 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
4828
4827
to_dm_crtc_state (drm_atomic_get_old_crtc_state (state , pcrtc ));
4829
4828
int planes_count = 0 ;
4830
4829
unsigned long flags ;
4830
+ u64 last_flip_vblank ;
4831
+ bool vrr_active = acrtc_state -> freesync_config .state == VRR_STATE_ACTIVE_VARIABLE ;
4831
4832
4832
4833
/* update planes when needed */
4833
4834
for_each_oldnew_plane_in_state (state , plane , old_plane_state , new_plane_state , i ) {
@@ -4859,6 +4860,16 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
4859
4860
/* In commit tail framework this cannot happen */
4860
4861
WARN_ON (1 );
4861
4862
}
4863
+
4864
+ /* For variable refresh rate mode only:
4865
+ * Get vblank of last completed flip to avoid > 1 vrr flips per
4866
+ * video frame by use of throttling, but allow flip programming
4867
+ * anywhere in the possibly large variable vrr vblank interval
4868
+ * for fine-grained flip timing control and more opportunity to
4869
+ * avoid stutter on late submission of amdgpu_dm_do_flip() calls.
4870
+ */
4871
+ last_flip_vblank = acrtc_attach -> last_flip_vblank ;
4872
+
4862
4873
spin_unlock_irqrestore (& crtc -> dev -> event_lock , flags );
4863
4874
4864
4875
if (!pflip_needed || plane -> type == DRM_PLANE_TYPE_OVERLAY ) {
@@ -4882,10 +4893,18 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
4882
4893
if (plane -> type == DRM_PLANE_TYPE_PRIMARY )
4883
4894
drm_crtc_vblank_get (crtc );
4884
4895
4896
+ /* Use old throttling in non-vrr fixed refresh rate mode
4897
+ * to keep flip scheduling based on target vblank counts
4898
+ * working in a backwards compatible way, e.g., clients
4899
+ * using GLX_OML_sync_control extension.
4900
+ */
4901
+ if (!vrr_active )
4902
+ last_flip_vblank = drm_crtc_vblank_count (crtc );
4903
+
4885
4904
amdgpu_dm_do_flip (
4886
4905
crtc ,
4887
4906
fb ,
4888
- (uint32_t )drm_crtc_vblank_count ( crtc ) + * wait_for_vblank ,
4907
+ (uint32_t ) last_flip_vblank + * wait_for_vblank ,
4889
4908
dc_state );
4890
4909
}
4891
4910
0 commit comments