diff options
| author | 2019-11-15 17:07:27 -0500 | |
|---|---|---|
| committer | 2019-12-05 18:22:40 -0500 | |
| commit | dd0b162fd00915728860a360c97752988782b8cc (patch) | |
| tree | 084cc17c1f5be72e3044b66e085afaed42ae094d /drivers/gpu | |
| parent | drm/amd/display: Reset steer fifo before unblanking the stream (diff) | |
| download | linux-dev-dd0b162fd00915728860a360c97752988782b8cc.tar.xz linux-dev-dd0b162fd00915728860a360c97752988782b8cc.zip  | |
drm/amd/display: Fix screen tearing on vrr tests
[Why]
Screen tearing is present in tests when setting the frame rate to
certain fps
[How]
Revert previous optimizations for low frame rates.
Signed-off-by: Amanda Liu <amanda.liu@amd.com>
Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
Acked-by: Leo Li <sunpeng.li@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/amd/display/modules/freesync/freesync.c | 32 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h | 1 | 
2 files changed, 13 insertions, 20 deletions
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c index 16e69bbc69aa..5437b50e9f90 100644 --- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c @@ -37,8 +37,8 @@  #define STATIC_SCREEN_RAMP_DELTA_REFRESH_RATE_PER_FRAME ((1000 / 60) * 65)  /* Number of elements in the render times cache array */  #define RENDER_TIMES_MAX_COUNT 10 -/* Threshold to exit/exit BTR (to avoid frequent enter-exits at the lower limit) */ -#define BTR_MAX_MARGIN 2500 +/* Threshold to exit BTR (to avoid frequent enter-exits at the lower limit) */ +#define BTR_EXIT_MARGIN 2000  /* Threshold to change BTR multiplier (to avoid frequent changes) */  #define BTR_DRIFT_MARGIN 2000  /*Threshold to exit fixed refresh rate*/ @@ -254,22 +254,24 @@ static void apply_below_the_range(struct core_freesync *core_freesync,  	unsigned int delta_from_mid_point_in_us_1 = 0xFFFFFFFF;  	unsigned int delta_from_mid_point_in_us_2 = 0xFFFFFFFF;  	unsigned int frames_to_insert = 0; +	unsigned int min_frame_duration_in_ns = 0; +	unsigned int max_render_time_in_us = in_out_vrr->max_duration_in_us;  	unsigned int delta_from_mid_point_delta_in_us; -	unsigned int max_render_time_in_us = -			in_out_vrr->max_duration_in_us - in_out_vrr->btr.margin_in_us; + +	min_frame_duration_in_ns = ((unsigned int) (div64_u64( +		(1000000000ULL * 1000000), +		in_out_vrr->max_refresh_in_uhz)));  	/* Program BTR */ -	if ((last_render_time_in_us + in_out_vrr->btr.margin_in_us / 2) < max_render_time_in_us) { +	if (last_render_time_in_us + BTR_EXIT_MARGIN < max_render_time_in_us) {  		/* Exit Below the Range */  		if (in_out_vrr->btr.btr_active) {  			in_out_vrr->btr.frame_counter = 0;  			in_out_vrr->btr.btr_active = false;  		} -	} else if (last_render_time_in_us > (max_render_time_in_us + in_out_vrr->btr.margin_in_us / 2)) { +	} else if (last_render_time_in_us > max_render_time_in_us) {  		/* Enter Below the Range */ -		if (!in_out_vrr->btr.btr_active) { -			in_out_vrr->btr.btr_active = true; -		} +		in_out_vrr->btr.btr_active = true;  	}  	/* BTR set to "not active" so disengage */ @@ -325,9 +327,7 @@ static void apply_below_the_range(struct core_freesync *core_freesync,  		/* Choose number of frames to insert based on how close it  		 * can get to the mid point of the variable range.  		 */ -		if ((frame_time_in_us / mid_point_frames_ceil) > in_out_vrr->min_duration_in_us && -				(delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2 || -						mid_point_frames_floor < 2)) { +		if (delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2) {  			frames_to_insert = mid_point_frames_ceil;  			delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_2 -  					delta_from_mid_point_in_us_1; @@ -343,7 +343,7 @@ static void apply_below_the_range(struct core_freesync *core_freesync,  		if (in_out_vrr->btr.frames_to_insert != 0 &&  				delta_from_mid_point_delta_in_us < BTR_DRIFT_MARGIN) {  			if (((last_render_time_in_us / in_out_vrr->btr.frames_to_insert) < -					max_render_time_in_us) && +					in_out_vrr->max_duration_in_us) &&  				((last_render_time_in_us / in_out_vrr->btr.frames_to_insert) >  					in_out_vrr->min_duration_in_us))  				frames_to_insert = in_out_vrr->btr.frames_to_insert; @@ -796,11 +796,6 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,  		refresh_range = in_out_vrr->max_refresh_in_uhz -  				in_out_vrr->min_refresh_in_uhz; -		in_out_vrr->btr.margin_in_us = in_out_vrr->max_duration_in_us - -				2 * in_out_vrr->min_duration_in_us; -		if (in_out_vrr->btr.margin_in_us > BTR_MAX_MARGIN) -			in_out_vrr->btr.margin_in_us = BTR_MAX_MARGIN; -  		in_out_vrr->supported = true;  	} @@ -816,7 +811,6 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,  	in_out_vrr->btr.inserted_duration_in_us = 0;  	in_out_vrr->btr.frames_to_insert = 0;  	in_out_vrr->btr.frame_counter = 0; -  	in_out_vrr->btr.mid_point_in_us =  				(in_out_vrr->min_duration_in_us +  				 in_out_vrr->max_duration_in_us) / 2; diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h b/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h index dbe7835aabcf..dc187844d10b 100644 --- a/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h +++ b/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h @@ -92,7 +92,6 @@ struct mod_vrr_params_btr {  	uint32_t inserted_duration_in_us;  	uint32_t frames_to_insert;  	uint32_t frame_counter; -	uint32_t margin_in_us;  };  struct mod_vrr_params_fixed_refresh {  | 
