[PATCH i-g-t v4 4/5] tests/xe-ccs: Add tests which exercise small to large blit sizes

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Thu Feb 1 19:54:19 UTC 2024


On Thu, Feb 01, 2024 at 03:10:51PM +0100, Karolina Stolarek wrote:
> On 1.02.2024 11:07, Zbigniew Kempczyński wrote:
> > Testing block-copy for 512 x 512 x 32bpp is not enough to verify
> > blit is working for different (small) and not always aligned
> > resolutions. Add 'increment' subtests which checks blits from
> > small (1x1) to large (512x512) resolutions.
> > 
> > To avoid too long execution resolution increment equals 15x15 pixels.
> > 
> > Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> > Cc: Karolina Drobnik <karolina.drobnik at intel.com>
> > ---
> >   tests/intel/xe_ccs.c | 144 +++++++++++++++++++++++++++++++++----------
> >   1 file changed, 112 insertions(+), 32 deletions(-)
> 
> Ah, one question actually. We use width == height, and I wonder if we want
> to test rectangular surfaces. I think that caused problems in the past, but
> maybe I'm misremembering something.

Good question. I also thought to increment w/h depending on tile size
but due to unnecessary code complication I dropped this idea. Going
toward 512x512 in square shape imo is good enough to catch out of
boundary accesses (try decreasing stride/aligned height by half in helpers
and see how tests are failing).

--
Zbigniew

> 
> All the best,
> Karolina
> 
> > 
> > diff --git a/tests/intel/xe_ccs.c b/tests/intel/xe_ccs.c
> > index a7785edcb1..627976049c 100644
> > --- a/tests/intel/xe_ccs.c
> > +++ b/tests/intel/xe_ccs.c
> > @@ -28,9 +28,15 @@
> >    * SUBTEST: block-copy-compressed
> >    * Description: Check block-copy flatccs compressed blit
> >    *
> > + * SUBTEST: block-copy-compressed-inc-dimension
> > + * Description: Check block-copy compressed blit for different sizes
> > + *
> >    * SUBTEST: block-copy-uncompressed
> >    * Description: Check block-copy uncompressed blit
> >    *
> > + * SUBTEST: block-copy-uncompressed-inc-dimension
> > + * Description: Check block-copy uncompressed blit for different sizes
> > + *
> >    * SUBTEST: block-multicopy-compressed
> >    * Description: Check block-multicopy flatccs compressed blit
> >    *
> > @@ -73,6 +79,8 @@ struct test_config {
> >   	bool surfcopy;
> >   	bool new_ctx;
> >   	bool suspend_resume;
> > +	int width_increment;
> > +	int width_steps;
> >   };
> >   #define PRINT_SURFACE_INFO(name, obj) do { \
> > @@ -286,9 +294,17 @@ static int blt_block_copy3(int xe,
> >   	return ret;
> >   }
> > +#define CHECK_MIN_WIDTH 2
> > +#define CHECK_MIN_HEIGHT 2
> > +#define MIN_EXP_WH(w, h) ((w) >= CHECK_MIN_WIDTH && (h) >= CHECK_MIN_HEIGHT)
> > +#define CHECK_FROM_WIDTH 256
> > +#define CHECK_FROM_HEIGHT 256
> > +#define FROM_EXP_WH(w, h) ((w) >= CHECK_FROM_WIDTH && (h) >= CHECK_FROM_HEIGHT)
> > +
> >   static void block_copy(int xe,
> >   		       intel_ctx_t *ctx,
> >   		       uint32_t region1, uint32_t region2,
> > +		       uint32_t width, uint32_t height,
> >   		       enum blt_tiling_type mid_tiling,
> >   		       const struct test_config *config)
> >   {
> > @@ -301,7 +317,7 @@ static void block_copy(int xe,
> >   	uint32_t run_id = mid_tiling;
> >   	uint32_t mid_region = (AT_LEAST_GEN(intel_get_drm_devid(xe), 20) &
> >   							!xe_has_vram(xe)) ? region1 : region2;
> > -	uint32_t width = param.width, height = param.height, bb;
> > +	uint32_t bb;
> >   	enum blt_compression mid_compression = config->compression;
> >   	int mid_compression_format = param.compression_format;
> >   	enum blt_compression_type comp_type = COMPRESSION_TYPE_3D;
> > @@ -339,9 +355,16 @@ static void block_copy(int xe,
> >   	blt_block_copy(xe, ctx, NULL, ahnd, &blt, pext);
> >   	intel_ctx_xe_sync(ctx, true);
> > -	/* We expect mid != src if there's compression */
> > -	if (mid->compression)
> > -		igt_assert(memcmp(src->ptr, mid->ptr, src->size) != 0);
> > +	/*
> > +	 * We expect mid != src if there's compression. Ignore this for small
> > +	 * width x height for linear as compression for gradient occurs in the
> > +	 * middle for bigger sizes. We also ignore 1x1 as this looks same for
> > +	 * xmajor.
> > +	 */
> > +	if (mid->compression && MIN_EXP_WH(width, height)) {
> > +		if (mid_tiling != T_LINEAR || FROM_EXP_WH(width, height))
> > +			igt_assert(memcmp(src->ptr, mid->ptr, src->size) != 0);
> > +	}
> >   	WRITE_PNG(xe, run_id, "mid", &blt.dst, width, height, bpp);
> > @@ -416,6 +439,7 @@ static void block_copy(int xe,
> >   static void block_multicopy(int xe,
> >   			    intel_ctx_t *ctx,
> >   			    uint32_t region1, uint32_t region2,
> > +			    uint32_t width, uint32_t height,
> >   			    enum blt_tiling_type mid_tiling,
> >   			    const struct test_config *config)
> >   {
> > @@ -429,7 +453,7 @@ static void block_multicopy(int xe,
> >   	uint32_t run_id = mid_tiling;
> >   	uint32_t mid_region = (AT_LEAST_GEN(intel_get_drm_devid(xe), 20) &
> >   							!xe_has_vram(xe)) ? region1 : region2;
> > -	uint32_t width = param.width, height = param.height, bb;
> > +	uint32_t bb;
> >   	enum blt_compression mid_compression = config->compression;
> >   	int mid_compression_format = param.compression_format;
> >   	enum blt_compression_type comp_type = COMPRESSION_TYPE_3D;
> > @@ -521,6 +545,7 @@ static const struct {
> >   	void (*copyfn)(int fd,
> >   		       intel_ctx_t *ctx,
> >   		       uint32_t region1, uint32_t region2,
> > +		       uint32_t width, uint32_t height,
> >   		       enum blt_tiling_type btype,
> >   		       const struct test_config *config);
> >   } copyfns[] = {
> > @@ -528,17 +553,44 @@ static const struct {
> >   	[BLOCK_MULTICOPY] = { "-multicopy", block_multicopy },
> >   };
> > -static void block_copy_test(int xe,
> > -			    const struct test_config *config,
> > -			    struct igt_collection *set,
> > -			    enum copy_func copy_function)
> > +static void single_copy(int xe, const struct test_config *config,
> > +			int32_t region1, uint32_t region2,
> > +			uint32_t width, uint32_t height,
> > +			int tiling, enum copy_func copy_function)
> >   {
> >   	struct drm_xe_engine_class_instance inst = {
> >   		.engine_class = DRM_XE_ENGINE_CLASS_COPY,
> >   	};
> > +	uint32_t vm, exec_queue;
> > +	uint32_t sync_bind, sync_out;
> >   	intel_ctx_t *ctx;
> > +
> > +	vm = xe_vm_create(xe, 0, 0);
> > +	exec_queue = xe_exec_queue_create(xe, vm, &inst, 0);
> > +	sync_bind = syncobj_create(xe, 0);
> > +	sync_out = syncobj_create(xe, 0);
> > +	ctx = intel_ctx_xe(xe, vm, exec_queue,
> > +			   0, sync_bind, sync_out);
> > +
> > +	copyfns[copy_function].copyfn(xe, ctx,
> > +				      region1, region2,
> > +				      width, height,
> > +				      tiling, config);
> > +
> > +	xe_exec_queue_destroy(xe, exec_queue);
> > +	xe_vm_destroy(xe, vm);
> > +	syncobj_destroy(xe, sync_bind);
> > +	syncobj_destroy(xe, sync_out);
> > +	free(ctx);
> > +}
> > +
> > +static void block_copy_test(int xe,
> > +			    const struct test_config *config,
> > +			    struct igt_collection *set,
> > +			    enum copy_func copy_function)
> > +{
> > +
> >   	struct igt_collection *regions;
> > -	uint32_t vm, exec_queue;
> >   	int tiling;
> >   	if (config->compression && !blt_block_copy_supports_compression(xe))
> > @@ -555,6 +607,7 @@ static void block_copy_test(int xe,
> >   		for_each_variation_r(regions, 2, set) {
> >   			uint32_t region1, region2;
> >   			char *regtxt;
> > +			char testname[256];
> >   			region1 = igt_collection_get_value(regions, 0);
> >   			region2 = igt_collection_get_value(regions, 1);
> > @@ -566,30 +619,36 @@ static void block_copy_test(int xe,
> >   			regtxt = xe_memregion_dynamic_subtest_name(xe, regions);
> > -			igt_dynamic_f("%s-%s-compfmt%d-%s%s",
> > -				      blt_tiling_name(tiling),
> > -				      config->compression ?
> > -					      "compressed" : "uncompressed",
> > -				      param.compression_format, regtxt,
> > -				      copyfns[copy_function].suffix) {
> > -				uint32_t sync_bind, sync_out;
> > +			snprintf(testname, sizeof(testname),
> > +				 "%s-%s-compfmt%d-%s%s",
> > +				 blt_tiling_name(tiling),
> > +				 config->compression ?
> > +					 "compressed" : "uncompressed",
> > +				 param.compression_format, regtxt,
> > +				 copyfns[copy_function].suffix);
> > -				vm = xe_vm_create(xe, 0, 0);
> > -				exec_queue = xe_exec_queue_create(xe, vm, &inst, 0);
> > -				sync_bind = syncobj_create(xe, 0);
> > -				sync_out = syncobj_create(xe, 0);
> > -				ctx = intel_ctx_xe(xe, vm, exec_queue,
> > -						   0, sync_bind, sync_out);
> > +			if (!config->width_increment) {
> > +				igt_dynamic(testname)
> > +					single_copy(xe, config, region1, region2,
> > +						    param.width, param.height,
> > +						    tiling, copy_function);
> > +			} else {
> > +				for (int w = param.width;
> > +				     w < param.width + config->width_steps;
> > +				     w += config->width_increment) {
> > +					snprintf(testname, sizeof(testname),
> > +						 "%s-%s-compfmt%d-%s%s-%dx%d",
> > +						 blt_tiling_name(tiling),
> > +						 config->compression ?
> > +							 "compressed" : "uncompressed",
> > +						 param.compression_format, regtxt,
> > +						 copyfns[copy_function].suffix,
> > +						 w, w);
> > +					igt_dynamic(testname)
> > +						single_copy(xe, config, region1, region2,
> > +							    w, w, tiling, copy_function);
> > +				}
> > -				copyfns[copy_function].copyfn(xe, ctx,
> > -							      region1, region2,
> > -							      tiling, config);
> > -
> > -				xe_exec_queue_destroy(xe, exec_queue);
> > -				xe_vm_destroy(xe, vm);
> > -				syncobj_destroy(xe, sync_bind);
> > -				syncobj_destroy(xe, sync_out);
> > -				free(ctx);
> >   			}
> >   			free(regtxt);
> > @@ -669,6 +728,16 @@ igt_main_args("bf:pst:W:H:", NULL, help_str, opt_handler, NULL)
> >   		block_copy_test(xe, &config, set, BLOCK_COPY);
> >   	}
> > +	igt_describe("Check block-copy uncompressed blit with increment width/height");
> > +	igt_subtest_with_dynamic("block-copy-uncompressed-inc-dimension") {
> > +		struct test_config config = { .width_increment = 15,
> > +					      .width_steps = 512 };
> > +		param.width = 1;
> > +		param.height = 1;
> > +
> > +		block_copy_test(xe, &config, set, BLOCK_COPY);
> > +	}
> > +
> >   	igt_describe("Check block-copy flatccs compressed blit");
> >   	igt_subtest_with_dynamic("block-copy-compressed") {
> >   		struct test_config config = { .compression = true };
> > @@ -676,6 +745,17 @@ igt_main_args("bf:pst:W:H:", NULL, help_str, opt_handler, NULL)
> >   		block_copy_test(xe, &config, set, BLOCK_COPY);
> >   	}
> > +	igt_describe("Check block-copy compressed blit with increment width/height");
> > +	igt_subtest_with_dynamic("block-copy-compressed-inc-dimension") {
> > +		struct test_config config = { .compression = true,
> > +					      .width_increment = 15,
> > +					      .width_steps = 512 };
> > +		param.width = 1;
> > +		param.height = 1;
> > +
> > +		block_copy_test(xe, &config, set, BLOCK_COPY);
> > +	}
> > +
> >   	igt_describe("Check block-multicopy flatccs compressed blit");
> >   	igt_subtest_with_dynamic("block-multicopy-compressed") {
> >   		struct test_config config = { .compression = true };


More information about the igt-dev mailing list