broadcom/vc5: Add sim support for the GET_BO_OFFSET ioctl.
authorEric Anholt <eric@anholt.net>
Thu, 12 Apr 2018 20:47:52 +0000 (13:47 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 24 Apr 2018 17:37:29 +0000 (10:37 -0700)
Otherwise we'd crash immediately upon importing a BO through EGL
interfaces.

src/gallium/drivers/vc5/vc5_bufmgr.c
src/gallium/drivers/vc5/vc5_simulator.c

index 7a9c04a268d6da4529ecb804ce0e259209e7499c..1b91fbbdae7547501294c574dbcac298e80d9551 100644 (file)
@@ -348,6 +348,12 @@ vc5_bo_open_handle(struct vc5_screen *screen,
         bo->name = "winsys";
         bo->private = false;
 
+#ifdef USE_VC5_SIMULATOR
+        vc5_simulator_open_from_handle(screen->fd, winsys_stride,
+                                       bo->handle, bo->size);
+        bo->map = malloc(bo->size);
+#endif
+
         struct drm_vc5_get_bo_offset get = {
                 .handle = handle,
         };
@@ -355,17 +361,12 @@ vc5_bo_open_handle(struct vc5_screen *screen,
         if (ret) {
                 fprintf(stderr, "Failed to get BO offset: %s\n",
                         strerror(errno));
+                free(bo->map);
                 free(bo);
                 return NULL;
         }
         bo->offset = get.offset;
 
-#ifdef USE_VC5_SIMULATOR
-        vc5_simulator_open_from_handle(screen->fd, winsys_stride,
-                                       bo->handle, bo->size);
-        bo->map = malloc(bo->size);
-#endif
-
         util_hash_table_set(screen->bo_handles, (void *)(uintptr_t)handle, bo);
 
 done:
index d677293f3eddfed67e34ec103684d5d2e39076fd..ee4ffb28c0410875f0fbc0348b2a4a0d9cff3bca 100644 (file)
@@ -510,6 +510,18 @@ vc5_simulator_mmap_bo_ioctl(int fd, struct drm_vc5_mmap_bo *args)
         return ret;
 }
 
+static int
+vc5_simulator_get_bo_offset_ioctl(int fd, struct drm_vc5_get_bo_offset *args)
+{
+        struct vc5_simulator_file *file = vc5_get_simulator_file_for_fd(fd);
+        struct vc5_simulator_bo *sim_bo = vc5_get_simulator_bo(file,
+                                                               args->handle);
+
+        args->offset = sim_bo->block->ofs;
+
+        return 0;
+}
+
 static int
 vc5_simulator_gem_close_ioctl(int fd, struct drm_gem_close *args)
 {
@@ -541,6 +553,8 @@ vc5_simulator_ioctl(int fd, unsigned long request, void *args)
                 return vc5_simulator_create_bo_ioctl(fd, args);
         case DRM_IOCTL_VC5_MMAP_BO:
                 return vc5_simulator_mmap_bo_ioctl(fd, args);
+        case DRM_IOCTL_VC5_GET_BO_OFFSET:
+                return vc5_simulator_get_bo_offset_ioctl(fd, args);
 
         case DRM_IOCTL_VC5_WAIT_BO:
                 /* We do all of the vc5 rendering synchronously, so we just