[igt-dev] [PATCH i-g-t] test/i915/gem_linear_blits: Added COPY Commands modification for MTL
Vikas Srivastava
vikas.srivastava at intel.com
Mon Oct 31 18:17:46 UTC 2022
Test case uses legacy command which is not supported on MTL.
Modified test to use XY_FAST_COPY_BLT.
Signed-off-by: Arjun Melkaveri <arjun.melkaveri at intel.com>
Acked-by: Janga Rahul Kumar <janga.rahul.kumar at intel.com>
---
tests/i915/gem_close_race.c | 95 ++++++++++++++++--------
tests/i915/gem_linear_blits.c | 64 ++++++++++------
tests/i915/gem_userptr_blits.c | 131 +++++++++++++++++++++------------
3 files changed, 190 insertions(+), 100 deletions(-)
diff --git a/tests/i915/gem_close_race.c b/tests/i915/gem_close_race.c
index e37a88828..2a939c94c 100644
--- a/tests/i915/gem_close_race.c
+++ b/tests/i915/gem_close_race.c
@@ -70,40 +70,73 @@ static void selfcopy(int fd, uint32_t ctx, uint32_t handle, int loops)
struct drm_i915_gem_create create;
uint32_t buf[16], *b = buf;
int err;
+ uint32_t src_x1 = 0;
memset(reloc, 0, sizeof(reloc));
- *b = COPY_BLT_CMD | BLT_WRITE_ALPHA | BLT_WRITE_RGB;
- if (has_64bit_relocations)
- *b += 2;
- b++;
- *b++ = 0xcc << 16 | 1 << 25 | 1 << 24 | (4*1024);
- *b++ = 0;
- *b++ = 1 << 16 | 1024;
-
- reloc[0].offset = (b - buf) * sizeof(*b);
- reloc[0].target_handle = handle;
- reloc[0].read_domains = I915_GEM_DOMAIN_RENDER;
- reloc[0].write_domain = I915_GEM_DOMAIN_RENDER;
- reloc[0].presumed_offset = data_addr;
- *b++ = data_addr;
- if (has_64bit_relocations)
- *b++ = CANONICAL(data_addr) >> 32;
-
- *b++ = 512 << 16;
- *b++ = 4*1024;
-
- reloc[1].offset = (b - buf) * sizeof(*b);
- reloc[1].target_handle = handle;
- reloc[1].read_domains = I915_GEM_DOMAIN_RENDER;
- reloc[1].write_domain = 0;
- reloc[1].presumed_offset = data_addr;
- *b++ = data_addr;
- if (has_64bit_relocations)
- *b++ = CANONICAL(data_addr) >> 32;
-
- *b++ = MI_BATCH_BUFFER_END;
- *b++ = 0;
+ if (intel_graphics_ver(devid) >= IP_VER(12, 60)) {
+ *b++ = XY_FAST_COPY_BLT;
+ *b = XY_FAST_COPY_COLOR_DEPTH_32;
+ if (intel_graphics_ver(devid) >= IP_VER(20, 0))
+ *b = XY_FAST_COPY_SRC_TILING_Yf |
+ XY_FAST_COPY_DST_TILING_Yf;
+ b++;
+ *b++ = 0;
+ *b++ = 1 << 16 | 1024;/* dst X2 , y2 */
+
+ reloc[0].offset = (b - buf) * sizeof(*b);
+ reloc[0].target_handle = handle;
+ reloc[0].read_domains = I915_GEM_DOMAIN_RENDER;
+ reloc[0].write_domain = I915_GEM_DOMAIN_RENDER;
+
+ *b++ = 0;/* dst address lower bits */
+ *b++ = 0;/* dst address upper bits */
+
+ *b++ = 512 << 16 | src_x1;/* src x1,y1 */
+ *b++ = 4*1024;/* src pitch */
+
+ reloc[1].offset = (b - buf) * sizeof(*b);
+ reloc[1].target_handle = handle;
+ reloc[1].read_domains = I915_GEM_DOMAIN_RENDER;
+ reloc[1].write_domain = 0;
+
+ *b++ = 0;// src address lower bits
+ *b++ = 0;// src address upper bits
+ *b++ = MI_BATCH_BUFFER_END;
+ *b++ = MI_NOOP;
+ } else {
+ *b = COPY_BLT_CMD | BLT_WRITE_ALPHA | BLT_WRITE_RGB;
+ if (has_64bit_relocations)
+ *b += 2;
+ b++;
+ *b++ = 0xcc << 16 | 1 << 25 | 1 << 24 | (4*1024);
+ *b++ = 0;
+ *b++ = 1 << 16 | 1024;
+
+ reloc[0].offset = (b - buf) * sizeof(*b);
+ reloc[0].target_handle = handle;
+ reloc[0].read_domains = I915_GEM_DOMAIN_RENDER;
+ reloc[0].write_domain = I915_GEM_DOMAIN_RENDER;
+ reloc[0].presumed_offset = data_addr;
+ *b++ = data_addr;
+ if (has_64bit_relocations)
+ *b++ = CANONICAL(data_addr) >> 32;
+
+ *b++ = 512 << 16;
+ *b++ = 4*1024;
+
+ reloc[1].offset = (b - buf) * sizeof(*b);
+ reloc[1].target_handle = handle;
+ reloc[1].read_domains = I915_GEM_DOMAIN_RENDER;
+ reloc[1].write_domain = 0;
+ reloc[1].presumed_offset = data_addr;
+ *b++ = data_addr;
+ if (has_64bit_relocations)
+ *b++ = CANONICAL(data_addr) >> 32;
+
+ *b++ = MI_BATCH_BUFFER_END;
+ *b++ = 0;
+ }
memset(gem_exec, 0, sizeof(gem_exec));
gem_exec[0].handle = handle;
diff --git a/tests/i915/gem_linear_blits.c b/tests/i915/gem_linear_blits.c
index d02751be9..ae9971ca7 100644
--- a/tests/i915/gem_linear_blits.c
+++ b/tests/i915/gem_linear_blits.c
@@ -67,6 +67,7 @@ static void copy(int fd, uint64_t ahnd, uint32_t dst, uint32_t src,
struct drm_i915_gem_relocation_entry reloc[2];
struct drm_i915_gem_exec_object2 obj[3];
struct drm_i915_gem_execbuffer2 exec;
+ static uint32_t devid;
int i = 0;
memset(obj, 0, sizeof(obj));
@@ -83,29 +84,46 @@ static void copy(int fd, uint64_t ahnd, uint32_t dst, uint32_t src,
obj[2].offset = CANONICAL(obj[2].offset);
obj[2].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
- batch[i++] = XY_SRC_COPY_BLT_CMD |
- XY_SRC_COPY_BLT_WRITE_ALPHA |
- XY_SRC_COPY_BLT_WRITE_RGB;
- if (intel_gen(intel_get_drm_devid(fd)) >= 8)
- batch[i - 1] |= 8;
- else
- batch[i - 1] |= 6;
-
- batch[i++] = (3 << 24) | /* 32 bits */
- (0xcc << 16) | /* copy ROP */
- WIDTH*4;
- batch[i++] = 0; /* dst x1,y1 */
- batch[i++] = (HEIGHT << 16) | WIDTH; /* dst x2,y2 */
- batch[i++] = obj[0].offset;
- if (intel_gen(intel_get_drm_devid(fd)) >= 8)
- batch[i++] = obj[0].offset >> 32;
- batch[i++] = 0; /* src x1,y1 */
- batch[i++] = WIDTH*4;
- batch[i++] = obj[1].offset;
- if (intel_gen(intel_get_drm_devid(fd)) >= 8)
- batch[i++] = obj[1].offset >> 32;
- batch[i++] = MI_BATCH_BUFFER_END;
- batch[i++] = MI_NOOP;
+ devid = intel_get_drm_devid(fd);
+
+ if (intel_graphics_ver(devid) >= IP_VER(12, 60)) {
+ batch[i++] = XY_FAST_COPY_BLT;
+ batch[i++] = XY_FAST_COPY_COLOR_DEPTH_32 | WIDTH*4;
+ batch[i++] = 0;/* dst x1,y1 */
+ batch[i++] = (HEIGHT << 16) | WIDTH;/* dst x2,y2 */
+ batch[i++] = obj[0].offset; /* dst address lower bits */
+ batch[i++] = obj[0].offset >> 32; /* dst address upper bits */
+ batch[i++] = 0;/* src x1,y1 */
+ batch[i++] = WIDTH*4;/* src pitch */
+ batch[i++] = obj[1].offset; /* src address lower bits */
+ batch[i++] = obj[1].offset >> 32; /* src address upper bits */
+ batch[i++] = MI_BATCH_BUFFER_END;
+ batch[i++] = MI_NOOP;
+ } else {
+ batch[i++] = XY_SRC_COPY_BLT_CMD |
+ XY_SRC_COPY_BLT_WRITE_ALPHA |
+ XY_SRC_COPY_BLT_WRITE_RGB;
+ if (intel_gen(intel_get_drm_devid(fd)) >= 8)
+ batch[i - 1] |= 8;
+ else
+ batch[i - 1] |= 6;
+
+ batch[i++] = (3 << 24) | /* 32 bits */
+ (0xcc << 16) | /* copy ROP */
+ WIDTH*4;
+ batch[i++] = 0; /* dst x1,y1 */
+ batch[i++] = (HEIGHT << 16) | WIDTH; /* dst x2,y2 */
+ batch[i++] = obj[0].offset;
+ if (intel_gen(intel_get_drm_devid(fd)) >= 8)
+ batch[i++] = obj[0].offset >> 32;
+ batch[i++] = 0; /* src x1,y1 */
+ batch[i++] = WIDTH*4;
+ batch[i++] = obj[1].offset;
+ if (intel_gen(intel_get_drm_devid(fd)) >= 8)
+ batch[i++] = obj[1].offset >> 32;
+ batch[i++] = MI_BATCH_BUFFER_END;
+ batch[i++] = MI_NOOP;
+ }
gem_write(fd, obj[2].handle, 0, batch, i * sizeof(batch[0]));
diff --git a/tests/i915/gem_userptr_blits.c b/tests/i915/gem_userptr_blits.c
index 698508669..cc26cf125 100644
--- a/tests/i915/gem_userptr_blits.c
+++ b/tests/i915/gem_userptr_blits.c
@@ -100,6 +100,7 @@ static int copy(int fd, uint32_t dst, uint32_t src)
struct drm_i915_gem_exec_object2 obj[3];
struct drm_i915_gem_execbuffer2 exec;
uint32_t handle;
+ static uint32_t devid;
int ret, i=0;
uint64_t dst_offset, src_offset, bb_offset;
bool has_relocs = gem_has_relocations(fd);
@@ -108,29 +109,47 @@ static int copy(int fd, uint32_t dst, uint32_t src)
dst_offset = bb_offset + 4096;
src_offset = dst_offset + WIDTH * HEIGHT * sizeof(uint32_t) * (src != dst);
- batch[i++] = XY_SRC_COPY_BLT_CMD |
- XY_SRC_COPY_BLT_WRITE_ALPHA |
- XY_SRC_COPY_BLT_WRITE_RGB;
- if (intel_gen(intel_get_drm_devid(fd)) >= 8)
- batch[i - 1] |= 8;
- else
- batch[i - 1] |= 6;
-
- batch[i++] = (3 << 24) | /* 32 bits */
- (0xcc << 16) | /* copy ROP */
- WIDTH*4;
- batch[i++] = 0; /* dst x1,y1 */
- batch[i++] = (HEIGHT << 16) | WIDTH; /* dst x2,y2 */
- batch[i++] = dst_offset; /* dst reloc */
- if (intel_gen(intel_get_drm_devid(fd)) >= 8)
- batch[i++] = dst_offset >> 32;
- batch[i++] = 0; /* src x1,y1 */
- batch[i++] = WIDTH*4;
- batch[i++] = src_offset; /* src reloc */
- if (intel_gen(intel_get_drm_devid(fd)) >= 8)
- batch[i++] = src_offset >> 32;
- batch[i++] = MI_BATCH_BUFFER_END;
- batch[i++] = MI_NOOP;
+ devid = intel_get_drm_devid(fd);
+
+ if (intel_graphics_ver(devid) >= IP_VER(12, 60)) {
+ batch[i++] = XY_FAST_COPY_BLT;
+ batch[i++] = XY_FAST_COPY_COLOR_DEPTH_32 | WIDTH*4;
+ batch[i++] = 0;/* dst x1,y1 */
+ batch[i++] = (HEIGHT << 16) | WIDTH;/* dst x2,y2 */
+ batch[i++] = 0;/* dst address lower bits */
+ batch[i++] = 0;/* dst address upper bits */
+ batch[i++] = 0;/* src x1,y1 */
+ batch[i++] = WIDTH*4;/* src pitch */
+ batch[i++] = 0;// src address lower bits
+ batch[i++] = 0;// src address upper bits
+ batch[i++] = MI_BATCH_BUFFER_END;
+ batch[i++] = MI_NOOP;
+ } else {
+ batch[i++] = XY_SRC_COPY_BLT_CMD |
+ XY_SRC_COPY_BLT_WRITE_ALPHA |
+ XY_SRC_COPY_BLT_WRITE_RGB;
+
+ if (intel_gen(intel_get_drm_devid(fd)) >= 8)
+ batch[i - 1] |= 8;
+ else
+ batch[i - 1] |= 6;
+
+ batch[i++] = (3 << 24) | /* 32 bits */
+ (0xcc << 16) | /* copy ROP */
+ WIDTH*4;
+ batch[i++] = 0; /* dst x1,y1 */
+ batch[i++] = (HEIGHT << 16) | WIDTH; /* dst x2,y2 */
+ batch[i++] = dst_offset; /* dst reloc */
+ if (intel_gen(intel_get_drm_devid(fd)) >= 8)
+ batch[i++] = dst_offset >> 32;
+ batch[i++] = 0; /* src x1,y1 */
+ batch[i++] = WIDTH*4;
+ batch[i++] = src_offset; /* src reloc */
+ if (intel_gen(intel_get_drm_devid(fd)) >= 8)
+ batch[i++] = src_offset >> 32;
+ batch[i++] = MI_BATCH_BUFFER_END;
+ batch[i++] = MI_NOOP;
+ }
handle = gem_create(fd, 4096);
gem_write(fd, handle, 0, batch, sizeof(batch));
@@ -206,29 +225,49 @@ blit(int fd, uint32_t dst, uint32_t src, uint32_t *all_bo, int n_bo)
struct drm_i915_gem_execbuffer2 exec;
uint32_t handle;
int n, ret, i=0;
-
- batch[i++] = XY_SRC_COPY_BLT_CMD |
- XY_SRC_COPY_BLT_WRITE_ALPHA |
- XY_SRC_COPY_BLT_WRITE_RGB;
- if (intel_gen(intel_get_drm_devid(fd)) >= 8)
- batch[i - 1] |= 8;
- else
- batch[i - 1] |= 6;
- batch[i++] = (3 << 24) | /* 32 bits */
- (0xcc << 16) | /* copy ROP */
- WIDTH*4;
- batch[i++] = 0; /* dst x1,y1 */
- batch[i++] = (HEIGHT << 16) | WIDTH; /* dst x2,y2 */
- batch[i++] = 0; /* dst reloc */
- if (intel_gen(intel_get_drm_devid(fd)) >= 8)
- batch[i++] = 0;
- batch[i++] = 0; /* src x1,y1 */
- batch[i++] = WIDTH*4;
- batch[i++] = 0; /* src reloc */
- if (intel_gen(intel_get_drm_devid(fd)) >= 8)
- batch[i++] = 0;
- batch[i++] = MI_BATCH_BUFFER_END;
- batch[i++] = MI_NOOP;
+ static uint32_t devid;
+
+ devid = intel_get_drm_devid(fd);
+
+ if (intel_graphics_ver(devid) >= IP_VER(12, 60)) {
+ batch[i++] = XY_FAST_COPY_BLT;
+ batch[i++] = XY_FAST_COPY_COLOR_DEPTH_32 | WIDTH*4;
+ batch[i++] = 0;/* dst x1,y1 */
+ batch[i++] = (HEIGHT << 16) | WIDTH;/* dst x2,y2 */
+ batch[i++] = 0;/* dst address lower bits */
+ batch[i++] = 0;/* dst address upper bits */
+ batch[i++] = 0;/* src x1,y1 */
+ batch[i++] = WIDTH*4;/* src pitch */
+ batch[i++] = 0;// src address lower bits
+ batch[i++] = 0;// src address upper bits
+ batch[i++] = MI_BATCH_BUFFER_END;
+ batch[i++] = MI_NOOP;
+ } else {
+ batch[i++] = XY_SRC_COPY_BLT_CMD |
+ XY_SRC_COPY_BLT_WRITE_ALPHA |
+ XY_SRC_COPY_BLT_WRITE_RGB;
+
+ if (intel_gen(intel_get_drm_devid(fd)) >= 8)
+ batch[i - 1] |= 8;
+ else
+ batch[i - 1] |= 6;
+
+ batch[i++] = (3 << 24) | /* 32 bits */
+ (0xcc << 16) | /* copy ROP */
+ WIDTH*4;
+ batch[i++] = 0; /* dst x1,y1 */
+ batch[i++] = (HEIGHT << 16) | WIDTH; /* dst x2,y2 */
+ batch[i++] = dst_offset; /* dst reloc */
+ if (intel_gen(intel_get_drm_devid(fd)) >= 8)
+ batch[i++] = dst_offset >> 32;
+ batch[i++] = 0; /* src x1,y1 */
+ batch[i++] = WIDTH*4;
+ batch[i++] = src_offset; /* src reloc */
+ if (intel_gen(intel_get_drm_devid(fd)) >= 8)
+ batch[i++] = src_offset >> 32;
+ batch[i++] = MI_BATCH_BUFFER_END;
+ batch[i++] = MI_NOOP;
+ }
handle = gem_create(fd, 4096);
gem_write(fd, handle, 0, batch, sizeof(batch));
--
2.25.1
More information about the igt-dev
mailing list