[PATCH i-g-t v3 10/11] tests/xe_copy_basic: add mem-copy matrix subtests

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Fri May 23 08:01:25 UTC 2025


Verify intel_blt is able to properly copy matrix from one buffer
to another.

Cc: Francois Dugast <francois.dugast at intel.com>
Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
---
 tests/intel/xe_copy_basic.c | 52 +++++++++++++++++++++++++++++++++----
 1 file changed, 47 insertions(+), 5 deletions(-)

diff --git a/tests/intel/xe_copy_basic.c b/tests/intel/xe_copy_basic.c
index 404fe7f50a..be400e3175 100644
--- a/tests/intel/xe_copy_basic.c
+++ b/tests/intel/xe_copy_basic.c
@@ -62,6 +62,19 @@ struct rect {
  * @17: 17
  */
 
+/**
+ *
+ * SUBTEST: mem-matrix-copy-%s
+ * Description: Test validates MEM_COPY command, it takes various
+ *              parameters needed for the filling batch buffer for MEM_COPY command
+ *              with size %arg[1].
+ * Test category: functionality test
+ *
+ * arg[1]:
+ * @2x2: 2x2
+ * @200x127: 200x127
+ */
+
 static void
 mem_copy(int fd, uint32_t src_handle, uint32_t dst_handle, const intel_ctx_t *ctx,
 	 enum blt_memop_type type, enum blt_memop_mode mode,
@@ -79,13 +92,17 @@ mem_copy(int fd, uint32_t src_handle, uint32_t dst_handle, const intel_ctx_t *ct
 	uint8_t *psrc, *pdst;
 	int result, i;
 
+	igt_debug("size: %u, pitch: %u, width: %u, height: %u (type: %d, mode: %d)\n",
+		  size, pitch, width, height, type, mode);
+
 	bb = xe_bo_create(fd, 0, bb_size, region, 0);
 
 	blt_mem_copy_init(fd, &mem, mode, type);
-	blt_set_mem_object(&mem.src, src_handle, size, width, width, height,
+	blt_set_mem_object(&mem.src, src_handle, size, pitch, width, height,
 			   region, src_mocs, DEFAULT_PAT_INDEX, COMPRESSION_DISABLED);
-	blt_set_mem_object(&mem.dst, dst_handle, size, width, width, height,
+	blt_set_mem_object(&mem.dst, dst_handle, size, pitch, width, height,
 			   region, dst_mocs, DEFAULT_PAT_INDEX, COMPRESSION_DISABLED);
+
 	mem.src.ptr = xe_bo_map(fd, src_handle, size);
 	mem.dst.ptr = xe_bo_map(fd, dst_handle, size);
 	psrc = (uint8_t *) mem.src.ptr;
@@ -112,8 +129,20 @@ mem_copy(int fd, uint32_t src_handle, uint32_t dst_handle, const intel_ctx_t *ct
 				break;
 			}
 		}
-	} else {
+	} else if (type == TYPE_LINEAR && mode == MODE_PAGE) {
 		result = memcmp(psrc, pdst, pitch << 8);
+	} else {
+		result = 0;
+
+		for (i = 0; i < pitch * height; i++) {
+			if (i % pitch > width && pdst[i] != 0) {
+				result = -1;
+				break;
+			} else if (i % pitch < width && psrc[i] != pdst[i]) {
+				result = -1;
+				break;
+			}
+		}
 	}
 
 	intel_allocator_bind(ahnd, 0, 0);
@@ -190,8 +219,10 @@ static void copy_test(int fd, struct rect *rect, enum blt_cmd_type cmd, uint32_t
 	ctx = intel_ctx_xe(fd, vm, exec_queue, 0, 0, 0);
 
 	if (cmd == MEM_COPY)
-		mem_copy(fd, src_handle, dst_handle, ctx, TYPE_LINEAR, rect->mode,
-			 bo_size, pitch, rect->width, rect->height, region);
+		mem_copy(fd, src_handle, dst_handle, ctx,
+			 rect->height > 1 ? TYPE_MATRIX : TYPE_LINEAR,
+			 rect->mode, bo_size, pitch,
+			 rect->width, rect->height, region);
 	else if (cmd == MEM_SET)
 		mem_set(fd, dst_handle, ctx, bo_size, rect->width, 1, MEM_FILL, region);
 
@@ -214,6 +245,7 @@ igt_main
 				 { 0, 0x8fffe, 1 } };
 	struct rect page[] = { { 0, 1, 1, MODE_PAGE },
 			       { 0, 17, 1, MODE_PAGE }};
+	struct rect matrix[] = { { 4, 2, 2 }, { 256, 200, 127 } };
 
 	igt_fixture {
 		fd = drm_open_driver(DRIVER_XE);
@@ -243,6 +275,16 @@ igt_main
 		}
 	}
 
+	for (int i = 0; i < ARRAY_SIZE(matrix); i++) {
+		igt_subtest_f("mem-matrix-copy-%ux%u", matrix[i].width, matrix[i].height) {
+			igt_require(blt_has_mem_copy(fd));
+			for_each_variation_r(regions, 1, set) {
+				region = igt_collection_get_value(regions, 0);
+				copy_test(fd, &matrix[i], MEM_COPY, region);
+			}
+		}
+	}
+
 	for (int i = 0; i < ARRAY_SIZE(linear); i++) {
 		igt_subtest_f("mem-set-linear-0x%x", linear[i].width) {
 			igt_require(blt_has_mem_set(fd));
-- 
2.43.0



More information about the igt-dev mailing list