#include "os/os_thread.h"
#include "util/u_memory.h"
+#include "loader/loader.h"
#include "entrypoint.h"
#include "vid_dec.h"
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)
{
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;
+ }
}
}
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;
}