@@ -317,23 +317,17 @@ igt_cork_t *igt_cork_new(int fd)
{
igt_cork_t *cork;
struct vgem_bo bo;
- int dmabuf;
cork = calloc(1, sizeof(igt_cork_t));
igt_assert(cork);
cork->device = drm_open_driver(DRIVER_VGEM);
- igt_require(vgem_has_fences(cork->device));
-
bo.width = bo.height = 1;
bo.bpp = 4;
- vgem_create(cork->device, &bo);
- cork->fence = vgem_fence_attach(cork->device, &bo, VGEM_FENCE_WRITE);
- dmabuf = prime_handle_to_fd(cork->device, bo.handle);
- cork->handle = prime_fd_to_handle(fd, dmabuf);
- close(dmabuf);
+ cork->handle = vgem_create_and_import(cork->device, &bo, fd,
+ &cork->fence);
return cork;
}
@@ -66,6 +66,41 @@ void vgem_create(int fd, struct vgem_bo *bo)
igt_assert_eq(__vgem_create(fd, bo), 0);
}
+/**
+ * vgem_create_and_import:
+ * @vgem_fd: open vgem file descriptor
+ * @bo: vgem_bo struct containing width, height and bpp of the object to open
+ * @import_fd: open drm file descriptor to be used to import the vgem bo
+ * @fence: optional return variable to store a fence attached to the vgem bo
+ *
+ * This function creates a vgem bo and imports it to the provided device. If
+ * the fence parameter if provided a fence is attached to the bo and returned.
+ * The provided vgem_bo struct is updated as in vgem_create.
+ *
+ * Returns:
+ * Handle of the imported bo.
+ */
+uint32_t vgem_create_and_import(int vgem_fd, struct vgem_bo *bo, int import_fd,
+ uint32_t *fence)
+{
+ int dmabuf;
+ uint32_t handle;
+
+ vgem_create(vgem_fd, bo);
+
+ if (fence) {
+ igt_require(vgem_has_fences(vgem_fd));
+ *fence = vgem_fence_attach(vgem_fd, bo, VGEM_FENCE_WRITE);
+ }
+
+ dmabuf = prime_handle_to_fd(vgem_fd, bo->handle);
+ handle = prime_fd_to_handle(import_fd, dmabuf);
+ igt_assert(handle);
+ close(dmabuf);
+
+ return handle;
+}
+
void *__vgem_mmap(int fd, struct vgem_bo *bo, unsigned prot)
{
struct drm_mode_map_dumb arg;
@@ -36,6 +36,8 @@ struct vgem_bo {
int __vgem_create(int fd, struct vgem_bo *bo);
void vgem_create(int fd, struct vgem_bo *bo);
+uint32_t vgem_create_and_import(int vgem_fd, struct vgem_bo *bo, int import_fd,
+ uint32_t *fence);
void *__vgem_mmap(int fd, struct vgem_bo *bo, unsigned prot);
void *vgem_mmap(int fd, struct vgem_bo *bo, unsigned prot);
@@ -35,16 +35,12 @@ static void test_read(int vgem, int i915)
struct vgem_bo scratch;
uint32_t handle;
uint32_t *ptr;
- int dmabuf, i;
+ int i;
scratch.width = 1024;
scratch.height = 1024;
scratch.bpp = 32;
- vgem_create(vgem, &scratch);
-
- dmabuf = prime_handle_to_fd(vgem, scratch.handle);
- handle = prime_fd_to_handle(i915, dmabuf);
- close(dmabuf);
+ handle = vgem_create_and_import(vgem, &scratch, i915, NULL);
ptr = vgem_mmap(vgem, &scratch, PROT_WRITE);
for (i = 0; i < 1024; i++)
@@ -66,7 +62,7 @@ static void test_fence_read(int i915, int vgem)
uint32_t handle;
uint32_t *ptr;
uint32_t fence;
- int dmabuf, i;
+ int i;
int master[2], slave[2];
igt_assert(pipe(master) == 0);
@@ -75,11 +71,7 @@ static void test_fence_read(int i915, int vgem)
scratch.width = 1024;
scratch.height = 1024;
scratch.bpp = 32;
- vgem_create(vgem, &scratch);
-
- dmabuf = prime_handle_to_fd(vgem, scratch.handle);
- handle = prime_fd_to_handle(i915, dmabuf);
- close(dmabuf);
+ handle = vgem_create_and_import(vgem, &scratch, i915, NULL);
igt_fork(child, 1) {
for (i = 0; i < 1024; i++) {
@@ -121,7 +113,7 @@ static void test_fence_mmap(int i915, int vgem)
uint32_t handle;
uint32_t *ptr;
uint32_t fence;
- int dmabuf, i;
+ int i;
int master[2], slave[2];
igt_assert(pipe(master) == 0);
@@ -130,11 +122,7 @@ static void test_fence_mmap(int i915, int vgem)
scratch.width = 1024;
scratch.height = 1024;
scratch.bpp = 32;
- vgem_create(vgem, &scratch);
-
- dmabuf = prime_handle_to_fd(vgem, scratch.handle);
- handle = prime_fd_to_handle(i915, dmabuf);
- close(dmabuf);
+ handle = vgem_create_and_import(vgem, &scratch, i915, NULL);
igt_fork(child, 1) {
ptr = gem_mmap__gtt(i915, handle, 4096*1024, PROT_READ);
@@ -176,16 +164,12 @@ static void test_write(int vgem, int i915)
struct vgem_bo scratch;
uint32_t handle;
uint32_t *ptr;
- int dmabuf, i;
+ int i;
scratch.width = 1024;
scratch.height = 1024;
scratch.bpp = 32;
- vgem_create(vgem, &scratch);
-
- dmabuf = prime_handle_to_fd(vgem, scratch.handle);
- handle = prime_fd_to_handle(i915, dmabuf);
- close(dmabuf);
+ handle = vgem_create_and_import(vgem, &scratch, i915, NULL);
ptr = vgem_mmap(vgem, &scratch, PROT_READ);
gem_close(vgem, scratch.handle);
@@ -204,16 +188,12 @@ static void test_gtt(int vgem, int i915)
struct vgem_bo scratch;
uint32_t handle;
uint32_t *ptr;
- int dmabuf, i;
+ int i;
scratch.width = 1024;
scratch.height = 1024;
scratch.bpp = 32;
- vgem_create(vgem, &scratch);
-
- dmabuf = prime_handle_to_fd(vgem, scratch.handle);
- handle = prime_fd_to_handle(i915, dmabuf);
- close(dmabuf);
+ handle = vgem_create_and_import(vgem, &scratch, i915, NULL);
ptr = gem_mmap__gtt(i915, handle, scratch.size, PROT_WRITE);
for (i = 0; i < 1024; i++)
@@ -241,16 +221,12 @@ static void test_gtt_interleaved(int vgem, int i915)
struct vgem_bo scratch;
uint32_t handle;
uint32_t *ptr, *gtt;
- int dmabuf, i;
+ int i;
scratch.width = 1024;
scratch.height = 1024;
scratch.bpp = 32;
- vgem_create(vgem, &scratch);
-
- dmabuf = prime_handle_to_fd(vgem, scratch.handle);
- handle = prime_fd_to_handle(i915, dmabuf);
- close(dmabuf);
+ handle = vgem_create_and_import(vgem, &scratch, i915, NULL);
/* This assumes that GTT is perfectedly coherent. On certain machines,
* it is possible for a direct acces to bypass the GTT indirection.
@@ -709,17 +685,11 @@ static void test_flip(int i915, int vgem, unsigned hang)
signal(SIGHUP, sighandler);
for (int i = 0; i < 2; i++) {
- int fd;
-
bo[i].width = 1024;
bo[i].height = 768;
bo[i].bpp = 32;
- vgem_create(vgem, &bo[i]);
- fd = prime_handle_to_fd(vgem, bo[i].handle);
- handle[i] = prime_fd_to_handle(i915, fd);
- igt_assert(handle[i]);
- close(fd);
+ handle[i] = vgem_create_and_import(vgem, &bo[i], i915, NULL);
do_or_die(__kms_addfb(i915, handle[i],
bo[i].width, bo[i].height, bo[i].pitch,
The same code to create and import a vgem object is used in a couple of places and a couple more are coming up in the next patches so extract the code into a common function Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> --- lib/igt_dummyload.c | 10 ++-------- lib/igt_vgem.c | 35 +++++++++++++++++++++++++++++++++ lib/igt_vgem.h | 2 ++ tests/prime_vgem.c | 56 +++++++++++++---------------------------------------- 4 files changed, 52 insertions(+), 51 deletions(-)