[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