This patch allows to use gallium vaapi without requiring a X server running for your second graphic card.
Signed-off-by: Julien Isorce <j.iso...@samsung.com> --- src/gallium/state_trackers/va/Makefile.am | 9 ++++++ src/gallium/state_trackers/va/context.c | 49 +++++++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/gallium/state_trackers/va/Makefile.am b/src/gallium/state_trackers/va/Makefile.am index 2a93a90..348cfe1 100644 --- a/src/gallium/state_trackers/va/Makefile.am +++ b/src/gallium/state_trackers/va/Makefile.am @@ -30,6 +30,15 @@ AM_CFLAGS = \ $(VA_CFLAGS) \ -DVA_DRIVER_INIT_FUNC="__vaDriverInit_$(VA_MAJOR)_$(VA_MINOR)" +AM_CFLAGS += \ + $(GALLIUM_PIPE_LOADER_DEFINES) \ + -DPIPE_SEARCH_DIR=\"$(libdir)/gallium-pipe\" + +if HAVE_GALLIUM_STATIC_TARGETS +AM_CFLAGS += \ + -DGALLIUM_STATIC_TARGETS=1 +endif + AM_CPPFLAGS = \ -I$(top_srcdir)/include diff --git a/src/gallium/state_trackers/va/context.c b/src/gallium/state_trackers/va/context.c index ddc863b..9ab2710 100644 --- a/src/gallium/state_trackers/va/context.c +++ b/src/gallium/state_trackers/va/context.c @@ -28,7 +28,8 @@ #include "pipe/p_screen.h" #include "pipe/p_video_codec.h" - +#include "pipe-loader/pipe_loader.h" +#include "state_tracker/drm_driver.h" #include "util/u_memory.h" #include "util/u_handle_table.h" #include "util/u_video.h" @@ -98,7 +99,7 @@ static struct VADriverVTableVPP vtable_vpp = PUBLIC VAStatus VA_DRIVER_INIT_FUNC(VADriverContextP ctx) { - vlVaDriver *drv; + vlVaDriver *drv = NULL; if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; @@ -107,8 +108,40 @@ VA_DRIVER_INIT_FUNC(VADriverContextP ctx) if (!drv) return VA_STATUS_ERROR_ALLOCATION_FAILED; - drv->vscreen = vl_screen_create(ctx->native_dpy, ctx->x11_screen); - if (!drv->vscreen) + drv->vscreen = NULL; + + switch (ctx->display_type) { + case VA_DISPLAY_X11: + drv->vscreen = vl_screen_create(ctx->native_dpy, ctx->x11_screen); + if (!drv->vscreen) + goto error_screen; + break; + + case VA_DISPLAY_DRM: + case VA_DISPLAY_DRM_RENDERNODES: { + struct drm_state *drm_info = (struct drm_state *) ctx->drm_state; + if (!drm_info) + goto error_screen; + + drv->vscreen = CALLOC_STRUCT(vl_screen); + +#if GALLIUM_STATIC_TARGETS + drv->vscreen->pscreen = dd_create_screen(drm_info->fd); +#else + int loader_fd = dup(drm_info->fd); + if (loader_fd == -1) + goto error_screen; + + if (pipe_loader_drm_probe_fd(&drv->dev, loader_fd)) + drv->vscreen->pscreen = pipe_loader_create_screen(drv->dev, PIPE_SEARCH_DIR); +#endif + } + break; + default: + goto error_screen; + } + + if (!drv->vscreen->pscreen) goto error_screen; drv->pipe = drv->vscreen->pscreen->context_create(drv->vscreen->pscreen, @@ -146,8 +179,11 @@ error_htab: error_pipe: vl_screen_destroy(drv->vscreen); + drv->vscreen = NULL; error_screen: + if (drv->vscreen) + FREE(drv->vscreen); FREE(drv); return VA_STATUS_ERROR_ALLOCATION_FAILED; } @@ -266,7 +302,10 @@ vlVaTerminate(VADriverContextP ctx) vl_compositor_cleanup_state(&drv->cstate); vl_compositor_cleanup(&drv->compositor); drv->pipe->destroy(drv->pipe); - vl_screen_destroy(drv->vscreen); + if (ctx->display_type == VA_DISPLAY_X11) + vl_screen_destroy(drv->vscreen); + else + FREE(drv->vscreen); handle_table_destroy(drv->htab); FREE(drv); -- 1.9.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev