[PATCH i-g-t 5/5] tests/intel/xe_pat: verify wb-transient with pipe crc

Nirmoy Das nirmoy.das at linux.intel.com
Mon Mar 4 12:18:54 UTC 2024


On 3/1/2024 6:16 PM, Matthew Auld wrote:
> On Xe2 using the L3:XD (wb-transient) caching mode, which is intended
> for display use, verify we don't observe display corruption when
> rendering unto the display surface. Transient cache entries should be
> flushed by the time we do the flip, if not we will detect pipe crc
> mismatch vs reference fb.
>
> Signed-off-by: Matthew Auld<matthew.auld at intel.com>
> Cc: Zbigniew Kempczyński<zbigniew.kempczynski at intel.com>
> Cc: Nirmoy Das<nirmoy.das at intel.com>
Reviewed-by: Nirmoy Das <nirmoy.das at intel.com>
> ---
>   tests/intel/xe_pat.c | 121 +++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 121 insertions(+)
>
> diff --git a/tests/intel/xe_pat.c b/tests/intel/xe_pat.c
> index 6918ebe7e..bee93ac2f 100644
> --- a/tests/intel/xe_pat.c
> +++ b/tests/intel/xe_pat.c
> @@ -10,6 +10,8 @@
>    * Functionality: pat_index
>    */
>   
> +#include <fcntl.h>
> +
>   #include "igt.h"
>   #include "igt_vgem.h"
>   #include "intel_blt.h"
> @@ -722,6 +724,122 @@ static void prime_external_import_coh(void)
>   	drm_close_driver(fd2);
>   }
>   
> +/**
> + * SUBTEST: display-vs-wb-transient
> + * Test category: functionality test
> + * Description: Scanout with dirty L3:XD
> + */
> +static void display_vs_wb_transient(int fd)
> +{
> +	uint16_t pat_index_modes[] = {
> +		0, /* UC (baseline) */
> +		6, /* L3:XD (uncompressed) */
> +	};
> +	uint32_t devid = intel_get_drm_devid(fd);
> +	igt_render_copyfunc_t render_copy = NULL;
> +	igt_crc_t ref_crc = {}, crc = {};
> +	igt_plane_t *primary;
> +	igt_display_t display;
> +	igt_output_t *output;
> +	igt_pipe_crc_t *pipe_crc;
> +	drmModeModeInfoPtr mode;
> +	struct intel_bb *ibb;
> +	struct buf_ops *bops;
> +	struct igt_fb src_fb, dst_fb;
> +	struct intel_buf src, dst;
> +	enum pipe pipe;
> +	int bpp = 32;
> +	int i;
> +
> +	igt_require(intel_get_device_info(devid)->graphics_ver >= 20);
> +
> +	render_copy = igt_get_render_copyfunc(devid);
> +	igt_require(render_copy);
> +	igt_require(xe_has_engine_class(fd, DRM_XE_ENGINE_CLASS_RENDER));
> +
> +	igt_display_require(&display, fd);
> +	igt_display_require_output(&display);
> +	kmstest_set_vt_graphics_mode();
> +
> +	bops = buf_ops_create(fd);
> +	ibb = intel_bb_create(fd, SZ_4K);
> +
> +	for_each_pipe_with_valid_output(&display, pipe, output) {
> +		igt_display_reset(&display);
> +
> +		igt_output_set_pipe(output, pipe);
> +		if (!intel_pipe_output_combo_valid(&display))
> +			continue;
> +
> +		mode = igt_output_get_mode(output);
> +		pipe_crc = igt_pipe_crc_new(fd, pipe, IGT_PIPE_CRC_SOURCE_AUTO);
> +		break;
> +	}
> +
> +	primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> +
> +	igt_create_fb(fd, mode->hdisplay, mode->vdisplay,
> +		      DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR, &src_fb);
> +	igt_draw_fill_fb(fd, &src_fb, 0xFF);
> +
> +	igt_plane_set_fb(primary, &src_fb);
> +	igt_assert_eq(igt_display_commit2(&display, COMMIT_ATOMIC), 0);
> +	igt_pipe_crc_collect_crc(pipe_crc, &ref_crc);
> +
> +	intel_buf_init_full(bops, src_fb.gem_handle, &src, src_fb.width,
> +			    src_fb.height, bpp, 0, I915_TILING_NONE,
> +			    I915_COMPRESSION_NONE, src_fb.size,
> +			    src_fb.strides[0], 0, DEFAULT_PAT_INDEX,
> +			    DEFAULT_MOCS_INDEX);
> +
> +	for (i = 0; i < ARRAY_SIZE(pat_index_modes); i++) {
> +		int fw_handle;
> +
> +		igt_create_fb(fd, mode->hdisplay, mode->vdisplay,
> +			      DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR, &dst_fb);
> +
> +		intel_buf_init_full(bops, dst_fb.gem_handle, &dst,
> +				    dst_fb.width, dst_fb.height, bpp, 0,
> +				    I915_TILING_NONE, I915_COMPRESSION_NONE,
> +				    dst_fb.size, dst_fb.strides[0], 0,
> +				    pat_index_modes[i],
> +				    intel_get_deferred_mocs_index(fd));
> +
> +		/* c0 -> c6 might flush caches */
> +		fw_handle = igt_debugfs_open(fd, "forcewake_all", O_RDONLY);
> +		igt_assert(fw_handle >= 0);
> +
> +		render_copy(ibb,
> +			    &src,
> +			    0, 0, dst_fb.width, dst_fb.height,
> +			    &dst,
> +			    0, 0);
> +		intel_bb_sync(ibb);
> +
> +		/*
> +		 * Display engine is not coherent with GPU/CPU caches, however
> +		 * with new L3:XD caching mode, the GPU cache entries marked as
> +		 * transient should be automatically flushed by the time we do
> +		 * the flip.
> +		 */
> +
> +		igt_plane_set_fb(primary, &dst_fb);
> +		igt_assert_eq(igt_display_commit2(&display, COMMIT_ATOMIC), 0);
> +		igt_pipe_crc_collect_crc(pipe_crc, &crc);
> +
> +		igt_assert_crc_equal(&crc, &ref_crc);
> +
> +		intel_bb_reset(ibb, false);
> +
> +		intel_buf_close(dst.bops, &dst);
> +		igt_remove_fb(fd, &dst_fb);
> +		close(fw_handle);
> +	}
> +
> +	igt_remove_fb(fd, &src_fb);
> +	intel_bb_destroy(ibb);
> +}
> +
>   static uint8_t get_pat_idx_uc(int fd, bool *compressed)
>   {
>   	if (compressed)
> @@ -1054,6 +1172,9 @@ igt_main_args("V", NULL, help_str, opt_handler, NULL)
>   						     ARRAY_SIZE(xe2_pat_index_modes));
>   	}
>   
> +	igt_subtest("display-vs-wb-transient")
> +		display_vs_wb_transient(fd);
> +
>   	igt_fixture
>   		drm_close_driver(fd);
>   }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/igt-dev/attachments/20240304/12b2c19f/attachment.htm>


More information about the igt-dev mailing list