diff options
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/omx/entrypoint.c | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/src/gallium/state_trackers/omx/entrypoint.c b/src/gallium/state_trackers/omx/entrypoint.c index a7656660e8c..7df90b16a84 100644 --- a/src/gallium/state_trackers/omx/entrypoint.c +++ b/src/gallium/state_trackers/omx/entrypoint.c @@ -38,6 +38,7 @@ #include "os/os_thread.h" #include "util/u_memory.h" +#include "loader/loader.h" #include "entrypoint.h" #include "vid_dec.h" @@ -47,6 +48,8 @@ pipe_static_mutex(omx_lock); static Display *omx_display = NULL; static struct vl_screen *omx_screen = NULL; static unsigned omx_usecount = 0; +static const char *omx_render_node = NULL; +static int drm_fd; int omx_component_library_Setup(stLoaderComponentType **stComponents) { @@ -73,18 +76,30 @@ struct vl_screen *omx_get_screen(void) pipe_mutex_lock(omx_lock); if (!omx_display) { - omx_display = XOpenDisplay(NULL); - if (!omx_display) { - pipe_mutex_unlock(omx_lock); - return NULL; + omx_render_node = debug_get_option("OMX_RENDER_NODE", NULL); + if (!omx_render_node) { + omx_display = XOpenDisplay(NULL); + if (!omx_display) + goto error; } } if (!omx_screen) { - omx_screen = vl_screen_create(omx_display, 0); - if (!omx_screen) { - pipe_mutex_unlock(omx_lock); - return NULL; + if (omx_render_node) { + drm_fd = loader_open_device(omx_render_node); + if (drm_fd < 0) + goto error; + omx_screen = vl_drm_screen_create(drm_fd); + if (!omx_screen) { + close(drm_fd); + goto error; + } + } else { + omx_screen = vl_screen_create(omx_display, 0); + if (!omx_screen) { + XCloseDisplay(omx_display); + goto error; + } } } @@ -92,14 +107,24 @@ struct vl_screen *omx_get_screen(void) pipe_mutex_unlock(omx_lock); return omx_screen; + +error: + pipe_mutex_unlock(omx_lock); + return NULL; } void omx_put_screen(void) { pipe_mutex_lock(omx_lock); if ((--omx_usecount) == 0) { - vl_screen_destroy(omx_screen); - XCloseDisplay(omx_display); + if (!omx_render_node) { + vl_screen_destroy(omx_screen); + if (omx_display) + XCloseDisplay(omx_display); + } else { + close(drm_fd); + vl_drm_screen_destroy(omx_screen); + } omx_screen = NULL; omx_display = NULL; } |