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 <[email protected]>
---
 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(-)

diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
index 913cc93..03541f7 100644
--- a/lib/igt_dummyload.c
+++ b/lib/igt_dummyload.c
@@ -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;
 }
diff --git a/lib/igt_vgem.c b/lib/igt_vgem.c
index 7f933b2..7fc62f2 100644
--- a/lib/igt_vgem.c
+++ b/lib/igt_vgem.c
@@ -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;
diff --git a/lib/igt_vgem.h b/lib/igt_vgem.h
index 92045f0..94b1186 100644
--- a/lib/igt_vgem.h
+++ b/lib/igt_vgem.h
@@ -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);
diff --git a/tests/prime_vgem.c b/tests/prime_vgem.c
index 0ffaee9..489e9b6 100644
--- a/tests/prime_vgem.c
+++ b/tests/prime_vgem.c
@@ -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,
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to