summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2018-04-12 13:47:52 -0700
committerEric Anholt <[email protected]>2018-04-24 10:37:29 -0700
commit82cdb801fda294465aadcdd5dde426a1fa02ffd2 (patch)
treecfa66059a6396a573bf3ada93e4819d9a19e688c /src
parent3cdd055ed24d97ff79221ac427102a58b9b28d6c (diff)
broadcom/vc5: Add sim support for the GET_BO_OFFSET ioctl.
Otherwise we'd crash immediately upon importing a BO through EGL interfaces.
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/vc5/vc5_bufmgr.c13
-rw-r--r--src/gallium/drivers/vc5/vc5_simulator.c14
2 files changed, 21 insertions, 6 deletions
diff --git a/src/gallium/drivers/vc5/vc5_bufmgr.c b/src/gallium/drivers/vc5/vc5_bufmgr.c
index 7a9c04a268d..1b91fbbdae7 100644
--- a/src/gallium/drivers/vc5/vc5_bufmgr.c
+++ b/src/gallium/drivers/vc5/vc5_bufmgr.c
@@ -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:
diff --git a/src/gallium/drivers/vc5/vc5_simulator.c b/src/gallium/drivers/vc5/vc5_simulator.c
index d677293f3ed..ee4ffb28c04 100644
--- a/src/gallium/drivers/vc5/vc5_simulator.c
+++ b/src/gallium/drivers/vc5/vc5_simulator.c
@@ -511,6 +511,18 @@ vc5_simulator_mmap_bo_ioctl(int fd, struct drm_vc5_mmap_bo *args)
}
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)
{
/* Free the simulator's internal tracking. */
@@ -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