[igt-dev] [PATCH i-g-t 2/2] tests/kms_frontbuffer_tracking: Remove redundant modesets during subtest start, v4.

Dhinakaran Pandiyan dhinakaran.pandiyan at gmail.com
Fri Aug 17 06:53:54 UTC 2018


On Tue, 2018-08-14 at 14:22 +0200, Maarten Lankhorst wrote:
> CRC capturing enables the display, then disables it again. With
> igt_display we can use igt_display_reset to restore the original
> state,
> without committing it to the hw.
> 
> All subtests first set their own state anyway, so we can save up on
> the number of commits.
> 
> Changes since v1:
> - Try to avoid modesets for PSR if the kernel supports it, but
> otherwise force
>   a modeset for the changes to take effect.
> Changes since v2:
> - Rebase on top of previous PSR changes.
> Changes since v3:
> - Rebase on move to lib/igt_psr.
> 
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> ---
>  tests/kms_frontbuffer_tracking.c | 57 ++++++++++++++++++++++++----
> ----
>  1 file changed, 44 insertions(+), 13 deletions(-)
> 
> diff --git a/tests/kms_frontbuffer_tracking.c
> b/tests/kms_frontbuffer_tracking.c
> index 7ea2f697184d..2cec30da2750 100644
> --- a/tests/kms_frontbuffer_tracking.c
> +++ b/tests/kms_frontbuffer_tracking.c
> @@ -1129,14 +1129,14 @@ static void unset_all_crtcs(void)
>  	igt_display_commit(&drm.display);
>  }
>  
> -static void disable_features(const struct test_mode *t)
> +static bool disable_features(const struct test_mode *t)
>  {
>  	if (t->feature == FEATURE_DEFAULT)
> -		return;
> +		return false;
>  
>  	fbc_disable();
> -	psr_disable(drm.debugfs);
>  	drrs_disable();
> +	return psr_disable(drm.debugfs);
>  }
>  
>  static void *busy_thread_func(void *data)
> @@ -1220,7 +1220,7 @@ static void init_blue_crc(enum pixel_format
> format)
>  
>  	print_crc("Blue CRC:  ", &blue_crcs[format].crc);
>  
> -	unset_all_crtcs();
> +	igt_display_reset(&drm.display);
>  
>  	igt_remove_fb(drm.fd, &blue);
>  
> @@ -1272,7 +1272,7 @@ static void init_crcs(enum pixel_format format,
>  		print_crc("", &pattern->crcs[format][r]);
>  	}
>  
> -	unset_all_crtcs();
> +	igt_display_reset(&drm.display);
>  
>  	for (r = 0; r < pattern->n_rects; r++)
>  		igt_remove_fb(drm.fd, &tmp_fbs[r]);
> @@ -1695,6 +1695,22 @@ static void enable_scnd_screen_and_wait(const
> struct test_mode *t)
>  	do_assertions(ASSERT_NO_ACTION_CHANGE);
>  }
>  
> +static void enable_both_screens_and_wait(const struct test_mode *t)
> +{
> +	fill_fb_region(&prim_mode_params.primary, COLOR_PRIM_BG);
> +	fill_fb_region(&scnd_mode_params.primary, COLOR_SCND_BG);
> +
> +	__set_mode_for_params(&prim_mode_params);
> +	__set_mode_for_params(&scnd_mode_params);
> +
> +	igt_display_commit2(&drm.display, drm.display.is_atomic ?
> COMMIT_ATOMIC : COMMIT_LEGACY);
> +
> +	wanted_crc = &blue_crcs[t->format].crc;
> +	fbc_update_last_action();
> +
> +	do_assertions(ASSERT_NO_ACTION_CHANGE);
> +}
> +
>  static void set_region_for_test(const struct test_mode *t,
>  				struct fb_region *reg)
>  {
> @@ -1709,17 +1725,21 @@ static void set_region_for_test(const struct
> test_mode *t,
>  	do_assertions(ASSERT_NO_ACTION_CHANGE);
>  }
>  
> -static void enable_features_for_test(const struct test_mode *t)
> +static bool enable_features_for_test(const struct test_mode *t)
>  {
> +	bool ret = false;
> +
>  	if (t->feature == FEATURE_DEFAULT)
> -		return;
> +		return false;
>  
>  	if (t->feature & FEATURE_FBC)
>  		fbc_enable();
>  	if (t->feature & FEATURE_PSR)
> -		psr_enable(drm.debugfs);
> +		ret = psr_enable(drm.debugfs);
>  	if (t->feature & FEATURE_DRRS)
>  		drrs_enable();
> +
> +	return ret;
>  }
>  
>  static void check_test_requirements(const struct test_mode *t)
> @@ -1801,28 +1821,40 @@ static void set_crtc_fbs(const struct
> test_mode *t)
>  static void prepare_subtest_data(const struct test_mode *t,
>  				 struct draw_pattern_info *pattern)
>  {
> +	bool need_modeset;
> +
>  	check_test_requirements(t);
>  
>  	stop_busy_thread();
>  
> -	disable_features(t);
> +	need_modeset = disable_features(t);
>  	set_crtc_fbs(t);
>  
>  	if (t->screen == SCREEN_OFFSCREEN)
>  		fill_fb_region(&offscreen_fb, COLOR_OFFSCREEN_BG);
>  
> -	unset_all_crtcs();
> +	igt_display_reset(&drm.display);
> +	if (need_modeset)
> +		igt_display_commit(&drm.display);
>  
>  	init_blue_crc(t->format);
>  	if (pattern)
>  		init_crcs(t->format, pattern);
>  
> -	enable_features_for_test(t);
> +	igt_display_reset(&drm.display);

Both init_blue_crc() and init_crc() call igt_display_reset(). Why is a
another reset required here?

Feel like there's too much going on in this one patch. Can you please
split the modeset eliminations you are implementing? I think changes
corresponding to PSR enabling, CRC initialization and the refactoring
of enable_both_screens_and_wait() all warrant to be individual patches.


-DK

> +
> +	need_modeset = enable_features_for_test(t);
> +	if (need_modeset)
> +		igt_display_commit(&drm.display);
>  }
>  
>  static void prepare_subtest_screens(const struct test_mode *t)
>  {
> -	enable_prim_screen_and_wait(t);
> +	if (t->pipes == PIPE_DUAL)
> +		enable_both_screens_and_wait(t);
> +	else
> +		enable_prim_screen_and_wait(t);
> +
>  	if (t->screen == SCREEN_PRIM) {
>  		if (t->plane == PLANE_CUR)
>  			set_region_for_test(t,
> &prim_mode_params.cursor);
> @@ -1833,7 +1865,6 @@ static void prepare_subtest_screens(const
> struct test_mode *t)
>  	if (t->pipes == PIPE_SINGLE)
>  		return;
>  
> -	enable_scnd_screen_and_wait(t);
>  	if (t->screen == SCREEN_SCND) {
>  		if (t->plane == PLANE_CUR)
>  			set_region_for_test(t,
> &scnd_mode_params.cursor);
-- 
-DK


More information about the igt-dev mailing list