[PATCH i-g-t 2/2] test/prime_vgem: Make blitter access work on Gen < 9

Janusz Krzysztofik janusz.krzysztofik at linux.intel.com
Tue Jan 14 17:29:50 UTC 2020


As fast copy is not supported on platforms older than Gen 9, use
XY_SRC_COPY instead.  As there is no respective library helper
available, implement a simple local one.

Suggested-by: Chris Wilson <chris at chris-wilson.co.uk>
Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik at linux.intel.com>
Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
---
 tests/prime_vgem.c | 138 ++++++++++++++++++++++++++++++++++-----------
 1 file changed, 104 insertions(+), 34 deletions(-)

diff --git a/tests/prime_vgem.c b/tests/prime_vgem.c
index b199df29..9a26c683 100644
--- a/tests/prime_vgem.c
+++ b/tests/prime_vgem.c
@@ -172,6 +172,88 @@ static void test_fence_mmap(int i915, int vgem)
 	close(slave[1]);
 }
 
+/*
+ * FIXME: Temporary drop-in replacement of igt_blitter_fast_copy__raw(),
+ * based on XY_SRC_COPY_BLT instead of XY_FAST_COPY_BLT so Gen < 9 is also
+ * supported.  Switch to an equivalent library helper as soon as available.
+ */
+static void local_igt_blitter_copy(int fd, uint32_t src_handle,
+				   unsigned int src_delta,
+				   unsigned int src_stride,
+				   unsigned int src_tiling,
+				   unsigned int src_x, unsigned int src_y,
+				   unsigned int width, unsigned int height,
+				   unsigned int bpp, uint32_t dst_handle,
+				   unsigned int dst_delta,
+				   unsigned int dst_stride,
+				   unsigned int dst_tiling,
+				   unsigned int dst_x, unsigned dst_y)
+{
+	uint32_t batch[12];
+	struct drm_i915_gem_relocation_entry reloc[2];
+	struct drm_i915_gem_exec_object2 obj[3];
+	struct drm_i915_gem_execbuffer2 exec;
+	uint32_t devid = intel_get_drm_devid(fd);
+	unsigned int gen = intel_gen(devid);
+	int i = 0;
+
+	igt_assert(src_delta == 0);
+	igt_assert(dst_delta == 0);
+	igt_assert(src_tiling == I915_TILING_NONE);
+	igt_assert(dst_tiling == I915_TILING_NONE);
+	igt_assert(bpp == 32);
+
+	batch[i++] = XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA |
+		     XY_SRC_COPY_BLT_WRITE_RGB | (gen >= 8 ? 8 : 6);
+	batch[i++] = (3 << 24) | (0xcc << 16) | dst_stride;
+	batch[i++] = (dst_y << 16) | dst_x;
+	batch[i++] = ((dst_y + height) << 16) | (dst_x + width);
+
+	reloc[0].target_handle = dst_handle;
+	reloc[0].delta = 0;
+	reloc[0].offset = i * sizeof(batch[0]);
+	reloc[0].presumed_offset = 0;
+	reloc[0].read_domains = I915_GEM_DOMAIN_RENDER;
+	reloc[0].write_domain = I915_GEM_DOMAIN_RENDER;
+
+	batch[i++] = 0;
+	if (gen >= 8)
+		batch[i++] = 0;
+	batch[i++] = (src_y << 16) | src_x;
+	batch[i++] = src_stride;
+
+	reloc[1].target_handle = src_handle;
+	reloc[1].delta = 0;
+	reloc[1].offset = i * sizeof(batch[0]);
+	reloc[1].presumed_offset = 0;
+	reloc[1].read_domains = I915_GEM_DOMAIN_RENDER;
+	reloc[1].write_domain = 0;
+
+	batch[i++] = 0;
+	if (gen >= 8)
+		batch[i++] = 0;
+	batch[i++] = MI_BATCH_BUFFER_END;
+	batch[i++] = MI_NOOP;
+
+	memset(obj, 0, sizeof(obj));
+	obj[0].handle = dst_handle;
+	obj[1].handle = src_handle;
+	obj[2].handle = gem_create(fd, 4096);
+	obj[2].relocation_count = 2;
+	obj[2].relocs_ptr = to_user_pointer(reloc);
+
+	gem_write(fd, obj[2].handle, 0, batch, i * sizeof(batch[0]));
+
+	memset(&exec, 0, sizeof(exec));
+	exec.buffers_ptr = to_user_pointer(obj);
+	exec.buffer_count = 3;
+	exec.batch_len = i * sizeof(batch[0]);
+	exec.flags = HAS_BLT_RING(devid) ? I915_EXEC_BLT : 0;
+
+	gem_execbuf(fd, &exec);
+	gem_close(fd, obj[2].handle);
+}
+
 static void test_fence_blt(int i915, int vgem)
 {
 	struct vgem_bo scratch;
@@ -209,11 +291,10 @@ static void test_fence_blt(int i915, int vgem)
 		read(slave[0], &child, sizeof(child));
 
 		prime_sync_start(dmabuf, false);
-		igt_blitter_fast_copy__raw(i915, prime, 0, scratch.pitch,
-					   I915_TILING_NONE, 0, 0,
-					   scratch.width, scratch.height,
-					   scratch.bpp, native, 0, scratch.pitch,
-					   I915_TILING_NONE, 0, 0);
+		local_igt_blitter_copy(i915, prime, 0, scratch.pitch,
+				       I915_TILING_NONE, 0, 0, scratch.width,
+				       scratch.height, scratch.bpp, native, 0,
+				       scratch.pitch, I915_TILING_NONE, 0, 0);
 		prime_sync_end(dmabuf, false);
 
 		for (i = 0; i < scratch.height; i++)
@@ -335,11 +416,9 @@ static void test_blt(int vgem, int i915)
 		ptr[scratch.pitch * i / sizeof(*ptr)] = i;
 	munmap(ptr, scratch.size);
 
-	igt_blitter_fast_copy__raw(i915, native, 0, scratch.pitch,
-				   I915_TILING_NONE, 0, 0,
-				   scratch.width, scratch.height, scratch.bpp,
-				   prime, 0, scratch.pitch,
-				   I915_TILING_NONE, 0, 0);
+	local_igt_blitter_copy(i915, native, 0, scratch.pitch, I915_TILING_NONE,
+			       0, 0, scratch.width, scratch.height, scratch.bpp,
+			       prime, 0, scratch.pitch, I915_TILING_NONE, 0, 0);
 
 	ptr = vgem_mmap(vgem, &scratch, PROT_READ | PROT_WRITE);
 	for (i = 0; i < scratch.height; i++) {
@@ -348,11 +427,10 @@ static void test_blt(int vgem, int i915)
 	}
 	munmap(ptr, scratch.size);
 
-	igt_blitter_fast_copy__raw(i915, prime, 0, scratch.pitch,
-				   I915_TILING_NONE, 0, 0,
-				   scratch.width, scratch.height, scratch.bpp,
-				   native, 0, scratch.pitch,
-				   I915_TILING_NONE, 0, 0);
+	local_igt_blitter_copy(i915, prime, 0, scratch.pitch, I915_TILING_NONE,
+			       0, 0, scratch.width, scratch.height, scratch.bpp,
+			       native, 0, scratch.pitch, I915_TILING_NONE, 0,
+			       0);
 
 	ptr = gem_mmap__wc(i915, native, 0, scratch.size, PROT_READ);
 	for (i = 0; i < scratch.height; i++)
@@ -470,20 +548,18 @@ static void test_blt_interleaved(int vgem, int i915)
 
 	for (i = 0; i < scratch.height; i++) {
 		local[scratch.pitch * i / sizeof(*local)] = i;
-		igt_blitter_fast_copy__raw(i915, native, 0, scratch.pitch,
-					   I915_TILING_NONE, 0, i,
-					   scratch.width, 1, scratch.bpp,
-					   prime, 0, scratch.pitch,
-					   I915_TILING_NONE, 0, i);
+		local_igt_blitter_copy(i915, native, 0, scratch.pitch,
+				       I915_TILING_NONE, 0, i, scratch.width, 1,
+				       scratch.bpp, prime, 0, scratch.pitch,
+				       I915_TILING_NONE, 0, i);
 		igt_assert_eq_u32(foreign[scratch.pitch * i / sizeof(*foreign)],
 				  i);
 
 		foreign[scratch.pitch * i / sizeof(*foreign)] = ~i;
-		igt_blitter_fast_copy__raw(i915, prime, 0, scratch.pitch,
-					   I915_TILING_NONE, 0, i,
-					   scratch.width, 1, scratch.bpp,
-					   native, 0, scratch.pitch,
-					   I915_TILING_NONE, 0, i);
+		local_igt_blitter_copy(i915, prime, 0, scratch.pitch,
+				       I915_TILING_NONE, 0, i, scratch.width, 1,
+				       scratch.bpp, native, 0, scratch.pitch,
+				       I915_TILING_NONE, 0, i);
 		igt_assert_eq_u32(local[scratch.pitch * i / sizeof(*local)],
 				  ~i);
 	}
@@ -1012,10 +1088,8 @@ igt_main
 		test_gtt(vgem, i915);
 
 	igt_describe("Examine blitter access path");
-	igt_subtest("basic-blt") {
-		igt_require(intel_gen(intel_get_drm_devid(i915)) >= 9);
+	igt_subtest("basic-blt")
 		test_blt(vgem, i915);
-	}
 
 	igt_subtest("shrink")
 		test_shrink(vgem, i915);
@@ -1024,10 +1098,8 @@ igt_main
 		test_gtt_interleaved(vgem, i915);
 
 	igt_describe("Examine blitter access path WC coherency");
-	igt_subtest("coherency-blt") {
-		igt_require(intel_gen(intel_get_drm_devid(i915)) >= 9);
+	igt_subtest("coherency-blt")
 		test_blt_interleaved(vgem, i915);
-	}
 
 	for (e = intel_execution_engines; e->name; e++) {
 		igt_subtest_f("%ssync-%s",
@@ -1076,10 +1148,8 @@ igt_main
 		igt_subtest("basic-fence-mmap")
 			test_fence_mmap(i915, vgem);
 		igt_describe("Examine blitter access path fencing");
-		igt_subtest("basic-fence-blt") {
-			igt_require(intel_gen(intel_get_drm_devid(i915)) >= 9);
+		igt_subtest("basic-fence-blt")
 			test_fence_blt(i915, vgem);
-		}
 
 		for (e = intel_execution_engines; e->name; e++) {
 			igt_subtest_f("%sfence-wait-%s",
-- 
2.21.0



More information about the Intel-gfx-trybot mailing list