diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c index 38b0c94be01..4d7fb144496 100644 --- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c +++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c @@ -1298,6 +1298,43 @@ virgl_drm_screen_destroy(struct pipe_screen *pscreen) } } +static uint32_t +hash_fd(const void *key) +{ + int fd = pointer_to_intptr(key); + + return _mesa_hash_int(&fd); +} + +static bool +equal_fd(const void *key1, const void *key2) +{ + int ret; + int fd1 = pointer_to_intptr(key1); + int fd2 = pointer_to_intptr(key2); + + /* Since the scope of prime handle is limited to drm_file, + * virgl_screen is only shared at the drm_file level, + * not at the device (/dev/dri/cardX) level. + */ + ret = os_same_file_description(fd1, fd2); + if (ret == 0) { + return true; + } else if (ret < 0) { + static bool logged; + + if (!logged) { + _debug_printf("virgl: os_same_file_description couldn't " + "determine if two DRM fds reference the same " + "file description.\n" + "If they do, bad things may happen!\n"); + logged = true; + } + } + + return false; +} + struct pipe_screen * virgl_drm_screen_create(int fd, const struct pipe_screen_config *config) { @@ -1305,7 +1342,7 @@ virgl_drm_screen_create(int fd, const struct pipe_screen_config *config) mtx_lock(&virgl_screen_mutex); if (!fd_tab) { - fd_tab = util_hash_table_create_fd_keys(); + fd_tab = _mesa_hash_table_create(NULL, hash_fd, equal_fd); if (!fd_tab) goto unlock; }