#include "util/u_memory.h"
#include "vl/vl_winsys.h"
-struct vl_screen*
+static void
+vl_drm_screen_destroy(struct vl_screen *vscreen);
+
+struct vl_screen *
vl_drm_screen_create(int fd)
{
struct vl_screen *vscreen;
+ int new_fd;
vscreen = CALLOC_STRUCT(vl_screen);
if (!vscreen)
return NULL;
-#if GALLIUM_STATIC_TARGETS
- vscreen->pscreen = dd_create_screen(fd);
-#else
- if (pipe_loader_drm_probe_fd(&vscreen->dev, dup(fd))) {
- vscreen->pscreen =
- pipe_loader_create_screen(vscreen->dev, PIPE_SEARCH_DIR);
- if (!vscreen->pscreen)
- pipe_loader_release(&vscreen->dev, 1);
- }
-#endif
+ if (pipe_loader_drm_probe_fd(&vscreen->dev, fd))
+ vscreen->pscreen = pipe_loader_create_screen(vscreen->dev);
- if (!vscreen->pscreen) {
- FREE(vscreen);
- return NULL;
- }
+ if (!vscreen->pscreen)
+ goto release_pipe;
vscreen->destroy = vl_drm_screen_destroy;
vscreen->texture_from_drawable = NULL;
vscreen->set_next_timestamp = NULL;
vscreen->get_private = NULL;
return vscreen;
+
+release_pipe:
+ if (vscreen->dev)
+ pipe_loader_release(&vscreen->dev, 1);
+
+ FREE(vscreen);
+ return NULL;
}
-void
+static void
vl_drm_screen_destroy(struct vl_screen *vscreen)
{
assert(vscreen);
vscreen->pscreen->destroy(vscreen->pscreen);
-
-#if !GALLIUM_STATIC_TARGETS
pipe_loader_release(&vscreen->dev, 1);
-#endif
-
+ /* CHECK: The VAAPI loader/user preserves ownership of the original fd */
FREE(vscreen);
}