This reverts commit f87330dbce3f67cb531194f63a5db59685dcbbd3. Cc: Emil Velikov <emil.l.veli...@gmail.com> Cc: Dave Airlie <airl...@redhat.com> --- src/gallium/auxiliary/target-helpers/drm_helper.h | 7 +- src/gallium/drivers/virgl/virgl_screen.c | 1 - src/gallium/drivers/virgl/virgl_screen.h | 6 -- src/gallium/winsys/virgl/drm/virgl_drm_public.h | 4 +- src/gallium/winsys/virgl/drm/virgl_drm_winsys.c | 87 ----------------------- 5 files changed, 8 insertions(+), 97 deletions(-)
diff --git a/src/gallium/auxiliary/target-helpers/drm_helper.h b/src/gallium/auxiliary/target-helpers/drm_helper.h index 90820d3..332b1cb 100644 --- a/src/gallium/auxiliary/target-helpers/drm_helper.h +++ b/src/gallium/auxiliary/target-helpers/drm_helper.h @@ -226,9 +226,14 @@ pipe_freedreno_create_screen(int fd) struct pipe_screen * pipe_virgl_create_screen(int fd) { + struct virgl_winsys *vws; struct pipe_screen *screen; - screen = virgl_drm_screen_create(fd); + vws = virgl_drm_winsys_create(fd); + if (!vws) + return NULL; + + screen = virgl_create_screen(vws); return screen ? debug_screen_wrap(screen) : NULL; } diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index 919b64e..1ad7ffe 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -573,7 +573,6 @@ virgl_create_screen(struct virgl_winsys *vws) vws->get_caps(vws, &screen->caps); - screen->refcnt = 1; util_format_s3tc_init(); return &screen->base; diff --git a/src/gallium/drivers/virgl/virgl_screen.h b/src/gallium/drivers/virgl/virgl_screen.h index 8cac38d..52e72ca 100644 --- a/src/gallium/drivers/virgl/virgl_screen.h +++ b/src/gallium/drivers/virgl/virgl_screen.h @@ -28,12 +28,6 @@ struct virgl_screen { struct pipe_screen base; - - int refcnt; - - /* place for winsys to stash it's own stuff: */ - void *winsys_priv; - struct virgl_winsys *vws; struct virgl_drm_caps caps; diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_public.h b/src/gallium/winsys/virgl/drm/virgl_drm_public.h index f70f0e5..be01021 100644 --- a/src/gallium/winsys/virgl/drm/virgl_drm_public.h +++ b/src/gallium/winsys/virgl/drm/virgl_drm_public.h @@ -23,8 +23,8 @@ #ifndef VIRGL_DRM_PUBLIC_H #define VIRGL_DRM_PUBLIC_H -struct pipe_screen; +struct virgl_winsys; -struct pipe_screen *virgl_drm_screen_create(int fd); +struct virgl_winsys *virgl_drm_winsys_create(int drmFD); #endif diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c index 81afa84..e03e8bd 100644 --- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c +++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c @@ -25,7 +25,6 @@ #include <fcntl.h> #include <stdio.h> #include <sys/ioctl.h> -#include <sys/stat.h> #include "os/os_mman.h" #include "os/os_time.h" @@ -34,8 +33,6 @@ #include "util/u_hash_table.h" #include "util/u_inlines.h" #include "state_tracker/drm_driver.h" -#include "virgl/virgl_screen.h" -#include "virgl/virgl_public.h" #include <xf86drm.h> #include "virtgpu_drm.h" @@ -801,87 +798,3 @@ virgl_drm_winsys_create(int drmFD) return &qdws->base; } - -static struct util_hash_table *fd_tab = NULL; -pipe_static_mutex(virgl_screen_mutex); - -static void -virgl_drm_screen_destroy(struct pipe_screen *pscreen) -{ - struct virgl_screen *screen = virgl_screen(pscreen); - boolean destroy; - - pipe_mutex_lock(virgl_screen_mutex); - destroy = --screen->refcnt == 0; - if (destroy) { - int fd = virgl_drm_winsys(screen->vws)->fd; - util_hash_table_remove(fd_tab, intptr_to_pointer(fd)); - } - pipe_mutex_unlock(virgl_screen_mutex); - - if (destroy) { - pscreen->destroy = screen->winsys_priv; - pscreen->destroy(pscreen); - } -} - -static unsigned hash_fd(void *key) -{ - int fd = pointer_to_intptr(key); - struct stat stat; - fstat(fd, &stat); - - return stat.st_dev ^ stat.st_ino ^ stat.st_rdev; -} - -static int compare_fd(void *key1, void *key2) -{ - int fd1 = pointer_to_intptr(key1); - int fd2 = pointer_to_intptr(key2); - struct stat stat1, stat2; - fstat(fd1, &stat1); - fstat(fd2, &stat2); - - return stat1.st_dev != stat2.st_dev || - stat1.st_ino != stat2.st_ino || - stat1.st_rdev != stat2.st_rdev; -} - -struct pipe_screen * -virgl_drm_screen_create(int fd) -{ - struct pipe_screen *pscreen = NULL; - - pipe_mutex_lock(virgl_screen_mutex); - if (!fd_tab) { - fd_tab = util_hash_table_create(hash_fd, compare_fd); - if (!fd_tab) - goto unlock; - } - - pscreen = util_hash_table_get(fd_tab, intptr_to_pointer(fd)); - if (pscreen) { - virgl_screen(pscreen)->refcnt++; - } else { - struct virgl_winsys *vws; - int dup_fd = dup(fd); - - vws = virgl_drm_winsys_create(dup_fd); - - pscreen = virgl_create_screen(vws); - if (pscreen) { - util_hash_table_set(fd_tab, intptr_to_pointer(dup_fd), pscreen); - - /* Bit of a hack, to avoid circular linkage dependency, - * ie. pipe driver having to call in to winsys, we - * override the pipe drivers screen->destroy(): - */ - virgl_screen(pscreen)->winsys_priv = pscreen->destroy; - pscreen->destroy = virgl_drm_screen_destroy; - } - } - -unlock: - pipe_mutex_unlock(virgl_screen_mutex); - return pscreen; -} -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev