diff options
author | Zbigniew Kempczyński <zbigniew.kempczynski@intel.com> | 2021-07-06 06:14:38 +0200 |
---|---|---|
committer | Zbigniew Kempczyński <zbigniew.kempczynski@intel.com> | 2021-08-10 21:02:50 +0200 |
commit | 662e9ff194b2e8872328183f4ac473e37e915644 (patch) | |
tree | 0b8fc8452c6a9e9f76863acd0ef6b8b3f45090cc /lib/intel_batchbuffer.c | |
parent | abfbde8d8aee278b372ddb9eb6287f964df0838c (diff) |
lib/intel_batchbuffer: Add allocator support in blitter src copy
Adjust igt_fb library + prime_vgem test as they are blitter src copy
users.
Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Cc: Petri Latvala <petri.latvala@intel.com>
Cc: Ashutosh Dixit <ashutosh.dixit@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Diffstat (limited to 'lib/intel_batchbuffer.c')
-rw-r--r-- | lib/intel_batchbuffer.c | 53 |
1 files changed, 40 insertions, 13 deletions
diff --git a/lib/intel_batchbuffer.c b/lib/intel_batchbuffer.c index d9cc4d89..008dc78e 100644 --- a/lib/intel_batchbuffer.c +++ b/lib/intel_batchbuffer.c @@ -762,12 +762,15 @@ static uint32_t src_copy_dword1(uint32_t dst_pitch, uint32_t bpp) /** * igt_blitter_src_copy: * @fd: file descriptor of the i915 driver + * @ahnd: handle to an allocator + * @ctx: context within which execute copy blit * @src_handle: GEM handle of the source buffer * @src_delta: offset into the source GEM bo, in bytes * @src_stride: Stride (in bytes) of the source buffer * @src_tiling: Tiling mode of the source buffer * @src_x: X coordinate of the source region to copy * @src_y: Y coordinate of the source region to copy + * @src_size: size of the src bo required for allocator and softpin * @width: Width of the region to copy * @height: Height of the region to copy * @bpp: source and destination bits per pixel @@ -777,16 +780,20 @@ static uint32_t src_copy_dword1(uint32_t dst_pitch, uint32_t bpp) * @dst_tiling: Tiling mode of the destination buffer * @dst_x: X coordinate of destination * @dst_y: Y coordinate of destination + * @dst_size: size of the dst bo required for allocator and softpin * * Copy @src into @dst using the XY_SRC blit command. */ void igt_blitter_src_copy(int fd, + uint64_t ahnd, + uint32_t ctx, /* src */ uint32_t src_handle, uint32_t src_delta, uint32_t src_stride, uint32_t src_tiling, uint32_t src_x, uint32_t src_y, + uint64_t src_size, /* size */ uint32_t width, uint32_t height, @@ -799,7 +806,8 @@ void igt_blitter_src_copy(int fd, uint32_t dst_delta, uint32_t dst_stride, uint32_t dst_tiling, - uint32_t dst_x, uint32_t dst_y) + uint32_t dst_x, uint32_t dst_y, + uint64_t dst_size) { uint32_t batch[32]; struct drm_i915_gem_exec_object2 objs[3]; @@ -808,9 +816,21 @@ void igt_blitter_src_copy(int fd, uint32_t src_pitch, dst_pitch; uint32_t dst_reloc_offset, src_reloc_offset; uint32_t gen = intel_gen(intel_get_drm_devid(fd)); + uint64_t batch_offset, src_offset, dst_offset; const bool has_64b_reloc = gen >= 8; int i = 0; + batch_handle = gem_create(fd, 4096); + if (ahnd) { + src_offset = get_offset(ahnd, src_handle, src_size, 0); + dst_offset = get_offset(ahnd, dst_handle, dst_size, 0); + batch_offset = get_offset(ahnd, batch_handle, 4096, 0); + } else { + src_offset = 16 << 20; + dst_offset = ALIGN(src_offset + src_size, 1 << 20); + batch_offset = ALIGN(dst_offset + dst_size, 1 << 20); + } + memset(batch, 0, sizeof(batch)); igt_assert((src_tiling == I915_TILING_NONE) || @@ -855,15 +875,15 @@ void igt_blitter_src_copy(int fd, batch[i++] = (dst_y << 16) | dst_x; /* dst x1,y1 */ batch[i++] = ((dst_y + height) << 16) | (dst_x + width); /* dst x2,y2 */ dst_reloc_offset = i; - batch[i++] = dst_delta; /* dst address lower bits */ + batch[i++] = dst_offset + dst_delta; /* dst address lower bits */ if (has_64b_reloc) - batch[i++] = 0; /* dst address upper bits */ + batch[i++] = (dst_offset + dst_delta) >> 32; /* dst address upper bits */ batch[i++] = (src_y << 16) | src_x; /* src x1,y1 */ batch[i++] = src_pitch; src_reloc_offset = i; - batch[i++] = src_delta; /* src address lower bits */ + batch[i++] = src_offset + src_delta; /* src address lower bits */ if (has_64b_reloc) - batch[i++] = 0; /* src address upper bits */ + batch[i++] = (src_offset + src_delta) >> 32; /* src address upper bits */ if ((src_tiling | dst_tiling) >= I915_TILING_Y) { igt_assert(gen >= 6); @@ -882,22 +902,29 @@ void igt_blitter_src_copy(int fd, igt_assert(i <= ARRAY_SIZE(batch)); - batch_handle = gem_create(fd, 4096); gem_write(fd, batch_handle, 0, batch, sizeof(batch)); - fill_relocation(&relocs[0], dst_handle, -1, dst_delta, dst_reloc_offset, + fill_relocation(&relocs[0], dst_handle, dst_offset, + dst_delta, dst_reloc_offset, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER); - fill_relocation(&relocs[1], src_handle, -1, src_delta, src_reloc_offset, + fill_relocation(&relocs[1], src_handle, src_offset, + src_delta, src_reloc_offset, I915_GEM_DOMAIN_RENDER, 0); - fill_object(&objs[0], dst_handle, 0, NULL, 0); - fill_object(&objs[1], src_handle, 0, NULL, 0); - fill_object(&objs[2], batch_handle, 0, relocs, 2); + fill_object(&objs[0], dst_handle, dst_offset, NULL, 0); + fill_object(&objs[1], src_handle, src_offset, NULL, 0); + fill_object(&objs[2], batch_handle, batch_offset, relocs, !ahnd ? 2 : 0); - objs[0].flags |= EXEC_OBJECT_NEEDS_FENCE; + objs[0].flags |= EXEC_OBJECT_NEEDS_FENCE | EXEC_OBJECT_WRITE; objs[1].flags |= EXEC_OBJECT_NEEDS_FENCE; - exec_blit(fd, objs, 3, gen, 0); + if (ahnd) { + objs[0].flags |= EXEC_OBJECT_PINNED | EXEC_OBJECT_SUPPORTS_48B_ADDRESS; + objs[1].flags |= EXEC_OBJECT_PINNED | EXEC_OBJECT_SUPPORTS_48B_ADDRESS; + objs[2].flags |= EXEC_OBJECT_PINNED | EXEC_OBJECT_SUPPORTS_48B_ADDRESS; + } + + exec_blit(fd, objs, 3, gen, ctx); gem_close(fd, batch_handle); } |